Merge "BUG-2962: add DataTreeTip interface and implement it"
authorTony Tkacik <ttkacik@cisco.com>
Fri, 10 Apr 2015 09:44:58 +0000 (09:44 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 10 Apr 2015 09:44:59 +0000 (09:44 +0000)
29 files changed:
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/DataObjectReadingUtil.java
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/RpcMethodInvoker.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/spi/TreeNodeFactory.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONStringIdentityrefCodec.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/AbstractIntegerStringCodec.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BinaryStringCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BitsStringCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BooleanStringCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/DecimalStringCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/EmptyStringCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/EnumStringCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/StringPatternCheckingCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/StringStringCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/TypeDefinitionAwareCodec.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/UnionStringCodec.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XmlDocumentUtils.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/DomUtils.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractNamespaceCodec.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/Rfc6020Mapping.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/BitsType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/repo/AbstractCachingSchemaSourceProvider.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/BuilderUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupportBundle.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/util/TextToASTTransformer.java

index 23bb4ccde1f05a320e811b172a5c7a54392a36de..cf98712edc383925092acfd9a24735b6508326a0 100644 (file)
@@ -176,10 +176,10 @@ public class DataObjectReadingUtil {
             return getterMethod;
         }
 
-        abstract public Map<InstanceIdentifier, DataContainer> readUsingPathArgument(DataContainer parent,
+        public abstract Map<InstanceIdentifier, DataContainer> readUsingPathArgument(DataContainer parent,
                 PathArgument childArgument, InstanceIdentifier targetBuilder);
 
-        abstract public DataContainer read(DataContainer parent, Class<?> childType);
+        public abstract DataContainer read(DataContainer parent, Class<?> childType);
 
     }
 
index c93cd8ab3afc31ea09200932f3629c394fd577f4..2b121fcc2087b626763d337d4e975da29136b3d3 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 
 abstract class RpcMethodInvoker {
 
-    private static Lookup LOOKUP = MethodHandles.publicLookup();
+    private static final Lookup LOOKUP = MethodHandles.publicLookup();
 
     protected abstract Future<RpcResult<?>> invokeOn(RpcService impl, DataObject input);
 
@@ -37,5 +37,4 @@ abstract class RpcMethodInvoker {
         }
 
     }
-
-}
\ No newline at end of file
+}
index d43eefd73bc57b99bb377cb6affb1cbd25efc763..5863b31168a0d1a21323a88091dfe90041581e7e 100644 (file)
@@ -80,7 +80,7 @@ public final class YangInstanceIdentifier implements Path<YangInstanceIdentifier
     private static final Field PATHARGUMENTS_FIELD;
 
     private static final long serialVersionUID = 3L;
-    private transient final Iterable<PathArgument> pathArguments;
+    private final transient Iterable<PathArgument> pathArguments;
     private final int hash;
 
     private volatile ImmutableList<PathArgument> legacyPath = null;
@@ -302,7 +302,7 @@ public final class YangInstanceIdentifier implements Path<YangInstanceIdentifier
      *
      * @return new builder for InstanceIdentifier with empty path arguments.
      */
