YANGTOOLS-621: introduce specialized integer types
[yangtools.git] / yang / yang-model-export / src / main / java / org / opendaylight / yangtools / yang / model / export / SchemaContextEmitter.java
index 63b2e2e11516a9ceb56142d9a6529e29ec5fdeeb..3a28f320c7926025619587d65732c02dd6eb2a2f 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.model.export;
 import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicates;
-import com.google.common.base.Strings;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Range;
 import com.google.common.collect.RangeSet;
@@ -1332,10 +1331,8 @@ abstract class SchemaContextEmitter {
         }
 
         private void emitUnitsNode(@Nullable final String input) {
-            if (!Strings.isNullOrEmpty(input)) {
-                super.writer.startUnitsNode(input);
-                super.writer.endNode();
-            }
+            super.writer.startUnitsNode(input);
+            super.writer.endNode();
         }
 
         private void emitRevision(final Revision date) {
@@ -1420,8 +1417,8 @@ abstract class SchemaContextEmitter {
             // Differentiate between derived type and existing type
             // name.
             emitTypeNodeDerived(typedef);
-            emitUnitsNode(typedef.getUnits());
-            emitDefaultNode(typedef.getDefaultValue());
+            typedef.getUnits().ifPresent(this::emitUnitsNode);
+            typedef.getDefaultValue().ifPresent(this::emitDefaultNode);
             emitDocumentedNode(typedef);
             emitUnknownStatementNodes(typedef.getUnknownSchemaNodes());
             super.writer.endNode();
@@ -1453,9 +1450,9 @@ abstract class SchemaContextEmitter {
 
         private void emitTypeBodyNodes(final TypeDefinition<?> typeDef) {
             if (typeDef instanceof UnsignedIntegerTypeDefinition) {
-                emitUnsignedIntegerSpecification((UnsignedIntegerTypeDefinition) typeDef);
+                emitUnsignedIntegerSpecification((UnsignedIntegerTypeDefinition<?, ?>) typeDef);
             } else if (typeDef instanceof IntegerTypeDefinition) {
-                emitIntegerSpefication((IntegerTypeDefinition) typeDef);
+                emitIntegerSpefication((IntegerTypeDefinition<?, ?>) typeDef);
             } else if (typeDef instanceof DecimalTypeDefinition) {
                 emitDecimal64Specification((DecimalTypeDefinition) typeDef);
             } else if (typeDef instanceof StringTypeDefinition) {
@@ -1481,33 +1478,25 @@ abstract class SchemaContextEmitter {
             }
         }
 
-        private void emitIntegerSpefication(final IntegerTypeDefinition typeDef) {
-            emitRangeNodeOptional(typeDef.getRangeConstraints());
+        private void emitIntegerSpefication(final IntegerTypeDefinition<?, ?> typeDef) {
+            typeDef.getRangeConstraint().ifPresent(this::emitRangeNode);
         }
 
-        private void emitUnsignedIntegerSpecification(final UnsignedIntegerTypeDefinition typeDef) {
-            emitRangeNodeOptional(typeDef.getRangeConstraints());
-
+        private void emitUnsignedIntegerSpecification(final UnsignedIntegerTypeDefinition<?, ?> typeDef) {
+            typeDef.getRangeConstraint().ifPresent(this::emitRangeNode);
         }
 
-        private void emitRangeNodeOptional(final List<RangeConstraint> list) {
-            // FIXME: BUG-2444: Wrong decomposition in API, should be
-            // LenghtConstraint
-            // which contains ranges.
-            if (!list.isEmpty()) {
-                super.writer.startRangeNode(toRangeString(list));
-                final RangeConstraint first = list.iterator().next();
-                first.getErrorMessage().ifPresent(this::emitErrorMessageNode);
-                first.getErrorAppTag().ifPresent(this::emitErrorAppTagNode);
-                emitDocumentedNode(first);
-                super.writer.endNode();
-            }
-
+        private void emitRangeNode(final RangeConstraint<?> constraint) {
+            super.writer.startRangeNode(toRangeString(constraint.getAllowedRanges()));
+            constraint.getErrorMessage().ifPresent(this::emitErrorMessageNode);
+            constraint.getErrorAppTag().ifPresent(this::emitErrorAppTagNode);
+            emitDocumentedNode(constraint);
+            super.writer.endNode();
         }
 
         private void emitDecimal64Specification(final DecimalTypeDefinition typeDefinition) {
             emitFranctionDigitsNode(typeDefinition.getFractionDigits());
-            emitRangeNodeOptional(typeDefinition.getRangeConstraints());
+            typeDefinition.getRangeConstraint().ifPresent(this::emitRangeNode);
         }
 
         private void emitFranctionDigitsNode(final Integer fractionDigits) {
@@ -1548,8 +1537,8 @@ abstract class SchemaContextEmitter {
             return sb.toString();
         }
 
-        private static String toRangeString(final List<RangeConstraint> list) {
-            final Iterator<RangeConstraint> it = list.iterator();
+        private static String toRangeString(final RangeSet<?> ranges) {
+            final Iterator<? extends Range<?>> it = ranges.asRanges().iterator();
             if (!it.hasNext()) {
                 return "";
             }
@@ -1557,15 +1546,15 @@ abstract class SchemaContextEmitter {
             final StringBuilder sb = new StringBuilder();
             boolean haveNext;
             do {
-                final RangeConstraint current = it.next();
+                final Range<?> current = it.next();
                 haveNext = it.hasNext();
-                appendRange(sb, current.getMin(), current.getMax(), haveNext);
+                appendRange(sb, current.lowerEndpoint(), current.upperEndpoint(), haveNext);
             } while (haveNext);
 
             return sb.toString();
         }
 
-        private static void appendRange(final StringBuilder sb, final Number min, final Number max,
+        private static void appendRange(final StringBuilder sb, final Object min, final Object max,
                 final boolean haveNext) {
             sb.append(min);
             if (!min.equals(max)) {
@@ -1598,10 +1587,8 @@ abstract class SchemaContextEmitter {
         }
 
         private void emitDefaultNode(@Nullable final Object object) {
-            if (object != null) {
-                super.writer.startDefaultNode(object.toString());
-                super.writer.endNode();
-            }
+            super.writer.startDefaultNode(object.toString());
+            super.writer.endNode();
         }
 
         private void emitEnumSpecification(final EnumTypeDefinition typeDefinition) {
@@ -1791,9 +1778,9 @@ abstract class SchemaContextEmitter {
             child.getConstraints().getWhenCondition().ifPresent(this::emitWhen);
             // FIXME: BUG-2444: *(ifFeatureNode )
             emitTypeNode(child.getPath(), child.getType());
-            emitUnitsNode(child.getUnits());
+            child.getType().getUnits().ifPresent(this::emitUnitsNode);
             emitMustNodes(child.getConstraints().getMustConstraints());
-            emitDefaultNode(child.getDefault());
+            child.getType().getDefaultValue().ifPresent(this::emitDefaultNode);
             emitConfigNode(child.isConfiguration());
             emitMandatoryNode(child.getConstraints().isMandatory());
             emitDocumentedNode(child);
@@ -1808,7 +1795,7 @@ abstract class SchemaContextEmitter {
             child.getConstraints().getWhenCondition().ifPresent(this::emitWhen);
             // FIXME: BUG-2444: *(ifFeatureNode )
             emitTypeNode(child.getPath(), child.getType());
-            emitUnitsNode(child.getType().getUnits());
+            child.getType().getUnits().ifPresent(this::emitUnitsNode);
             // FIXME: BUG-2444: unitsNode /Optional
             emitMustNodes(child.getConstraints().getMustConstraints());
             emitConfigNode(child.isConfiguration());
@@ -1843,7 +1830,7 @@ abstract class SchemaContextEmitter {
 
         }
 
-        private void emitMustNodes(final Set<MustDefinition> mustConstraints) {
+        private void emitMustNodes(final Collection<MustDefinition> mustConstraints) {
             for (final MustDefinition must : mustConstraints) {
                 emitMust(must);
             }
@@ -1875,7 +1862,7 @@ abstract class SchemaContextEmitter {
             emitConfigNode(choice.isConfiguration());
             emitMandatoryNode(choice.getConstraints().isMandatory());
             emitDocumentedNode(choice);
-            for (final ChoiceCaseNode caze : choice.getCases()) {
+            for (final ChoiceCaseNode caze : choice.getCases().values()) {
                 // TODO: emit short case?
                 emitCaseNode(caze);
             }
@@ -1996,8 +1983,8 @@ abstract class SchemaContextEmitter {
             final LeafSchemaNode original = getOriginalChecked(value);
 
             // emitMustNodes(child.getConstraints().getMustConstraints());
-            if (Objects.deepEquals(original.getDefault(), value.getDefault())) {
-                emitDefaultNode(value.getDefault());
+            if (Objects.deepEquals(original.getType().getDefaultValue(), value.getType().getDefaultValue())) {
+                emitDefaultNode(value.getType().getDefaultValue());
             }
             if (Objects.deepEquals(original.isConfiguration(), value.isConfiguration())) {
                 emitConfigNode(value.isConfiguration());
@@ -2226,7 +2213,9 @@ abstract class SchemaContextEmitter {
 
             super.writer.startNotificationNode(notification.getQName());
             // FIXME: BUG-2444: *(ifFeatureNode )
-            emitConstraints(notification.getConstraints());
+            for (final MustDefinition mustCondition : notification.getMustConstraints()) {
+                emitMust(mustCondition);
+            }
             emitDocumentedNode(notification);
             emitDataNodeContainer(notification);
             emitUnknownStatementNodes(notification.getUnknownSchemaNodes());