Bug 5410 - XSD regular expressions are interpreted as Java regexes (1/2)
[yangtools.git] / yang / yang-model-export / src / main / java / org / opendaylight / yangtools / yang / model / export / SchemaContextEmitter.java
index f4e19f821f5ff14a2800c51177beaf2af5986aa3..9ec95a5b119b1489acd0ac2d645a1313b752bb51 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Set;
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.NotThreadSafe;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -53,7 +54,9 @@ import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
@@ -72,8 +75,6 @@ import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
-import org.opendaylight.yangtools.yang.model.util.DerivedType;
-import org.opendaylight.yangtools.yang.model.util.ExtendedType;
 import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
 
 @Beta
@@ -443,9 +444,7 @@ class SchemaContextEmitter {
     }
 
     private void emitTypeBodyNodes(final TypeDefinition<?> typeDef) {
-        if (typeDef instanceof ExtendedType) {
-            emitTypeBodyNodes(DerivedType.from((ExtendedType) typeDef));
-        } else if (typeDef instanceof UnsignedIntegerTypeDefinition) {
+        if (typeDef instanceof UnsignedIntegerTypeDefinition) {
             emitUnsignedIntegerSpecification((UnsignedIntegerTypeDefinition) typeDef);
         } else if (typeDef instanceof IntegerTypeDefinition) {
             emitIntegerSpefication((IntegerTypeDefinition) typeDef);
@@ -533,10 +532,9 @@ class SchemaContextEmitter {
             emitReferenceNode(first.getReference());
             writer.endNode();
         }
-
     }
 
-    private String toLengthString(final List<LengthConstraint> list) {
+    private static String toLengthString(final List<LengthConstraint> list) {
         final StringBuilder lengthStr = new StringBuilder();
         final Iterator<LengthConstraint> constIt = list.iterator();
         while (constIt.hasNext()) {
@@ -555,7 +553,7 @@ class SchemaContextEmitter {
         return lengthStr.toString();
     }
 
-    private String toRangeString(final List<RangeConstraint> list) {
+    private static String toRangeString(final List<RangeConstraint> list) {
         final StringBuilder lengthStr = new StringBuilder();
         final Iterator<RangeConstraint> constIt = list.iterator();
         while (constIt.hasNext()) {
@@ -575,7 +573,7 @@ class SchemaContextEmitter {
     }
 
     private void emitPatternNode(final PatternConstraint pattern) {
-        writer.startPatternNode(pattern.getRegularExpression());
+        writer.startPatternNode(pattern.getRawRegularExpression());
         emitErrorMessageNode(pattern.getErrorMessage()); // FIXME: BUG-2444: Optional
         emitErrorAppTagNode(pattern.getErrorAppTag()); // FIXME: BUG-2444: Optional
         emitDescriptionNode(pattern.getDescription());
@@ -628,7 +626,7 @@ class SchemaContextEmitter {
     }
 
     private void emitIdentityrefSpecification(final IdentityrefTypeDefinition typeDefinition) {
-        emitBase(typeDefinition.getQName());
+        emitBase(typeDefinition.getIdentity().getQName());
     }
 
     private void emitUnionSpecification(final UnionTypeDefinition typeDefinition) {
@@ -693,7 +691,7 @@ class SchemaContextEmitter {
     }
 
     private void emitMust(@Nullable final MustDefinition mustCondition) {
-        if(mustCondition != null && mustCondition.getXpath() != null) {
+        if (mustCondition != null && mustCondition.getXpath() != null) {
             writer.startMustNode(mustCondition.getXpath());
             emitErrorMessageNode(mustCondition.getErrorMessage());
             emitErrorAppTagNode(mustCondition.getErrorAppTag());
@@ -739,7 +737,7 @@ class SchemaContextEmitter {
         }
     }
 
-    private void emitDocumentedNode(final DocumentedNode input) {
+    private void emitDocumentedNode(final DocumentedNode.WithStatus input) {
         emitStatusNode(input.getStatus());
         emitDescriptionNode(input.getDescription());
         emitReferenceNode(input.getReference());
@@ -762,7 +760,6 @@ class SchemaContextEmitter {
         emitConstraints(child.getConstraints());
         // FIXME: BUG-2444: whenNode //:Optional
         // FIXME: BUG-2444: *(ifFeatureNode )
-        emitMustNodes(child.getConstraints().getMustConstraints());
         emitPresenceNode(child.isPresenceContainer());
         emitConfigNode(child.isConfiguration());
         emitDocumentedNode(child);
@@ -942,7 +939,7 @@ class SchemaContextEmitter {
 
     }
 
-    private <T extends SchemaNode> T getOriginalChecked(final T value) {
+    private static <T extends SchemaNode> T getOriginalChecked(final T value) {
         final Optional<SchemaNode> original = SchemaNodeUtils.getOriginalIfPossible(value);
         Preconditions.checkArgument(original.isPresent(), "Original unmodified version of node is not present.");
         @SuppressWarnings("unchecked")
@@ -1074,7 +1071,7 @@ class SchemaContextEmitter {
         emitStatusNode(augmentation.getStatus());
         emitDescriptionNode(augmentation.getDescription());
         emitReferenceNode(augmentation.getReference());
-        for(final UsesNode uses: augmentation.getUses()) {
+        for (final UsesNode uses: augmentation.getUses()) {
             emitUsesNode(uses);
         }
 
@@ -1091,7 +1088,9 @@ class SchemaContextEmitter {
 
     private void emitUnknownStatementNodes(final List<UnknownSchemaNode> unknownNodes) {
         for (final UnknownSchemaNode unknonwnNode : unknownNodes) {
-            emitUnknownStatementNode(unknonwnNode);
+            if (!unknonwnNode.isAddedByAugmentation() && !unknonwnNode.isAddedByUses()) {
+                emitUnknownStatementNode(unknonwnNode);
+            }
         }
     }
 
@@ -1113,7 +1112,7 @@ class SchemaContextEmitter {
     }
 
     private void emitWhen(final RevisionAwareXPath revisionAwareXPath) {
-        if(revisionAwareXPath != null) {
+        if (revisionAwareXPath != null) {
             writer.startWhenNode(revisionAwareXPath);
             writer.endNode();
         }
@@ -1130,10 +1129,10 @@ class SchemaContextEmitter {
         emitDescriptionNode(rpc.getDescription());
         emitReferenceNode(rpc.getReference());
 
-        for(final TypeDefinition<?> typedef : rpc.getTypeDefinitions()) {
+        for (final TypeDefinition<?> typedef : rpc.getTypeDefinitions()) {
             emitTypedefNode(typedef);
         }
-        for(final GroupingDefinition grouping : rpc.getGroupings()) {
+        for (final GroupingDefinition grouping : rpc.getGroupings()) {
             emitGrouping(grouping);
         }
         emitInput(rpc.getInput());
@@ -1143,8 +1142,8 @@ class SchemaContextEmitter {
 
     }
 
-    private void emitInput(@Nullable final ContainerSchemaNode input) {
-        if (input != null) {
+    private void emitInput(@Nonnull final ContainerSchemaNode input) {
+        if (isExplicitStatement(input)) {
             writer.startInputNode();
             emitDataNodeContainer(input);
             emitUnknownStatementNodes(input.getUnknownSchemaNodes());
@@ -1153,16 +1152,21 @@ class SchemaContextEmitter {
 
     }
 
-    private void emitOutput(@Nullable final ContainerSchemaNode input) {
-        if (input != null) {
+    private void emitOutput(@Nonnull final ContainerSchemaNode output) {
+        if (isExplicitStatement(output)) {
             writer.startOutputNode();
-            emitDataNodeContainer(input);
-            emitUnknownStatementNodes(input.getUnknownSchemaNodes());
+            emitDataNodeContainer(output);
+            emitUnknownStatementNodes(output.getUnknownSchemaNodes());
             writer.endNode();
         }
 
     }
 
+    private static boolean isExplicitStatement(final ContainerSchemaNode node) {
+        return node instanceof EffectiveStatement
+                && ((EffectiveStatement) node).getDeclared().getStatementSource() == StatementSource.DECLARATION;
+    }
+
     private void emitNotificationNode(final NotificationDefinition notification) {
         writer.startNotificationNode(notification.getQName());
         // FIXME: BUG-2444: *(ifFeatureNode )
@@ -1178,11 +1182,11 @@ class SchemaContextEmitter {
     private static <T> boolean  isPrefix(final Iterable<T> prefix, final Iterable<T> other) {
         final Iterator<T> prefixIt = prefix.iterator();
         final Iterator<T> otherIt = other.iterator();
-        while(prefixIt.hasNext()) {
-            if(!otherIt.hasNext()) {
+        while (prefixIt.hasNext()) {
+            if (!otherIt.hasNext()) {
                 return false;
             }
-            if(!Objects.deepEquals(prefixIt.next(), otherIt.next())) {
+            if (!Objects.deepEquals(prefixIt.next(), otherIt.next())) {
                 return false;
             }
         }