Optimize deviate statement implementations
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / deviate / DeviateEffectiveStatementImpl.java
index b5c378dacb0b3b7411cb92c8668f70d830567648..3f08767e80042907e43224f0acd329b02233b831 100644 (file)
@@ -7,16 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate;
 
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
 import java.util.Collection;
-import java.util.Set;
-import org.opendaylight.yangtools.util.OptionalBoolean;
 import org.opendaylight.yangtools.yang.model.api.DeviateDefinition;
 import org.opendaylight.yangtools.yang.model.api.DeviateKind;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UniqueConstraint;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement;
@@ -26,41 +25,13 @@ import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatem
 import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
 
-final class DeviateEffectiveStatementImpl extends DeclaredEffectiveStatementBase<DeviateKind, DeviateStatement>
+final class DeviateEffectiveStatementImpl extends WithSubstatements<DeviateKind, DeviateStatement>
         implements DeviateDefinition, DeviateEffectiveStatement {
-
-    private final String deviatedDefault;
-    private final Integer deviatedMaxElements;
-    private final Integer deviatedMinElements;
-    private final ImmutableSet<MustDefinition> deviatedMustDefinitions;
-    private final TypeDefinition<?> deviatedType;
-    private final ImmutableList<UniqueConstraint> deviatedUniqueConstraints;
-    private final String deviatedUnits;
-
-    private final byte deviatedConfig;
-    private final byte deviatedMandatory;
-
-    DeviateEffectiveStatementImpl(final StmtContext<DeviateKind, DeviateStatement, ?> ctx) {
-        super(ctx);
-
-        deviatedConfig = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument(
-            ConfigEffectiveStatement.class).orElse(null));
-        deviatedMandatory = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument(
-            MandatoryEffectiveStatement.class).orElse(null));
-        deviatedDefault = findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null);
-        deviatedMaxElements = findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class)
-                // FIXME: this does not handle 'unbounded'
-                .map(Integer::valueOf).orElse(null);
-        deviatedMinElements = findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null);
-        deviatedType = findFirstEffectiveSubstatement(TypeEffectiveStatement.class)
-                .map(TypeEffectiveStatement::getTypeDefinition).orElse(null);
-        deviatedUnits = findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null);
-
-        deviatedMustDefinitions = ImmutableSet.copyOf(allSubstatementsOfType(MustDefinition.class));
-        deviatedUniqueConstraints = ImmutableList.copyOf(allSubstatementsOfType(UniqueConstraint.class));
+    DeviateEffectiveStatementImpl(final DeviateStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, substatements);
     }
 
     @Override
@@ -70,46 +41,54 @@ final class DeviateEffectiveStatementImpl extends DeclaredEffectiveStatementBase
 
     @Override
     public Boolean getDeviatedConfig() {
-        return OptionalBoolean.toNullable(deviatedConfig);
+        return findFirstEffectiveSubstatementArgument(ConfigEffectiveStatement.class).orElse(null);
     }
 
     @Override
     public String getDeviatedDefault() {
-        return deviatedDefault;
+        return findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null);
     }
 
     @Override
     public Boolean getDeviatedMandatory() {
-        return OptionalBoolean.toNullable(deviatedMandatory);
+        return findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(null);
     }
 
     @Override
     public Integer getDeviatedMaxElements() {
-        return deviatedMaxElements;
+        return findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class)
+                // FIXME: this does not handle 'unbounded'
+                .map(Integer::valueOf).orElse(null);
     }
 
     @Override
     public Integer getDeviatedMinElements() {
-        return deviatedMinElements;
+        return findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null);
     }
 
     @Override
-    public Set<MustDefinition> getDeviatedMusts() {
-        return deviatedMustDefinitions;
+    public Collection<? extends MustDefinition> getDeviatedMusts() {
+        return allSubstatementsOfType(MustDefinition.class);
     }
 
     @Override
     public TypeDefinition<?> getDeviatedType() {
-        return deviatedType;
+        return findFirstEffectiveSubstatement(TypeEffectiveStatement.class)
+                .map(TypeEffectiveStatement::getTypeDefinition).orElse(null);
     }
 
     @Override
-    public Collection<UniqueConstraint> getDeviatedUniques() {
-        return deviatedUniqueConstraints;
+    public Collection<? extends UniqueConstraint> getDeviatedUniques() {
+        return allSubstatementsOfType(UniqueConstraint.class);
     }
 
     @Override
     public String getDeviatedUnits() {
-        return deviatedUnits;
+        return findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null);
+    }
+
+    @SuppressWarnings("unchecked")
+    private <T> Collection<T> allSubstatementsOfType(final Class<T> type) {
+        return Collection.class.cast(Collections2.filter(effectiveSubstatements(), type::isInstance));
     }
 }