Reduce number of paramaters for PCEP Dispatcher
[bgpcep.git] / pcep / impl / src / main / java / org / opendaylight / protocol / pcep / impl / BasePCEPSessionProposalFactory.java
index 8eed88fe772576102fe21e43b34408719597f65a..fd4e7d073405ad7ac902c6218706eb1361039e38 100644 (file)
@@ -7,27 +7,49 @@
  */
 package org.opendaylight.protocol.pcep.impl;
 
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Preconditions;
 import java.net.InetSocketAddress;
+import java.util.List;
+import org.opendaylight.protocol.pcep.PCEPCapability;
+import org.opendaylight.protocol.pcep.PCEPPeerProposal;
 import org.opendaylight.protocol.pcep.PCEPSessionProposalFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-public class BasePCEPSessionProposalFactory implements PCEPSessionProposalFactory {
+public final class BasePCEPSessionProposalFactory implements PCEPSessionProposalFactory {
+    private static final Logger LOG = LoggerFactory.getLogger(BasePCEPSessionProposalFactory.class);
+    private static final int KA_TO_DEADTIMER_RATIO = 4;
 
     private final int keepAlive, deadTimer;
+    private final List<PCEPCapability> capabilities;
+
+    public BasePCEPSessionProposalFactory(final int deadTimer, final int keepAlive, final List<PCEPCapability> capabilities) {
+        if(keepAlive != 0) {
+            Preconditions.checkArgument(keepAlive >= 1, "Minimum value for keep-alive-timer-value is 1");
+            if(deadTimer != 0 && (deadTimer / keepAlive != KA_TO_DEADTIMER_RATIO)) {
+                LOG.warn("dead-timer-value should be {} times greater than keep-alive-timer-value", KA_TO_DEADTIMER_RATIO);
+            }
+        }
 
-    public BasePCEPSessionProposalFactory(final int deadTimer, final int keepAlive) {
         this.deadTimer = deadTimer;
         this.keepAlive = keepAlive;
+        this.capabilities = requireNonNull(capabilities);
     }
 
-    protected void addTlvs(final InetSocketAddress address, final TlvsBuilder builder) {
-        // No TLVs by default
+    private void addTlvs(final InetSocketAddress address, final TlvsBuilder builder) {
+        for (final PCEPCapability capability : this.capabilities) {
+            capability.setCapabilityProposal(address, builder);
+        }
     }
 
     @Override
-    public final Open getSessionProposal(final InetSocketAddress address, final int sessionId) {
+    public Open getSessionProposal(final InetSocketAddress address, final int sessionId,
+            final PCEPPeerProposal peerProposal) {
         final OpenBuilder oBuilder = new OpenBuilder();
         oBuilder.setSessionId((short) sessionId);
         oBuilder.setKeepalive((short) BasePCEPSessionProposalFactory.this.keepAlive);
@@ -39,14 +61,15 @@ public class BasePCEPSessionProposalFactory implements PCEPSessionProposalFactor
 
         final TlvsBuilder builder = new TlvsBuilder();
         addTlvs(address, builder);
-        return oBuilder.setTlvs(builder.build()).build();
-    }
 
-    public final int getKeepAlive() {
-        return this.keepAlive;
+        if (peerProposal != null) {
+            peerProposal.setPeerSpecificProposal(address, builder);
+        }
+        return oBuilder.setTlvs(builder.build()).build();
     }
 
-    public final int getDeadTimer() {
-        return this.deadTimer;
+    @Override
+    public List<PCEPCapability> getCapabilities() {
+        return this.capabilities;
     }
 }