Remove generics from YangNumberExpr 26/80626/4
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 27 Feb 2019 14:22:23 +0000 (15:22 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 27 Feb 2019 15:30:45 +0000 (16:30 +0100)
Generics are only getting in the way with the class and its support,
remove them from interface classes and move them to
AbstractYangXPathMathSupport.

Change-Id: I81b69e88786db1ce014c4ee83b65c01da09fbdad
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/AbstractYangXPathMathSupport.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/BigDecimalNumberExpr.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/BigDecimalXPathMathSupport.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/DoubleNumberExpr.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/DoubleXPathMathSupport.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangNumberExpr.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangXPathMathMode.java
yang/yang-xpath-api/src/main/java/org/opendaylight/yangtools/yang/xpath/api/YangXPathMathSupport.java
yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/AntlrXPathParser.java
yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/FunctionSupport.java
yang/yang-xpath-impl/src/main/java/org/opendaylight/yangtools/yang/xpath/impl/InstanceIdentifierParser.java

index 0de1b7c3dbbe548e721ed86fba04bddd4ca502ae..589f8e26c4901f388d66366be530fa8528113f9e 100644 (file)
@@ -10,25 +10,33 @@ package org.opendaylight.yangtools.yang.xpath.api;
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.annotations.Beta;
 import java.util.Optional;
 
-abstract class AbstractYangXPathMathSupport<N extends YangNumberExpr<N, ?>> implements YangXPathMathSupport<N> {
+/**
+ * Type-safe shim to ensure concrete {@link YangXPathMathSupport} implementations get handed properly-typed
+ * YangNumberExprs.
+ *
+ * @param <N> Type of YangNumberExpr
+ * @author Robert Varga
+ */
+@Beta
+public abstract class AbstractYangXPathMathSupport<N extends YangNumberExpr> implements YangXPathMathSupport {
     private final Class<N> numberClass;
 
-    AbstractYangXPathMathSupport(final Class<N> numberClass) {
+    protected AbstractYangXPathMathSupport(final Class<N> numberClass) {
         this.numberClass = requireNonNull(numberClass);
     }
 
     @Override
-    public final N negateNumber(final YangNumberExpr<?, ?> number) {
+    public final N negateNumber(final YangNumberExpr number) {
         checkArgument(numberClass.isInstance(requireNonNull(number)), "Expected %s have %s", numberClass, number);
-        return doNegate(numberClass.cast(number));
+        return doNegateNumber(numberClass.cast(number));
     }
 
-
     @Override
-    public final Optional<YangExpr> tryEvaluate(final YangBinaryOperator operator,
-            final YangNumberExpr<?, ?> left, final YangNumberExpr<?, ?> right) {
+    public final Optional<YangExpr> tryEvaluate(final YangBinaryOperator operator, final YangNumberExpr left,
+            final YangNumberExpr right) {
         if (!numberClass.isInstance(left) || !numberClass.isInstance(right)) {
             requireNonNull(operator);
             requireNonNull(left);
@@ -36,10 +44,16 @@ abstract class AbstractYangXPathMathSupport<N extends YangNumberExpr<N, ?>> impl
             return Optional.empty();
         }
 
-        return Optional.of(evaluate(requireNonNull(operator), numberClass.cast(left), numberClass.cast(right)));
+        return Optional.of(doEvaluate(requireNonNull(operator), numberClass.cast(left), numberClass.cast(right)));
     }
 
-    abstract N doNegate(N number);
+    /**
+     * Create a {@link YangNumberExpr} representing the negated value of a number.
+     *
+     * @param number input number
+     * @return negated number expression
+     */
+    protected abstract N doNegateNumber(N number);
 
     /**
      * Evaluate an  operator and its left- and right-handside.
@@ -49,5 +63,5 @@ abstract class AbstractYangXPathMathSupport<N extends YangNumberExpr<N, ?>> impl
      * @param right Right hand-side
      * @return Evaluation result
      */
-    abstract YangExpr evaluate(YangBinaryOperator operator, N left, N right);
+    protected abstract YangExpr doEvaluate(YangBinaryOperator operator, N left, N right);
 }
index 3fa4d202ecf9524a2010b343f61dc2768c693ef1..cc54a44a14828ce4ebb797c9c6acd8c39cb8b289 100644 (file)
@@ -12,7 +12,7 @@ import static java.util.Objects.requireNonNull;
 import java.math.BigDecimal;
 import org.eclipse.jdt.annotation.Nullable;
 
-final class BigDecimalNumberExpr extends YangNumberExpr<BigDecimalNumberExpr, BigDecimal> {
+final class BigDecimalNumberExpr extends YangNumberExpr {
     private static final long serialVersionUID = 1L;
 
     private final BigDecimal number;
@@ -32,7 +32,7 @@ final class BigDecimalNumberExpr extends YangNumberExpr<BigDecimalNumberExpr, Bi
 
     @Override
     public BigDecimalXPathMathSupport getSupport() {
-        return BigDecimalXPathMathSupport.getInstance();
+        return BigDecimalXPathMathSupport.INSTANCE;
     }
 
     @Override
index 5c3c117c83091ff0d5fb490d33d552d95018cd3d..f489b98c5ab5e174c272efb66156325dbccaed29 100644 (file)
@@ -10,7 +10,8 @@ package org.opendaylight.yangtools.yang.xpath.api;
 import java.math.BigDecimal;
 
 final class BigDecimalXPathMathSupport extends AbstractYangXPathMathSupport<BigDecimalNumberExpr> {
-    private static final BigDecimalXPathMathSupport INSTANCE = new BigDecimalXPathMathSupport();
+    static final BigDecimalXPathMathSupport INSTANCE = new BigDecimalXPathMathSupport();
+
     private static final BigDecimalNumberExpr ZERO = BigDecimalNumberExpr.of(BigDecimal.ZERO);
     private static final BigDecimalNumberExpr ONE = BigDecimalNumberExpr.of(BigDecimal.ONE);
     private static final BigDecimalNumberExpr TEN = BigDecimalNumberExpr.of(BigDecimal.TEN);
@@ -19,10 +20,6 @@ final class BigDecimalXPathMathSupport extends AbstractYangXPathMathSupport<BigD
         super(BigDecimalNumberExpr.class);
     }
 
-    static BigDecimalXPathMathSupport getInstance() {
-        return INSTANCE;
-    }
-
     @Override
     public BigDecimalNumberExpr createNumber(final String str) {
         switch (str) {
@@ -52,12 +49,12 @@ final class BigDecimalXPathMathSupport extends AbstractYangXPathMathSupport<BigD
     }
 
     @Override
-    BigDecimalNumberExpr doNegate(final BigDecimalNumberExpr number) {
+    protected BigDecimalNumberExpr doNegateNumber(final BigDecimalNumberExpr number) {
         return BigDecimalNumberExpr.of(number.getNumber().negate());
     }
 
     @Override
-    YangExpr evaluate(final YangBinaryOperator operator, final BigDecimalNumberExpr left,
+    protected YangExpr doEvaluate(final YangBinaryOperator operator, final BigDecimalNumberExpr left,
             final BigDecimalNumberExpr right) {
         final BigDecimal l = left.getNumber();
         final BigDecimal r = right.getNumber();
index 52cdf0b036afea4d7fa51c9c1d7e931fdf22460f..56ce14eade0ef432aa12391ef7a888dce365ce15 100644 (file)
@@ -7,10 +7,9 @@
  */
 package org.opendaylight.yangtools.yang.xpath.api;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.eclipse.jdt.annotation.Nullable;
 
-final class DoubleNumberExpr extends YangNumberExpr<DoubleNumberExpr, Double> {
+final class DoubleNumberExpr extends YangNumberExpr {
     private static final long serialVersionUID = 1L;
 
     private final double value;
@@ -34,7 +33,7 @@ final class DoubleNumberExpr extends YangNumberExpr<DoubleNumberExpr, Double> {
 
     @Override
     public DoubleXPathMathSupport getSupport() {
-        return DoubleXPathMathSupport.getInstance();
+        return DoubleXPathMathSupport.INSTANCE;
     }
 
     @Override
@@ -43,7 +42,6 @@ final class DoubleNumberExpr extends YangNumberExpr<DoubleNumberExpr, Double> {
     }
 
     @Override
-    @SuppressFBWarnings(value = "FE_FLOATING_POINT_EQUALITY", justification = "")
     public boolean equals(final @Nullable Object obj) {
         return this == obj || obj instanceof DoubleNumberExpr && bitEqual(((DoubleNumberExpr) obj).value);
     }
@@ -56,5 +54,4 @@ final class DoubleNumberExpr extends YangNumberExpr<DoubleNumberExpr, Double> {
     public String toString() {
         return String.valueOf(value);
     }
-
-}
\ No newline at end of file
+}
index 97e76474ebc01b366d3a8a9a0468b2bc3bfcf35c..72f31d8b3879bc88001d89255904a1f108eff5c8 100644 (file)
@@ -8,16 +8,12 @@
 package org.opendaylight.yangtools.yang.xpath.api;
 
 final class DoubleXPathMathSupport extends AbstractYangXPathMathSupport<DoubleNumberExpr> {
-    private static final DoubleXPathMathSupport INSTANCE = new DoubleXPathMathSupport();
+    static final DoubleXPathMathSupport INSTANCE = new DoubleXPathMathSupport();
 
     private DoubleXPathMathSupport() {
         super(DoubleNumberExpr.class);
     }
 
-    static DoubleXPathMathSupport getInstance() {
-        return INSTANCE;
-    }
-
     @Override
     public DoubleNumberExpr createNumber(final String str) {
         return DoubleNumberExpr.of(Double.parseDouble(str));
@@ -29,12 +25,13 @@ final class DoubleXPathMathSupport extends AbstractYangXPathMathSupport<DoubleNu
     }
 
     @Override
-    DoubleNumberExpr doNegate(final DoubleNumberExpr number) {
+    protected DoubleNumberExpr doNegateNumber(final DoubleNumberExpr number) {
         return DoubleNumberExpr.of(-number.getValue());
     }
 
     @Override
-    YangExpr evaluate(final YangBinaryOperator operator, final DoubleNumberExpr left, final DoubleNumberExpr right) {
+    protected YangExpr doEvaluate(final YangBinaryOperator operator, final DoubleNumberExpr left,
+            final DoubleNumberExpr right) {
         final double l = left.getValue();
         final double r = right.getValue();
 
index f5b5d1b62d57a331c54458e68424c8e2b167d566..cf355bd45c552aa2bf8f39e60a3ee1b612e3fcb1 100644 (file)
@@ -8,19 +8,26 @@
 package org.opendaylight.yangtools.yang.xpath.api;
 
 import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.Nullable;
 
 /**
  * A number-bearing expression.
  */
 @Beta
-public abstract class YangNumberExpr<T extends YangNumberExpr<T, N>, N extends Number> implements YangExpr {
+public abstract class YangNumberExpr implements YangExpr {
     private static final long serialVersionUID = 1L;
 
     YangNumberExpr() {
         // Hidden to prevent external subclassing
     }
 
-    public abstract N getNumber();
+    public abstract Number getNumber();
 
-    public abstract YangXPathMathSupport<T> getSupport();
+    public abstract YangXPathMathSupport getSupport();
+
+    @Override
+    public abstract int hashCode();
+
+    @Override
+    public abstract boolean equals(@Nullable Object obj);
 }
index 073ad6086303147c07dc355a8082a60c51588c44..80b8bc5bdab3e43a652acaa5b4d700190e17da60 100644 (file)
@@ -23,14 +23,14 @@ public enum YangXPathMathMode {
      * All number expressions are treated as {@code double}. This in spirit of XPath 1.0 -- any number expression
      * starts its life as a double, making all operations subject to IEEE754 rounding and range rules.
      */
-    IEEE754(DoubleXPathMathSupport.getInstance()),
+    IEEE754(DoubleXPathMathSupport.INSTANCE),
 
     /**
      * All number expressions are treated as infinite-precision numbers. This follows the spirit of YANG 1.1 --
      * where mostly have integral types and decimal64 mapped to BigDecimal. Non-decimal numbers are mapped either to
      * {@code int}, {@code long} or {@code BigInteger}.
      */
-    EXACT(BigDecimalXPathMathSupport.getInstance());
+    EXACT(BigDecimalXPathMathSupport.INSTANCE);
 
     /*
      * FIXME: 3.0.0: specify and implement this:
@@ -41,9 +41,9 @@ public enum YangXPathMathMode {
      */
     // ODL_COMMON;
 
-    private YangXPathMathSupport<?> support;
+    private YangXPathMathSupport support;
 
-    YangXPathMathMode(final YangXPathMathSupport<?> support) {
+    YangXPathMathMode(final YangXPathMathSupport support) {
         this.support = requireNonNull(support);
     }
 
@@ -52,7 +52,7 @@ public enum YangXPathMathMode {
      *
      * @return YangXPathMathSupport supporting this mode.
      */
-    public YangXPathMathSupport<?> getSupport() {
+    public YangXPathMathSupport getSupport() {
         return support;
     }
 }
index 9dd1f8c98504568f7dd6861c6a9beb2a4e3af526..e3385640733d7a88c7ef40d9afc860bd1be4db1f 100644 (file)
@@ -10,8 +10,14 @@ package org.opendaylight.yangtools.yang.xpath.api;
 import com.google.common.annotations.Beta;
 import java.util.Optional;
 
+/**
+ * Interface supporting mathematical operations. This interface should be implemented by subclassing
+ * {@link AbstractYangXPathMathSupport}, which provides type safety guards.
+ *
+ * @author Robert Varga
+ */
 @Beta
-public interface YangXPathMathSupport<N extends YangNumberExpr<N, ?>> {
+public interface YangXPathMathSupport {
     /**
      * Create a {@link YangNumberExpr} backed by specified string.
      *
@@ -20,7 +26,7 @@ public interface YangXPathMathSupport<N extends YangNumberExpr<N, ?>> {
      * @throws NullPointerException if {@code str} is null
      * @throws NumberFormatException if the string does not represent a valid number
      */
-    N createNumber(String str);
+    YangNumberExpr createNumber(String str);
 
     /**
      * Create a {@link YangNumberExpr} for specified integer.
@@ -28,7 +34,7 @@ public interface YangXPathMathSupport<N extends YangNumberExpr<N, ?>> {
      * @param value integer value
      * @return number expression
      */
-    N createNumber(int value);
+    YangNumberExpr createNumber(int value);
 
     /**
      * Create a {@link YangNumberExpr} representing the negated value of a number.
@@ -38,7 +44,7 @@ public interface YangXPathMathSupport<N extends YangNumberExpr<N, ?>> {
      * @throws NullPointerException if {@code number} is null
      * @throws IllegalArgumentException if {@code number} has unrecognized type
      */
-    N negateNumber(YangNumberExpr<?, ?> number);
+    YangNumberExpr negateNumber(YangNumberExpr number);
 
     /**
      * Attempt to evaluate an  operator and its left- and right-handside.
@@ -49,5 +55,5 @@ public interface YangXPathMathSupport<N extends YangNumberExpr<N, ?>> {
      * @return Evaluation result, if evaluation succeeded
      * @throws NullPointerException if any of the arguments is null
      */
-    Optional<YangExpr> tryEvaluate(YangBinaryOperator operator, YangNumberExpr<?, ?> left, YangNumberExpr<?, ?> right);
+    Optional<YangExpr> tryEvaluate(YangBinaryOperator operator, YangNumberExpr left, YangNumberExpr right);
 }
index f3e9a0998ee428412200120093a9ffb84e2173c4..d8cc076fbb9255dce8d75b9e77f0f68ceb24783b 100644 (file)
@@ -116,7 +116,7 @@ final class AntlrXPathParser implements YangXPathParser {
     private static final AxisStep SELF_STEP = YangXPathAxis.SELF.asStep();
 
     private final YangXPathMathMode mathMode;
-    private final YangXPathMathSupport<?> mathSupport;
+    private final YangXPathMathSupport mathSupport;
     private final YangNamespaceContext namespaceContext;
     private final FunctionSupport functionSupport;
 
@@ -383,9 +383,7 @@ final class AntlrXPathParser implements YangXPathParser {
             // Even number of '-' tokens cancel out
             return ret;
         }
-
-        return ret instanceof YangNumberExpr ? mathSupport.negateNumber((YangNumberExpr<?, ?>) ret)
-                : YangNegateExpr.of(ret);
+        return ret instanceof YangNumberExpr ? mathSupport.negateNumber((YangNumberExpr) ret) : YangNegateExpr.of(ret);
     }
 
     private YangExpr parseUnion(final UnionExprNoRootContext expr) {
@@ -437,7 +435,7 @@ final class AntlrXPathParser implements YangXPathParser {
             final YangExpr right) {
         if (left instanceof YangNumberExpr && right instanceof YangNumberExpr) {
             // Constant folding on numbers -- precision plays a role here
-            return mathSupport.tryEvaluate(operator, (YangNumberExpr<?, ?>)left, (YangNumberExpr<?, ?>)right);
+            return mathSupport.tryEvaluate(operator, (YangNumberExpr)left, (YangNumberExpr)right);
         }
         return Optional.empty();
     }
index b12ba65835c9be32fdaba2a58435bce51fb99a92..8e3d7b0aedafac269326b39953210d4fd988c2c4 100644 (file)
@@ -40,10 +40,10 @@ final class FunctionSupport {
     private static final YangFunctionCallExpr STRING_LENGTH = YangFunctionCallExpr.of(
         YangFunction.STRING_LENGTH.getIdentifier());
 
-    private final YangXPathMathSupport<?> mathSupport;
+    private final YangXPathMathSupport mathSupport;
     private final YangNamespaceContext namespaceContext;
 
-    FunctionSupport(final YangNamespaceContext namespaceContext, final YangXPathMathSupport<?> mathSupport) {
+    FunctionSupport(final YangNamespaceContext namespaceContext, final YangXPathMathSupport mathSupport) {
         this.namespaceContext = requireNonNull(namespaceContext);
         this.mathSupport = requireNonNull(mathSupport);
     }
index edc5653d22ddb8625fe8d2354720b27877225790..63bd5004bbbf58c7e71d0e10427097efa55bbc4a 100644 (file)
@@ -44,9 +44,8 @@ import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.Predi
 import org.opendaylight.yangtools.yang.xpath.impl.instanceIdentifierParser.QuotedStringContext;
 
 final class InstanceIdentifierParser {
-
     private final YangNamespaceContext namespaceContext;
-    private final YangXPathMathSupport<?> mathSupport;
+    private final YangXPathMathSupport mathSupport;
 
     InstanceIdentifierParser(final YangNamespaceContext namespaceContext, final YangXPathMathMode mathMode) {
         this.namespaceContext = requireNonNull(namespaceContext);