+ for (Map.Entry<List<String>, TypeAwareBuilder> entry : dirtyNodes
+ .entrySet()) {
+ TypeAwareBuilder typeToResolve = entry.getValue();
+ Map<TypeDefinitionBuilder, TypeConstraints> foundedTypeDefinitionBuilder = findTypeDefinitionBuilderWithConstraints(
+ modules, entry.getValue(), builder);
+ TypeDefinitionBuilder targetType = foundedTypeDefinitionBuilder
+ .entrySet().iterator().next().getKey();
+ TypeConstraints constraints = foundedTypeDefinitionBuilder
+ .entrySet().iterator().next().getValue();
+
+ UnknownType ut = (UnknownType) typeToResolve.getType();
+
+ // RANGE
+ List<RangeConstraint> ranges = ut.getRangeStatements();
+ resolveRanges(ranges, typeToResolve, targetType, modules,
+ builder);
+
+ // LENGTH
+ List<LengthConstraint> lengths = ut.getLengthStatements();
+ resolveLengths(lengths, typeToResolve, targetType, modules,
+ builder);
+
+ // PATTERN
+ List<PatternConstraint> patterns = ut.getPatterns();
+
+ // Fraction Digits
+ Integer fractionDigits = ut.getFractionDigits();
+
+ TypeDefinition<?> type = targetType.getBaseType();
+ String typeName = type.getQName().getLocalName();
+
+ // MERGE CONSTRAINTS (enumeration and leafref omitted because
+ // they have no restrictions)
+ if (type instanceof DecimalTypeDefinition) {
+ List<RangeConstraint> fullRanges = new ArrayList<RangeConstraint>();
+ fullRanges.addAll(constraints.getRanges());
+ fullRanges.addAll(ranges);
+ Integer fd = fractionDigits == null ? constraints
+ .getFractionDigits() : fractionDigits;
+ type = YangTypesConverter.javaTypeForBaseYangDecimal64Type(
+ fullRanges, fd);
+ } else if (type instanceof IntegerTypeDefinition) {
+ List<RangeConstraint> fullRanges = new ArrayList<RangeConstraint>();
+ fullRanges.addAll(constraints.getRanges());
+ fullRanges.addAll(ranges);
+ if (typeName.startsWith("int")) {
+ type = YangTypesConverter
+ .javaTypeForBaseYangSignedIntegerType(typeName,
+ fullRanges);
+ } else {
+ type = YangTypesConverter
+ .javaTypeForBaseYangUnsignedIntegerType(
+ typeName, fullRanges);
+ }
+ } else if (type instanceof StringTypeDefinition) {
+ List<LengthConstraint> fullLengths = new ArrayList<LengthConstraint>();
+ fullLengths.addAll(constraints.getLengths());
+ fullLengths.addAll(lengths);
+ List<PatternConstraint> fullPatterns = new ArrayList<PatternConstraint>();
+ fullPatterns.addAll(constraints.getPatterns());
+ fullPatterns.addAll(patterns);
+ type = new StringType(fullLengths, fullPatterns);
+ } else if (type instanceof BitsTypeDefinition) {
+ // TODO: add 'length' restriction to BitsType
+ BitsTypeDefinition bitsType = (BitsTypeDefinition) type;
+ List<Bit> bits = bitsType.getBits();
+ type = new BitsType(bits);
+ } else if (type instanceof BinaryTypeDefinition) {
+ type = new BinaryType(null, lengths, null);
+ } else if (typeName.equals("instance-identifier")) {
+ // TODO: instance-identifier
+ /*
+ * boolean requireInstance = isRequireInstance(typeBody);
+ * type = new InstanceIdentifier(null, requireInstance);
+ */
+ }
+ typeToResolve.setType(type);