2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.model.api;
10 import static java.util.Objects.requireNonNull;
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;
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;
32 QNAMES = MethodHandles.lookup().findVarHandle(PathFromRoot.class, "qnames", QName[].class);
33 } catch (NoSuchFieldException | IllegalAccessException e) {
34 throw new ExceptionInInitializerError(e);
38 private final SchemaPath path;
40 @SuppressWarnings("unused")
41 private QName @Nullable [] qnames;
43 PathFromRoot(final SchemaPath path) {
44 this.path = requireNonNull(path);
48 public Iterator<QName> iterator() {
49 return Arrays.asList(qnames()).iterator();
53 public Spliterator<QName> spliterator() {
54 return Arrays.spliterator(qnames());
58 public QName get(final int index) {
59 return qnames()[index];
63 public boolean isEmpty() {
69 return qnames().length;
72 private QName @NonNull [] qnames() {
73 final QName[] local = (QName[]) QNAMES.getAcquire(this);
74 return local != null ? local : loadQNames();
77 private QName @NonNull [] loadQNames() {
78 final Deque<QName> tmp = new ArrayDeque<>();
79 for (QName qname : path.getPathTowardsRoot()) {
83 final QName[] result = tmp.toArray(EMPTY_QNAMES);
84 // We do not care about atomicity here
85 QNAMES.setRelease(this, result);