Bug 4969: NPE in JSONCodecFactory by attempt to find codec for a leafref
[yangtools.git] / yang / yang-model-util / src / main / java / org / opendaylight / yangtools / yang / model / util / BaseTypes.java
index 002746fa571d8b9616e4ca78ddfd406bcfd005ef..18e58d41a5d14a8d52c2f4b993c1850feaeb1807 100644 (file)
@@ -9,17 +9,13 @@ package org.opendaylight.yangtools.yang.model.util;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
-
 import java.net.URI;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
 import java.util.Set;
-
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.common.YangConstants;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 
 /**
@@ -32,8 +28,16 @@ public final class BaseTypes {
     private BaseTypes() {
     }
 
-    public static final URI BASE_TYPES_NAMESPACE = URI.create("urn:ietf:params:xml:ns:yang:1");
-    public static final QNameModule BASE_TYPES_MODULE = QNameModule.create(BASE_TYPES_NAMESPACE, null);
+    /**
+     * @deprecated Use {@link YangConstants#RFC6020_YANG_NAMESPACE} instead. To be removed in Boron release.
+     */
+    @Deprecated
+    public static final URI BASE_TYPES_NAMESPACE = YangConstants.RFC6020_YANG_NAMESPACE;
+    /**
+     * @deprecated Use {@link YangConstants#RFC6020_YANG_MODULE} instead. To be removed in Boron release.
+     */
+    @Deprecated
+    public static final QNameModule BASE_TYPES_MODULE = YangConstants.RFC6020_YANG_MODULE;
 
     public static final QName BINARY_QNAME = constructQName("binary");
     public static final QName BITS_QNAME = constructQName("bits");
@@ -55,25 +59,26 @@ public final class BaseTypes {
     public static final QName UINT64_QNAME = constructQName("uint64");
     public static final QName UNION_QNAME = constructQName("union");
 
-    private static final Set<String> BUILD_IN_TYPES = ImmutableSet.<String> builder().add(BINARY_QNAME.getLocalName()) //
-            .add(BITS_QNAME.getLocalName()) //
-            .add(BOOLEAN_QNAME.getLocalName()) //
-            .add(DECIMAL64_QNAME.getLocalName()) //
-            .add(EMPTY_QNAME.getLocalName()) //
-            .add(ENUMERATION_QNAME.getLocalName()) //
-            .add(IDENTITYREF_QNAME.getLocalName()) //
-            .add(INSTANCE_IDENTIFIER_QNAME.getLocalName()) //
-            .add(INT8_QNAME.getLocalName()) //
-            .add(INT16_QNAME.getLocalName()) //
-            .add(INT32_QNAME.getLocalName()) //
-            .add(INT64_QNAME.getLocalName()) //
-            .add(LEAFREF_QNAME.getLocalName()) //
-            .add(STRING_QNAME.getLocalName()) //
-            .add(UINT8_QNAME.getLocalName()) //
-            .add(UINT16_QNAME.getLocalName()) //
-            .add(UINT32_QNAME.getLocalName()) //
-            .add(UINT64_QNAME.getLocalName()) //
-            .add(UNION_QNAME.getLocalName()) //
+    private static final Set<QName> BUILT_IN_TYPES = ImmutableSet.<QName>builder()
+            .add(BINARY_QNAME)
+            .add(BITS_QNAME)
+            .add(BOOLEAN_QNAME)
+            .add(DECIMAL64_QNAME)
+            .add(EMPTY_QNAME)
+            .add(ENUMERATION_QNAME)
+            .add(IDENTITYREF_QNAME)
+            .add(INSTANCE_IDENTIFIER_QNAME)
+            .add(INT8_QNAME)
+            .add(INT16_QNAME)
+            .add(INT32_QNAME)
+            .add(INT64_QNAME)
+            .add(LEAFREF_QNAME)
+            .add(STRING_QNAME)
+            .add(UINT8_QNAME)
+            .add(UINT16_QNAME)
+            .add(UINT32_QNAME)
+            .add(UINT64_QNAME)
+            .add(UNION_QNAME)
             .build();
 
     /**
@@ -85,50 +90,23 @@ public final class BaseTypes {
      * @return built-in base yang type QName.
      */
     public static QName constructQName(final String typeName) {
-        return QName.create(BASE_TYPES_MODULE, "", typeName);
-    }
-
-    /**
-     * Creates Schema Path from {@link QName}.
-     *
-     * @param typeName
-     *            yang type QName
-     * @return Schema Path from Qname.
-     * @deprecated Use {@link SchemaPath#create(boolean, QName...)} instead.
-     */
-    @Deprecated
-    public static SchemaPath schemaPath(final QName typeName) {
-        return SchemaPath.create(true, typeName);
+        return QName.create(YangConstants.RFC6020_YANG_MODULE, typeName).intern();
     }
 
     /**
-     * Creates Schema Path from List of partial paths defined as Strings, module
-     * Namespace and module latest Revision Date.
+     * Returns true if supplied type is representation of built-in YANG type as
+     * per RFC 6020.
      *
-     * @param actualPath
-     *            List of partial paths
-     * @param namespace
-     *            Module Namespace
-     * @param revision
-     *            Revision Date
-     * @return Schema Path
+     * See package documentation for description of base types.
      *
-     * @deprecated Use {@link SchemaPath#create(boolean, Iterable)} with QNames
-     *             manually constructed.
+     * @param type
+     * @return true if type is built-in YANG Types.
      */
-    @Deprecated
-    public static SchemaPath schemaPath(final List<String> actualPath, final URI namespace, final Date revision) {
-        if (actualPath == null) {
-            throw new IllegalArgumentException("The actual path List MUST be specified.");
-        }
-        final List<QName> pathList = new ArrayList<QName>();
-        for (final String path : actualPath) {
-            final QName qname = QName.create(namespace, revision, path);
-            if (qname != null) {
-                pathList.add(qname);
-            }
+    public static boolean isYangBuildInType(final String type) {
+        if (Strings.isNullOrEmpty(type)) {
+            return false;
         }
-        return SchemaPath.create(pathList, true);
+        return BUILT_IN_TYPES.contains(QName.create(YangConstants.RFC6020_YANG_MODULE, type));
     }
 
     /**
@@ -140,8 +118,11 @@ public final class BaseTypes {
      * @param type
      * @return true if type is built-in YANG Types.
      */
-    public static boolean isYangBuildInType(final String type) {
-        return BUILD_IN_TYPES.contains(type);
+    public static boolean isYangBuildInType(final TypeDefinition<?> type) {
+        if(type == null) {
+            return false;
+        }
+        return BUILT_IN_TYPES.contains(type.getQName());
     }
 
     /**
@@ -154,11 +135,14 @@ public final class BaseTypes {
      * @return Returns default instance or {@link Optional#absent()} if default
      *         instance does not exists
      *
+     * @deprecated Use parser-specific lookup tables.
      */
+    @Deprecated
     public static Optional<TypeDefinition<?>> defaultBaseTypeFor(final String typeName) {
         return Optional.<TypeDefinition<?>> fromNullable(defaultBaseTypeForImpl(typeName));
     }
 
+    @Deprecated
     private static TypeDefinition<?> defaultBaseTypeForImpl(final String typeName) {
         Preconditions.checkNotNull(typeName, "typeName must not be null.");
 
@@ -191,7 +175,7 @@ public final class BaseTypes {
         } else if ("empty".equals(typeName)) {
             return EmptyType.getInstance();
         } else if ("instance-identifier".equals(typeName)) {
-            return InstanceIdentifier.getInstance();
+            return InstanceIdentifierType.getInstance();
         }
         return null;
     }