Updated concepts, mapped InstanceIdentifier to Concepts 72/1872/1
authorTony Tkacik <ttkacik@cisco.com>
Mon, 14 Oct 2013 11:57:04 +0000 (13:57 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Mon, 14 Oct 2013 12:23:11 +0000 (14:23 +0200)
Change-Id: Id02325b55fbcc912344f8ef2afa7a36be24ea4c2
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractListenerRegistration.java [new file with mode: 0644]
concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractObjectRegistration.java [new file with mode: 0644]
concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractRegistration.java
concepts/src/main/java/org/opendaylight/yangtools/concepts/Builder.java
concepts/src/main/java/org/opendaylight/yangtools/concepts/ClassBasedPropertyBuilder.java [new file with mode: 0644]
concepts/src/main/java/org/opendaylight/yangtools/concepts/Identifiable.java
concepts/src/main/java/org/opendaylight/yangtools/concepts/util/Immutables.java [new file with mode: 0644]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/InstanceIdentifier.java

diff --git a/concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractListenerRegistration.java b/concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractListenerRegistration.java
new file mode 100644 (file)
index 0000000..eec6d16
--- /dev/null
@@ -0,0 +1,12 @@
+package org.opendaylight.yangtools.concepts;
+
+import java.util.EventListener;
+
+public abstract class AbstractListenerRegistration<T extends EventListener> extends AbstractObjectRegistration<T>
+        implements ListenerRegistration<T> {
+    
+    public AbstractListenerRegistration(T listener) {
+        super(listener);
+    }
+
+}
diff --git a/concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractObjectRegistration.java b/concepts/src/main/java/org/opendaylight/yangtools/concepts/AbstractObjectRegistration.java
new file mode 100644 (file)
index 0000000..69dddd6
--- /dev/null
@@ -0,0 +1,23 @@
+package org.opendaylight.yangtools.concepts;\r
+\r
+/**\r
+ * Utility registration handle. It is a convenience for register-style method\r
+ * which can return an AutoCloseable realized by a subclass of this class.\r
+ * Invoking the close() method triggers unregistration of the state the method\r
+ * installed.\r
+ */\r
+public abstract class AbstractObjectRegistration<T> extends AbstractRegistration implements Registration<T> {\r
+\r
+    \r
+    private final T instance;\r
+\r
+    public AbstractObjectRegistration(T instance) {\r
+        this.instance = instance;\r
+    }\r
+\r
+    @Override\r
+    public final T getInstance() {\r
+        return instance;\r
+    }\r
+\r
+}\r
index 24b43dde2e155fae7498a9c64d673090ab7b5c38..541686cecf728e7de949f094ff098f4fd3cb472b 100644 (file)
@@ -1,38 +1,27 @@
-package org.opendaylight.yangtools.concepts;\r
-\r
-/**\r
- * Utility registration handle. It is a convenience for register-style method\r
- * which can return an AutoCloseable realized by a subclass of this class.\r
- * Invoking the close() method triggers unregistration of the state the method\r
- * installed.\r
- */\r
-public abstract class AbstractRegistration<T> implements Registration<T> {\r
-\r
-    private boolean closed = false;\r
-    private final T instance;\r
-\r
-    public AbstractRegistration(T instance) {\r
-        this.instance = instance;\r
-    }\r
-\r
-    @Override\r
-    public T getInstance() {\r
-        return instance;\r
-    }\r
-\r
-    /**\r
-     * Remove the state referenced by this registration. This method is\r
-     * guaranteed to be called at most once. The referenced state must be\r
-     * retained until this method is invoked.\r
-     */\r
-    protected abstract void removeRegistration();\r
-\r
-    @Override\r
-    public void close() throws Exception {\r
-        if (!closed) {\r
-            closed = true;\r
-            removeRegistration();\r
-        }\r
-    }\r
-\r
-}\r
+package org.opendaylight.yangtools.concepts;
+
+/**
+ * Utility registration handle. It is a convenience for register-style method
+ * which can return an AutoCloseable realized by a subclass of this class.
+ * Invoking the close() method triggers unregistration of the state the method
+ * installed.
+ */
+public abstract class AbstractRegistration implements AutoCloseable {
+
+    private boolean closed = false;
+    
+    /**
+     * Remove the state referenced by this registration. This method is
+     * guaranteed to be called at most once. The referenced state must be
+     * retained until this method is invoked.
+     */
+    protected abstract void removeRegistration();
+
+    @Override
+    public synchronized void close() throws Exception {
+        if (!closed) {
+            closed = true;
+            removeRegistration();
+        }
+    }
+}
index df2fe2912583b7cb9c00725cd1e92d9c50334531..81d178144d50e9272e2c50c6d377498888929281 100644 (file)
@@ -15,5 +15,14 @@ package org.opendaylight.yangtools.concepts;
  * @author Tony Tkacik <ttkacik@cisco.com>\r
  */\r
 public interface Builder<P> extends Mutable {\r
+    \r
+    /**\r
+     * Returns instance of the product.\r
+     * \r
+     * Multiple calls to this method are not required to return\r
+     * same instance if the state of the builder was changed.\r
+     * \r
+     * @return\r
+     */\r
     P toInstance();\r
 }\r
diff --git a/concepts/src/main/java/org/opendaylight/yangtools/concepts/ClassBasedPropertyBuilder.java b/concepts/src/main/java/org/opendaylight/yangtools/concepts/ClassBasedPropertyBuilder.java
new file mode 100644 (file)
index 0000000..a405538
--- /dev/null
@@ -0,0 +1,23 @@
+package org.opendaylight.yangtools.concepts;
+
+public interface ClassBasedPropertyBuilder<P,T extends ClassBasedPropertyBuilder<P,T>> extends Builder<P> {
+
+    /**
+     * Sets a value of property uniquely identified by it's
+     * class.
+     * 
+     * @param type Type of property to set
+     * @param value Value of property 
+     * @return
+     */
+    <V> T set(Class<V> type,V value);
+    
+    /**
+     * Gets a value of property based on it's type.
+     * 
+     * @param type
+     * @return
+     */
+    <V> V get(Class<V> type);
+
+}
index 185a2106f143b21f934921ce6463ada036882472..cc552a5b70f9a3ff1707f6185a9b2d09d425b7c9 100644 (file)
@@ -8,5 +8,6 @@
 package org.opendaylight.yangtools.concepts;\r
 \r
 public interface Identifiable<T> {\r
+    \r
     T getIdentifier();\r
 }\r
diff --git a/concepts/src/main/java/org/opendaylight/yangtools/concepts/util/Immutables.java b/concepts/src/main/java/org/opendaylight/yangtools/concepts/util/Immutables.java
new file mode 100644 (file)
index 0000000..9708d81
--- /dev/null
@@ -0,0 +1,70 @@
+package org.opendaylight.yangtools.concepts.util;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.concepts.Mutable;
+
+public class Immutables {
+
+    private Immutables() {
+        throw new UnsupportedOperationException("Helper class");
+    }
+
+    public static final Set<Class<?>> KNOWN_IMMUTABLES = Immutables.<Class<?>> asHashSet(
+            //
+            Integer.class, Short.class, BigDecimal.class, BigInteger.class, Byte.class, Character.class, Double.class,
+            Float.class);
+
+    /**
+     * Determines if object is known to be immutable
+     * 
+     * Note: This method may return false to immutable objects which
+     * immutability is not known, was defined not using concepts term.
+     * 
+     * @param o
+     *            Reference to check
+     * @return true if object is known to be immutable false otherwise.
+     */
+    public static boolean isImmutable(Object o) {
+        if (o == null) {
+            throw new IllegalArgumentException("Object should not be null");
+        }
+        if (o instanceof Mutable) {
+            return false;
+        } else if (o instanceof Immutable) {
+            return true;
+        } else if (o instanceof String) {
+            return true;
+        } else if (KNOWN_IMMUTABLES.contains(o.getClass())) {
+            return true;
+        }
+        return false;
+    }
+
+    private static boolean isNumberImmutable(Number o) {
+        if(o instanceof AtomicInteger) {
+            return false;
+        } else if(o instanceof AtomicLong) {
+            return false;
+        } else if(o instanceof Short) {
+            return true;
+        }
+        return false;
+    }
+
+    @SafeVarargs
+    private static <E> Set<E> asHashSet(E... list) {
+        HashSet<E> ret = new HashSet<>();
+        for (E e : list) {
+            ret.add(e);
+        }
+        return Collections.unmodifiableSet(ret);
+    }
+}
index 811b947537fb50ea4d9289a0664bcd4b03ae315b..d74f230ee78afe7bea52be3b7b5e1ac1b4c93ccd 100644 (file)
@@ -6,6 +6,7 @@ import java.util.HashMap;
 import java.util.List;\r
 import java.util.Map;\r
 \r
+import org.opendaylight.yangtools.concepts.Builder;\r
 import org.opendaylight.yangtools.concepts.Immutable;\r
 import org.opendaylight.yangtools.concepts.Path;\r
 import org.opendaylight.yangtools.yang.common.QName;\r
@@ -53,11 +54,11 @@ public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable {
 \r
     // Static factories & helpers\r
 \r
-    public InstanceIdentifier of(QName name) {\r
+    public static InstanceIdentifier of(QName name) {\r
         return new InstanceIdentifier(new NodeIdentifier(name));\r
     }\r
 \r
-    public InstanceIdentifierBuilder builder() {\r
+    static public InstanceIdentifierBuilder builder() {\r
         return new BuilderImpl();\r
     }\r
 \r
@@ -66,13 +67,14 @@ public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable {
 \r
     }\r
 \r
-    public interface InstanceIdentifierBuilder {\r
+    public interface InstanceIdentifierBuilder extends Builder<InstanceIdentifier>{\r
         InstanceIdentifierBuilder node(QName nodeType);\r
 \r
         InstanceIdentifierBuilder nodeWithKey(QName nodeType, Map<QName, Object> keyValues);\r
 \r
         InstanceIdentifierBuilder nodeWithKey(QName nodeType, QName key, Object value);\r
 \r
+        @Deprecated\r
         InstanceIdentifier getIdentifier();\r
     }\r
 \r
@@ -192,9 +194,14 @@ public class InstanceIdentifier implements Path<InstanceIdentifier>, Immutable {
         }\r
 \r
         @Override\r
-        public InstanceIdentifier getIdentifier() {\r
+        public InstanceIdentifier toInstance() {\r
             return new InstanceIdentifier(path);\r
         }\r
+        \r
+        @Override\r
+        public InstanceIdentifier getIdentifier() {\r
+            return toInstance();\r
+        }\r
     }\r
 \r
     @Override\r