Invert enforcement patterns when needed
[mdsal.git] / binding2 / mdsal-binding2-generator-impl / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / yang / types / TypeGenHelper.java
index 406a0a18358bbd5e0d29093f4fa1d22ee6a6d017..3795a238a241053d2196e2348718b501cf080d03 100644 (file)
@@ -58,15 +58,19 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.ModifierKind;
 import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Auxiliary util class for {@link TypeProviderImpl} class
  */
 @Beta
 final class TypeGenHelper {
+    private static final Logger LOG = LoggerFactory.getLogger(TypeGenHelper.class);
 
     private TypeGenHelper() {
         throw new UnsupportedOperationException("Util class");
@@ -227,7 +231,14 @@ final class TypeGenHelper {
 
         final List<String> regExps = new ArrayList<>(patternConstraints.size());
         for (final PatternConstraint patternConstraint : patternConstraints) {
-            final String regEx = patternConstraint.getJavaPatternString();
+            String regEx = patternConstraint.getJavaPatternString();
+
+            // The pattern can be inverted
+            final Optional<ModifierKind> optModifier = patternConstraint.getModifier();
+            if (optModifier.isPresent()) {
+                regEx = applyModifier(optModifier.get(), regEx);
+            }
+
             final String modifiedRegEx = StringEscapeUtils.escapeJava(regEx);
             regExps.add(modifiedRegEx);
         }
@@ -235,6 +246,16 @@ final class TypeGenHelper {
         return regExps;
     }
 
+    private static String applyModifier(final ModifierKind modifier, final String pattern) {
+        switch (modifier) {
+            case INVERT_MATCH:
+                return BindingMapping.negatePatternString(pattern);
+            default:
+                LOG.warn("Ignoring unhandled modifier {}", modifier);
+                return pattern;
+        }
+    }
+
     /**
      * Finds out for each type definition how many immersion (depth) is
      * necessary to get to the base type. Every type definition is inserted to