From cb8c265eacff4d61427ec7ab120672e8ad374063 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 20 Nov 2015 23:13:51 +0100 Subject: [PATCH] BUG-4638: fix Restrictions This fixes up the implementation to pick up restrictions from other types than ExtendedType. Change-Id: I9fb8125c07fdfeb3905df551ab6424c08624e0a7 Signed-off-by: Robert Varga --- .../binding/yang/types/TypeProviderImpl.java | 40 ++++++---- .../generator/util/BindingGeneratorUtil.java | 79 ++++++++++++++----- 2 files changed, 85 insertions(+), 34 deletions(-) diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java index f8b33ad262..2d034ecaf8 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderImpl.java @@ -12,6 +12,7 @@ import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findD import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule; import com.google.common.base.Preconditions; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import com.google.common.io.BaseEncoding; import java.io.Serializable; @@ -809,8 +810,8 @@ public final class TypeProviderImpl implements TypeProvider { genTOBuilder.addEqualsIdentity(genPropBuilder); genTOBuilder.addHashIdentity(genPropBuilder); genTOBuilder.addToStringProperty(genPropBuilder); - if (javaType instanceof ConcreteType && "String".equals(javaType.getName()) && typedef instanceof ExtendedType) { - final List regExps = resolveRegExpressionsFromTypedef((ExtendedType) typedef); + if (javaType instanceof ConcreteType && "String".equals(javaType.getName()) && typedef.getBaseType() != null) { + final List regExps = resolveRegExpressionsFromTypedef(typedef); addStringRegExAsConstant(genTOBuilder, regExps); } addUnitsToGenTO(genTOBuilder, typedef.getUnits()); @@ -1174,22 +1175,31 @@ public final class TypeProviderImpl implements TypeProvider { * if typedef equals null * */ - private static List resolveRegExpressionsFromTypedef(final ExtendedType typedef) { - final List regExps = new ArrayList(); + private static List resolveRegExpressionsFromTypedef(final TypeDefinition typedef) { Preconditions.checkArgument(typedef != null, "typedef can't be null"); - final TypeDefinition strTypeDef = baseTypeDefForExtendedType(typedef); - if (strTypeDef instanceof StringType) { - final List patternConstraints = typedef.getPatternConstraints(); - if (!patternConstraints.isEmpty()) { - String regEx; - String modifiedRegEx; - for (PatternConstraint patternConstraint : patternConstraints) { - regEx = patternConstraint.getRegularExpression(); - modifiedRegEx = StringEscapeUtils.escapeJava(regEx); - regExps.add(modifiedRegEx); - } + + final List patternConstraints; + if (typedef instanceof ExtendedType) { + final TypeDefinition strTypeDef = baseTypeDefForExtendedType(typedef); + if (strTypeDef instanceof StringType) { + patternConstraints = ((ExtendedType)typedef).getPatternConstraints(); + } else { + patternConstraints = ImmutableList.of(); } + } else if (typedef instanceof StringTypeDefinition) { + // FIXME: run diff against base + patternConstraints = ((StringTypeDefinition) typedef).getPatternConstraints(); + } else { + patternConstraints = ImmutableList.of(); } + + final List regExps = new ArrayList<>(patternConstraints.size()); + for (PatternConstraint patternConstraint : patternConstraints) { + final String regEx = patternConstraint.getRegularExpression(); + final String modifiedRegEx = StringEscapeUtils.escapeJava(regEx); + regExps.add(modifiedRegEx); + } + return regExps; } diff --git a/binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java b/binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java index 41f30ca257..f80ba6a7b4 100644 --- a/binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java +++ b/binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/BindingGeneratorUtil.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.binding.generator.util; import com.google.common.base.CharMatcher; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -33,11 +34,13 @@ import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; 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.UnsignedIntegerTypeDefinition; import org.opendaylight.yangtools.yang.model.util.ExtendedType; @@ -447,35 +450,74 @@ public final class BindingGeneratorUtil { } public static Restrictions getRestrictions(final TypeDefinition type) { - // Base types have no constraints, so get over it quickly - if (!(type instanceof ExtendedType)) { + // Old parser generated types which actually contained based restrictions, but our code deals with that when + // binding to core Java types. Hence we'll emit empty restrictions for base types. + if (type == null || type.getBaseType() == null) { return EMPTY_RESTRICTIONS; } - // Take care of the extended types ... - final ExtendedType ext = (ExtendedType)type; - final List length = ext.getLengthConstraints(); - final List pattern = ext.getPatternConstraints(); - - List tmp = ext.getRangeConstraints(); - if (tmp.isEmpty()) { - final TypeDefinition base = ext.getBaseType(); - if (base instanceof IntegerTypeDefinition) { - tmp = ((IntegerTypeDefinition)base).getRangeConstraints(); - } else if (base instanceof UnsignedIntegerTypeDefinition) { - tmp = ((UnsignedIntegerTypeDefinition)base).getRangeConstraints(); - } else if (base instanceof DecimalTypeDefinition) { - tmp = ((DecimalTypeDefinition)base).getRangeConstraints(); + final List length; + final List pattern; + final List range; + + // Take care of extended types.. + if (type instanceof ExtendedType) { + final ExtendedType ext = (ExtendedType)type; + length = ext.getLengthConstraints(); + pattern = ext.getPatternConstraints(); + + // Interesting special-case... + List tmp = ext.getRangeConstraints(); + if (tmp.isEmpty()) { + final TypeDefinition base = ext.getBaseType(); + if (base instanceof IntegerTypeDefinition) { + tmp = ((IntegerTypeDefinition)base).getRangeConstraints(); + } else if (base instanceof UnsignedIntegerTypeDefinition) { + tmp = ((UnsignedIntegerTypeDefinition)base).getRangeConstraints(); + } else if (base instanceof DecimalTypeDefinition) { + tmp = ((DecimalTypeDefinition)base).getRangeConstraints(); + } } + + range = tmp; + } else if (type instanceof BinaryTypeDefinition) { + // FIXME: run a diff on base type + length = ((BinaryTypeDefinition)type).getLengthConstraints(); + pattern = ImmutableList.of(); + range = ImmutableList.of(); + } else if (type instanceof DecimalTypeDefinition) { + length = ImmutableList.of(); + pattern = ImmutableList.of(); + // FIXME: run a diff on base type + range = ((DecimalTypeDefinition)type).getRangeConstraints(); + } else if (type instanceof IntegerTypeDefinition) { + length = ImmutableList.of(); + pattern = ImmutableList.of(); + // FIXME: run a diff on base type + range = ((IntegerTypeDefinition)type).getRangeConstraints(); + } else if (type instanceof StringTypeDefinition) { + // FIXME: run a diff on base type + length = ((StringTypeDefinition)type).getLengthConstraints(); + // FIXME: run a diff on base type + pattern = ((StringTypeDefinition)type).getPatternConstraints(); + range = ImmutableList.of(); + } else if (type instanceof UnsignedIntegerTypeDefinition) { + length = ImmutableList.of(); + pattern = ImmutableList.of(); + // FIXME: run a diff on base type + range = ((UnsignedIntegerTypeDefinition)type).getRangeConstraints(); + } else { + length = ImmutableList.of(); + pattern = ImmutableList.of(); + range = ImmutableList.of(); } // Now, this may have ended up being empty, too... - if (length.isEmpty() && pattern.isEmpty() && tmp.isEmpty()) { + if (length.isEmpty() && pattern.isEmpty() && range.isEmpty()) { return EMPTY_RESTRICTIONS; } // Nope, not empty allocate a holder - final List range = tmp; return new Restrictions() { @Override public List getRangeConstraints() { @@ -495,5 +537,4 @@ public final class BindingGeneratorUtil { } }; } - } -- 2.36.6