Refactor fraction-digits implementation classes 25/87325/1
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 31 Jan 2020 13:20:15 +0000 (14:20 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 31 Jan 2020 13:22:42 +0000 (14:22 +0100)
Refactor our implementation classes, so that we end up sharing
declared/effective instances as much as possible.

JIRA: YANGTOOLS-1065
Change-Id: I2bdf8d30f9d2fd734a536001906b1f6f0af09f41
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/FractionDigitsEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/FractionDigitsStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/EmptyFractionDigitsEffectiveStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/FractionDigitsEffectiveStatementImpl.java with 52% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/EmptyFractionDigitsStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/FractionDigitsStatementImpl.java [deleted file]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/FractionDigitsStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/RegularFractionDigitsEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/RegularFractionDigitsStatement.java [new file with mode: 0644]

index fd5a4051d863b19278493e8880075fd885eb389c..c340bb046e02f621dc43bb5e97a57c63f0e1e8b2 100644 (file)
@@ -8,9 +8,14 @@
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface FractionDigitsEffectiveStatement extends EffectiveStatement<Integer, FractionDigitsStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.FRACTION_DIGITS;
+    }
 }
index c76e2b82f8ea3a89cbb3090c72b430a278d84b60..44e400732545c235d087bfab004895e107db45d7 100644 (file)
@@ -7,9 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
+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.StatementDefinition;
 
 public interface FractionDigitsStatement extends DeclaredStatement<Integer> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.FRACTION_DIGITS;
+    }
+
     default int getValue() {
         return argument().intValue();
     }
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -9,13 +9,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.fraction_digits;
 
 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
-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;
 
