Turn PCEPCapability into an abstract class 40/104040/13
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 16 Jan 2023 13:08:42 +0000 (14:08 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 16 Jan 2023 22:36:18 +0000 (23:36 +0100)
We want to force uniform treatment, equality and useful toString(). All
that requires an explicit abstract superclass.

JIRA: BGPCEP-960
Change-Id: I4522732290429c298bc7d2109ce65e272e909d86
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
pcep/api/src/main/java/org/opendaylight/protocol/pcep/PCEPCapability.java
pcep/ietf-p2mp-te-lsp/src/main/java/org/opendaylight/protocol/pcep/p2mp/te/lsp/P2MPTeLspCapability.java
pcep/ietf-stateful/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful/PCEPStatefulCapability.java
pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/PCEPSegmentRoutingCapability.java
pcep/segment-routing/src/test/java/org/opendaylight/protocol/pcep/segment/routing/PCEPSegmentRoutingCapabilityTest.java
pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTopologyConfiguration.java

index 6ea4b75bdad27e3451498fba9793445f619085e4..d96ab838c2a3e301210a6ccfca30a20545da71c4 100644 (file)
@@ -7,18 +7,37 @@
  */
 package org.opendaylight.protocol.pcep;
 
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import java.net.InetSocketAddress;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
 
 /**
- * Stores usability for available capabilities.
+ * Stores usability for available capabilities. All implementations are required to be effectively immutable.
  */
-public interface PCEPCapability {
+public abstract class PCEPCapability {
     /**
      * Sets stateful capabilities tlv in incoming builder.
      *
      * @param address peer address to assign capability proposal
      * @param builder for TLVs included in PCEPOpenObject
      */
-    void setCapabilityProposal(InetSocketAddress address, TlvsBuilder builder);
+    public abstract void setCapabilityProposal(InetSocketAddress address, TlvsBuilder builder);
+
+    @Override
+    public abstract int hashCode();
+
+    @Override
+    public abstract boolean equals(Object obj);
+
+    @Override
+    public final String toString() {
+        return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
+    }
+
+    protected @NonNull ToStringHelper addToStringAttributes(final @NonNull ToStringHelper helper) {
+        // No-op by default
+        return helper;
+    }
 }
index e719ad3906f08bef700cb698c6ddc5f63d953339..032c98c3fb457d3bd2c69ceb3f6ba917fc502270 100644 (file)
@@ -7,16 +7,24 @@
  */
 package org.opendaylight.protocol.pcep.p2mp.te.lsp;
 
-import com.google.common.base.MoreObjects;
 import java.net.InetSocketAddress;
-import org.kohsuke.MetaInfServices;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.protocol.pcep.PCEPCapability;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.p2mp.te.lsp.rev181109.TlvsP2mpCapabilityAugBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.p2mp.te.lsp.rev181109.p2mp.pce.capability.tlv.P2mpPceCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
 
-@MetaInfServices
-public final class P2MPTeLspCapability implements PCEPCapability {
+public final class P2MPTeLspCapability extends PCEPCapability {
+    private static final @NonNull P2MPTeLspCapability INSTANCE = new P2MPTeLspCapability();
+
+    private P2MPTeLspCapability() {
+        // Hidden on purpose
+    }
+
+    public static @NonNull P2MPTeLspCapability of() {
+        return INSTANCE;
+    }
+
     @Override
     public void setCapabilityProposal(final InetSocketAddress address, final TlvsBuilder builder) {
         builder.addAugmentation(new TlvsP2mpCapabilityAugBuilder()
@@ -25,7 +33,12 @@ public final class P2MPTeLspCapability implements PCEPCapability {
     }
 
     @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this).toString();
+    public int hashCode() {
+        return System.identityHashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return this == obj;
     }
 }
index 6dc327750a5b7cba08081659f82b836deebb5637..957dc1c32178abf0682992801b7c9afec69b692d 100644 (file)
@@ -7,8 +7,9 @@
  */
 package org.opendaylight.protocol.pcep.ietf.stateful;
 
+import com.google.common.base.MoreObjects.ToStringHelper;
 import java.net.InetSocketAddress;
-import org.kohsuke.MetaInfServices;
+import java.util.Arrays;
 import org.opendaylight.protocol.pcep.PCEPCapability;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Stateful1Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.config.rev230115.StatefulCapabilities;
@@ -16,8 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.StatefulBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
 
-@MetaInfServices
-public final class PCEPStatefulCapability implements PCEPCapability {
+public final class PCEPStatefulCapability extends PCEPCapability {
     private final boolean active;
     private final boolean initiated;
     private final boolean triggeredSync;
@@ -83,4 +83,41 @@ public final class PCEPStatefulCapability implements PCEPCapability {
     public boolean isIncludeDbVersion() {
         return includeDbVersion;
     }
+
+    @Override
+    public int hashCode() {
+        return Arrays.hashCode(
+            new boolean[] { active, initiated, triggeredSync, triggeredResync, deltaLspSync, includeDbVersion });
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return this == obj || obj instanceof PCEPStatefulCapability other && active == other.active
+            && initiated == other.initiated && triggeredSync == other.triggeredSync
+            && triggeredResync == other.triggeredResync && deltaLspSync == other.deltaLspSync
+            && includeDbVersion == other.includeDbVersion;
+    }
+
+    @Override
+    protected ToStringHelper addToStringAttributes(final ToStringHelper helper) {
+        if (active) {
+            helper.addValue("active");
+        }
+        if (initiated) {
+            helper.addValue("initiated");
+        }
+        if (triggeredSync) {
+            helper.addValue("triggeredSync");
+        }
+        if (triggeredResync) {
+            helper.addValue("triggeredResync");
+        }
+        if (deltaLspSync) {
+            helper.addValue("deltaLspSync");
+        }
+        if (includeDbVersion) {
+            helper.addValue("includeDbVersion");
+        }
+        return helper;
+    }
 }
index b7d583875080a791cd2f6c9204764234af85a3ba..40854c0280f0b0c47bd360b2b01b2ebc11445615 100644 (file)
@@ -7,17 +7,25 @@
  */
 package org.opendaylight.protocol.pcep.segment.routing;
 
-import com.google.common.base.MoreObjects;
 import java.net.InetSocketAddress;
-import org.kohsuke.MetaInfServices;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.protocol.pcep.PCEPCapability;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev200720.Tlvs1Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev200720.sr.pce.capability.tlv.SrPceCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
 import org.opendaylight.yangtools.yang.common.Uint8;
 
-@MetaInfServices
-public class PCEPSegmentRoutingCapability implements PCEPCapability {
+public final class PCEPSegmentRoutingCapability extends PCEPCapability {
+    private static final @NonNull PCEPSegmentRoutingCapability INSTANCE = new PCEPSegmentRoutingCapability();
+
+    private PCEPSegmentRoutingCapability() {
+        // Hidden on purpose
+    }
+
+    public static @NonNull PCEPSegmentRoutingCapability of() {
+        return INSTANCE;
+    }
+
     @Override
     public void setCapabilityProposal(final InetSocketAddress address, final TlvsBuilder builder) {
         builder.addAugmentation(new Tlvs1Builder()
@@ -30,7 +38,12 @@ public class PCEPSegmentRoutingCapability implements PCEPCapability {
     }
 
     @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this).toString();
+    public int hashCode() {
+        return System.identityHashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return this == obj;
     }
 }
index 20db9b2d6baa8366be1762a8666d03dee6a68e38..5242dd6ff971cee43138aa5351678b89211d8fc7 100644 (file)
@@ -19,7 +19,7 @@ public class PCEPSegmentRoutingCapabilityTest {
     @Test
     public void testSegmentRoutingCapability() {
         final var builder = new TlvsBuilder();
-        new PCEPSegmentRoutingCapability().setCapabilityProposal(null, builder);
+        PCEPSegmentRoutingCapability.of().setCapabilityProposal(null, builder);
         assertEquals(new TlvsBuilder()
             .addAugmentation(new Tlvs1Builder()
                 .setSrPceCapability(new SrPceCapabilityBuilder()
index d17d9e8197bcb56f1aba67afc578935fe9195de8..aa901a17cfb939f5af4a375bd8011c042ded8225 100644 (file)
@@ -43,7 +43,7 @@ import org.opendaylight.yangtools.yang.common.Uint16;
 final class PCEPTopologyConfiguration implements Immutable {
     private static final long DEFAULT_UPDATE_INTERVAL = TimeUnit.SECONDS.toNanos(5);
     private static final @NonNull ImmutableList<PCEPCapability> DEFAULT_CAPABILITIES = ImmutableList.of(
-        new PCEPStatefulCapability(), new P2MPTeLspCapability(), new PCEPSegmentRoutingCapability());
+        new PCEPStatefulCapability(), P2MPTeLspCapability.of(), PCEPSegmentRoutingCapability.of());
 
     private final @NonNull InetSocketAddress address;
     private final @NonNull GraphKey graphKey;
@@ -112,10 +112,10 @@ final class PCEPTopologyConfiguration implements Immutable {
         final var builder = ImmutableList.<PCEPCapability>builder()
             .add(new PCEPStatefulCapability(capabilities.nonnullStateful()));
         if (capabilities.requireP2mp()) {
-            builder.add(new P2MPTeLspCapability());
+            builder.add(P2MPTeLspCapability.of());
         }
         if (capabilities.requireSegmentRouting()) {
-            builder.add(new PCEPSegmentRoutingCapability());
+            builder.add(PCEPSegmentRoutingCapability.of());
         }
         return builder.build();
     }