*/
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;
+ }
}
*/
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()
}
@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;
}
}
*/
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;
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;
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;
+ }
}
*/
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()
}
@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;
}
}
@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()
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;
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();
}