1ddc8ed2fca01dfbc884c144e1ef25731beac265
[yangtools.git] / yang / rfc6241-parser-support / src / main / java / org / opendaylight / yangtools / rfc6241 / parser / GetFilterElementAttributesStatementSupport.java
1 /*
2  * Copyright (c) 2019 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.rfc6241.parser;
9
10 import com.google.common.annotations.Beta;
11 import com.google.common.collect.ImmutableList;
12 import org.eclipse.jdt.annotation.NonNull;
13 import org.opendaylight.yangtools.rfc6241.model.api.GetFilterElementAttributesEffectiveStatement;
14 import org.opendaylight.yangtools.rfc6241.model.api.GetFilterElementAttributesSchemaNode;
15 import org.opendaylight.yangtools.rfc6241.model.api.GetFilterElementAttributesStatement;
16 import org.opendaylight.yangtools.rfc6241.model.api.NetconfStatements;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
19 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
20 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
21 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
23 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithoutArgument.WithSubstatements;
24 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseVoidStatementSupport;
25 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
27 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
28 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
29 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 @Beta
34 public final class GetFilterElementAttributesStatementSupport extends BaseVoidStatementSupport<
35         GetFilterElementAttributesStatement, GetFilterElementAttributesEffectiveStatement> {
36
37     private static final class Declared extends WithSubstatements implements GetFilterElementAttributesStatement {
38         static final @NonNull Declared EMPTY = new Declared(ImmutableList.of());
39
40         Declared(final ImmutableList<? extends DeclaredStatement<?>> substatements) {
41             super(substatements);
42         }
43     }
44
45     private static final class Effective
46             extends UnknownEffectiveStatementBase<Void, GetFilterElementAttributesStatement>
47             implements GetFilterElementAttributesEffectiveStatement, GetFilterElementAttributesSchemaNode {
48         private final @NonNull SchemaPath path;
49
50         Effective(final Current<Void, GetFilterElementAttributesStatement> stmt,
51                 final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
52             super(stmt, substatements);
53             path = stmt.getEffectiveParent().getSchemaPath().createChild(stmt.publicDefinition().getStatementName());
54         }
55
56         @Override
57         public QName getQName() {
58             return path.getLastComponent();
59         }
60
61         @Override
62         @Deprecated
63         public SchemaPath getPath() {
64             return path;
65         }
66
67         @Override
68         public GetFilterElementAttributesEffectiveStatement asEffectiveStatement() {
69             return this;
70         }
71     }
72
73     private static final Logger LOG = LoggerFactory.getLogger(GetFilterElementAttributesStatementSupport.class);
74     private static final GetFilterElementAttributesStatementSupport INSTANCE =
75             new GetFilterElementAttributesStatementSupport(NetconfStatements.GET_FILTER_ELEMENT_ATTRIBUTES);
76
77     private final SubstatementValidator validator;
78
79     GetFilterElementAttributesStatementSupport(final StatementDefinition definition) {
80         super(definition);
81         this.validator = SubstatementValidator.builder(definition).build();
82     }
83
84     public static GetFilterElementAttributesStatementSupport getInstance() {
85         return INSTANCE;
86     }
87
88     @Override
89     public void onFullDefinitionDeclared(final Mutable<Void, GetFilterElementAttributesStatement,
90             GetFilterElementAttributesEffectiveStatement> stmt) {
91         super.onFullDefinitionDeclared(stmt);
92         stmt.setIsSupportedToBuildEffective(computeSupported(stmt));
93     }
94
95     @Override
96     protected SubstatementValidator getSubstatementValidator() {
97         return validator;
98     }
99
100     @Override
101     protected GetFilterElementAttributesStatement createDeclared(
102             final StmtContext<Void, GetFilterElementAttributesStatement, ?> ctx,
103             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
104         return new Declared(substatements);
105     }
106
107     @Override
108     protected GetFilterElementAttributesStatement createEmptyDeclared(
109             final StmtContext<Void, GetFilterElementAttributesStatement, ?> ctx) {
110         return Declared.EMPTY;
111     }
112
113     @Override
114     protected GetFilterElementAttributesEffectiveStatement createEffective(
115             final Current<Void, GetFilterElementAttributesStatement> stmt,
116             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
117         return new Effective(stmt, substatements);
118     }
119
120     private static boolean computeSupported(final StmtContext<?, ?, ?> stmt) {
121         final StmtContext<?, ?, ?> parent = stmt.getParentContext();
122         if (parent == null) {
123             LOG.debug("No parent, ignoring get-filter-element-attributes statement");
124             return false;
125         }
126         if (parent.publicDefinition() != YangStmtMapping.ANYXML) {
127             LOG.debug("Parent is not an anyxml node, ignoring get-filter-element-attributes statement");
128             return false;
129         }
130         if (!"filter".equals(parent.rawArgument())) {
131             LOG.debug("Parent is not named 'filter', ignoring get-filter-element-attributes statement");
132             return false;
133         }
134
135         final StmtContext<?, ?, ?> grandParent = parent.getParentContext();
136         if (grandParent == null) {
137             LOG.debug("No grandparent, ignoring get-filter-element-attributes statement");
138             return false;
139         }
140         if (grandParent.publicDefinition() != YangStmtMapping.INPUT) {
141             LOG.debug("Grandparent is not an input node, ignoring get-filter-element-attributes statement");
142             return false;
143         }
144
145         final StmtContext<?, ?, ?> greatGrandParent = grandParent.getParentContext();
146         if (greatGrandParent == null) {
147             LOG.debug("No grandparent, ignoring get-filter-element-attributes statement");
148             return false;
149         }
150         if (greatGrandParent.publicDefinition() != YangStmtMapping.RPC) {
151             LOG.debug("Grandparent is not an RPC node, ignoring get-filter-element-attributes statement");
152             return false;
153         }
154
155         switch (greatGrandParent.getRawArgument()) {
156             case "get":
157             case "get-config":
158                 return true;
159             default:
160                 LOG.debug("Great-grandparent is not named 'get' nor 'get-config, ignoring get-filter-element-attributes"
161                     + " statement");
162                 return false;
163         }
164     }
165 }