Add more deprecations around SchemaPath
[yangtools.git] / model / yang-model-api / src / main / java / org / opendaylight / yangtools / yang / model / api / PathFromRoot.java
1 /*
2  * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.model.api;
9
10 import static java.util.Objects.requireNonNull;
11
12 import java.lang.invoke.MethodHandles;
13 import java.lang.invoke.VarHandle;
14 import java.util.AbstractList;
15 import java.util.ArrayDeque;
16 import java.util.Arrays;
17 import java.util.Deque;
18 import java.util.Iterator;
19 import java.util.Spliterator;
20 import org.eclipse.jdt.annotation.NonNull;
21 import org.eclipse.jdt.annotation.Nullable;
22 import org.opendaylight.yangtools.concepts.Immutable;
23 import org.opendaylight.yangtools.yang.common.QName;
24
25 @Deprecated(since = "7.0.9", forRemoval = true)
26 final class PathFromRoot extends AbstractList<QName> implements Immutable {
27     private static final QName[] EMPTY_QNAMES = new QName[0];
28     private static final VarHandle QNAMES;
29
30     static {
31         try {
32             QNAMES = MethodHandles.lookup().findVarHandle(PathFromRoot.class, "qnames", QName[].class);
33         } catch (NoSuchFieldException | IllegalAccessException e) {
34             throw new ExceptionInInitializerError(e);
35         }
36     }
37
38     private final SchemaPath path;
39
40     @SuppressWarnings("unused")
41     private QName @Nullable [] qnames;
42
43     PathFromRoot(final SchemaPath path) {
44         this.path = requireNonNull(path);
45     }
46
47     @Override
48     public Iterator<QName> iterator() {
49         return Arrays.asList(qnames()).iterator();
50     }
51
52     @Override
53     public Spliterator<QName> spliterator() {
54         return Arrays.spliterator(qnames());
55     }
56
57     @Override
58     public QName get(final int index) {
59         return qnames()[index];
60     }
61
62     @Override
63     public boolean isEmpty() {
64         return false;
65     }
66
67     @Override
68     public int size() {
69         return qnames().length;
70     }
71
72     private QName @NonNull [] qnames() {
73         final QName[] local = (QName[]) QNAMES.getAcquire(this);
74         return local != null ? local : loadQNames();
75     }
76
77     private QName @NonNull [] loadQNames() {
78         final Deque<QName> tmp = new ArrayDeque<>();
79         for (QName qname : path.getPathTowardsRoot()) {
80             tmp.addFirst(qname);
81         }
82
83         final QName[] result = tmp.toArray(EMPTY_QNAMES);
84         // We do not care about atomicity here
85         QNAMES.setRelease(this, result);
86         return result;
87     }
88 }