*/
package org.opendaylight.yangtools.yang.parser.stmt.reactor;
+import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.EffectiveSchemaContext;
+
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import com.google.common.base.Preconditions;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
class BuildGlobalContext extends NamespaceStorageSupport implements NamespaceBehaviour.Registry {
private static final List<ModelProcessingPhase> PHASE_EXECUTION_ORDER = ImmutableList.<ModelProcessingPhase>builder()
- .add(ModelProcessingPhase.SourceLinkage)
- .add(ModelProcessingPhase.StatementDefinition)
- .add(ModelProcessingPhase.FullDeclaration)
- .add(ModelProcessingPhase.EffectiveModel)
+ .add(ModelProcessingPhase.SOURCE_LINKAGE)
+ .add(ModelProcessingPhase.STATEMENT_DEFINITION)
+ .add(ModelProcessingPhase.FULL_DECLARATION)
+ .add(ModelProcessingPhase.EFFECTIVE_MODEL)
.build();
private final Map<QName,StatementDefinitionContext<?,?,?>> definitions = new HashMap<>();
this.supports = supports;
}
+ public StatementSupportBundle getSupportsForPhase(ModelProcessingPhase currentPhase) {
+ return supports.get(currentPhase);
+ }
+
public void addSource(@Nonnull StatementStreamSource source) {
sources.add(new SourceSpecificContext(this,source));
}
@Override
public StorageNodeType getStorageNodeType() {
- return StorageNodeType.Global;
+ return StorageNodeType.GLOBAL;
}
@Override
* Safe cast, previous checkState checks equivalence of key from
* which type argument are derived
*/
- @SuppressWarnings("unchecked")
- NamespaceBehaviourWithListeners<K, V, N> casted = (NamespaceBehaviourWithListeners<K, V, N>) potential;
- return casted;
+ return (NamespaceBehaviourWithListeners<K, V, N>) potential;
}
throw new NamespaceNotAvailableException("Namespace " + type + "is not available in phase " + currentPhase);
}
}
private EffectiveModelContext transform() {
- Preconditions.checkState(finishedPhase == ModelProcessingPhase.EffectiveModel);
+ Preconditions.checkState(finishedPhase == ModelProcessingPhase.EFFECTIVE_MODEL);
List<DeclaredStatement<?>> rootStatements = new ArrayList<>();
for(SourceSpecificContext source : sources) {
DeclaredStatement<?> root = source.getRoot().buildDeclared();
return new EffectiveModelContext(rootStatements);
}
+ public EffectiveSchemaContext buildEffective() throws SourceException, ReactorException {
+ for(ModelProcessingPhase phase : PHASE_EXECUTION_ORDER) {
+ startPhase(phase);
+ loadPhaseStatements();
+ completePhaseActions();
+ endPhase(phase);
+ }
+ return transformEffective();
+ }
+
+ private EffectiveSchemaContext transformEffective() {
+ Preconditions.checkState(finishedPhase == ModelProcessingPhase.EFFECTIVE_MODEL);
+ List<DeclaredStatement<?>> rootStatements = new ArrayList<>();
+ List<EffectiveStatement<?,?>> rootEffectiveStatements = new ArrayList<>();
+
+ for(SourceSpecificContext source : sources) {
+ DeclaredStatement<?> root = source.getRoot().buildDeclared();
+ rootStatements.add(root);
+
+ EffectiveStatement<?,?> rootEffective = source.getRoot().buildEffective();
+ rootEffectiveStatements.add(rootEffective);
+ }
+
+ return new EffectiveSchemaContext(rootStatements,rootEffectiveStatements);
+ }
+
private void startPhase(ModelProcessingPhase phase) {
Preconditions.checkState(Objects.equals(finishedPhase, phase.getPreviousPhase()));
for(SourceSpecificContext source : sources) {
private void completePhaseActions() throws ReactorException {
Preconditions.checkState(currentPhase != null);
- ArrayList<SourceSpecificContext> sourcesToProgress = Lists.newArrayList(sources);
+ List<SourceSpecificContext> sourcesToProgress = Lists.newArrayList(sources);
try {
boolean progressing = true;
while(progressing) {