Add OrderedByAwareEffectiveStatement
[yangtools.git] / model / yang-model-ri / src / main / java / org / opendaylight / yangtools / yang / model / ri / stmt / impl / eff / ExtensionEffectiveStatementImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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.ri.stmt.impl.eff;
9
10 import static com.google.common.base.Verify.verifyNotNull;
11
12 import com.google.common.collect.ImmutableList;
13 import org.opendaylight.yangtools.yang.common.QName;
14 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
15 import org.opendaylight.yangtools.yang.model.api.Status;
16 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
17 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentEffectiveStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionEffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementEffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredEffectiveStatement.DefaultArgument;
23 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.DocumentedNodeMixin;
24
25 public final class ExtensionEffectiveStatementImpl extends DefaultArgument<QName, ExtensionStatement>
26         implements ExtensionDefinition, ExtensionEffectiveStatement, DocumentedNodeMixin<QName, ExtensionStatement> {
27     private final Object substatements;
28
29     public ExtensionEffectiveStatementImpl(final ExtensionStatement declared,
30             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
31         super(declared);
32         this.substatements = maskList(substatements);
33     }
34
35     @Override
36     public QName getQName() {
37         return argument();
38     }
39
40     @Override
41     public String getArgument() {
42         return findFirstEffectiveSubstatementArgument(ArgumentEffectiveStatement.class)
43                 .map(QName::getLocalName)
44                 .orElse(null);
45     }
46
47     @Override
48     public boolean isYinElement() {
49         return findFirstEffectiveSubstatement(ArgumentEffectiveStatement.class)
50                 .flatMap(arg -> arg.findFirstEffectiveSubstatementArgument(YinElementEffectiveStatement.class))
51                 .orElse(Boolean.FALSE);
52     }
53
54     @Override
55     public ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
56         final Object local = verifyNotNull(substatements, "Substatements are not yet initialized");
57         return unmaskList(local);
58     }
59
60     @Override
61     public Status getStatus() {
62         return findFirstEffectiveSubstatementArgument(StatusEffectiveStatement.class).orElse(Status.CURRENT);
63     }
64
65     @Override
66     public ExtensionEffectiveStatement asEffectiveStatement() {
67         return this;
68     }
69 }