-final class FractionDigitsEffectiveStatementImpl
-        extends DeclaredEffectiveStatementBase<Integer, FractionDigitsStatement>
+final class EmptyFractionDigitsEffectiveStatement extends DefaultArgument<Integer, FractionDigitsStatement>
         implements FractionDigitsEffectiveStatement {
-    FractionDigitsEffectiveStatementImpl(final StmtContext<Integer, FractionDigitsStatement, ?> ctx) {
-        super(ctx);
+    EmptyFractionDigitsEffectiveStatement(final FractionDigitsStatement declared) {
+        super(declared);
     }
 }
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/EmptyFractionDigitsStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/EmptyFractionDigitsStatement.java
new file mode 100644 (file)
index 0000000..61706af
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.fraction_digits;
+
+import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString;
+
+final class EmptyFractionDigitsStatement extends ArgumentToString<Integer> implements FractionDigitsStatement {
+    EmptyFractionDigitsStatement(final Integer argument) {
+        super(argument);
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/FractionDigitsStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/FractionDigitsStatementImpl.java
deleted file mode 100644 (file)
index e012f3b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.fraction_digits;
-
-import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-
-final class FractionDigitsStatementImpl extends AbstractDeclaredStatement<Integer> implements FractionDigitsStatement {
-    FractionDigitsStatementImpl(final StmtContext<Integer, FractionDigitsStatement, ?> context) {
-        super(context);
-    }
-}
index 7d6d5b101f9b70909ddcd11f5ec88317cc2ddb0b..f294c14e24d59bb84a018c15e3cf8e90c1b76fea 100644 (file)
@@ -7,23 +7,46 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.fraction_digits;
 
-import com.google.common.collect.Range;
+import static com.google.common.base.Verify.verifyNotNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
 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.FractionDigitsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
-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.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 public final class FractionDigitsStatementSupport
-        extends AbstractStatementSupport<Integer, FractionDigitsStatement, FractionDigitsEffectiveStatement> {
-    private static final Range<Integer> FRAC_DIGITS_ALLOWED = Range.closed(1, 18);
-    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
-        YangStmtMapping.FRACTION_DIGITS)
-        .build();
+        extends BaseStatementSupport<Integer, FractionDigitsStatement, FractionDigitsEffectiveStatement> {
+    private static final SubstatementValidator SUBSTATEMENT_VALIDATOR =
+            SubstatementValidator.builder(YangStmtMapping.FRACTION_DIGITS).build();
     private static final FractionDigitsStatementSupport INSTANCE = new FractionDigitsStatementSupport();
 
+    private static final ImmutableMap<Integer, EmptyFractionDigitsStatement> EMPTY_DECLS;
+    private static final ImmutableMap<EmptyFractionDigitsStatement, EmptyFractionDigitsEffectiveStatement> EMPTY_EFF;
+
+    static {
+        final Builder<Integer, EmptyFractionDigitsStatement> declBuilder = ImmutableMap.builder();
+        final Builder<EmptyFractionDigitsStatement, EmptyFractionDigitsEffectiveStatement> effBuilder =
+                ImmutableMap.builder();
+
+        for (int i = 1; i <= 18; ++i) {
+            final Integer argument = i;
+            final EmptyFractionDigitsStatement decl = new EmptyFractionDigitsStatement(argument);
+            declBuilder.put(argument, decl);
+            effBuilder.put(decl, new EmptyFractionDigitsEffectiveStatement(decl));
+        }
+
+        EMPTY_DECLS = declBuilder.build();
+        EMPTY_EFF = effBuilder.build();
+    }
+
     private FractionDigitsStatementSupport() {
         super(YangStmtMapping.FRACTION_DIGITS);
     }
@@ -34,32 +57,50 @@ public final class FractionDigitsStatementSupport
 
     @Override
     public Integer parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        final Integer fractionDigits;
+        final int fractionDigits;
         try {
-            fractionDigits = Integer.valueOf(value);
+            fractionDigits = Integer.parseInt(value);
         } catch (NumberFormatException e) {
             throw new SourceException(ctx.getStatementSourceReference(), e,
                 "%s is not valid fraction-digits integer argument", value);
         }
-
-        SourceException.throwIf(!FRAC_DIGITS_ALLOWED.contains(fractionDigits), ctx.getStatementSourceReference(),
-            "fraction-digits argument should be integer within %s", FRAC_DIGITS_ALLOWED);
+        if (fractionDigits < 1 || fractionDigits > 18) {
+            throw new SourceException("fraction-digits argument should be integer within [1..18]",
+                ctx.getStatementSourceReference());
+        }
         return fractionDigits;
     }
 
     @Override
-    public FractionDigitsStatement createDeclared(final StmtContext<Integer, FractionDigitsStatement, ?> ctx) {
-        return new FractionDigitsStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    public FractionDigitsEffectiveStatement createEffective(
-            final StmtContext<Integer, FractionDigitsStatement, FractionDigitsEffectiveStatement> ctx) {
-        return new FractionDigitsEffectiveStatementImpl(ctx);
+    protected FractionDigitsStatement createDeclared(final StmtContext<Integer, FractionDigitsStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularFractionDigitsStatement(ctx.coerceStatementArgument(), substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected FractionDigitsStatement createEmptyDeclared(final StmtContext<Integer, FractionDigitsStatement, ?> ctx) {
+        final Integer argument = ctx.coerceStatementArgument();
+        return verifyNotNull(EMPTY_DECLS.get(argument), "No declared instance for %s", argument);
+    }
+
+    @Override
+    protected FractionDigitsEffectiveStatement createEffective(
+            final StmtContext<Integer, FractionDigitsStatement, FractionDigitsEffectiveStatement> ctx,
+            final FractionDigitsStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RegularFractionDigitsEffectiveStatement(declared, substatements);
+    }
+
+    @Override
+    protected FractionDigitsEffectiveStatement createEmptyEffective(
+            final StmtContext<Integer, FractionDigitsStatement, FractionDigitsEffectiveStatement> ctx,
+            final FractionDigitsStatement declared) {
+        final EmptyFractionDigitsEffectiveStatement shared = EMPTY_EFF.get(declared);
+        return shared != null ? shared :  new EmptyFractionDigitsEffectiveStatement(declared);
     }
 }
\ No newline at end of file
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/RegularFractionDigitsEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/RegularFractionDigitsEffectiveStatement.java
new file mode 100644 (file)
index 0000000..dd0000b
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.fraction_digits;
+
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
+
+final class RegularFractionDigitsEffectiveStatement extends WithSubstatements<Integer, FractionDigitsStatement>
+        implements FractionDigitsEffectiveStatement {
+    RegularFractionDigitsEffectiveStatement(final FractionDigitsStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, substatements);
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/RegularFractionDigitsStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/fraction_digits/RegularFractionDigitsStatement.java
new file mode 100644 (file)
index 0000000..f0ed3fe
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.fraction_digits;
+
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString.WithSubstatements;
+
+final class RegularFractionDigitsStatement extends WithSubstatements<Integer> implements FractionDigitsStatement {
+    RegularFractionDigitsStatement(final Integer argument,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(argument, substatements);
+    }
+}