Convert pattern statement
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / pattern / AbstractPatternStatementSupport.java
index c86acbf641fd375382c19cc8529e7220d1776bb0..2c3b487039f99b1b0e9667f5b211330e2dbbfefd 100644 (file)
@@ -7,21 +7,29 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.pattern;
 
-import java.util.Optional;
+import com.google.common.collect.ImmutableList;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ModifierEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PatternEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.type.ModifierKind;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
 import org.opendaylight.yangtools.yang.model.util.RegexUtils;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 abstract class AbstractPatternStatementSupport
-        extends AbstractStatementSupport<PatternConstraint, PatternStatement, PatternEffectiveStatement> {
+        extends BaseStatementSupport<PatternConstraint, PatternStatement, PatternEffectiveStatement> {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractPatternStatementSupport.class);
 
     AbstractPatternStatementSupport() {
@@ -39,17 +47,45 @@ abstract class AbstractPatternStatementSupport
             return null;
         }
 
-        return new PatternConstraintImpl(pattern, value, Optional.empty(), Optional.empty());
+        return new PatternConstraintImpl(pattern, value);
     }
 
     @Override
-    public final PatternStatement createDeclared(final StmtContext<PatternConstraint, PatternStatement, ?> ctx) {
-        return new PatternStatementImpl(ctx);
+    protected final PatternStatement createDeclared(final StmtContext<PatternConstraint, PatternStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularPatternStatement(ctx, substatements);
     }
 
     @Override
-    public final PatternEffectiveStatement createEffective(
-            final StmtContext<PatternConstraint, PatternStatement, PatternEffectiveStatement> ctx) {
-        return new PatternEffectiveStatementImpl(ctx);
+    protected final PatternStatement createEmptyDeclared(
+            final StmtContext<PatternConstraint, PatternStatement, ?> ctx) {
+        return new EmptyPatternStatement(ctx);
     }
-}
\ No newline at end of file
+
+    @Override
+    protected final PatternEffectiveStatement createEffective(
+            final StmtContext<PatternConstraint, PatternStatement, PatternEffectiveStatement> ctx,
+            final PatternStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        final String description = findFirstArgument(substatements, DescriptionEffectiveStatement.class, null);
+        final String reference = findFirstArgument(substatements, ReferenceEffectiveStatement.class, null);
+        final String errorAppTag = findFirstArgument(substatements, ErrorAppTagEffectiveStatement.class, null);
+        final String errorMessage = findFirstArgument(substatements, ErrorMessageEffectiveStatement.class, null);
+        final ModifierKind modifier = findFirstArgument(substatements, ModifierEffectiveStatement.class, null);
+
+        if (description == null && reference == null && errorAppTag == null && errorMessage == null
+                && modifier == null) {
+            // No customization, just use declared statement for the actual value
+            return new SimplePatternEffectiveStatement(declared, substatements);
+        }
+
+        return new RegularPatternEffectiveStatement(declared, new PatternConstraintImpl(declared.argument(),
+            description, reference, errorAppTag, errorMessage, modifier), substatements);
+    }
+
+    @Override
+    protected final PatternEffectiveStatement createEmptyEffective(
+            final StmtContext<PatternConstraint, PatternStatement, PatternEffectiveStatement> ctx,
+            final PatternStatement declared) {
+        return new EmptyPatternEffectiveStatement(declared);
+    }
+}