Improve UnionXmlCodec error reporting 87/100287/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 29 Mar 2022 21:54:19 +0000 (23:54 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 29 Mar 2022 21:54:19 +0000 (23:54 +0200)
Collect the exceptions reported and add them as suppressed in case
we end up rejecting all values.

Change-Id: I6aa6d99d4a60426963dc30a1a5595b8ecd7a3bab
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
codec/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/UnionXmlCodec.java

index 76c7a5b469364db2f5b00c2b8a3910d96d7d20d0..03663d6cb8fbf67b7489af8163621cce53e98787 100644 (file)
@@ -11,6 +11,7 @@ import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import javax.xml.namespace.NamespaceContext;
@@ -74,19 +75,24 @@ abstract class UnionXmlCodec<T> implements XmlCodec<T> {
     @Override
     @SuppressWarnings("checkstyle:illegalCatch")
     public final T parseValue(final NamespaceContext ctx, final String str) {
+        final var suppressed = new ArrayList<RuntimeException>();
+
         for (XmlCodec<?> codec : codecs) {
             final Object ret;
             try {
                 ret = codec.parseValue(ctx, str);
             } catch (RuntimeException e) {
                 LOG.debug("Codec {} did not accept input '{}'", codec, str, e);
+                suppressed.add(e);
                 continue;
             }
 
             return getDataType().cast(ret);
         }
 
-        throw new IllegalArgumentException("Invalid value \"" + str + "\" for union type.");
+        final var ex = new IllegalArgumentException("Invalid value \"" + str + "\" for union type.");
+        suppressed.forEach(ex::addSuppressed);
+        throw ex;
     }
 
     @Override