HC2VPP-187 - Naming context improvements 64/7864/1
authorJan Srnicek <[email protected]>
Tue, 1 Aug 2017 08:11:42 +0000 (10:11 +0200)
committerJan Srnicek <[email protected]>
Tue, 1 Aug 2017 08:11:42 +0000 (10:11 +0200)
Adds option to throw specific exception on non existing mapping

Change-Id: I1903ad8d0d660380680f99f0252e7ec6d9c8862d
Signed-off-by: Jan Srnicek <[email protected]>
vpp-common/vpp-translate-utils/src/main/java/io/fd/hc2vpp/common/translate/util/NamingContext.java
vpp-common/vpp-translate-utils/src/test/java/io/fd/hc2vpp/common/translate/util/NamingContextTest.java

index 5e0eea7..8e5c31a 100644 (file)
@@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkState;
 import com.google.common.base.Optional;
 import io.fd.honeycomb.translate.MappingContext;
 import io.fd.honeycomb.translate.util.RWUtils;
+import java.util.function.Supplier;
 import java.util.stream.Collector;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.Contexts;
@@ -168,6 +169,26 @@ public final class NamingContext implements AutoCloseable {
 
     }
 
+    /**
+     * Returns index value associated with the given name.
+     *
+     * @param name               the name whose associated index value is to be returned
+     * @param mappingContext     mapping context providing context data for current transaction
+     * @param throwIfNonExisting if mapping was not found, supplied exception will be thrown
+     * @return integer index value matching supplied name
+     * @throws T if name was not found
+     */
+    public synchronized <T extends Throwable> int getIndex(final String name,
+                                                           final MappingContext mappingContext,
+                                                           final Supplier<T> throwIfNonExisting) throws T {
+        // supplier is used to not instantiate exception if not needed
+        final Optional<Mapping> read = mappingContext.read(getMappingIid(name));
+        if (!read.isPresent()) {
+            throw throwIfNonExisting.get();
+        }
+        return read.get().getIndex();
+    }
+
     /**
      * Check whether mapping is present for name.
      *
index 4e66315..c85a874 100644 (file)
@@ -17,6 +17,7 @@
 package io.fd.hc2vpp.common.translate.util;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -104,6 +105,13 @@ public class NamingContextTest implements InjectablesProcessor {
                 .build());
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void getAndThrow() {
+        when(mappingContext.read(any())).thenReturn(Optional.absent());
+        namingContext
+                .getIndex("non-existing", mappingContext, () -> new IllegalArgumentException("Non existing index"));
+    }
+
     private Mapping filterForParent(final String parent) {
         return mappings.getMapping().stream()
                 .filter(mapping -> mapping.getName().equals(parent))