BUG-865: Deprecate EnumPairImpl 69/42669/1
authorRobert Varga <rovarga@cisco.com>
Thu, 28 Jul 2016 02:33:33 +0000 (04:33 +0200)
committerRobert Varga <rovarga@cisco.com>
Thu, 28 Jul 2016 02:36:51 +0000 (04:36 +0200)
Leaking implementation classes leads to badness when users
use them instead of interfaces. Deprecate EnumPairImpl and provide
an alternative available via EnumPairBuilder.

Change-Id: I9a11a6fa54da1ef9594fdb8318fea9482b0703c3
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/EnumPairImpl.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/EnumPairBuilder.java [new file with mode: 0644]
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/EnumPairImpl.java [new file with mode: 0644]
yang/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/type/TypeTest.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/type/EnumSpecificationEffectiveStatementImpl.java

index e04736f69105ead1c89c522b318c2d788c438dd8..5716ddd5cb12ebd720c24513b4b093a287d9821c 100644 (file)
@@ -19,6 +19,10 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
 
+/**
+ * @deprecated use {@link org.opendaylight.yangtools.yang.model.util.type.EnumPairBuilder} instead.
+ */
+@Deprecated
 public final class EnumPairImpl implements EnumPair, Immutable {
     private final List<UnknownSchemaNode> unknownSchemaNodes;
     private final String description;
@@ -27,10 +31,6 @@ public final class EnumPairImpl implements EnumPair, Immutable {
     private final Integer value;
     private final String name;
 
-    /**
-     * @deprecated Use the constructor without a SchemaPath
-     */
-    @Deprecated
     public EnumPairImpl(final String name, final Integer value, final SchemaPath path, final String description,
             final String reference, final Status status, final Collection<UnknownSchemaNode> unknownSchemaNodes) {
         this(name, value, description, reference, status, unknownSchemaNodes);
diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/EnumPairBuilder.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/EnumPairBuilder.java
new file mode 100644 (file)
index 0000000..b88e52b
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2016 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.model.util.type;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+import java.util.List;
+import org.opendaylight.yangtools.concepts.Builder;
+import org.opendaylight.yangtools.concepts.Mutable;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
+
+/**
+ * Utility builder for {@link EnumPair} instances.
+ *
+ * @author Robert Varga
+ */
+@Beta
+public final class EnumPairBuilder implements Builder<EnumPair>, Mutable {
+    private final String name;
+    private final Integer value;
+
+    private List<UnknownSchemaNode> unknownSchemaNodes = ImmutableList.of();
+    private Status status = Status.CURRENT;
+    private String description;
+    private String reference;
+
+    private EnumPairBuilder(final String name, final Integer value) {
+        this.name = Preconditions.checkNotNull(name);
+        this.value = Preconditions.checkNotNull(value);
+    }
+
+    public static EnumPairBuilder create(final String name, final Integer value) {
+        return new EnumPairBuilder(name, value);
+    }
+
+    public EnumPairBuilder setDescription(final String description) {
+        this.description = description;
+        return this;
+    }
+
+    public EnumPairBuilder setReference(final String reference) {
+        this.reference = reference;
+        return this;
+    }
+
+    public EnumPairBuilder setStatus(final Status status) {
+        this.status = Preconditions.checkNotNull(status);
+        return this;
+    }
+
+    public EnumPairBuilder setUnknownSchemaNodes(final Collection<UnknownSchemaNode> unknownSchemaNodes) {
+        this.unknownSchemaNodes = ImmutableList.copyOf(unknownSchemaNodes);
+        return this;
+    }
+
+    public EnumPairBuilder setUnknownSchemaNodes(final UnknownSchemaNode... unknownSchemaNodes) {
+        this.unknownSchemaNodes = ImmutableList.copyOf(unknownSchemaNodes);
+        return this;
+    }
+
+    @Override
+    public EnumPair build() {
+        return new EnumPairImpl(name, value, description, reference, status, unknownSchemaNodes);
+    }
+
+}
diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/EnumPairImpl.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/EnumPairImpl.java
new file mode 100644 (file)
index 0000000..c2d19a0
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2015 Pantheon Technologies 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.model.util.type;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import java.util.List;
+import java.util.Objects;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
+
+final class EnumPairImpl implements EnumPair, Immutable {
+    private final List<UnknownSchemaNode> unknownSchemaNodes;
+    private final String description;
+    private final String reference;
+    private final Status status;
+    private final Integer value;
+    private final String name;
+
+    EnumPairImpl(final String name, final Integer value, final String description, final String reference,
+            final Status status, final List<UnknownSchemaNode> unknownSchemaNodes) {
+        this.value = Preconditions.checkNotNull(value);
+        this.name = Preconditions.checkNotNull(name);
+        this.description = description;
+        this.reference = reference;
+        this.status = Preconditions.checkNotNull(status);
+        this.unknownSchemaNodes = Preconditions.checkNotNull(unknownSchemaNodes);
+    }
+
+    @Override
+    public List<UnknownSchemaNode> getUnknownSchemaNodes() {
+        return unknownSchemaNodes;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String getReference() {
+        return reference;
+    }
+
+    @Override
+    public Status getStatus() {
+        return status;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + unknownSchemaNodes.hashCode();
+        result = prime * result + name.hashCode();
+        result = prime * result + value.hashCode();
+        return result;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof EnumPair)) {
+            return false;
+        }
+        EnumPair other = (EnumPair) obj;
+        if (!Objects.equals(name, other.getName())) {
+            return false;
+        }
+
+        return Objects.equals(value, other.getValue()) &&
+                Objects.equals(unknownSchemaNodes, other.getUnknownSchemaNodes());
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this).add("name", name).add("value", value).toString();
+    }
+}
index 7a4cf90ceeb33a582ca4bccab3cec3319f717908..8d8ed894476aca4aee1d206877a1645b0eee5d29 100644 (file)
@@ -15,7 +15,6 @@ import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import com.google.common.base.Optional;
 import java.util.ArrayList;
-import java.util.Collection;
 import org.junit.Test;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -27,6 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
@@ -37,7 +37,6 @@ import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
 import org.opendaylight.yangtools.yang.model.util.BaseConstraints;
 import org.opendaylight.yangtools.yang.model.util.BitImpl;
-import org.opendaylight.yangtools.yang.model.util.EnumPairImpl;
 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
 import org.opendaylight.yangtools.yang.model.util.UnresolvedNumber;
 
@@ -436,11 +435,9 @@ public class TypeTest {
         final UnresolvedNumber max = UnresolvedNumber.max();
         final LengthConstraint lengthConstraint = BaseConstraints.newLengthConstraint(min, max, absent, absent);
         final RangeConstraint rangeConstraint= BaseConstraints.newRangeConstraint(min, max, absent, absent);
-        final UnknownSchemaNode UNKNOWN_SCHEMA_NODE= mock(UnknownSchemaNode.class);
-        final Collection<UnknownSchemaNode> collection = new ArrayList<>(1);
-        collection.add(UNKNOWN_SCHEMA_NODE);
-        final EnumPairImpl enumPair = new EnumPairImpl("enum1", 1, "description", "reference",
-                Status.CURRENT, collection);
+
+        final EnumPair enumPair = EnumPairBuilder.create("enum1", 1).setDescription("description")
+                .setReference("reference").setUnknownSchemaNodes(mock(UnknownSchemaNode.class)).build();
 
         final InvalidLengthConstraintException invalidLengthConstraintException = new InvalidLengthConstraintException(
                 lengthConstraint, "error msg", "other important messages");
@@ -478,12 +475,10 @@ public class TypeTest {
     @Test(expected = InvalidEnumDefinitionException.class)
     public void invalidEnumDefinitionExceptionTest() {
         final UnknownSchemaNode UNKNOWN_SCHEMA_NODE= mock(UnknownSchemaNode.class);
-        final Collection<UnknownSchemaNode> collection = new ArrayList<>(1);
-        collection.add(UNKNOWN_SCHEMA_NODE);
-        final EnumPairImpl enumPair1 = new EnumPairImpl("enum1", 1, "description", "reference",
-                Status.CURRENT, collection);
-        final EnumPairImpl enumPair2 = new EnumPairImpl("enum", 1, "description", "reference",
-                Status.CURRENT, collection);
+        final EnumPair enumPair1 = EnumPairBuilder.create("enum1", 1).setDescription("description")
+                .setReference("reference").setUnknownSchemaNodes(UNKNOWN_SCHEMA_NODE).build();
+        final EnumPair enumPair2 = EnumPairBuilder.create("enum", 1).setDescription("description")
+                .setReference("reference").setUnknownSchemaNodes(UNKNOWN_SCHEMA_NODE).build();
         final EnumerationTypeBuilder enumerationTypeBuilder = BaseTypes.enumerationTypeBuilder(SCHEMA_PATH);
         enumerationTypeBuilder.addEnum(enumPair1);
         enumerationTypeBuilder.addEnum(enumPair2);
index 29ba56af99285ac8fe7e568b41d8a67a5c9974c1..09937c15b5ef0c956469bbad26d66b0355eff5ac 100644 (file)
@@ -12,8 +12,8 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.EnumSpecification;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
-import org.opendaylight.yangtools.yang.model.util.EnumPairImpl;
 import org.opendaylight.yangtools.yang.model.util.type.BaseTypes;
+import org.opendaylight.yangtools.yang.model.util.type.EnumPairBuilder;
 import org.opendaylight.yangtools.yang.model.util.type.EnumerationTypeBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
@@ -46,8 +46,9 @@ public final class EnumSpecificationEffectiveStatementImpl extends
                             "Enum '%s' must have a value statement", p);
                     }
 
-                    p = new EnumPairImpl(p.getName(), newValue, p.getDescription(), p.getReference(), p.getStatus(),
-                        p.getUnknownSchemaNodes());
+                    p = EnumPairBuilder.create(p.getName(), newValue).setDescription(p.getDescription())
+                            .setReference(p.getReference()).setStatus(p.getStatus())
+                            .setUnknownSchemaNodes(p.getUnknownSchemaNodes()).build();
                 }
 
                 if (highestValue == null || highestValue < p.getValue()) {