-    static public InstanceIdentifierBuilder builder() {
+    public static InstanceIdentifierBuilder builder() {
         return new BuilderImpl();
     }
 
@@ -313,7 +313,7 @@ public final class YangInstanceIdentifier implements Path<YangInstanceIdentifier
      * @param origin Instace Identifier from which path arguments are copied.
      * @return new builder for InstanceIdentifier with path arguments copied from original instance identifier.
      */
-    static public InstanceIdentifierBuilder builder(final YangInstanceIdentifier origin) {
+    public static InstanceIdentifierBuilder builder(final YangInstanceIdentifier origin) {
         return new BuilderImpl(origin.getPathArguments(), origin.hashCode());
     }
 
index 4f0a2201d7c58aa59770e80099c1b68bd4608871..601915f70ceff0fde6c383eb6594a66e479fcf49 100644 (file)
@@ -28,7 +28,7 @@ public final class TreeNodeFactory {
      * @param version data node version
      * @return new AbstractTreeNode instance, covering the data tree provided
      */
-    public static final TreeNode createTreeNodeRecursively(final NormalizedNode<?, ?> data, final Version version) {
+    public static TreeNode createTreeNodeRecursively(final NormalizedNode<?, ?> data, final Version version) {
         if (data instanceof NormalizedNodeContainer<?, ?, ?>) {
             @SuppressWarnings("unchecked")
             NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>> container = (NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>>) data;
@@ -51,7 +51,7 @@ public final class TreeNodeFactory {
      * @param version data node version
      * @return new AbstractTreeNode instance, covering the data tree provided
      */
-    public static final TreeNode createTreeNode(final NormalizedNode<?, ?> data, final Version version) {
+    public static TreeNode createTreeNode(final NormalizedNode<?, ?> data, final Version version) {
         if (data instanceof NormalizedNodeContainer<?, ?, ?>) {
             @SuppressWarnings("unchecked")
             NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>> container = (NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>>) data;
index c5840cff986b359c5f4271a29c8a5fa6829e0eb6..fcfbf112d695d5e67e595d67de73a51457070d43 100644 (file)
@@ -75,12 +75,10 @@ public final class JSONCodecFactory {
 
     private final SchemaContext schemaContext;
     private final JSONCodec<?> iidCodec;
-    private final JSONCodec<?> idrefCodec;
 
     private JSONCodecFactory(final SchemaContext context) {
         this.schemaContext = Preconditions.checkNotNull(context);
         iidCodec = new JSONStringInstanceIdentifierCodec(context);
-        idrefCodec = new JSONStringIdentityrefCodec(context);
     }
 
     /**
@@ -101,10 +99,15 @@ public final class JSONCodecFactory {
         return superType;
     }
 
+    @SuppressWarnings("unchecked")
     private JSONCodec<Object> createCodec(DataSchemaNode key, TypeDefinition<?> type) {
         TypeDefinition<?> baseType = resolveBaseTypeFrom(type);
         if (baseType instanceof LeafrefTypeDefinition) {
             return createReferencedTypeCodec(key, (LeafrefTypeDefinition) baseType);
+        } else if (baseType instanceof IdentityrefType) {
+            final JSONCodec<?> jsonStringIdentityrefCodec = new JSONStringIdentityrefCodec(schemaContext,
+                    key.getQName().getModule());
+            return (JSONCodec<Object>) jsonStringIdentityrefCodec;
         }
         return createFromSimpleType(type);
     }
@@ -114,7 +117,7 @@ public final class JSONCodecFactory {
         // FIXME: Verify if this does indeed support leafref of leafref
         TypeDefinition<?> referencedType =
                 SchemaContextUtil.getBaseTypeForLeafRef(type, getSchemaContext(), schema);
-        return createFromSimpleType(referencedType);
+        return createCodec(schema, referencedType);
     }
 
     @SuppressWarnings("unchecked")
@@ -123,9 +126,6 @@ public final class JSONCodecFactory {
         if (baseType instanceof InstanceIdentifierType) {
             return (JSONCodec<Object>) iidCodec;
         }
-        if (baseType instanceof IdentityrefType) {
-            return (JSONCodec<Object>) idrefCodec;
-        }
 
         final TypeDefinitionAwareCodec<Object, ?> codec = TypeDefinitionAwareCodec.from(type);
         if (codec == null) {
index 7e099b4e2d8aa96f35f732e728ee2e9412681ce7..7b00dc5dd2c132c3987cfd833d7a1bf0240c6213 100644 (file)
@@ -11,21 +11,30 @@ import com.google.common.base.Preconditions;
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
 import java.net.URI;
+
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.data.util.AbstractModuleStringIdentityrefCodec;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 final class JSONStringIdentityrefCodec extends AbstractModuleStringIdentityrefCodec implements JSONCodec<QName> {
     private final SchemaContext context;
+    private final QNameModule parentModuleQname;
 
-    JSONStringIdentityrefCodec(final SchemaContext context) {
+    JSONStringIdentityrefCodec(final SchemaContext context, final QNameModule parentModule) {
         this.context = Preconditions.checkNotNull(context);
+        this.parentModuleQname = Preconditions.checkNotNull(parentModule);
     }
 
     @Override
     protected Module moduleForPrefix(final String prefix) {
-        return context.findModuleByName(prefix, null);
+        if (prefix.isEmpty()) {
+            return context.findModuleByNamespaceAndRevision(parentModuleQname.getNamespace(),
+                    parentModuleQname.getRevision());
+        } else {
+            return context.findModuleByName(prefix, null);
+        }
     }
 
     @Override
index f7a361f45af48bbdf648f72723fe25d98860cee3..7922b95197b63badb9676c4e95286677017ad9ab 100644 (file)
@@ -22,7 +22,6 @@ import java.net.URI;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.Deque;
 import java.util.HashSet;
 import java.util.List;
index 2bf9a35a34e6024062f71e142fe9ac247ae21009..1739330e1a7314a6a6aefafff0940ee6b5ac18f5 100644 (file)
@@ -117,7 +117,7 @@ abstract class AbstractIntegerStringCodec<N extends Number & Comparable<N>, T ex
     }
 
 
-    private final void validate(final N value) {
+    private void validate(final N value) {
         if (rangeConstraints.isEmpty()) {
             return;
         }
@@ -159,7 +159,7 @@ abstract class AbstractIntegerStringCodec<N extends Number & Comparable<N>, T ex
         return type.getRangeConstraints();
     }
 
-    private static final int provideBase(final String integer) {
+    private static int provideBase(final String integer) {
         if (integer == null) {
             throw new IllegalArgumentException("String representing integer number cannot be NULL");
         }
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BinaryStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BinaryStringCodec.java
new file mode 100644 (file)
index 0000000..c4f70da
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Optional;
+import com.google.common.io.BaseEncoding;
+import javax.xml.bind.DatatypeConverter;
+import org.opendaylight.yangtools.yang.data.api.codec.BinaryCodec;
+import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
+
+class BinaryStringCodec extends TypeDefinitionAwareCodec<byte[], BinaryTypeDefinition> implements BinaryCodec<String> {
+
+    protected BinaryStringCodec(final Optional<BinaryTypeDefinition> typeDef) {
+        super(typeDef, byte[].class);
+    }
+
+    static TypeDefinitionAwareCodec<?,BinaryTypeDefinition> from(final BinaryTypeDefinition type) {
+        return new BinaryStringCodec(Optional.fromNullable(type));
+    }
+
+    @Override
+    public String serialize(final byte[] data) {
+        return data == null ? "" : BaseEncoding.base64().encode(data);
+    }
+
+    @Override
+    public byte[] deserialize(final String stringRepresentation) {
+        return stringRepresentation == null ? null : DatatypeConverter.parseBase64Binary(stringRepresentation);
+    }
+}
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BitsStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BitsStringCodec.java
new file mode 100644 (file)
index 0000000..4bd3643
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import java.util.List;
+import java.util.Set;
+import org.opendaylight.yangtools.yang.data.api.codec.BitsCodec;
+import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
+
+class BitsStringCodec extends TypeDefinitionAwareCodec<Set<String>, BitsTypeDefinition>
+        implements BitsCodec<String> {
+
+    private static final Joiner JOINER = Joiner.on(" ").skipNulls();
+    private static final Splitter SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults();
+
+    private final Set<String> bits;
+
+    @SuppressWarnings("unchecked")
+    protected BitsStringCodec(final Optional<BitsTypeDefinition> typeDef) {
+        super(typeDef, (Class<Set<String>>) ((Class<?>) Set.class));
+        if (typeDef.isPresent()) {
+            final List<Bit> yangBits = typeDef.get().getBits();
+            final Set<String> bitsBuilder = Sets.newHashSet();
+            for (final Bit bit : yangBits) {
+                bitsBuilder.add(bit.getName());
+            }
+            bits = ImmutableSet.copyOf(bitsBuilder);
+        } else {
+            bits = null;
+        }
+    }
+
+    static TypeDefinitionAwareCodec<?, BitsTypeDefinition> from(final BitsTypeDefinition normalizedType) {
+        return new BitsStringCodec(Optional.fromNullable(normalizedType));
+    }
+
+    @Override
+    public final String serialize(final Set<String> data) {
+        return data == null ? "" : JOINER.join(data);
+    }
+
+    @Override
+    public final Set<String> deserialize(final String stringRepresentation) {
+        if (stringRepresentation == null) {
+            return ImmutableSet.of();
+        }
+
+        final Iterable<String> strings = SPLITTER.split(stringRepresentation);
+        validate(strings);
+        return ImmutableSet.copyOf(strings);
+    }
+
+    private void validate(final Iterable<String> strings) {
+        if (bits != null) {
+            for (final String bit : strings) {
+                Preconditions.checkArgument(bits.contains(bit),
+                        "Invalid value '%s' for bits type. Allowed values are: %s", bit, bits);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BooleanStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/BooleanStringCodec.java
new file mode 100644 (file)
index 0000000..54bd337
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Optional;
+import org.opendaylight.yangtools.yang.data.api.codec.BooleanCodec;
+import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
+
+class BooleanStringCodec extends TypeDefinitionAwareCodec<Boolean, BooleanTypeDefinition>
+        implements BooleanCodec<String> {
+
+    protected BooleanStringCodec(final Optional<BooleanTypeDefinition> typeDef) {
+        super(typeDef, Boolean.class);
+    }
+
+    @Override
+    public final String serialize(final Boolean data) {
+        return data == null ? "" : data.toString();
+    }
+
+    @Override
+    public final Boolean deserialize(final String stringRepresentation) {
+        return Boolean.valueOf(stringRepresentation);
+    }
+
+    static TypeDefinitionAwareCodec<?,BooleanTypeDefinition> from(final BooleanTypeDefinition normalizedType) {
+        return new BooleanStringCodec(Optional.fromNullable(normalizedType));
+    }
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/CompiledPatternContext.java
new file mode 100644 (file)
index 0000000..6e90122
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import java.util.regex.Pattern;
+import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
+
+class CompiledPatternContext {
+
+    private final Pattern pattern;
+    private final String errorMessage;
+
+    CompiledPatternContext(final PatternConstraint yangConstraint) {
+        pattern = Pattern.compile("^" + yangConstraint.getRegularExpression() + "$");
+        final String yangMessage = yangConstraint.getErrorMessage();
+        if (Strings.isNullOrEmpty(yangMessage)) {
+            errorMessage = "Value %s does not match regular expression <" + pattern.pattern() + ">";
+        } else {
+            errorMessage = yangMessage;
+        }
+    }
+
+    public void validate(final String s) {
+        Preconditions.checkArgument(pattern.matcher(s).matches(), errorMessage, s);
+    }
+
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/DecimalStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/DecimalStringCodec.java
new file mode 100644 (file)
index 0000000..32571d4
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import java.math.BigDecimal;
+import org.opendaylight.yangtools.yang.data.api.codec.DecimalCodec;
+import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
+
+class DecimalStringCodec extends TypeDefinitionAwareCodec<BigDecimal, DecimalTypeDefinition>
+        implements DecimalCodec<String> {
+
+    protected DecimalStringCodec(final Optional<DecimalTypeDefinition> typeDef) {
+        super(typeDef, BigDecimal.class);
+    }
+
+    static TypeDefinitionAwareCodec<?,DecimalTypeDefinition> from(final DecimalTypeDefinition normalizedType) {
+        return new DecimalStringCodec(Optional.fromNullable(normalizedType));
+    }
+
+    @Override
+    public final String serialize(final BigDecimal data) {
+        return data == null ? "" : data.toString();
+    }
+
+    @Override
+    public final BigDecimal deserialize(final String stringRepresentation) {
+        Preconditions.checkArgument( stringRepresentation != null , "Input cannot be null" );
+        return new BigDecimal(stringRepresentation);
+    }
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/EmptyStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/EmptyStringCodec.java
new file mode 100644 (file)
index 0000000..61a178b
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import org.opendaylight.yangtools.yang.data.api.codec.EmptyCodec;
+import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
+
+class EmptyStringCodec extends TypeDefinitionAwareCodec<Void, EmptyTypeDefinition> implements
+        EmptyCodec<String> {
+
+    protected EmptyStringCodec(final Optional<EmptyTypeDefinition> typeDef) {
+        super(typeDef, Void.class);
+    }
+
+    @Override
+    public final String serialize(final Void data) {
+        return "";
+    }
+
+    @Override
+    public final Void deserialize(final String stringRepresentation) {
+        Preconditions.checkArgument( Strings.isNullOrEmpty( stringRepresentation ),
+                                     "The value must be empty" );
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/EnumStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/EnumStringCodec.java
new file mode 100644 (file)
index 0000000..a24b8b7
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import java.util.List;
+import java.util.Set;
+import org.opendaylight.yangtools.yang.data.api.codec.EnumCodec;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
+
+ class EnumStringCodec extends TypeDefinitionAwareCodec<String, EnumTypeDefinition> implements
+        EnumCodec<String> {
+
+    private final Set<String> values;
+
+    protected EnumStringCodec(final Optional<EnumTypeDefinition> typeDef) {
+        super(typeDef, String.class);
+        if(typeDef.isPresent()) {
+            final List<EnumPair> enumValues = typeDef.get().getValues();
+            final Set<String> valuesBuilder = Sets.newHashSetWithExpectedSize(enumValues.size());
+            for( final EnumPair pair: enumValues ) {
+                valuesBuilder.add( pair.getName() );
+            }
+            values = ImmutableSet.copyOf(valuesBuilder);
+        } else {
+            values = null;
+        }
+
+    }
+
+    static TypeDefinitionAwareCodec<?,EnumTypeDefinition> from(final EnumTypeDefinition normalizedType) {
+        return new EnumStringCodec(Optional.fromNullable(normalizedType));
+    }
+
+    @Override
+    public final String deserialize(final String s) {
+        if (values != null) {
+            Preconditions.checkArgument(values.contains(s), "Invalid value '%s' for enum type. Allowed values are: %s",
+                    s, values);
+        }
+        return s;
+    }
+
+    @Override
+    public final String serialize(final String data) {
+        return data == null ? "" : data;
+    }
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/StringPatternCheckingCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/StringPatternCheckingCodec.java
new file mode 100644 (file)
index 0000000..6ada9e3
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.regex.PatternSyntaxException;
+import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint;
+import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class StringPatternCheckingCodec extends StringStringCodec {
+
+    private static final Logger LOG = LoggerFactory.getLogger(StringPatternCheckingCodec.class);
+    private final Collection<CompiledPatternContext> patterns;
+
+    protected StringPatternCheckingCodec(final StringTypeDefinition typeDef) {
+        super(typeDef);
+        patterns = new ArrayList<>(typeDef.getPatternConstraints().size());
+        for (final PatternConstraint yangPattern : typeDef.getPatternConstraints()) {
+            try {
+                patterns.add(new CompiledPatternContext(yangPattern));
+            } catch (final PatternSyntaxException e) {
+                LOG.debug("Unable to compile {} pattern, excluding it from validation.", yangPattern, e);
+            }
+        }
+    }
+
+    @Override
+    protected void validate(final String s) {
+        super.validate(s);
+        for (final CompiledPatternContext pattern : patterns) {
+            pattern.validate(s);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/StringStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/StringStringCodec.java
new file mode 100644 (file)
index 0000000..91cf676
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Optional;
+import org.opendaylight.yangtools.yang.data.api.codec.StringCodec;
+import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
+
+class StringStringCodec extends TypeDefinitionAwareCodec<String, StringTypeDefinition> implements
+        StringCodec<String> {
+
+    protected StringStringCodec(final StringTypeDefinition typeDef) {
+        super(Optional.of(typeDef), String.class);
+        typeDef.getLengthConstraints();
+    }
+
+    static TypeDefinitionAwareCodec<?, StringTypeDefinition> from(final StringTypeDefinition normalizedType) {
+        if (normalizedType.getPatternConstraints().isEmpty()) {
+            return new StringStringCodec(normalizedType);
+        }
+
+        return new StringPatternCheckingCodec(normalizedType);
+    }
+
+    @Override
+    public final String deserialize(final String stringRepresentation) {
+        if (stringRepresentation == null) {
+            // FIXME: These seems buggy, but someone may be using this behaviour
+            return "";
+        }
+        validate(stringRepresentation);
+        return stringRepresentation;
+    }
+
+    @Override
+    public final String serialize(final String data) {
+        return data == null ? "" : data;
+    }
+
+    protected void validate(final String s) {
+
+    }
+}
\ No newline at end of file
index e73532ad9c98015636d9ee0bfcb8e27840ade2ef..24981326d7ab49c18cf34e1442c03197224b9510 100644 (file)
@@ -11,21 +11,6 @@ import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import com.google.common.io.BaseEncoding;
-import java.math.BigDecimal;
-import java.util.Set;
-import javax.xml.bind.DatatypeConverter;
-import org.opendaylight.yangtools.yang.data.api.codec.BinaryCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.BitsCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.BooleanCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.DecimalCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.EmptyCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.EnumCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.StringCodec;
-import org.opendaylight.yangtools.yang.data.api.codec.UnionCodec;
 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.BitsTypeDefinition;
@@ -33,7 +18,6 @@ import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
 import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
@@ -42,28 +26,10 @@ import org.opendaylight.yangtools.yang.model.util.DerivedType;
 
 public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> implements DataStringCodec<J> {
 
-
-
+    private static final TypeDefinitionAwareCodec<?,?> EMPTY_DEFAULT_CODEC = new EmptyStringCodec(Optional.<EmptyTypeDefinition>absent());
     private final Optional<T> typeDefinition;
     private final Class<J> inputClass;
 
-
-
-    private static final BinaryCodecStringImpl BINARY_DEFAULT_CODEC = new BinaryCodecStringImpl(
-            Optional.<BinaryTypeDefinition> absent());
-
-    private static final BooleanCodecStringImpl BOOLEAN_DEFAULT_CODEC = new BooleanCodecStringImpl(
-            Optional.<BooleanTypeDefinition> absent());
-
-    private static final DecimalCodecStringImpl DECIMAL64_DEFAULT_CODEC = new DecimalCodecStringImpl(
-            Optional.<DecimalTypeDefinition> absent());
-
-    private static final EmptyCodecStringImpl EMPTY_DEFAULT_CODEC = new EmptyCodecStringImpl(
-            Optional.<EmptyTypeDefinition> absent());
-
-    private static final StringCodecStringImpl STRING_DEFAULT_CODEC = new StringCodecStringImpl(
-            Optional.<StringTypeDefinition> absent());
-
     @Override
     public Class<J> getInputClass() {
         return inputClass;
@@ -91,44 +57,33 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         TypeDefinitionAwareCodec codec = null;
 
         if (normalizedType instanceof BinaryTypeDefinition) {
-            codec = BINARY_DEFAULT_CODEC;
+            codec = BinaryStringCodec.from((BinaryTypeDefinition)normalizedType);
         } else if (normalizedType instanceof BitsTypeDefinition) {
-            codec = new BitsCodecStringImpl( Optional.of( (BitsTypeDefinition)normalizedType ) );
+            codec = BitsStringCodec.from((BitsTypeDefinition)normalizedType);
         } else if (normalizedType instanceof BooleanTypeDefinition) {
-            codec = BOOLEAN_DEFAULT_CODEC;
+            codec = BooleanStringCodec.from((BooleanTypeDefinition)normalizedType);
         } else if (normalizedType instanceof DecimalTypeDefinition) {
-            codec = DECIMAL64_DEFAULT_CODEC;
+            codec = DecimalStringCodec.from((DecimalTypeDefinition)normalizedType);
         } else if (normalizedType instanceof EmptyTypeDefinition) {
             codec = EMPTY_DEFAULT_CODEC;
         } else if (normalizedType instanceof EnumTypeDefinition) {
-            codec = new EnumCodecStringImpl( Optional.of( (EnumTypeDefinition)normalizedType ) );
+            codec = EnumStringCodec.from((EnumTypeDefinition)normalizedType);
         } else if (normalizedType instanceof IntegerTypeDefinition) {
             codec = AbstractIntegerStringCodec.from((IntegerTypeDefinition) normalizedType);
         } else if (normalizedType instanceof StringTypeDefinition) {
-            codec = STRING_DEFAULT_CODEC;
+            codec = StringStringCodec.from((StringTypeDefinition)normalizedType);
         } else if (normalizedType instanceof UnionTypeDefinition) {
-            codec = new UnionCodecStringImpl( Optional.of( (UnionTypeDefinition)normalizedType ) );
+            codec = UnionStringCodec.from((UnionTypeDefinition)normalizedType);
         } else if (normalizedType instanceof UnsignedIntegerTypeDefinition) {
             codec = AbstractIntegerStringCodec.from((UnsignedIntegerTypeDefinition) normalizedType);
         }
         return codec;
     }
 
-    public static class BooleanCodecStringImpl extends TypeDefinitionAwareCodec<Boolean, BooleanTypeDefinition>
-            implements BooleanCodec<String> {
-
+    @Deprecated
+    public static class BooleanCodecStringImpl extends BooleanStringCodec{
         protected BooleanCodecStringImpl(final Optional<BooleanTypeDefinition> typeDef) {
-            super(typeDef, Boolean.class);
-        }
-
-        @Override
-        public String serialize(final Boolean data) {
-            return data == null ? "" : data.toString();
-        }
-
-        @Override
-        public Boolean deserialize(final String stringRepresentation) {
-            return Boolean.valueOf(stringRepresentation);
+            super(typeDef);
         }
     }
 
@@ -149,52 +104,34 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
 
     @Deprecated
     public static class Uint32CodecStringImpl extends Uint32StringCodec {
-
         protected Uint32CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
             super(typeDef);
         }
-
     }
 
     @Deprecated
     public static class Uint64CodecStringImpl extends Uint64StringCodec {
-
         protected Uint64CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
             super(typeDef);
         }
-
     }
 
-    public static class StringCodecStringImpl extends TypeDefinitionAwareCodec<String, StringTypeDefinition> implements
-            StringCodec<String> {
-
+    @Deprecated
+    public static class StringCodecStringImpl extends StringStringCodec {
         protected StringCodecStringImpl(final Optional<StringTypeDefinition> typeDef) {
-            super(typeDef, String.class);
-        }
-
-        @Override
-        public String deserialize(final String stringRepresentation) {
-            return stringRepresentation == null ? "" : stringRepresentation;
-        }
-
-        @Override
-        public String serialize(final String data) {
-            return data == null ? "" : data;
+            super(typeDef.get());
         }
     }
 
     @Deprecated
     public static class Int16CodecStringImpl extends Int16StringCodec {
-
         protected Int16CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
             super(typeDef);
         }
-
     }
 
     @Deprecated
     public static class Int32CodecStringImpl extends Int32StringCodec {
-
         protected Int32CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
             super(typeDef);
         }
@@ -203,7 +140,6 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
 
     @Deprecated
     public static class Int64CodecStringImpl extends Int64StringCodec {
-
         protected Int64CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
             super(typeDef);
         }
@@ -219,179 +155,52 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
 
     }
 
-    public static class EmptyCodecStringImpl extends TypeDefinitionAwareCodec<Void, EmptyTypeDefinition> implements
-            EmptyCodec<String> {
-
+    @Deprecated
+    public static class EmptyCodecStringImpl extends EmptyStringCodec {
         protected EmptyCodecStringImpl(final Optional<EmptyTypeDefinition> typeDef) {
-            super(typeDef, Void.class);
-        }
-
-        @Override
-        public String serialize(final Void data) {
-            return "";
-        }
-
-        @Override
-        public Void deserialize(final String stringRepresentation) {
-            Preconditions.checkArgument( Strings.isNullOrEmpty( stringRepresentation ),
-                                         "The value must be empty" );
-            return null;
+            super(typeDef);
         }
     }
 
-    public static final class BinaryCodecStringImpl extends TypeDefinitionAwareCodec<byte[], BinaryTypeDefinition>
-            implements BinaryCodec<String> {
-
+    @Deprecated
+    public static final class BinaryCodecStringImpl extends BinaryStringCodec {
         protected BinaryCodecStringImpl(final Optional<BinaryTypeDefinition> typeDef) {
-            super(typeDef, byte[].class);
-        }
-
-        @Override
-        public String serialize(final byte[] data) {
-            return data == null ? "" : BaseEncoding.base64().encode(data);
+            super(typeDef);
         }
 
-        @Override
-        public byte[] deserialize(final String stringRepresentation) {
-            return stringRepresentation == null ? null : DatatypeConverter.parseBase64Binary(stringRepresentation);
-        }
     }
 
-    public static final class BitsCodecStringImpl extends TypeDefinitionAwareCodec<Set<String>, BitsTypeDefinition>
-            implements BitsCodec<String> {
+    @Deprecated
+    public static final class BitsCodecStringImpl extends BitsStringCodec {
 
         public static final Joiner JOINER = Joiner.on(" ").skipNulls();
         public static final Splitter SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults();
 
-        @SuppressWarnings("unchecked")
         protected BitsCodecStringImpl(final Optional<BitsTypeDefinition> typeDef) {
-            super(typeDef, (Class<Set<String>>) ((Class<?>) Set.class));
-        }
-
-        @Override
-        public String serialize(final Set<String> data) {
-            return data == null ? "" : JOINER.join(data);
-        }
-
-        @Override
-        public Set<String> deserialize(final String stringRepresentation) {
-            if (stringRepresentation == null) {
-                return ImmutableSet.of();
-            }
-
-            final Iterable<String> strings = SPLITTER.split(stringRepresentation);
-
-            if( getTypeDefinition().isPresent() ) {
-                final Set<String> allowedNames = Sets.newHashSet();
-                for( final BitsTypeDefinition.Bit bit: getTypeDefinition().get().getBits() ) {
-                    allowedNames.add( bit.getName() );
-                }
-
-                for( final String bit: strings ) {
-                    if( !allowedNames.contains( bit ) ) {
-                        throw new IllegalArgumentException(
-                            "Invalid value \"" + bit + "\" for bits type. Allowed values are: " +
-                            allowedNames );
-                    }
-                }
-            }
-
-            return ImmutableSet.copyOf(strings);
+            super(typeDef);
         }
     }
 
-    public static class EnumCodecStringImpl extends TypeDefinitionAwareCodec<String, EnumTypeDefinition> implements
-            EnumCodec<String> {
+    @Deprecated
+    public static class EnumCodecStringImpl extends EnumStringCodec {
 
         protected EnumCodecStringImpl(final Optional<EnumTypeDefinition> typeDef) {
-            super(typeDef, String.class);
-        }
-
-        @Override
-        public String deserialize(final String stringRepresentation) {
-            if( getTypeDefinition().isPresent() ) {
-                final Set<String> allowedNames = Sets.newHashSet();
-                for( final EnumPair pair: getTypeDefinition().get().getValues() ) {
-                    allowedNames.add( pair.getName() );
-                }
-
-                if( !allowedNames.contains( stringRepresentation ) ) {
-                    throw new IllegalArgumentException(
-                        "Invalid value \"" + stringRepresentation + "\" for enum type. Allowed values are: " +
-                        allowedNames );
-                }
-            }
-
-            return stringRepresentation;
+            super(typeDef);
         }
 
-        @Override
-        public String serialize(final String data) {
-            return data == null ? "" : data;
-        }
     }
 
-    public static class DecimalCodecStringImpl extends TypeDefinitionAwareCodec<BigDecimal, DecimalTypeDefinition>
-            implements DecimalCodec<String> {
-
+    @Deprecated
+    public static class DecimalCodecStringImpl extends DecimalStringCodec {
         protected DecimalCodecStringImpl(final Optional<DecimalTypeDefinition> typeDef) {
-            super(typeDef, BigDecimal.class);
-        }
-
-        @Override
-        public String serialize(final BigDecimal data) {
-            return data == null ? "" : data.toString();
-        }
-
-        @Override
-        public BigDecimal deserialize(final String stringRepresentation) {
-            Preconditions.checkArgument( stringRepresentation != null , "Input cannot be null" );
-            return new BigDecimal(stringRepresentation);
+            super(typeDef);
         }
     }
 
-    public static class UnionCodecStringImpl extends TypeDefinitionAwareCodec<Object, UnionTypeDefinition> implements
-            UnionCodec<String> {
-
+    @Deprecated
+    public static class UnionCodecStringImpl extends UnionStringCodec {
         protected UnionCodecStringImpl(final Optional<UnionTypeDefinition> typeDef) {
-            super(typeDef, Object.class);
-        }
-
-        @Override
-        public String serialize(final Object data) {
-            return data == null ? "" : data.toString();
-        }
-
-        @Override
-        public Object deserialize(final String stringRepresentation) {
-            if( getTypeDefinition().isPresent() ) {
-                boolean valid = false;
-                for( final TypeDefinition<?> type: getTypeDefinition().get().getTypes() ) {
-                    final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> typeAwareCodec = from( type );
-                    if( typeAwareCodec == null ) {
-                        // This is a type for which we have no codec (eg identity ref) so we'll say it's valid
-                        // but we'll continue in case there's another type for which we do have a codec.
-                        valid = true;
-                        continue;
-                    }
-
-                    try {
-                        typeAwareCodec.deserialize( stringRepresentation );
-                        valid = true;
-                        break;
-                    }
-                    catch( final Exception e ) {
-                        // invalid - try the next union type.
-                    }
-                }
-
-                if( !valid ) {
-                    throw new IllegalArgumentException(
-                                        "Invalid value \"" + stringRepresentation + "\" for union type." );
-                }
-            }
-
-            return stringRepresentation;
+            super(typeDef);
         }
     }
 }
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/UnionStringCodec.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/UnionStringCodec.java
new file mode 100644 (file)
index 0000000..2dd81a0
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015 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.yang.data.impl.codec;
+
+import com.google.common.base.Optional;
+import org.opendaylight.yangtools.yang.data.api.codec.UnionCodec;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+class UnionStringCodec extends TypeDefinitionAwareCodec<Object, UnionTypeDefinition> implements UnionCodec<String> {
+
+    private final static Logger LOG = LoggerFactory.getLogger(UnionStringCodec.class);
+
+    protected UnionStringCodec(final Optional<UnionTypeDefinition> typeDef) {
+        super(typeDef, Object.class);
+    }
+
+    static TypeDefinitionAwareCodec<?, UnionTypeDefinition> from(final UnionTypeDefinition normalizedType) {
+        return new UnionStringCodec(Optional.fromNullable(normalizedType));
+    }
+
+    @Override
+    public final String serialize(final Object data) {
+        return data == null ? "" : data.toString();
+    }
+
+    @Override
+    public final Object deserialize(final String stringRepresentation) {
+
+        if (!getTypeDefinition().isPresent()) {
+            return stringRepresentation;
+        }
+
+        for (final TypeDefinition<?> type : getTypeDefinition().get().getTypes()) {
+            final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> typeAwareCodec = from(type);
+            if (typeAwareCodec == null) {
+                /*
+                 * This is a type for which we have no codec (eg identity ref) so we'll say it's
+                 * valid
+                 */
+                return stringRepresentation;
+            }
+
+            try {
+                typeAwareCodec.deserialize(stringRepresentation);
+                return stringRepresentation;
+            } catch (final Exception e) {
+                LOG.debug("Value {} did not matched representation for {}",stringRepresentation,type,e);
+                // invalid - try the next union type.
+            }
+        }
+
+        throw new IllegalArgumentException("Invalid value \"" + stringRepresentation + "\" for union type.");
+    }
+}
index 24abc3507143ae36bc8c566d50035ce078d94ee4..a4812c7316c81593bcf8869bc7919e448d6e26b7 100644 (file)
@@ -30,14 +30,13 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 public final class XmlDocumentUtils {
+    public static final QName OPERATION_ATTRIBUTE_QNAME = QName.create(SchemaContext.NAME, "operation");
+    private static final Logger LOG = LoggerFactory.getLogger(XmlDocumentUtils.class);
 
     private XmlDocumentUtils() {
         throw new UnsupportedOperationException("Utility class should not be instantiated");
     }
 
-    public static final QName OPERATION_ATTRIBUTE_QNAME = QName.create(SchemaContext.NAME, "operation");
-    private static final Logger LOG = LoggerFactory.getLogger(XmlDocumentUtils.class);
-
     public static Document getDocument() {
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         Document doc = null;
@@ -50,7 +49,7 @@ public final class XmlDocumentUtils {
         return doc;
     }
 
-    private static final Element createElementFor(final Document doc, final QName qname, final Object obj) {
+    private static Element createElementFor(final Document doc, final QName qname, final Object obj) {
         final Element ret;
         if (qname.getNamespace() != null) {
             ret = doc.createElementNS(qname.getNamespace().toString(), qname.getLocalName());
@@ -82,8 +81,6 @@ public final class XmlDocumentUtils {
         return QName.create(namespace != null ? URI.create(namespace) : null, null, localName);
     }
 
-
-
     public static Optional<ModifyAction> getModifyOperationFromAttributes(final Element xmlElement) {
         Attr attributeNodeNS = xmlElement.getAttributeNodeNS(OPERATION_ATTRIBUTE_QNAME.getNamespace().toString(), OPERATION_ATTRIBUTE_QNAME.getLocalName());
         if(attributeNodeNS == null) {
@@ -96,8 +93,7 @@ public final class XmlDocumentUtils {
         return Optional.of(action);
     }
 
-
-    public static final Optional<DataSchemaNode> findFirstSchema(final QName qname, final Iterable<DataSchemaNode> dataSchemaNode) {
+    public static Optional<DataSchemaNode> findFirstSchema(final QName qname, final Iterable<DataSchemaNode> dataSchemaNode) {
         if (dataSchemaNode != null && qname != null) {
             for (DataSchemaNode dsn : dataSchemaNode) {
                 if (qname.isEqualWithoutRevision(dsn.getQName())) {
@@ -115,7 +111,7 @@ public final class XmlDocumentUtils {
         return Optional.absent();
     }
 
-    public static final XmlCodecProvider defaultValueCodecProvider() {
+    public static XmlCodecProvider defaultValueCodecProvider() {
         return XmlUtils.DEFAULT_XML_CODEC_PROVIDER;
     }
 }
index 71a4d1a64f41f0a3ceaabdb75a0ecafbca47ea72..5470667a87b43bf20890f942d22d80ee33ea6d5c 100644 (file)
@@ -126,7 +126,7 @@ public final class DomUtils {
         if (baseType instanceof LeafrefTypeDefinition) {
             final LeafrefTypeDefinition leafrefTypeDefinition = (LeafrefTypeDefinition) baseType;
             baseType = SchemaContextUtil.getBaseTypeForLeafRef(leafrefTypeDefinition, schemaCtx, schema);
-            value = parseXmlValue(xml, codecProvider, baseType);
+            value = parseXmlValue(xml, codecProvider, schema, baseType, schemaCtx);
         } else if (baseType instanceof InstanceIdentifierType) {
             value = InstanceIdentifierForXmlCodec.deserialize(xml, schemaCtx);
         } else if (baseType instanceof IdentityrefTypeDefinition) {
index bc6574720f3450879376338df696f09bbb02c750..12c0f9ca9412c82445e9b3501a6515c9affc50da 100644 (file)
@@ -24,7 +24,7 @@ abstract class AbstractNamespaceCodec {
      * @param namespace Namespace to map
      * @return Allocated unique prefix, or null if the prefix cannot be mapped.
      */
-    protected abstract @Nullable String prefixForNamespace(final @Nonnull URI namespace);
+    @Nullable protected abstract String prefixForNamespace(@Nonnull final URI namespace);
 
     /**
      * Create a QName for a prefix and local name.
@@ -34,7 +34,7 @@ abstract class AbstractNamespaceCodec {
      * @return QName
      * @throws IllegalArgumentException if the prefix cannot be resolved
      */
-    protected abstract @Nullable QName createQName(final @Nonnull String prefix, final @Nonnull String localName);
+    @Nullable protected abstract QName createQName(@Nonnull final String prefix, @Nonnull final String localName);
 
     private static String getIdAndPrefixAsStr(final String pathPart) {
         int predicateStartIndex = pathPart.indexOf('[');
index 93f97ec9055394ca3580150f7451ccf8d9b657b2..6b8681d2321aad796f45dd75031013eaf6a99a19 100644 (file)
@@ -149,9 +149,9 @@ public enum Rfc6020Mapping implements StatementDefinition {
     YangVersion(YangVersionStatement.class, "yang-version", "value"),
     YinElement(YinElementStatement.class, "yin-element", "value");
 
-    private final @Nonnull Class<? extends DeclaredStatement<?>> type;
-    private final @Nonnull QName name;
-    private final @Nullable QName argument;
+    private final Class<? extends DeclaredStatement<?>> type;
+    private final QName name;
+    private final QName argument;
     private final boolean yinElement;
 
 
@@ -177,7 +177,7 @@ public enum Rfc6020Mapping implements StatementDefinition {
         this.yinElement = yinElement;
     }
 
-    private static QName yinQName(String nameStr) {
+    @Nonnull private static QName yinQName(String nameStr) {
         return QName.cachedReference(QName.create(YangConstants.RFC6020_YIN_MODULE, nameStr));
     }
 
@@ -187,12 +187,12 @@ public enum Rfc6020Mapping implements StatementDefinition {
     }
 
     @Override
-    public QName getArgumentName() {
+    @Nullable public QName getArgumentName() {
         return argument;
     }
 
     @Override
-    public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
+    @Nonnull public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
         return type;
     }
 
index 20f8c881a912235c01746fbf4f7606609ab1d004..32e55bfef031e81f6425df280ef29d83ccac2227 100644 (file)
@@ -23,16 +23,15 @@ import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
  * @see BitsTypeDefinition
  */
 public final class BitsType implements BitsTypeDefinition {
-    private final static QName NAME = BaseTypes.BITS_QNAME;
-
-    private final SchemaPath path;
+    private static final QName NAME = BaseTypes.BITS_QNAME;
     private static final String DESCRIPTION = "The bits built-in type represents a bit set. "
             + "That is, a bits value is a set of flags identified by small integer position "
             + "numbers starting at 0.  Each bit number has an assigned name.";
 
     private static final String REFERENCE = "https://tools.ietf.org/html/rfc6020#section-9.7";
-    private final List<Bit> bits;
     private static final String UNITS = "";
+    private final SchemaPath path;
+    private final List<Bit> bits;
 
     /**
      * Default constructor. <br>
index 4c497e0547535e65fc62ea151d4e57139597eac4..ede74c6a93fb247b574d7f752ace83170ca6d3e3 100644 (file)
@@ -98,7 +98,7 @@ public abstract class AbstractCachingSchemaSourceProvider<I, O> implements Advan
      * @param input Optional of schema source, representing one returned from delegate.
      * @return Optional of schema source, representing result returned from this cache.
      */
-    abstract protected Optional<O> cacheSchemaSource(SourceIdentifier identifier, Optional<I> input);
+    protected abstract Optional<O> cacheSchemaSource(SourceIdentifier identifier, Optional<I> input);
 
     /**
      * Returns cached schema source of {@link Optional#absent()} if source is not present in cache.
@@ -111,7 +111,7 @@ public abstract class AbstractCachingSchemaSourceProvider<I, O> implements Advan
      * @param identifier Source Identifier for which schema should be retrieved.
      * @return Cached schema source.
      */
-    abstract protected Optional<O> getCachedSchemaSource(SourceIdentifier identifier);
+    protected abstract Optional<O> getCachedSchemaSource(SourceIdentifier identifier);
 
     @Override
     public AdvancedSchemaSourceProvider<I> getDelegate() {
@@ -143,9 +143,7 @@ public abstract class AbstractCachingSchemaSourceProvider<I, O> implements Advan
      *
      */
     @Beta
-    private class SchemaSourceProviderInstance implements //
-    AdvancedSchemaSourceProvider<O>,
-    Delegator<AdvancedSchemaSourceProvider<I>> {
+    private class SchemaSourceProviderInstance implements AdvancedSchemaSourceProvider<O>, Delegator<AdvancedSchemaSourceProvider<I>> {
 
         private final AdvancedSchemaSourceProvider<I> delegate;
 
index 12a1f73d1ac373a82480658aeda022c2051a48e2..975b683dd64e93e6aa962069a9c4c2eeb0838747 100644 (file)
@@ -15,7 +15,6 @@ import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.io.ByteSource;
 import com.google.common.io.ByteStreams;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
index 504a70d69b5c14daf2d1b6671db72e9c9b9db37d..2002cf513527a53ecd52c97c8c5439b4f1a68c9e 100644 (file)
@@ -31,11 +31,11 @@ public final class StatementSupportBundle implements Immutable,NamespaceBehaviou
         this.namespaceDefinitions = namespaces;
     }
 
-    public static final Builder builder() {
+    public static Builder builder() {
         return new Builder(EMPTY);
     }
 
-    public static final Builder derivedFrom(StatementSupportBundle parent) {
+    public static Builder derivedFrom(StatementSupportBundle parent) {
         return new Builder(parent);
     }
 
index 9e3cd702d16f1d45c8343bc95ae79ba02cc4e644..1838e6effc97c288cd70b5d8f860ecd8469d37b7 100644 (file)
@@ -14,40 +14,35 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 public final class StmtContextUtils {
 
     private static final Function<StmtContext<?, ?,?>, DeclaredStatement<?>> BUILD_DECLARED = new Function<StmtContext<?,?,?>, DeclaredStatement<?>>() {
-
         @Override
         public DeclaredStatement<?> apply(StmtContext<?,?,?> input) {
             return input.buildDeclared();
         }
-
     };
 
     private static final Function<StmtContext<?, ?,?>, EffectiveStatement<?,?>> BUILD_EFFECTIVE = new Function<StmtContext<?,?,?>, EffectiveStatement<?,?>>() {
-
         @Override
         public EffectiveStatement<?,?> apply(StmtContext<?,?,?> input) {
             return input.buildEffective();
         }
-
     };
 
     private StmtContextUtils() {
         throw new UnsupportedOperationException("Utility class");
     }
 
-
     @SuppressWarnings("unchecked")
-    public static final <D extends DeclaredStatement<?>> Function<StmtContext<?, ? extends D, ?>, D> buildDeclared() {
+    public static <D extends DeclaredStatement<?>> Function<StmtContext<?, ? extends D, ?>, D> buildDeclared() {
         return Function.class.cast(BUILD_DECLARED);
     }
 
     @SuppressWarnings("unchecked")
-    public static final <E extends EffectiveStatement<?,?>> Function<StmtContext<?, ?,? extends E>, E> buildEffective() {
+    public static <E extends EffectiveStatement<?,?>> Function<StmtContext<?, ?,? extends E>, E> buildEffective() {
         return Function.class.cast(BUILD_EFFECTIVE);
     }
 
     @SuppressWarnings("unchecked")
-    public static final <AT,DT extends DeclaredStatement<AT>> AT firstAttributeOf(Iterable<? extends StmtContext<?,?,?>> contexts, Class<DT> declaredType) {
+    public static <AT,DT extends DeclaredStatement<AT>> AT firstAttributeOf(Iterable<? extends StmtContext<?,?,?>> contexts, Class<DT> declaredType) {
         for(StmtContext<?, ?, ?> ctx : contexts) {
             if(producesDeclared(ctx,declaredType)) {
                 return (AT) ctx.getStatementArgument();
@@ -56,10 +51,7 @@ public final class StmtContextUtils {
         return null;
     }
 
-    public static final boolean producesDeclared(StmtContext<?, ?, ?> ctx, Class<? extends DeclaredStatement<?>> type) {
+    public static boolean producesDeclared(StmtContext<?, ?, ?> ctx, Class<? extends DeclaredStatement<?>> type) {
         return type.isAssignableFrom(ctx.getPublicDefinition().getDeclaredRepresentationClass());
     }
-
-
-
 }
index c808f1102e132886b18d36d34a495a48d1b8130c..b312213a81250e1338b820a0bef54a958c57fe64 100644 (file)
@@ -66,7 +66,7 @@ public final class TextToASTTransformer extends SchemaSourceTransformer<YangText
         super(provider, YangTextSchemaSource.class, consumer, ASTSchemaSource.class, TRANSFORMATION);
     }
 
-    public static final TextToASTTransformer create(final SchemaRepository provider, final SchemaSourceRegistry consumer) {
+    public static TextToASTTransformer create(final SchemaRepository provider, final SchemaSourceRegistry consumer) {
         return new TextToASTTransformer(provider, consumer);
     }
 }