Seal XmlCodec
[yangtools.git] / codec / yang-data-codec-xml / src / main / java / org / opendaylight / yangtools / yang / data / codec / xml / UnionXmlCodec.java
index 76c7a5b469364db2f5b00c2b8a3910d96d7d20d0..ece38ea4c8a9335a86650a2210329b86402de776 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;
@@ -20,7 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-abstract class UnionXmlCodec<T> implements XmlCodec<T> {
+abstract sealed class UnionXmlCodec<T> implements XmlCodec<T> {
     private static final class Diverse extends UnionXmlCodec<Object> {
         Diverse(final List<XmlCodec<?>> codecs) {
             super(codecs);
@@ -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