Optimize immutable lookups
[yangtools.git] / yang / yang-model-util / src / main / java / org / opendaylight / yangtools / yang / model / util / BaseTypes.java
index 76157fbcb115769eec7071cf7f928c298072f7d6..1d9603867099afd1d061606adc0665ec2e26729f 100644 (file)
-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.yangtools.yang.model.util;\r
-\r
-import java.net.URI;\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.Date;\r
-import java.util.List;\r
-\r
-import org.opendaylight.yangtools.yang.common.QName;\r
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;\r
-\r
-public final class BaseTypes {\r
-\r
-    private BaseTypes() {}\r
-\r
-    public static final URI BaseTypesNamespace = URI\r
-            .create("urn:ietf:params:xml:ns:yang:1");\r
-\r
-    /**\r
-     * Construct QName for Built-in base Yang type. The namespace for\r
-     * built-in base yang types is defined as: urn:ietf:params:xml:ns:yang:1\r
-     *\r
-     * @param typeName yang type name\r
-     * @return built-in base yang type QName.\r
-     */\r
-    public static final QName constructQName(final String typeName) {\r
-        return new QName(BaseTypesNamespace, typeName);\r
-    }\r
-\r
-    /**\r
-     * Creates Schema Path from Qname.\r
-     *\r
-     * @param typeName yang type QName\r
-     * @return Schema Path from Qname.\r
-     */\r
-    public static final SchemaPath schemaPath(final QName typeName) {\r
-        List<QName> pathList = Collections.singletonList(typeName);\r
-        return new SchemaPath(pathList, true);\r
-    }\r
-\r
-    /**\r
-     * Creates Schema Path from List of partial paths defined as Strings, module Namespace and\r
-     * module latest Revision Date.\r
-     *\r
-     * @param actualPath List of partial paths\r
-     * @param namespace Module Namespace\r
-     * @param revision Revision Date\r
-     * @return Schema Path\r
-     */\r
-    public static final SchemaPath schemaPath(final List<String> actualPath, final URI namespace, final Date revision) {\r
-        if (actualPath == null) {\r
-            throw new IllegalArgumentException("The actual path List MUST be specified.");\r
-        }\r
-        final List<QName> pathList = new ArrayList<QName>();\r
-        for (final String path : actualPath) {\r
-            final QName qname = new QName(namespace, revision, path);\r
-            if (qname != null) {\r
-                pathList.add(qname);\r
-            }\r
-        }\r
-        return new SchemaPath(pathList, true);\r
-    }\r
-}\r
+/*
+ * Copyright (c) 2013 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.yangtools.yang.model.util;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.YangConstants;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+
+/**
+ * Utility methods and constants to work with built-in YANG types.
+ */
+public final class BaseTypes {
+
+    private BaseTypes() {
+    }
+
+    public static final QName BINARY_QNAME = constructQName("binary");
+    public static final QName BITS_QNAME = constructQName("bits");
+    public static final QName BOOLEAN_QNAME = constructQName("boolean");
+    public static final QName DECIMAL64_QNAME = constructQName("decimal64");
+    public static final QName EMPTY_QNAME = constructQName("empty");
+    public static final QName ENUMERATION_QNAME = constructQName("enumeration");
+    public static final QName IDENTITYREF_QNAME = constructQName("identityref");
+    public static final QName INSTANCE_IDENTIFIER_QNAME = constructQName("instance-identifier");
+    public static final QName INT8_QNAME = constructQName("int8");
+    public static final QName INT16_QNAME = constructQName("int16");
+    public static final QName INT32_QNAME = constructQName("int32");
+    public static final QName INT64_QNAME = constructQName("int64");
+    public static final QName LEAFREF_QNAME = constructQName("leafref");
+    public static final QName STRING_QNAME = constructQName("string");
+    public static final QName UINT8_QNAME = constructQName("uint8");
+    public static final QName UINT16_QNAME = constructQName("uint16");
+    public static final QName UINT32_QNAME = constructQName("uint32");
+    public static final QName UINT64_QNAME = constructQName("uint64");
+    public static final QName UNION_QNAME = constructQName("union");
+
+    private static final ImmutableSet<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();
+
+    /**
+     * Construct QName for Built-in base Yang type. The namespace for built-in
+     * base yang types is defined as: urn:ietf:params:xml:ns:yang:1
+     *
+     * @param typeName
+     *            yang type name
+     * @return built-in base yang type QName.
+     */
+    public static QName constructQName(final String typeName) {
+        return QName.create(YangConstants.RFC6020_YANG_MODULE, typeName).intern();
+    }
+
+    /**
+     * Returns true if supplied type is representation of built-in YANG type as
+     * per RFC 6020.
+     *
+     * <p>
+     * See package documentation for description of base types.
+     *
+     * @param type A type name
+     * @return true if type is built-in YANG Types.
+     */
+    public static boolean isYangBuildInType(final String type) {
+        return !Strings.isNullOrEmpty(type) && BUILT_IN_TYPES.contains(
+                QName.create(YangConstants.RFC6020_YANG_MODULE, type));
+    }
+
+    /**
+     * Returns true if supplied type is representation of built-in YANG type as
+     * per RFC 6020.
+     *
+     * <p>
+     * See package documentation for description of base types.
+     *
+     * @param type Type definition
+     * @return true if type is built-in YANG Types.
+     */
+    public static boolean isYangBuildInType(final TypeDefinition<?> type) {
+        return type != null && BUILT_IN_TYPES.contains(type.getQName());
+    }
+}