a9bab4de76eca85c0fcb34443526d4e38736a172
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / UsesStatementImpl.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.parser.stmt.rfc6020;
9
10 import java.util.Collection;
11 import org.opendaylight.yangtools.yang.common.QName;
12 import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
13 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
14 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
15 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
16 import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
17 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
24 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
25 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
26 import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace;
27 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
28 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
29 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
30 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
31 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceAction;
32 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
33 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
34 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
35 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
36 import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
37
38 public class UsesStatementImpl extends AbstractDeclaredStatement<QName> implements UsesStatement {
39
40     protected UsesStatementImpl(StmtContext<QName, UsesStatement, ?> context) {
41         super(context);
42     }
43
44     public static class Definition extends
45             AbstractStatementSupport<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> {
46
47         public Definition() {
48             super(Rfc6020Mapping.USES);
49         }
50
51         @Override
52         public QName parseArgumentValue(StmtContext<?, ?, ?> ctx, String value) {
53             return Utils.qNameFromArgument(ctx, value);
54         }
55
56         public void onStatementDeclared(Mutable<QName, UsesStatement, ?> usesNode) throws InferenceException {
57             ModelActionBuilder modifier = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
58             final QName groupingName = usesNode.getStatementArgument();
59             final StatementSourceReference usesSource = usesNode.getStatementSourceReference();
60             final Prerequisite<?> targetPre = modifier.mutatesEffectiveCtx(usesNode.getParentContext());
61             final Prerequisite<EffectiveStatement<QName, GroupingStatement>> sourcePre = modifier.requiresEffective(
62                     usesNode, GroupingNamespace.class, groupingName);
63
64             modifier.apply(new InferenceAction() {
65
66                 @Override
67                 public void apply() throws InferenceException {
68                     Mutable<?, ?, ?> targetCtx = (Mutable<?, ?, ?>) targetPre.get();
69                     EffectiveStatement<QName, GroupingStatement> source = sourcePre.get();
70
71                     throw new UnsupportedOperationException("Copy of not not yet implemented.");
72                 }
73
74                 @Override
75                 public void prerequisiteFailed(Collection<? extends Prerequisite<?>> failed) throws InferenceException {
76                     if(failed.contains(sourcePre)) {
77                         throw new InferenceException("Grouping " + groupingName + "was not found.", usesSource);
78                     }
79                     throw new InferenceException("Unknown error occured.", usesSource);
80                 }
81
82             });
83
84         }
85
86         @Override
87         public UsesStatement createDeclared(StmtContext<QName, UsesStatement, ?> ctx) {
88             return new UsesStatementImpl(ctx);
89         }
90
91         @Override
92         public EffectiveStatement<QName, UsesStatement> createEffective(
93                 StmtContext<QName, UsesStatement, EffectiveStatement<QName, UsesStatement>> ctx) {
94             throw new UnsupportedOperationException("Not implemented yet.");
95         }
96
97     }
98
99     @Override
100     public QName getName() {
101         return argument();
102     }
103
104     @Override
105     public WhenStatement getWhenStatement() {
106         return firstDeclared(WhenStatement.class);
107     }
108
109     @Override
110     public Collection<? extends IfFeatureStatement> getIfFeatures() {
111         return allDeclared(IfFeatureStatement.class);
112     }
113
114     @Override
115     public StatusStatement getStatus() {
116         return firstDeclared(StatusStatement.class);
117     }
118
119     @Override
120     public DescriptionStatement getDescription() {
121         return firstDeclared(DescriptionStatement.class);
122     }
123
124     @Override
125     public ReferenceStatement getReference() {
126         return firstDeclared(ReferenceStatement.class);
127     }
128
129     @Override
130     public Collection<? extends AugmentStatement> getAugments() {
131         return allDeclared(AugmentStatement.class);
132     }
133
134     @Override
135     public Collection<? extends RefineStatement> getRefines() {
136         return allDeclared(RefineStatement.class);
137     }
138
139     @Override
140     public QName argument() {
141         // TODO Auto-generated method stub
142         return null;
143     }
144
145     @Override
146     public String rawArgument() {
147         // TODO Auto-generated method stub
148         return null;
149     }
150
151     @Override
152     public Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
153         // TODO Auto-generated method stub
154         return null;
155     }
156
157     @Override
158     public StatementDefinition statementDefinition() {
159         // TODO Auto-generated method stub
160         return null;
161     }
162
163     @Override
164     public StatementSource getStatementSource() {
165         // TODO Auto-generated method stub
166         return null;
167     }
168
169 }