BUG-1862: Incorrect type transformation in TypeProviderImpl 65/27165/15
authorRobert Varga <rovarga@cisco.com>
Thu, 17 Sep 2015 23:56:29 +0000 (01:56 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 2 May 2016 09:54:14 +0000 (09:54 +0000)
added new interface and implementation, introduced new type

Change-Id: I70c625c0a182fb01147fdb14f48ea4c0b904b3a7
Signed-off-by: Robert Varga <rovarga@cisco.com>
Signed-off-by: Filip Gregor <fgregor@cisco.com>
binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/BaseTypeWithRestrictions.java [new file with mode: 0644]
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/yang/types/BaseYangTypes.java
binding/mdsal-binding-generator-impl/src/test/java/org/opendaylight/yangtools/sal/binding/yang/types/TypeProviderTest.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/yangtools/binding/generator/util/Types.java

diff --git a/binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/BaseTypeWithRestrictions.java b/binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/yangtools/sal/binding/model/api/BaseTypeWithRestrictions.java
new file mode 100644 (file)
index 0000000..703c58d
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.sal.binding.model.api;
+
+/**
+ * The BaseTypeWithRestrictions is marker interface that encapsulates definition of java
+ * concrete type only with changed restriction values.
+ */
+public interface BaseTypeWithRestrictions extends ConcreteType {
+
+}
\ No newline at end of file
index ef65b6c8cccc4f780e3b6090c6d3c2a83356bd30..26325c16b8eb5969afbb68e588418d423322cdd8 100644 (file)
@@ -7,13 +7,10 @@
  */
 package org.opendaylight.yangtools.sal.binding.yang.types;
 
-import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 import org.opendaylight.yangtools.binding.generator.util.Types;
 import org.opendaylight.yangtools.sal.binding.generator.spi.TypeProvider;
@@ -24,10 +21,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-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.util.BaseConstraints;
 
 public final class BaseYangTypes {
     /**
@@ -226,28 +219,7 @@ public final class BaseYangTypes {
     };
 
     private static <T extends Number> Restrictions singleRangeRestrictions(final T min, final T max) {
-        return new Restrictions() {
-            @Override
-            public boolean isEmpty() {
-                return false;
-            }
-
-            @Override
-            public List<RangeConstraint> getRangeConstraints() {
-                return Collections.singletonList(BaseConstraints.newRangeConstraint(min, max,
-                        Optional.<String> absent(), Optional.<String> absent()));
-            }
-
-            @Override
-            public List<PatternConstraint> getPatternConstraints() {
-                return Collections.emptyList();
-            }
-
-            @Override
-            public List<LengthConstraint> getLengthConstraints() {
-                return Collections.emptyList();
-            }
-        };
+        return Types.getDefaultRestrictions(min, max);
     }
 
     public static final class UnionType implements Type {
@@ -264,5 +236,4 @@ public final class BaseYangTypes {
             return "Union";
         }
     }
-
 }
index 59c07fcb5889c4b53839e48767854e1aea079418..004b007969a0e8ff1e82dd94878b5b834375ef27 100644 (file)
@@ -25,6 +25,7 @@ import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil;
 import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl;
 import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
 import org.opendaylight.yangtools.sal.binding.generator.spi.TypeProvider;
+import org.opendaylight.yangtools.sal.binding.model.api.BaseTypeWithRestrictions;
 import org.opendaylight.yangtools.sal.binding.model.api.ConcreteType;
 import org.opendaylight.yangtools.sal.binding.model.api.Enumeration;
 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;
@@ -224,10 +225,6 @@ public class TypeProviderTest {
         return result;
     }
 
-    /**
-     * FIXME: Remove @Ignore annotation once the bug https://bugs.opendaylight.org/show_bug.cgi?id=1862 is fixed
-     */
-    @Ignore
     @Test
     public void bug1862RestrictedTypedefTransformationTest() {
         final TypeProvider provider = new TypeProviderImpl(schemaContext);
@@ -237,8 +234,7 @@ public class TypeProviderTest {
         final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(leafType);
         final Type result = provider.javaTypeForSchemaDefinitionType(leafType, leaf, restrictions);
         assertNotNull(result);
-        assertTrue(result instanceof GeneratedTransferObject);
-        //TODO: complete test after bug 1862 is fixed
+        assertTrue(result instanceof BaseTypeWithRestrictions);
     }
 
     @Test
index 383618c61217b2d975f8e65400d074f582a98f00..26277e87f23932c2110085c3c80c02038edb3d9e 100644 (file)
@@ -8,16 +8,20 @@
 package org.opendaylight.yangtools.binding.generator.util;
 
 import com.google.common.base.CharMatcher;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.Iterables;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Future;
 import javax.annotation.Nullable;
+import org.opendaylight.yangtools.sal.binding.model.api.BaseTypeWithRestrictions;
 import org.opendaylight.yangtools.sal.binding.model.api.ConcreteType;
 import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType;
 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions;
@@ -25,6 +29,10 @@ import org.opendaylight.yangtools.sal.binding.model.api.Type;
 import org.opendaylight.yangtools.sal.binding.model.api.WildcardType;
 import org.opendaylight.yangtools.yang.binding.Augmentable;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
+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.util.BaseConstraints;
 
 public final class Types {
     private static final CacheLoader<Class<?>, ConcreteType> TYPE_LOADER =
@@ -96,7 +104,11 @@ public final class Types {
 
     public static ConcreteType typeForClass(final Class<?> cls, final Restrictions restrictions) {
         if (restrictions != null) {
-            return new ConcreteTypeImpl(cls.getPackage().getName(), cls.getSimpleName(), restrictions);
+            if (restrictions instanceof DefaultRestrictions) {
+                return new ConcreteTypeImpl(cls.getPackage().getName(), cls.getSimpleName(), restrictions);
+            } else {
+                return new BaseTypeWithRestrictionsImpl(cls.getPackage().getName(), cls.getSimpleName(), restrictions);
+            }
         } else {
             return typeForClass(cls);
         }
@@ -246,6 +258,34 @@ public final class Types {
         }
     }
 
+    /**
+     *
+     * Represents concrete JAVA type with changed restriction values.
+     *
+     */
+    private static final class BaseTypeWithRestrictionsImpl extends AbstractBaseType implements BaseTypeWithRestrictions {
+        private final Restrictions restrictions;
+
+        /**
+         * Creates instance of this class with package <code>pkName</code> and
+         * with the type name <code>name</code>.
+         *
+         * @param pkName
+         *            string with package name
+         * @param name
+         *            string with the name of the type
+         */
+        private BaseTypeWithRestrictionsImpl(final String pkName, final String name, final Restrictions restrictions) {
+            super(pkName, name);
+            this.restrictions = Preconditions.checkNotNull(restrictions);
+        }
+
+        @Override
+        public Restrictions getRestrictions() {
+            return restrictions;
+        }
+    }
+
     /**
      *
      * Represents parametrized JAVA type.
@@ -309,4 +349,40 @@ public final class Types {
         }
     }
 
-}
+    public static <T extends Number> DefaultRestrictions getDefaultRestrictions(final T min, final T max) {
+        return new DefaultRestrictions(min, max);
+    }
+
+    private static final class DefaultRestrictions<T extends Number> implements Restrictions {
+        private final T min;
+        private final T max;
+        private final List<RangeConstraint> rangeConstraints;
+
+        private DefaultRestrictions(final T min, final T max) {
+            this.min = Preconditions.checkNotNull(min);
+            this.max = Preconditions.checkNotNull(max);
+            this.rangeConstraints = Collections.singletonList(BaseConstraints.newRangeConstraint(min, max, Optional
+                    .<String>absent(), Optional.<String>absent()));
+        }
+
+        @Override
+        public boolean isEmpty() {
+            return false;
+        }
+
+        @Override
+        public List<RangeConstraint> getRangeConstraints() {
+            return rangeConstraints;
+        }
+
+        @Override
+        public List<PatternConstraint> getPatternConstraints() {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public List<LengthConstraint> getLengthConstraints() {
+            return Collections.emptyList();
+        }
+    }
+}
\ No newline at end of file