Merge "BUG-990: fixed deserialization of enums."
authorTony Tkacik <ttkacik@cisco.com>
Tue, 20 May 2014 13:35:46 +0000 (13:35 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 20 May 2014 13:35:46 +0000 (13:35 +0000)
15 files changed:
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/TransformerGenerator.xtend
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/YangSchemaUtils.java
code-generator/binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/generated/type/builder/EnumerationBuilderImpl.java
code-generator/binding-generator-util/src/test/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtilTest.java
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/GeneratorUtil.java
code-generator/binding-type-provider/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java
model/ietf/ietf-restconf/pom.xml
model/ietf/ietf-restconf/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/DatastoreIdentifierBuilder.java [new file with mode: 0644]
model/ietf/ietf-restconf/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/restconf/restconf/modules/RevisionBuilder.java [new file with mode: 0644]
model/ietf/ietf-restconf/src/main/yang/ietf-restconf.yang [deleted file]
model/ietf/ietf-restconf/src/main/yang/ietf-restconf@2013-10-19.yang [new file with mode: 0644]
model/ietf/ietf-restconf/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/restconf/restconf/modules/RevisionBuilderTest.java [new file with mode: 0644]
model/ietf/ietf-yang-types-20130715/pom.xml [new file with mode: 0644]
model/ietf/ietf-yang-types-20130715/src/main/yang/ietf-yang-types@2013-07-15.yang [new file with mode: 0644]
model/ietf/pom.xml

index b4a25f66c15ce4494dd083ab50a78e7bb5df5a26..81f39e4e5de9c877c2badba835b02507f2fceac8 100644 (file)
@@ -1246,7 +1246,7 @@ class TransformerGenerator extends AbstractTransformerGenerator {
                             }
                             «typeSpec.resolvedName» _value = («typeSpec.resolvedName») $1;
                             «FOR en : enumSchema.values»
-                            if(«typeSpec.resolvedName».«BindingGeneratorUtil.parseToClassName(en.name)».equals(_value)) {
+                            if(«typeSpec.resolvedName».«BindingMapping.getClassName(en.name)».equals(_value)) {
                                 return "«en.name»";
                             }
                             «ENDFOR»
@@ -1269,7 +1269,7 @@ class TransformerGenerator extends AbstractTransformerGenerator {
                             String _value = (String) $1;
                             «FOR en : enumSchema.values»
                                 if("«en.name»".equals(_value)) {
-                                    return «typeSpec.resolvedName».«BindingGeneratorUtil.parseToClassName(en.name)»;
+                                    return «typeSpec.resolvedName».«BindingMapping.getClassName(en.name)»;
                                 }
                             «ENDFOR»
                             return null;
index bf6fcec33379460f4971412e3c7096739573991f..3079c556b16293568a699092e0693d20fd4d7389 100644 (file)
@@ -78,9 +78,6 @@ public final class YangSchemaUtils {
             return null;
         }
         checkArgument(arguments.size() == 1);
-        for (QName qName : arguments) {
-            //previous.getDataChildByName(qName);
-        }
         for(TypeDefinition<?> typedef : previous.getTypeDefinitions()) {
             if(typedef.getQName().equals(typeQName)) {
                 return typedef;
index e2ca93bbe49db64bf874195c08d584a4edd4c40f..870fcd9ec864546637ff8ed34dd2b75e78c9663c 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.yangtools.binding.generator.util.generated.type.builder;
 
-import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToClassName;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -23,6 +21,7 @@ import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature;
 import org.opendaylight.yangtools.sal.binding.model.api.Type;
 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder;
 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.EnumBuilder;
+import org.opendaylight.yangtools.yang.binding.BindingMapping;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
 
@@ -62,7 +61,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see java.lang.Object#hashCode()
      */
     @Override
@@ -76,7 +75,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see java.lang.Object#equals(java.lang.Object)
      */
     @Override
@@ -110,7 +109,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see java.lang.Object#toString()
      */
     @Override
@@ -133,7 +132,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
             int listIndex = 0;
             for (final EnumPair enumPair : enums) {
                 if (enumPair != null) {
-                    final String enumPairName = parseToClassName(enumPair.getName());
+                    final String enumPairName = BindingMapping.getClassName(enumPair.getName());
                     Integer enumPairValue = enumPair.getValue();
 
                     if (enumPairValue == null) {
@@ -170,7 +169,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
         /*
          * (non-Javadoc)
-         * 
+         *
          * @see java.lang.Object#hashCode()
          */
         @Override
@@ -184,7 +183,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
         /*
          * (non-Javadoc)
-         * 
+         *
          * @see java.lang.Object#equals(java.lang.Object)
          */
         @Override
@@ -218,7 +217,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
         /*
          * (non-Javadoc)
-         * 
+         *
          * @see java.lang.Object#toString()
          */
         @Override
@@ -314,7 +313,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
         /*
          * (non-Javadoc)
-         * 
+         *
          * @see java.lang.Object#hashCode()
          */
         @Override
@@ -330,7 +329,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
         /*
          * (non-Javadoc)
-         * 
+         *
          * @see java.lang.Object#equals(java.lang.Object)
          */
         @Override
@@ -371,7 +370,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
 
         /*
          * (non-Javadoc)
-         * 
+         *
          * @see java.lang.Object#toString()
          */
         @Override
@@ -430,7 +429,7 @@ public final class EnumerationBuilderImpl extends AbstractBaseType implements En
             // TODO Auto-generated method stub
             return Collections.emptyList();
         }
-        
+
         @Override
         public List<GeneratedProperty> getProperties() {
             return Collections.emptyList();
index 4b7a86539d126838bdd869b0bfd5472d55414d66..9a572b35db59b94b200648b19d15e1053c96c9e7 100644 (file)
@@ -19,6 +19,7 @@ import java.util.List;
 import java.util.Set;
 
 import org.junit.Test;
+import org.opendaylight.yangtools.yang.binding.BindingMapping;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
@@ -149,9 +150,9 @@ public class BindingGeneratorUtilTest {
     public void testParsingMethods() {
         // parseToClassName method testing
         assertEquals("Class name has incorrect format", "SomeTestingClassName",
-                BindingGeneratorUtil.parseToClassName("  some-testing_class name   "));
+                BindingMapping.getClassName("  some-testing_class name   "));
         assertEquals("Class name has incorrect format", "_0SomeTestingClassName",
-                BindingGeneratorUtil.parseToClassName("  0 some-testing_class name   "));
+                BindingMapping.getClassName("  0 some-testing_class name   "));
 
         // parseToValidParamName
         assertEquals("Parameter name has incorrect format", "someTestingParameterName",
index a04dd7d0f50d2ff61fe29e46eb2e5f02da0841a2..c2b97b090aeffe5235fbb132bb6157c34adf3865 100644 (file)
@@ -128,8 +128,8 @@ public final class GeneratorUtil {
      */
     public static void putTypeIntoImports(final GeneratedType parentGenType, final Type type,
             final Map<String, String> imports) {
-        checkArgument(parentGenType != null,
-                "Parent Generated Type parameter MUST be specified and cannot be " + "NULL!");
+        checkArgument(parentGenType != null, "Parent Generated Type parameter MUST be specified and cannot be "
+                + "NULL!");
         checkArgument(parentGenType.getName() != null, "Parent Generated Type name cannot be NULL!");
         checkArgument(parentGenType.getPackageName() != null,
                 "Parent Generated Type cannot have Package Name referenced as NULL!");
@@ -141,9 +141,7 @@ public final class GeneratorUtil {
         final String typeName = type.getName();
         final String typePackageName = type.getPackageName();
         final String parentTypeName = parentGenType.getName();
-        final String parentTypePackageName = parentGenType.getPackageName();
-        if (typeName.equals(parentTypeName) || typePackageName.startsWith("java.lang")
-                 || typePackageName.isEmpty()) {
+        if (typeName.equals(parentTypeName) || typePackageName.startsWith("java.lang") || typePackageName.isEmpty()) {
             return;
         }
         if (!imports.containsKey(typeName)) {
index fdf6e242b673dcce1e06186c5fe8ba5c34126b3d..fe685e2478144f47ae92fd1af01b10b540b05f88 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.yangtools.sal.binding.yang.types;
 
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.moduleNamespaceToPackageName;
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.packageNameForGeneratedType;
-import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToClassName;
 import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToValidParamName;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNode;
 import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNodeForRelativeXPath;
@@ -275,7 +274,7 @@ public final class TypeProviderImpl implements TypeProvider {
 
         final String basePackageName = moduleNamespaceToPackageName(module);
         final String packageName = packageNameForGeneratedType(basePackageName, identity.getPath());
-        final String genTypeName = parseToClassName(identity.getQName().getLocalName());
+        final String genTypeName = BindingMapping.getClassName(identity.getQName());
 
         Type baseType = Types.typeForClass(Class.class);
         Type paramType = Types.wildcardTypeFor(packageName, genTypeName);
@@ -481,7 +480,7 @@ public final class TypeProviderImpl implements TypeProvider {
         Preconditions.checkArgument(enumTypeDef.getQName().getLocalName() != null,
                 "Local Name in EnumTypeDefinition QName cannot be NULL!");
 
-        final String enumerationName = parseToClassName(enumName);
+        final String enumerationName = BindingMapping.getClassName(enumName);
 
         Module module = findParentModule(schemaContext, parentNode);
         final String basePackageName = moduleNamespaceToPackageName(module);
@@ -524,7 +523,7 @@ public final class TypeProviderImpl implements TypeProvider {
                 "Local Name in EnumTypeDefinition QName cannot be NULL!");
         Preconditions.checkArgument(typeBuilder != null, "Generated Type Builder reference cannot be NULL!");
 
-        final String enumerationName = parseToClassName(enumName);
+        final String enumerationName = BindingMapping.getClassName(enumName);
 
         final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumerationName);
         enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef);
@@ -590,7 +589,6 @@ public final class TypeProviderImpl implements TypeProvider {
             if (module == null) {
                 continue;
             }
-            final String moduleName = module.getName();
             final String basePackageName = moduleNamespaceToPackageName(module);
 
             final DataNodeIterator it = new DataNodeIterator(module);
@@ -784,7 +782,7 @@ public final class TypeProviderImpl implements TypeProvider {
 
         final GeneratedTOBuilder unionGenTOBuilder;
         if (typeDefName != null && !typeDefName.isEmpty()) {
-            final String typeName = parseToClassName(typeDefName);
+            final String typeName = BindingMapping.getClassName(typeDefName);
             unionGenTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeName);
         } else {
             unionGenTOBuilder = typedefToTransferObject(basePackageName, typedef);
@@ -984,7 +982,7 @@ public final class TypeProviderImpl implements TypeProvider {
         final String typeDefTOName = typedef.getQName().getLocalName();
 
         if ((packageName != null) && (typedef != null) && (typeDefTOName != null)) {
-            final String genTOName = parseToClassName(typeDefTOName);
+            final String genTOName = BindingMapping.getClassName(typeDefTOName);
             final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(packageName, genTOName);
             newType.addComment(typedef.getDescription());
             return newType;
@@ -1021,7 +1019,7 @@ public final class TypeProviderImpl implements TypeProvider {
         if (typeDef instanceof BitsTypeDefinition) {
             BitsTypeDefinition bitsTypeDefinition = (BitsTypeDefinition) typeDef;
 
-            final String typeName = parseToClassName(typeDefName);
+            final String typeName = BindingMapping.getClassName(typeDefName);
             final GeneratedTOBuilder genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, typeName);
 
             final List<Bit> bitList = bitsTypeDefinition.getBits();
@@ -1132,7 +1130,7 @@ public final class TypeProviderImpl implements TypeProvider {
         Preconditions.checkArgument(basePackageName != null, "String with base package name cannot be NULL!");
 
         final String typedefName = typedef.getQName().getLocalName();
-        final String classTypedefName = parseToClassName(typedefName);
+        final String classTypedefName = BindingMapping.getClassName(typedefName);
         final String innerTypeDef = innerExtendedType.getQName().getLocalName();
         final GeneratedTOBuilder genTOBuilder = new GeneratedTOBuilderImpl(basePackageName, classTypedefName);
         genTOBuilder.setTypedef(true);
index 5c889988b89de4c0f4137a2b1db940c58af8fbd3..7333f2d409311213528e8bceb5f3468bbd7f7365 100644 (file)
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
 <!--
- 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
+/*
+* Copyright (c) 2014 Brocade Communications 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
+*/
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
             <groupId>org.opendaylight.yangtools.model</groupId>
             <artifactId>ietf-inet-types</artifactId>
         </dependency>
+        <!--  TODO: We need a better way to handle versioning... -->
         <dependency>
             <groupId>org.opendaylight.yangtools.model</groupId>
-            <artifactId>ietf-yang-types</artifactId>
+            <artifactId>ietf-yang-types-20130715</artifactId>
+            <version>2013.07.15.1-SNAPSHOT</version>
+        </dependency>
+        
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/model/ietf/ietf-restconf/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/DatastoreIdentifierBuilder.java b/model/ietf/ietf-restconf/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/DatastoreIdentifierBuilder.java
new file mode 100644 (file)
index 0000000..35b84e3
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+* Copyright (c) 2014 Brocade Communications 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.DatastoreIdentifier;
+
+
+/**
+**/
+public class DatastoreIdentifierBuilder {
+
+    public static DatastoreIdentifier getDefaultInstance(String defaultValue) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+}
diff --git a/model/ietf/ietf-restconf/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/restconf/restconf/modules/RevisionBuilder.java b/model/ietf/ietf-restconf/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/restconf/restconf/modules/RevisionBuilder.java
new file mode 100644 (file)
index 0000000..d09646a
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2014 Brocade Communications 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.restconf.restconf.modules;
+
+import java.util.regex.Pattern;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.RevisionIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.restconf.restconf.modules.Module.Revision;
+
+/**
+**/
+public class RevisionBuilder {
+
+    /**
+     * Defines the pattern for revisions. NOTE: This pattern will likely be
+     * updated in future versions of the ietf and should be adjusted accordingly
+     */
+    private static final Pattern REVISION_PATTERN = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
+
+    public static Revision getDefaultInstance(String defaultValue) {
+
+        if (defaultValue != null) {
+            if (REVISION_PATTERN.matcher(defaultValue).matches()) {
+                RevisionIdentifier id = new RevisionIdentifier(defaultValue);
+                return new Revision(id);
+            }
+            if (defaultValue.isEmpty()) {
+                return new Revision(defaultValue);
+            }
+        }
+
+        throw new IllegalArgumentException("Cannot create Revision from " + defaultValue
+                + ". Default value does not match pattern " + REVISION_PATTERN.pattern()
+                + " or empty string.");
+    }
+
+}
diff --git a/model/ietf/ietf-restconf/src/main/yang/ietf-restconf.yang b/model/ietf/ietf-restconf/src/main/yang/ietf-restconf.yang
deleted file mode 100644 (file)
index 281f780..0000000
+++ /dev/null
@@ -1,594 +0,0 @@
-module ietf-restconf {
-     // RFC Ed.: replace XXXX with 'ietf' and remove this note
-     namespace "urn:XXXX:params:xml:ns:yang:ietf-restconf";
-     prefix "restconf";
-
-     import ietf-yang-types { prefix yang; }
-     import ietf-inet-types { prefix inet; }
-
-     organization
-       "IETF NETCONF (Network Configuration) Working Group";
-
-     contact
-       "Editor:   Andy Bierman
-                  <mailto:andy@yumaworks.com>
-
-        Editor:   Martin Bjorklund
-                  <mailto:mbj@tail-f.com>
-
-        Editor:   Kent Watsen
-                  <mailto:kwatsen@juniper.net>
-
-        Editor:   Rex Fernando
-                  <mailto:rex@cisco.com>";
-
-     description
-       "This module contains conceptual YANG specifications
-        for the YANG Patch and error content that is used in
-        RESTCONF protocol messages. A conceptual container
-        representing the RESTCONF API nodes (type vnd.yang.api).
-
-        Note that the YANG definitions within this module do not
-        represent configuration data of any kind.
-        The YANG grouping statements provide a normative syntax
-        for XML and JSON message encoding purposes.
-
-        Copyright (c) 2013 IETF Trust and the persons identified as
-        authors of the code.  All rights reserved.
-
-        Redistribution and use in source and binary forms, with or
-        without modification, is permitted pursuant to, and subject
-        to the license terms contained in, the Simplified BSD License
-        set forth in Section 4.c of the IETF Trust's Legal Provisions
-        Relating to IETF Documents
-        (http://trustee.ietf.org/license-info).
-
-        This version of this YANG module is part of RFC XXXX; see
-        the RFC itself for full legal notices.";
-
-     // RFC Ed.: replace XXXX with actual RFC number and remove this
-     // note.
-
-     // RFC Ed.: remove this note
-     // Note: extracted from draft-bierman-netconf-restconf-00.txt
-
-     // RFC Ed.: update the date below with the date of RFC publication
-     // and remove this note.
-     revision 2013-09-04 {
-       description
-         "Initial revision.";
-       reference
-         "RFC XXXX: RESTCONF Protocol.";
-     }
-
-     typedef data-resource-identifier {
-       type string {
-         length "1 .. max";
-       }
-       description
-         "Contains a Data Resource Identifier formatted string
-          to identify a specific data node.";
-       reference
-         "RFC XXXX: [sec. 5.3.1.1 ABNF For Data Resource Identifiers]";
-     }
-
-     // this typedef is TBD; not currently used
-     typedef datastore-identifier {
-       type union {
-         type enumeration {
-           enum candidate {
-             description
-               "Identifies the NETCONF shared candidate datastore.";
-             reference
-               "RFC 6241, section 8.3";
-           }
-           enum running {
-             description
-               "Identifies the NETCONF running datastore.";
-             reference
-               "RFC 6241, section 5.1";
-               }
-           enum startup {
-             description
-               "Identifies the NETCONF startup datastore.";
-             reference
-               "RFC 6241, section 8.7";
-           }
-         }
-         type string;
-       }
-       description
-         "Contains a string to identify a specific datastore.
-          The enumerated datastore identifier values are
-          reserved for standard datastore names.";
-     }
-
-     grouping yang-patch {
-
-       description
-         "A grouping that contains a YANG container
-          representing the syntax and semantics of a
-          YANG Patch edit request message.";
-
-       container yang-patch {
-         description
-           "Represents a conceptual sequence of datastore edits,
-            called a patch. Each patch is given a client-assigned
-            patch identifier. A patch is applied with client-specified
-            error handling to control how the ordered list of edits
-            is applied if an error is encountered.
-
-            A patch MUST be validated by the server to be a
-            well-formed message before any of the patch edits
-            are validated or attempted.
-
-            The validation model for patches closely follows
-            the constraint enforcement model in YANG, except it
-            is conceptually enforced on an ordered list of edits.
-
-            The server MUST conceptually perform field validation
-            for each edit in ascending order, as defined in RFC 6020,
-            section 8.3.1 and 8.3.2.  This is most relevant if the edit
-            error-action is 'stop-on-error', since the identification
-            of the first error determines where edit processing is
-            terminated.
-
-            If YANG datastore validation (defined in RFC 6020, section 
-            8.3.3) is required, then it performed after all edits have
-            been individually validated.
-
-            It is possible for a datastore constraint violation to occur
-            due to any node in the datastore, including nodes not
-            included in the edit list. Any validation errors SHOULD
-            be reported in the reply message.
-
-            If datastore validation is required and fails, the server
-            SHOULD NOT allow the datastore to remain invalid. It is an
-            implementation-specific matter how the server fixes the
-            invalid datastore.  For example, the server might prune
-            invalid nodes causing the datastore validation error,
-            or undo the entire patch.";
-
-         reference
-           "RFC 6020, section 8.3.";
-
-         leaf patch-id {
-           type string;
-           description
-             "An arbitrary string provided by the client to identify
-              the entire patch.  This value SHOULD be present in any
-              audit logging records generated by the server for the
-              patch. Error messages returned by the server pertaining
-              to this patch will be identified by this patch-id value.";
-         }
-
-         leaf error-action {
-           type enumeration {
-             enum all-or-none {
-               description
-                 "The server will apply all edits in the patch only
-                  if no errors occur.  If any errors occur then
-                  none of the edits will be applied and the
-                  contents of the target datastore MUST be unchanged.";
-             }
-             enum stop-on-error {
-               description
-                 "The server will apply edits in the specified order
-                  and will stop processing edits if any error occurs.
-                  Any previous edits which were successfully applied
-                  will remain applied.  No further edits will be
-                  attempted after the first error is encountered.";
-             }
-             enum continue-on-error {
-               description
-                 "The server will apply edits in the specified order
-                  and will continue processing edits if any error
-                          occurs.";
-             }
-           }
-           default all-or-none;
-           description
-             "The error handling behavior for the ordered list of
-              edits.";
-         }
-
-         list edit {
-           key edit-id;
-
-           description
-             "Represents one edit within the YANG Patch
-              request message.";
-
-           leaf edit-id {
-             type uint32;
-             description
-               "Arbitrary integer index for the edit.
-                The server MUST process edits in ascending order.
-                Error messages returned by the server pertaining
-                to a specific edit will be identified by this
-                identifier value.";
-           }
-
-           leaf operation {
-             type enumeration {
-               enum create {
-                 description
-                   "The target data node is created using the
-                    supplied value, only if it does not already
-                    exist.";
-               }
-               enum delete {
-                 description
-                   "Delete the target node, only if the data resource
-                    currently exists, otherwise return an error.";
-               }
-               enum insert {
-                 description
-                   "Insert the supplied value into a user-ordered
-                    list or leaf-list entry. The target node must
-                    represent a new data resource.";
-               }
-               enum merge {
-                 description
-                   "The supplied value is merged with the target data
-                           node.";
-               }
-               enum move {
-                 description
-                   "Move the target node. Reorder a user-ordered
-                    list or leaf-list. The target node must represent
-                    an existing data resource.";
-               }
-               enum replace {
-                 description
-                   "The supplied value is used to replace the target
-                    data node.";
-               }
-               enum remove {
-                 description
-                   "Delete the target node if it currently exists.";
-               }
-             }
-             mandatory true;
-             description
-               "The datastore operation requested for the associated
-                edit entry";
-           }
-
-           leaf target {
-             type data-resource-identifier;
-             mandatory true;
-             description
-               "Identifies the target data resource for the edit
-                operation.";
-           }
-
-           leaf point {
-             when "(../operation = 'insert' or " +
-               "../operation = 'move') and " +
-               "(../where = 'before' or ../where = 'after')" {
-               description
-                 "Point leaf only applies for insert or move
-                  operations, before or after an existing entry.";
-             }
-             type data-resource-identifier;
-             description
-               "The absolute URL path for the data node that is being
-                used as the insertion point or move point for the
-                target of this edit entry.";
-           }
-
-           leaf where {
-            when "../operation = 'insert' or ../operation = 'move'" {
-               description
-                 "Where leaf only applies for insert or move
-                  operations.";
-             }
-             type enumeration {
-               enum before {
-                 description
-                   "Insert or move a data node before the data resource
-                    identified by the 'point' parameter.";
-               }
-               enum after {
-                 description
-                   "Insert or move a data node after the data resource
-                    identified by the 'point' parameter.";
-               }
-               enum first {
-                 description
-                   "Insert or move a data node so it becomes ordered
-                    as the first entry.";
-               }
-               enum last {
-                 description
-                   "Insert or move a data node so it becomes ordered
-                    as the last entry.";
-               }
-
-             }
-             default last;
-             description
-               "Identifies where a data resource will be inserted or
-                moved. YANG only allows these operations for
-                list and leaf-list data nodes that are ordered-by
-                user.";
-           }
-
-           anyxml value {
-             when "(../operation = 'create' or " +
-               "../operation = 'merge' " +
-               "or ../operation = 'replace' or " +
-               "../operation = 'insert')" {
-               description
-                 "Value node only used for create, merge,
-                  replace, and insert operations";
-             }
-             description
-               "Value used for this edit operation.";
-           }
-              }
-       }
-
-     } // grouping yang-patch
-
-
-     grouping yang-patch-status {
-
-       description
-         "A grouping that contains a YANG container
-          representing the syntax and semantics of
-          YANG Patch status response message.";
-
-       container yang-patch-status {
-         description
-           "A container representing the response message
-            sent by the server after a YANG Patch edit
-            request message has been processed.";
-
-         leaf patch-id {
-           type string;
-           description
-             "The patch-id value used in the request";
-         }
-
-         container global-errors {
-           uses errors;
-           description
-             "This container will be present if global
-              errors unrelated to a specific edit occurred.";
-         }
-
-         container edit-status {
-           description
-             "This container will be present if there are
-              edit-specific status responses to report.";
-
-           list edit {
-             key edit-id;
-
-             description
-               "Represents a list of status responses,
-                corresponding to edits in the YANG Patch
-                request message.";
-
-             leaf edit-id {
-               type uint32;
-                description
-                      "Response status is for the edit list entry
-                   with this edit-id value.";
-             }
-             choice edit-status-choice {
-               description
-                 "A choice between different types of status
-                  responses for each edit entry.";
-
-               leaf ok {
-                 type empty;
-                 description
-                   "This edit entry was invoked without any
-                    errors detected by the server associated
-                    with this edit.";
-               }
-               leaf location {
-                 type inet:uri;
-                 description
-                   "Contains the Location header value that would be
-                    returned if this edit causes a new resource to be
-                    created. If the edit identified by the same edit-id
-                    value was successfully invoked and a new resource
-                    was created, then this field will be returned
-                    instead of 'ok'.";
-               }
-               leaf skipped {
-                 type empty;
-                 description
-                   "This edit entry was skipped or not reached
-                    by the server.";
-               }
-               case errors {
-                 uses errors;
-                 description
-                   "The server detected errors associated with the
-                     edit identified by the same edit-id value.";
-               }
-             }
-           }
-         }
-       }
-     }  // grouping yang-patch-status
-
-     grouping errors {
-
-       description
-         "A grouping that contains a YANG container
-          representing the syntax and semantics of a
-            YANG Patch errors report within a response message.";
-
-       container errors {
-         config false;  // needed so list error does not need a key
-         description
-           "Represents an error report returned by the server if
-            a request results in an error.";
-
-         list error {
-           description
-             "An entry containing information about one
-              specific error that occurred while processing
-              a RESTCONF request.";
-           reference "RFC 6241, Section 4.3";
-
-           leaf error-type {
-             type enumeration {
-               enum transport {
-                 description "The transport layer";
-               }
-               enum rpc {
-                 description "The rpc or notification layer";
-               }
-               enum protocol {
-                 description "The protocol operation layer";
-               }
-               enum application {
-                 description "The server application layer";
-               }
-             }
-             mandatory true;
-             description
-               "The protocol layer where the error occurred.";
-           }
-
-           leaf error-tag {
-             type string;
-             mandatory true;
-             description
-               "The enumerated error tag.";
-           }
-
-           leaf error-app-tag {
-             type string;
-             description
-               "The application-specific error tag.";
-           }
-           leaf error-path {
-             type data-resource-identifier;
-             description
-               "The target data resource identifier associated
-                with the error, if any.";
-           }
-
-           leaf error-message {
-             type string;
-             description
-               "A message describing the error.";
-           }
-
-           container error-info {
-              description
-                "A container allowing additional information
-                 to be included in the error report.";
-              // arbitrary anyxml content here
-           }
-         }
-       }
-     } // grouping errors
-
-
-     grouping restconf {
-
-       description
-         "A grouping that contains a YANG container
-          representing the syntax and semantics of
-          the RESTCONF API resource.";
-
-       container restconf {
-         description
-           "Conceptual container representing the vnd.yang.api
-            resource type.";
-
-         container datastore {
-           description
-             "Container representing the vnd.yang.datastore resource
-              type. Represents the conceptual root of the unified
-              datastore containing YANG data nodes.  The child nodes
-              of this container can be data resources (vnd.yang.data)
-              defined as top-level YANG data nodes from the modules
-              advertised by the server in /restconf/modules.";
-         }
-         container modules {
-           description
-             "Contains a list of module description entries.
-              These modules are currently loaded into the server.";
-
-           list module {
-             key "name revision";
-             description
-               "Each entry represents one module currently
-                supported by the server.";
-
-             leaf name {
-               type string;
-               description "The YANG module name.";
-             }
-             leaf revision {
-               type union {
-                 type yang:date-and-time;
-                 type string { length 0; }
-               }
-               description
-                 "The YANG module revision date. An empty string is
-                  used if no revision statement is present in the
-                  YANG module.";
-             }
-             leaf namespace {
-               type inet:uri;
-               mandatory true;
-               description
-                 "The XML namespace identifier for this module.";
-             }
-             leaf-list feature {
-               type string;
-               description
-                 "List of YANG feature names from this module that are
-                  supported by the server.";
-             }
-             leaf-list deviation {
-               type string;
-               description
-                 "List of YANG deviation module names used by this
-                  server to modify the conformance of the module
-                  associated with this entry.";
-             }
-           }
-         }
-         container operations {
-           description
-             "Container for all operation resources
-              (vnd.yang.operation),
-                   Each resource is represented as an empty leaf with the
-              name of the RPC operation from the YANG rpc statement.
-
-              E.g.;
-
-                 POST /restconf/operations/show-log-errors
-
-                 leaf show-log-errors {
-                   type empty;
-                 }
-             ";
-         }
-         leaf version {
-           type enumeration {
-             enum "1.0" {
-               description
-                 "Version 1.0 of the RESTCONF protocol.";
-             }
-           }
-           config false;
-           description
-             "Contains the RESTCONF protocol version.";
-         }
-       }
-     }  // grouping restconf
-
-   }
\ No newline at end of file
diff --git a/model/ietf/ietf-restconf/src/main/yang/ietf-restconf@2013-10-19.yang b/model/ietf/ietf-restconf/src/main/yang/ietf-restconf@2013-10-19.yang
new file mode 100644 (file)
index 0000000..a389b19
--- /dev/null
@@ -0,0 +1,689 @@
+module ietf-restconf {
+  namespace "urn:ietf:params:xml:ns:yang:ietf-restconf";
+  prefix "restconf";
+
+  import ietf-yang-types { prefix yang; }
+  import ietf-inet-types { prefix inet; }
+
+  organization
+    "IETF NETCONF (Network Configuration) Working Group";
+
+  contact
+    "Editor:   Andy Bierman
+               <mailto:andy@yumaworks.com>
+
+     Editor:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>
+
+     Editor:   Kent Watsen
+               <mailto:kwatsen@juniper.net>
+
+     Editor:   Rex Fernando
+               <mailto:rex@cisco.com>";
+
+  description
+    "This module contains conceptual YANG specifications
+     for the YANG Patch and error content that is used in
+     RESTCONF protocol messages. A conceptual container
+     representing the RESTCONF API nodes (media type 
+     application/yang.api).
+
+     Note that the YANG definitions within this module do not
+     represent configuration data of any kind.
+     The YANG grouping statements provide a normative syntax
+     for XML and JSON message encoding purposes.
+
+     Copyright (c) 2013 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC XXXX; see
+     the RFC itself for full legal notices.";
+
+  // RFC Ed.: replace XXXX with actual RFC number and remove this
+  // note.
+
+  // RFC Ed.: remove this note
+  // Note: extracted from draft-bierman-netconf-restconf-02.txt
+
+  // RFC Ed.: update the date below with the date of RFC publication
+  // and remove this note.
+  revision 2013-10-19 {
+    description
+      "Initial revision.";
+    reference
+      "RFC XXXX: RESTCONF Protocol.";
+  }
+
+  typedef data-resource-identifier {
+    type string {
+      length "1 .. max";
+    }
+    description
+      "Contains a Data Resource Identifier formatted string
+       to identify a specific data node. The data node that
+       uses this data type SHOULD define the document root
+       for data resource identifiers.  The default document
+       root is the target datastore conceptual root node.
+       Data resource identifiers are defined relative to
+       this document root.";
+    reference
+      "RFC XXXX: [sec. 5.3.1.1 ABNF For Data Resource Identifiers]";
+  }
+
+  // this typedef is TBD; not currently used
+  typedef datastore-identifier {
+    type union {
+      type enumeration {
+        enum candidate {
+          description
+            "Identifies the NETCONF shared candidate datastore.";
+          reference
+            "RFC 6241, section 8.3";
+        }
+        enum running {
+          description
+            "Identifies the NETCONF running datastore.";
+          reference
+            "RFC 6241, section 5.1";
+        }
+        enum startup {
+          description
+            "Identifies the NETCONF startup datastore.";
+          reference
+            "RFC 6241, section 8.7";
+        }
+      }
+      type string;
+    }
+    description
+      "Contains a string to identify a specific datastore.
+       The enumerated datastore identifier values are
+       reserved for standard datastore names.";
+  }
+
+  typedef revision-identifier {
+    type string {
+      pattern '\d{4}-\d{2}-\d{2}';
+    }
+    description
+      "Represents a specific date in YYYY-MM-DD format.
+       TBD: make pattern more precise to exclude leading zeros.";
+  }
+
+  grouping yang-patch {
+
+    description
+      "A grouping that contains a YANG container
+       representing the syntax and semantics of a
+       YANG Patch edit request message.";
+
+    container yang-patch {
+      description
+        "Represents a conceptual sequence of datastore edits,
+         called a patch. Each patch is given a client-assigned
+         patch identifier. Each edit MUST be applied
+         in ascending order, and all edits MUST be applied.
+         If any errors occur, then the target datastore MUST NOT
+         be changed by the patch operation.
+  
+         A patch MUST be validated by the server to be a 
+         well-formed message before any of the patch edits
+         are validated or attempted.
+  
+         YANG datastore validation (defined in RFC 6020, section
+         8.3.3) is performed after all edits have been
+         individually validated.
+  
+         It is possible for a datastore constraint violation to occur
+         due to any node in the datastore, including nodes not
+         included in the edit list. Any validation errors MUST
+         be reported in the reply message.";
+  
+      reference
+        "RFC 6020, section 8.3.";
+  
+      leaf patch-id {
+        type string;
+        description
+          "An arbitrary string provided by the client to identify
+           the entire patch.  This value SHOULD be present in any
+           audit logging records generated by the server for the
+           patch. Error messages returned by the server pertaining
+           to this patch will be identified by this patch-id value.";
+      }
+
+      leaf comment {
+        type string {
+          length "0 .. 1024";
+        }
+        description
+          "An arbitrary string provided by the client to describe
+           the entire patch.  This value SHOULD be present in any
+           audit logging records generated by the server for the
+           patch.";
+      }
+  
+      list edit {
+        key edit-id;
+        ordered-by user;
+
+        description
+          "Represents one edit within the YANG Patch
+           request message.";
+
+        leaf edit-id {
+          type string;
+          description
+            "Arbitrary string index for the edit.
+             Error messages returned by the server pertaining
+             to a specific edit will be identified by this
+             value.";
+        }
+  
+        leaf operation {
+          type enumeration {
+            enum create {
+              description
+                "The target data node is created using the
+                 supplied value, only if it does not already
+                 exist.";
+            }
+            enum delete {
+              description
+                "Delete the target node, only if the data resource
+                 currently exists, otherwise return an error.";
+            }
+            enum insert {
+              description
+                "Insert the supplied value into a user-ordered
+                 list or leaf-list entry. The target node must
+                 represent a new data resource.";
+            }
+            enum merge {
+              description
+                "The supplied value is merged with the target data
+                 node.";
+            }
+            enum move {
+              description
+                "Move the target node. Reorder a user-ordered
+                 list or leaf-list. The target node must represent
+                 an existing data resource.";
+            }
+            enum replace {
+              description
+                "The supplied value is used to replace the target
+                 data node.";
+            }
+            enum remove {
+              description
+                "Delete the target node if it currently exists.";
+            }
+          }
+          mandatory true;
+          description
+            "The datastore operation requested for the associated
+             edit entry";
+        }
+  
+        leaf target {
+          type data-resource-identifier;
+          mandatory true;
+          description
+            "Identifies the target data resource for the edit
+             operation.";
+        }
+  
+        leaf point {
+          when "(../operation = 'insert' or " +
+            "../operation = 'move') and " +
+            "(../where = 'before' or ../where = 'after')" {
+            description
+              "Point leaf only applies for insert or move
+               operations, before or after an existing entry.";
+          }
+          type data-resource-identifier;
+          description
+            "The absolute URL path for the data node that is being
+             used as the insertion point or move point for the
+             target of this edit entry.";
+        }
+  
+        leaf where {
+          when "../operation = 'insert' or ../operation = 'move'" {
+            description
+              "Where leaf only applies for insert or move
+               operations.";
+          }
+          type enumeration {
+            enum before {
+              description
+                "Insert or move a data node before the data resource
+                 identified by the 'point' parameter.";
+            }
+            enum after {
+              description
+                "Insert or move a data node after the data resource
+                 identified by the 'point' parameter.";
+            }
+            enum first {
+              description
+                "Insert or move a data node so it becomes ordered
+                 as the first entry.";
+            }
+            enum last {
+              description
+                "Insert or move a data node so it becomes ordered
+                 as the last entry.";
+            }
+  
+          }
+          default last;
+          description
+            "Identifies where a data resource will be inserted or
+             moved. YANG only allows these operations for
+             list and leaf-list data nodes that are ordered-by
+             user.";
+        }
+  
+        anyxml value {
+          when "(../operation = 'create' or " +
+            "../operation = 'merge' " +
+            "or ../operation = 'replace' or " +
+            "../operation = 'insert')" {
+            description
+              "Value node only used for create, merge,
+               replace, and insert operations";
+          }
+          description
+            "Value used for this edit operation.";
+        }
+      }
+    }
+
+  } // grouping yang-patch
+
+
+  grouping yang-patch-status {
+
+    description
+      "A grouping that contains a YANG container
+       representing the syntax and semantics of
+       YANG Patch status response message.";
+    
+    container yang-patch-status {
+      description
+        "A container representing the response message
+         sent by the server after a YANG Patch edit
+         request message has been processed.";
+
+      leaf patch-id {
+        type string;
+        description
+          "The patch-id value used in the request";
+      }
+
+      choice global-status {
+        description
+          "Report global errors or complete success.
+           If there is no case selected then errors
+           are reported in the edit-status container.";
+
+        case global-errors {
+          uses errors;
+          description
+            "This container will be present if global
+             errors unrelated to a specific edit occurred.";
+        }
+        leaf ok {
+          type empty;
+          description
+            "This leaf will be present if the request succeeded
+             and there are no errors reported in the edit-status
+             container.";
+        }
+      }
+
+      container edit-status {
+        description
+          "This container will be present if there are
+           edit-specific status responses to report.";
+      
+        list edit {
+          key edit-id;
+
+          description
+            "Represents a list of status responses,
+             corresponding to edits in the YANG Patch
+             request message.  If an edit entry was
+             skipped or not reached by the server,
+             then this list will not contain a corresponding
+             entry for that edit.";
+
+          leaf edit-id {
+            type string;
+             description
+               "Response status is for the edit list entry
+                with this edit-id value.";
+          }
+          choice edit-status-choice {
+            description
+              "A choice between different types of status
+               responses for each edit entry.";
+            leaf ok {
+              type empty;
+              description
+                "This edit entry was invoked without any
+                 errors detected by the server associated
+                 with this edit.";
+            }
+            leaf location {
+              type inet:uri;
+              description
+                "Contains the Location header value that would be
+                 returned if this edit causes a new resource to be
+                 created. If the edit identified by the same edit-id
+                 value was successfully invoked and a new resource
+                 was created, then this field will be returned
+                 instead of 'ok'.";
+            }
+            case errors {
+              uses errors;
+              description
+                "The server detected errors associated with the
+                  edit identified by the same edit-id value.";
+            }
+          }
+        }
+      }
+    }
+  }  // grouping yang-patch-status
+
+
+  grouping errors {
+
+    description
+      "A grouping that contains a YANG container
+       representing the syntax and semantics of a
+       YANG Patch errors report within a response message.";
+
+    container errors {
+      config false;  // needed so list error does not need a key
+      description
+        "Represents an error report returned by the server if
+         a request results in an error.";
+  
+      list error {
+        description
+          "An entry containing information about one
+           specific error that occurred while processing
+           a RESTCONF request.";
+        reference "RFC 6241, Section 4.3";
+  
+        leaf error-type { 
+          type enumeration {
+            enum transport {
+              description "The transport layer";
+            }
+            enum rpc {
+              description "The rpc or notification layer";
+            }
+            enum protocol {
+              description "The protocol operation layer";
+            }
+            enum application {
+              description "The server application layer";
+            }
+          }
+          mandatory true;
+          description
+            "The protocol layer where the error occurred.";
+        }
+  
+        leaf error-tag {
+          type string;
+          mandatory true;
+          description
+            "The enumerated error tag.";
+        }
+  
+        leaf error-app-tag { 
+          type string;
+          description
+            "The application-specific error tag.";
+        }
+  
+        leaf error-path { 
+          type data-resource-identifier;
+          description
+            "The target data resource identifier associated
+             with the error, if any.";
+        }
+  
+        leaf error-message { 
+          type string;
+          description
+            "A message describing the error.";
+        }
+  
+        container error-info { 
+           description
+             "A container allowing additional information
+              to be included in the error report.";
+           // arbitrary anyxml content here
+        }
+      }
+    }
+  } // grouping errors
+
+
+  grouping restconf {
+
+    description
+      "A grouping that contains a YANG container
+       representing the syntax and semantics of
+       the RESTCONF API resource.";
+
+    container restconf {
+      description
+        "Conceptual container representing the
+         application/yang.api resource type.";
+  
+      container config {
+        description
+          "Container representing the application/yang.datastore
+           resource type. Represents the conceptual root of the
+           unified configuration datastore containing YANG data
+           nodes. The child nodes of this container are
+           configuration data resources (application/yang.data)
+           defined as top-level YANG data nodes from the modules
+           advertised by the server in /restconf/modules.";
+      }
+
+      container operational {
+        description
+          "Container representing the application/yang.datastore
+           resource type. Represents the conceptual root of the
+           operational data supported by the server.  The child
+           nodes of this container are operational data resources 
+           (application/yang.data) defined as top-level
+           YANG data nodes from the modules advertised by
+           the server in /restconf/modules.";
+      }
+
+      container modules {
+        description
+          "Contains a list of module description entries.
+           These modules are currently loaded into the server.";
+  
+        list module {
+          key "name revision";
+          description
+            "Each entry represents one module currently
+             supported by the server.";
+
+          leaf name {
+            type yang:yang-identifier;
+            description "The YANG module name.";
+          }
+          leaf revision {
+            type union {
+              type revision-identifier;
+              type string { length 0; }
+            }
+            description
+              "The YANG module revision date. An empty string is
+               used if no revision statement is present in the
+               YANG module.";
+          }
+          leaf namespace {
+            type inet:uri;
+            mandatory true;
+            description
+              "The XML namespace identifier for this module.";
+          }
+          leaf-list feature {
+            type yang:yang-identifier;
+            description
+              "List of YANG feature names from this module that are
+               supported by the server.";
+          }
+          leaf-list deviation {
+            type yang:yang-identifier;
+            description
+              "List of YANG deviation module names used by this
+               server to modify the conformance of the module
+               associated with this entry.";
+          }
+        }
+      }
+
+      container operations {
+        description
+          "Container for all operation resources
+           (application/yang.operation),
+
+           Each resource is represented as an empty leaf with the
+           name of the RPC operation from the YANG rpc statement.
+  
+           E.g.;
+  
+              POST /restconf/operations/show-log-errors
+  
+              leaf show-log-errors {
+                type empty;
+              }
+          ";
+      }
+
+      container streams {
+        description
+          "Container representing the notification event streams
+           supported by the server.";
+         reference
+           "RFC 5277, Section 3.4, <streams> element.";
+
+        list stream {
+          key name;
+          description
+            "Each entry describes an event stream supported by
+             the server.";
+
+          leaf name {
+            type string;
+            description "The stream name";
+            reference "RFC 5277, Section 3.4, <name> element.";
+          }
+
+          leaf description {
+            type string;
+            description "Description of stream content";
+            reference
+              "RFC 5277, Section 3.4, <description> element.";
+          }
+
+          leaf replay-support {
+            type boolean;
+            description
+              "Indicates if replay buffer supported for this stream";
+            reference
+              "RFC 5277, Section 3.4, <replaySupport> element.";
+          }
+
+          leaf replay-log-creation-time {
+            type yang:date-and-time;
+            description
+              "Indicates the time the replay log for this stream
+               was created.";
+            reference
+              "RFC 5277, Section 3.4, <replayLogCreationTime>
+               element.";
+          }
+
+          leaf events {
+            type empty;
+            description
+              "Represents the entry point for establishing
+               notification delivery via server sent events.";
+          }
+        }
+      }
+
+      leaf version {
+        type enumeration {
+          enum "1.0" {
+            description 
+              "Version 1.0 of the RESTCONF protocol.";
+          }
+        }
+        config false;
+        description
+          "Contains the RESTCONF protocol version.";
+      }
+    }
+  }  // grouping restconf
+
+
+  grouping notification {
+    description
+      "Contains the notification message wrapper definition.";
+
+    container notification {
+      description
+        "RESTCONF notification message wrapper.";
+
+      leaf event-time {
+        type yang:date-and-time;
+        mandatory true;
+        description
+          "The time the event was generated by the
+           event source.";
+        reference
+          "RFC 5277, section 4, <eventTime> element.";
+      }
+
+      /* The YANG-specific notification container is encoded
+       * after the 'event-time' element.  The format
+       * corresponds to the notificationContent element
+       * in RFC 5277, section 4. For example:
+       *
+       *  module example-one {
+       *     ...
+       *     notification event1 { ... }
+       *
+       *  }
+       *
+       *  Encoded as element 'event1' in the namespace
+       *  for module 'example-one'.
+       */
+    }
+  }  // grouping notification
+
+}
\ No newline at end of file
diff --git a/model/ietf/ietf-restconf/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/restconf/restconf/modules/RevisionBuilderTest.java b/model/ietf/ietf-restconf/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/restconf/rev131019/restconf/restconf/modules/RevisionBuilderTest.java
new file mode 100644 (file)
index 0000000..9e7fbc9
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014 Brocade Communications 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.restconf.restconf.modules;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.RevisionIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.restconf.restconf.modules.Module.Revision;
+
+public class RevisionBuilderTest {
+
+    private RevisionBuilder builder;
+
+    @Before
+    public void setUp() {
+        builder = new RevisionBuilder();
+    }
+
+    @Test
+    public void testEmptyString() {
+        Revision revision = builder.getDefaultInstance("");
+        validate(revision, "", null);
+    }
+
+    @Test
+    public void testValidDataString() {
+        String dateString = "2014-04-23";
+        Revision revision = builder.getDefaultInstance(dateString);
+        validate(revision, null, new RevisionIdentifier(dateString));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testNullString() {
+        builder.getDefaultInstance(null);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testBadFormatString() {
+        builder.getDefaultInstance("badFormat");
+    }
+
+    private void validate(Revision revisionUnderTest, String expectedRevisionString,
+            RevisionIdentifier expectedRevisionIdentifier) {
+        assertNotNull(revisionUnderTest);
+        assertEquals(expectedRevisionString, revisionUnderTest.getString());
+        assertEquals(expectedRevisionIdentifier, revisionUnderTest.getRevisionIdentifier());
+    }
+}
\ No newline at end of file
diff --git a/model/ietf/ietf-yang-types-20130715/pom.xml b/model/ietf/ietf-yang-types-20130715/pom.xml
new file mode 100644 (file)
index 0000000..8800060
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (c) 2014 Brocade Communications 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
+*/
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <artifactId>model-ietf</artifactId>
+        <groupId>org.opendaylight.yangtools.model</groupId>
+        <version>0.6.2-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>ietf-yang-types-20130715</artifactId>
+    <version>2013.07.15.1-SNAPSHOT</version>
+    <name>${project.artifactId}</name>
+    <description>${project.artifactId}</description>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-jar-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/model/ietf/ietf-yang-types-20130715/src/main/yang/ietf-yang-types@2013-07-15.yang b/model/ietf/ietf-yang-types-20130715/src/main/yang/ietf-yang-types@2013-07-15.yang
new file mode 100644 (file)
index 0000000..bdff18c
--- /dev/null
@@ -0,0 +1,467 @@
+module ietf-yang-types {
+
+     namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+     prefix "yang";
+
+     organization
+      "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+     contact
+      "WG Web:   <http://tools.ietf.org/wg/netmod/>
+       WG List:  <mailto:netmod@ietf.org>
+       WG Chair: David Kessens
+                 <mailto:david.kessens@nsn.com>
+
+       WG Chair: Juergen Schoenwaelder
+                 <mailto:j.schoenwaelder@jacobs-university.de>
+
+       Editor:   Juergen Schoenwaelder
+                 <mailto:j.schoenwaelder@jacobs-university.de>";
+
+     description
+      "This module contains a collection of generally useful derived
+       YANG data types.
+
+       Copyright (c) 2013 IETF Trust and the persons identified as
+       authors of the code.  All rights reserved.
+
+       Redistribution and use in source and binary forms, with or
+       without modification, is permitted pursuant to, and subject
+       to the license terms contained in, the Simplified BSD License
+       set forth in Section 4.c of the IETF Trust's Legal Provisions
+       Relating to IETF Documents
+       (http://trustee.ietf.org/license-info).
+
+       This version of this YANG module is part of RFC 6991; see
+       the RFC itself for full legal notices.";
+
+     revision 2013-07-15 {
+       description
+        "This revision adds the following new data types:
+         - yang-identifier
+         - hex-string
+         - uuid
+         - dotted-quad";
+       reference
+        "RFC 6991: Common YANG Data Types";
+     }
+
+     revision 2010-09-24 {
+       description
+        "Initial revision.";
+       reference
+        "RFC 6021: Common YANG Data Types";
+     }
+
+     /*** collection of counter and gauge types ***/
+
+     typedef counter32 {
+       type uint32;
+       description
+        "The counter32 type represents a non-negative integer
+         that monotonically increases until it reaches a
+         maximum value of 2^32-1 (4294967295 decimal), when it
+         wraps around and starts increasing again from zero.
+
+         Counters have no defined 'initial' value, and thus, a
+         single value of a counter has (in general) no information
+         content.  Discontinuities in the monotonically increasing
+         value normally occur at re-initialization of the
+         management system, and at other times as specified in the
+         description of a schema node using this type.  If such
+         other times can occur, for example, the creation of
+         a schema node of type counter32 at times other than
+         re-initialization, then a corresponding schema node
+         should be defined, with an appropriate type, to indicate
+         the last discontinuity.
+
+         The counter32 type should not be used for configuration
+         schema nodes.  A default statement SHOULD NOT be used in
+         combination with the type counter32.
+
+         In the value set and its semantics, this type is equivalent
+         to the Counter32 type of the SMIv2.";
+       reference
+        "RFC 2578: Structure of Management Information Version 2
+                   (SMIv2)";
+     }
+
+     typedef zero-based-counter32 {
+       type yang:counter32;
+       default "0";
+       description
+        "The zero-based-counter32 type represents a counter32
+         that has the defined 'initial' value zero.
+
+         A schema node of this type will be set to zero (0) on creation
+         and will thereafter increase monotonically until it reaches
+         a maximum value of 2^32-1 (4294967295 decimal), when it
+         wraps around and starts increasing again from zero.
+
+         Provided that an application discovers a new schema node
+         of this type within the minimum time to wrap, it can use the
+         'initial' value as a delta.  It is important for a management
+         station to be aware of this minimum time and the actual time
+         between polls, and to discard data if the actual time is too
+         long or there is no defined minimum time.
+        In the value set and its semantics, this type is equivalent
+         to the ZeroBasedCounter32 textual convention of the SMIv2.";
+       reference
+         "RFC 4502: Remote Network Monitoring Management Information
+                    Base Version 2";
+     }
+
+     typedef counter64 {
+       type uint64;
+       description
+        "The counter64 type represents a non-negative integer
+         that monotonically increases until it reaches a
+         maximum value of 2^64-1 (18446744073709551615 decimal),
+         when it wraps around and starts increasing again from zero.
+
+         Counters have no defined 'initial' value, and thus, a
+         single value of a counter has (in general) no information
+         content.  Discontinuities in the monotonically increasing
+         value normally occur at re-initialization of the
+         management system, and at other times as specified in the
+         description of a schema node using this type.  If such
+         other times can occur, for example, the creation of
+         a schema node of type counter64 at times other than
+         re-initialization, then a corresponding schema node
+         should be defined, with an appropriate type, to indicate
+         the last discontinuity.
+
+         The counter64 type should not be used for configuration
+         schema nodes.  A default statement SHOULD NOT be used in
+         combination with the type counter64.
+
+         In the value set and its semantics, this type is equivalent
+         to the Counter64 type of the SMIv2.";
+       reference
+        "RFC 2578: Structure of Management Information Version 2
+                   (SMIv2)";
+     }
+
+     typedef zero-based-counter64 {
+       type yang:counter64;
+       default "0";
+       description
+        "The zero-based-counter64 type represents a counter64 that
+         has the defined 'initial' value zero.
+         A schema node of this type will be set to zero (0) on creation
+         and will thereafter increase monotonically until it reaches
+         a maximum value of 2^64-1 (18446744073709551615 decimal),
+         when it wraps around and starts increasing again from zero.
+
+         Provided that an application discovers a new schema node
+         of this type within the minimum time to wrap, it can use the
+         'initial' value as a delta.  It is important for a management
+         station to be aware of this minimum time and the actual time
+         between polls, and to discard data if the actual time is too
+         long or there is no defined minimum time.
+
+         In the value set and its semantics, this type is equivalent
+         to the ZeroBasedCounter64 textual convention of the SMIv2.";
+       reference
+        "RFC 2856: Textual Conventions for Additional High Capacity
+                   Data Types";
+     }
+
+     typedef gauge32 {
+       type uint32;
+       description
+        "The gauge32 type represents a non-negative integer, which
+         may increase or decrease, but shall never exceed a maximum
+         value, nor fall below a minimum value.  The maximum value
+         cannot be greater than 2^32-1 (4294967295 decimal), and
+         the minimum value cannot be smaller than 0.  The value of
+         a gauge32 has its maximum value whenever the information
+         being modeled is greater than or equal to its maximum
+         value, and has its minimum value whenever the information
+         being modeled is smaller than or equal to its minimum value.
+         If the information being modeled subsequently decreases
+         below (increases above) the maximum (minimum) value, the
+         gauge32 also decreases (increases).
+
+         In the value set and its semantics, this type is equivalent
+         to the Gauge32 type of the SMIv2.";
+       reference
+        "RFC 2578: Structure of Management Information Version 2
+                   (SMIv2)";
+     }
+
+     typedef gauge64 {
+       type uint64;
+       description
+        "The gauge64 type represents a non-negative integer, which
+         may increase or decrease, but shall never exceed a maximum
+         value, nor fall below a minimum value.  The maximum value
+         cannot be greater than 2^64-1 (18446744073709551615), and
+         the minimum value cannot be smaller than 0.  The value of
+         a gauge64 has its maximum value whenever the information
+         being modeled is greater than or equal to its maximum
+         value, and has its minimum value whenever the information
+         being modeled is smaller than or equal to its minimum value.
+         If the information being modeled subsequently decreases
+         below (increases above) the maximum (minimum) value, the
+         gauge64 also decreases (increases).
+
+         In the value set and its semantics, this type is equivalent
+         to the CounterBasedGauge64 SMIv2 textual convention defined
+         in RFC 2856";
+       reference
+        "RFC 2856: Textual Conventions for Additional High Capacity
+                   Data Types";
+     }
+
+     /*** collection of identifier-related types ***/
+
+     typedef object-identifier {
+       type string {
+         pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+               + '(\.(0|([1-9]\d*)))*';
+       }
+       description
+        "The object-identifier type represents administratively
+         assigned names in a registration-hierarchical-name tree.
+
+         Values of this type are denoted as a sequence of numerical
+         non-negative sub-identifier values.  Each sub-identifier
+         value MUST NOT exceed 2^32-1 (4294967295).  Sub-identifiers
+         are separated by single dots and without any intermediate
+         whitespace.
+
+         The ASN.1 standard restricts the value space of the first
+         sub-identifier to 0, 1, or 2.  Furthermore, the value space
+         of the second sub-identifier is restricted to the range
+         0 to 39 if the first sub-identifier is 0 or 1.  Finally,
+         the ASN.1 standard requires that an object identifier
+         has always at least two sub-identifiers.  The pattern
+         captures these restrictions.
+
+         Although the number of sub-identifiers is not limited,
+         module designers should realize that there may be
+         implementations that stick with the SMIv2 limit of 128
+         sub-identifiers.
+         This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+         since it is not restricted to 128 sub-identifiers.  Hence,
+         this type SHOULD NOT be used to represent the SMIv2 OBJECT
+         IDENTIFIER type; the object-identifier-128 type SHOULD be
+         used instead.";
+       reference
+        "ISO9834-1: Information technology -- Open Systems
+         Interconnection -- Procedures for the operation of OSI
+         Registration Authorities: General procedures and top
+         arcs of the ASN.1 Object Identifier tree";
+     }
+
+     typedef object-identifier-128 {
+       type object-identifier {
+         pattern '\d*(\.\d*){1,127}';
+       }
+       description
+        "This type represents object-identifiers restricted to 128
+         sub-identifiers.
+
+         In the value set and its semantics, this type is equivalent
+         to the OBJECT IDENTIFIER type of the SMIv2.";
+       reference
+        "RFC 2578: Structure of Management Information Version 2
+                   (SMIv2)";
+     }
+
+     typedef yang-identifier {
+       type string {
+         length "1..max";
+         pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+         pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+       }
+       description
+         "A YANG identifier string as defined by the 'identifier'
+          rule in Section 12 of RFC 6020.  An identifier must
+          start with an alphabetic character or an underscore
+          followed by an arbitrary sequence of alphabetic or
+          numeric characters, underscores, hyphens, or dots.
+
+          A YANG identifier MUST NOT start with any possible
+          combination of the lowercase or uppercase character
+          sequence 'xml'.";
+       reference
+         "RFC 6020: YANG - A Data Modeling Language for the Network
+                    Configuration Protocol (NETCONF)";
+     }
+     /*** collection of types related to date and time***/
+
+     typedef date-and-time {
+       type string {
+         pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+               + '(Z|[\+\-]\d{2}:\d{2})';
+       }
+       description
+        "The date-and-time type is a profile of the ISO 8601
+         standard for representation of dates and times using the
+         Gregorian calendar.  The profile is defined by the
+         date-time production in Section 5.6 of RFC 3339.
+
+         The date-and-time type is compatible with the dateTime XML
+         schema type with the following notable exceptions:
+
+         (a) The date-and-time type does not allow negative years.
+
+         (b) The date-and-time time-offset -00:00 indicates an unknown
+             time zone (see RFC 3339) while -00:00 and +00:00 and Z
+             all represent the same time zone in dateTime.
+
+         (c) The canonical format (see below) of data-and-time values
+             differs from the canonical format used by the dateTime XML
+             schema type, which requires all times to be in UTC using
+             the time-offset 'Z'.
+
+         This type is not equivalent to the DateAndTime textual
+         convention of the SMIv2 since RFC 3339 uses a different
+         separator between full-date and full-time and provides
+         higher resolution of time-secfrac.
+
+         The canonical format for date-and-time values with a known time
+         zone uses a numeric time zone offset that is calculated using
+         the device's configured known offset to UTC time.  A change of
+         the device's offset to UTC time will cause date-and-time values
+         to change accordingly.  Such changes might happen periodically
+         in case a server follows automatically daylight saving time
+         (DST) time zone offset changes.  The canonical format for
+         date-and-time values with an unknown time zone (usually
+         referring to the notion of local time) uses the time-offset
+         -00:00.";
+       reference
+        "RFC 3339: Date and Time on the Internet: Timestamps
+         RFC 2579: Textual Conventions for SMIv2
+         XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+     }
+     typedef timeticks {
+       type uint32;
+       description
+        "The timeticks type represents a non-negative integer that
+         represents the time, modulo 2^32 (4294967296 decimal), in
+         hundredths of a second between two epochs.  When a schema
+         node is defined that uses this type, the description of
+         the schema node identifies both of the reference epochs.
+
+         In the value set and its semantics, this type is equivalent
+         to the TimeTicks type of the SMIv2.";
+       reference
+        "RFC 2578: Structure of Management Information Version 2
+                   (SMIv2)";
+     }
+
+     typedef timestamp {
+       type yang:timeticks;
+       description
+        "The timestamp type represents the value of an associated
+         timeticks schema node at which a specific occurrence
+         happened.  The specific occurrence must be defined in the
+         description of any schema node defined using this type.  When
+         the specific occurrence occurred prior to the last time the
+         associated timeticks attribute was zero, then the timestamp
+         value is zero.  Note that this requires all timestamp values
+         to be reset to zero when the value of the associated timeticks
+         attribute reaches 497+ days and wraps around to zero.
+
+         The associated timeticks schema node must be specified
+         in the description of any schema node using this type.
+
+         In the value set and its semantics, this type is equivalent
+         to the TimeStamp textual convention of the SMIv2.";
+       reference
+        "RFC 2579: Textual Conventions for SMIv2";
+     }
+
+     /*** collection of generic address types ***/
+
+     typedef phys-address {
+       type string {
+         pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+       }
+       description
+        "Represents media- or physical-level addresses represented
+         as a sequence octets, each octet represented by two hexadecimal
+         numbers.  Octets are separated by colons.  The canonical
+         representation uses lowercase characters.
+
+         In the value set and its semantics, this type is equivalent
+         to the PhysAddress textual convention of the SMIv2.";
+       reference
+        "RFC 2579: Textual Conventions for SMIv2";
+     }
+
+     typedef mac-address {
+       type string {
+         pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+       }
+       description
+        "The mac-address type represents an IEEE 802 MAC address.
+         The canonical representation uses lowercase characters.
+
+         In the value set and its semantics, this type is equivalent
+         to the MacAddress textual convention of the SMIv2.";
+       reference
+        "IEEE 802: IEEE Standard for Local and Metropolitan Area
+                   Networks: Overview and Architecture
+         RFC 2579: Textual Conventions for SMIv2";
+     }
+
+     /*** collection of XML-specific types ***/
+
+     typedef xpath1.0 {
+       type string;
+       description
+        "This type represents an XPATH 1.0 expression.
+
+         When a schema node is defined that uses this type, the
+         description of the schema node MUST specify the XPath
+         context in which the XPath expression is evaluated.";
+       reference
+        "XPATH: XML Path Language (XPath) Version 1.0";
+     }
+
+     /*** collection of string types ***/
+
+     typedef hex-string {
+       type string {
+         pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+       }
+       description
+        "A hexadecimal string with octets represented as hex digits
+         separated by colons.  The canonical representation uses
+         lowercase characters.";
+     }
+
+     typedef uuid {
+       type string {
+         pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+               + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+       }
+       description
+        "A Universally Unique IDentifier in the string representation
+         defined in RFC 4122.  The canonical representation uses
+         lowercase characters.
+
+         The following is an example of a UUID in string representation:
+         f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+         ";
+       reference
+        "RFC 4122: A Universally Unique IDentifier (UUID) URN
+                   Namespace";
+     }
+
+     typedef dotted-quad {
+       type string {
+         pattern
+           '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+         + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+       }
+       description
+         "An unsigned 32-bit number expressed in the dotted-quad
+          notation, i.e., four octets written as decimal numbers
+          and separated with the '.' (full stop) character.";
+     }
+   }
\ No newline at end of file
index d3587a7817388fc41735135bb4f67f2536eb46a1..1cd98f48a3f1d38cef57347c1782d08341288946 100644 (file)
@@ -27,6 +27,7 @@
     <modules>
         <module>ietf-inet-types</module>
         <module>ietf-yang-types</module>
+        <module>ietf-yang-types-20130715</module>
         <module>ietf-ted</module>
         <module>ietf-topology</module>
         <module>ietf-topology-isis</module>