BUG-4638: Implement enum build validation 70/29870/3
authorRobert Varga <rovarga@cisco.com>
Wed, 18 Nov 2015 15:06:23 +0000 (16:06 +0100)
committerTony Tkacik <ttkacik@cisco.com>
Thu, 19 Nov 2015 18:41:27 +0000 (18:41 +0000)
EnumPairs need to be validated fro conflicting values. Also, the parser
integration code needs to assign th eproper value.

Change-Id: I28a57656231b110110dff58ba69c57ec6d76e3c7
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/EnumerationTypeBuilder.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/InvalidEnumDefinitionException.java [new file with mode: 0644]

index 46f1aa001b0c77e4a1557939673ec560235e519b..467a6217366a636256e2cea98bbd83082deaafd9 100644 (file)
@@ -7,8 +7,10 @@
  */
 package org.opendaylight.yangtools.yang.model.util.type;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMap.Builder;
+import java.util.HashMap;
 import java.util.Map;
 import javax.annotation.Nonnull;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
@@ -23,14 +25,21 @@ public final class EnumerationTypeBuilder extends TypeBuilder<EnumTypeDefinition
     }
 
     public void addEnum(@Nonnull final EnumPair item) {
+        Preconditions.checkArgument(item.getValue() != null, "Enum %s has null value", item);
         builder.put(item.getName(), item);
     }
 
     @Override
     public EnumTypeDefinition build() {
         final Map<String, EnumPair> map = builder.build();
+        final Map<Integer, EnumPair> positionMap = new HashMap<>();
 
-        // FIXME: run null value checks and re-generate EnumPairs as appropriate
+        for (EnumPair p : map.values()) {
+            final EnumPair conflict = positionMap.put(p.getValue(), p);
+            if (conflict != null) {
+                throw new InvalidEnumDefinitionException(p, "Bit %s conflicts on position with bit ", conflict);
+            }
+        }
 
         return new BaseEnumerationType(getPath(), getUnknownSchemaNodes(), map.values());
     }
diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/InvalidEnumDefinitionException.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/InvalidEnumDefinitionException.java
new file mode 100644 (file)
index 0000000..7bab7be
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2015 Pantheon Technologies s.r.o. 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.yang.model.util.type;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Preconditions;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
+
+@Beta
+public class InvalidEnumDefinitionException extends IllegalArgumentException {
+    private static final long serialVersionUID = 1L;
+    private final EnumPair offendingEnum;
+
+    protected InvalidEnumDefinitionException(final EnumPair offendingEnum, final String message) {
+        super(message);
+        this.offendingEnum = Preconditions.checkNotNull(offendingEnum);
+    }
+
+    public InvalidEnumDefinitionException(final EnumPair offendingEnum, final String format,
+            final Object... args) {
+        this(offendingEnum, String.format(format, args));
+    }
+
+    public EnumPair getOffendingEnum() {
+        return offendingEnum;
+    }
+}