Bug 4827: PeerSpecificParserConstraint implementation 16/37316/7
authorMilos Fabian <milfabia@cisco.com>
Thu, 7 Apr 2016 11:49:53 +0000 (13:49 +0200)
committerMilos Fabian <milfabia@cisco.com>
Tue, 3 May 2016 09:53:03 +0000 (11:53 +0200)
Implemented PeerSpecificParserConstraint for holding
peer specific contraints used during a process
of BGP PDUs parsing.

Change-Id: I2c82cb8d0f5eb6e08c790d0e071724e53d6fde7c
Signed-off-by: Milos Fabian <milfabia@cisco.com>
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/PeerSpecificParserConstraintProvider.java [new file with mode: 0644]
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/PeerSpecificParserConstraintImpl.java [new file with mode: 0644]
bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/pojo/PeerSpecificParserConstraintImplTest.java [new file with mode: 0644]

diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/PeerSpecificParserConstraintProvider.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/PeerSpecificParserConstraintProvider.java
new file mode 100644 (file)
index 0000000..6f17d2a
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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.protocol.bgp.parser.spi;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Serve as an entry gate for providers of {@link PeerSpecificParserConstraint} services.
+ *
+ */
+public interface PeerSpecificParserConstraintProvider extends PeerSpecificParserConstraint {
+
+    /**
+     * Register new {@link PeerConstraint} service.
+     * @param classType Class type of the service to be added.
+     * @param peerConstraint Peer constraint service to be added.
+     * @return True if service was added, false if not (such service is already registered).
+     */
+    <T extends PeerConstraint> boolean addPeerConstraint(@Nonnull Class<T> classType, @Nonnull T peerConstraint);
+
+}
diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/PeerSpecificParserConstraintImpl.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/PeerSpecificParserConstraintImpl.java
new file mode 100644 (file)
index 0000000..d9c970b
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * 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.protocol.bgp.parser.spi.pojo;
+
+import com.google.common.base.Preconditions;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import javax.annotation.concurrent.GuardedBy;
+import org.opendaylight.protocol.bgp.parser.spi.PeerConstraint;
+import org.opendaylight.protocol.bgp.parser.spi.PeerSpecificParserConstraintProvider;
+
+public class PeerSpecificParserConstraintImpl implements PeerSpecificParserConstraintProvider {
+
+    @GuardedBy("this")
+    private final Map<Class<? extends PeerConstraint>, PeerConstraint> constraints = new HashMap<>();
+
+    @Override
+    public synchronized <T extends PeerConstraint> Optional<T> getPeerConstraint(final Class<T> peerConstraintType) {
+        return (Optional<T>) Optional.ofNullable(this.constraints.get(peerConstraintType));
+    }
+
+    @Override
+    public synchronized <T extends PeerConstraint> boolean addPeerConstraint(final Class<T> classType, final T peerConstraint) {
+        Preconditions.checkNotNull(classType);
+        Preconditions.checkNotNull(peerConstraint);
+        final PeerConstraint previous = this.constraints.putIfAbsent(classType, peerConstraint);
+        return previous == null;
+    }
+
+}
diff --git a/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/pojo/PeerSpecificParserConstraintImplTest.java b/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/pojo/PeerSpecificParserConstraintImplTest.java
new file mode 100644 (file)
index 0000000..5e80029
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * 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.protocol.bgp.parser.spi.pojo;
+
+import java.util.Collections;
+import java.util.Optional;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.protocol.bgp.parser.spi.MultiPathSupport;
+import org.opendaylight.protocol.bgp.parser.spi.PeerSpecificParserConstraintProvider;
+
+public class PeerSpecificParserConstraintImplTest {
+
+    private static final MultiPathSupport ADD_PATH_CONSTRAINT = MultiPathSupportImpl.createParserMultiPathSupport(Collections.emptyList());
+
+    private PeerSpecificParserConstraintProvider constraints;
+
+    @Before
+    public void setUp() {
+        this.constraints = new PeerSpecificParserConstraintImpl();
+    }
+
+    @Test
+    public void testProviderSucess() {
+        Assert.assertTrue(this.constraints.addPeerConstraint(MultiPathSupport.class, ADD_PATH_CONSTRAINT));
+    }
+
+    @Test
+    public void testProviderAlreadyPresent() {
+        this.constraints.addPeerConstraint(MultiPathSupport.class, ADD_PATH_CONSTRAINT);
+        Assert.assertFalse(this.constraints.addPeerConstraint(MultiPathSupport.class, ADD_PATH_CONSTRAINT));
+    }
+
+    @Test(expected=NullPointerException.class)
+    public void testProviderNullInput() {
+        this.constraints.addPeerConstraint(MultiPathSupport.class, null);
+    }
+
+    @Test
+    public void testGetPeerConstraintSuccess() {
+        this.constraints.addPeerConstraint(MultiPathSupport.class, ADD_PATH_CONSTRAINT);
+        final Optional<MultiPathSupport> peerConstraint = this.constraints.getPeerConstraint(MultiPathSupport.class);
+        Assert.assertTrue(peerConstraint.isPresent());
+    }
+
+    @Test
+    public void testGetPeerConstraintNonExisting() {
+        final Optional<MultiPathSupport> peerConstraint = this.constraints.getPeerConstraint(MultiPathSupport.class);
+        Assert.assertFalse(peerConstraint.isPresent());
+    }
+
+}