Reformulate StatementContextFactory.createEffective()
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / pattern / AbstractPatternStatementSupport.java
index c86acbf641fd375382c19cc8529e7220d1776bb0..a799b6741118a8176f3afd36ec7bafdd2dd02c4b 100644 (file)
@@ -7,49 +7,55 @@
  */
 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.PatternEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.PatternExpression;
 import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement;
-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.EffectiveStmtCtx.Current;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 abstract class AbstractPatternStatementSupport
-        extends AbstractStatementSupport<PatternConstraint, PatternStatement, PatternEffectiveStatement> {
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractPatternStatementSupport.class);
-
+        extends BaseStatementSupport<PatternExpression, PatternStatement, PatternEffectiveStatement> {
     AbstractPatternStatementSupport() {
         super(YangStmtMapping.PATTERN, CopyPolicy.CONTEXT_INDEPENDENT);
     }
 
     @Override
-    public final PatternConstraint parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+    public final PatternExpression parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
         final String pattern = RegexUtils.getJavaRegexFromXSD(value);
-
         try {
             Pattern.compile(pattern);
         } catch (final PatternSyntaxException e) {
-            LOG.debug("Pattern \"{}\" failed to compile at {}", pattern, ctx.getStatementSourceReference(), e);
-            return null;
+            throw new SourceException(ctx.getStatementSourceReference(), e,
+                "Pattern \"%s\" failed to compile", pattern);
         }
+        return PatternExpression.of(value, pattern);
+    }
 
-        return new PatternConstraintImpl(pattern, value, Optional.empty(), Optional.empty());
+    @Override
+    protected final PatternStatement createDeclared(final StmtContext<PatternExpression, PatternStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularPatternStatement(ctx.coerceStatementArgument(), substatements);
     }
 
     @Override
-    public final PatternStatement createDeclared(final StmtContext<PatternConstraint, PatternStatement, ?> ctx) {
-        return new PatternStatementImpl(ctx);
+    protected final PatternStatement createEmptyDeclared(
+            final StmtContext<PatternExpression, PatternStatement, ?> ctx) {
+        return new EmptyPatternStatement(ctx.coerceStatementArgument());
     }
 
     @Override
-    public final PatternEffectiveStatement createEffective(
-            final StmtContext<PatternConstraint, PatternStatement, PatternEffectiveStatement> ctx) {
-        return new PatternEffectiveStatementImpl(ctx);
+    protected final PatternEffectiveStatement createEffective(final Current<PatternExpression, PatternStatement> stmt,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return substatements.isEmpty() ? new EmptyPatternEffectiveStatement(stmt.declared())
+            : new RegularPatternEffectiveStatement(stmt.declared(), substatements);
     }
-}
\ No newline at end of file
+}