This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new f71472f  Collections usage optimizations.
f71472f is described below

commit f71472f3fec396f244852ecf5aa511de9edb3e17
Author: JamesBognar <[email protected]>
AuthorDate: Sat Mar 5 10:04:40 2022 -0500

    Collections usage optimizations.
---
 .../java/org/apache/juneau/jena/RdfBeanMeta.java   | 10 +--
 .../apache/juneau/jena/RdfBeanPropertyMeta.java    | 10 +--
 .../java/org/apache/juneau/jena/RdfClassMeta.java  |  6 +-
 .../org/apache/juneau/jena/RdfParserSession.java   | 29 ++++-----
 .../apache/juneau/jena/RdfSerializerSession.java   | 72 ++++++++++------------
 .../src/main/java/org/apache/juneau/BeanMeta.java  | 14 +++++
 .../apache/juneau/csv/CsvSerializerSession.java    |  2 +-
 .../java/org/apache/juneau/internal/IOUtils.java   | 62 +++++++++++++++++++
 .../org/apache/juneau/internal/ThrowableUtils.java | 64 +++++++++++++++++++
 .../org/apache/juneau/parser/ParserSession.java    |  3 +-
 .../apache/juneau/serializer/SerializerPipe.java   | 30 +++++----
 11 files changed, 209 insertions(+), 93 deletions(-)

diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
index ae314f5..9a03ff4 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
@@ -37,15 +37,7 @@ public class RdfBeanMeta extends ExtendedBeanMeta {
         */
        public RdfBeanMeta(BeanMeta<?> beanMeta, RdfMetaProvider mp) {
                super(beanMeta);
-
-               BeanPropertyMeta t_beanUriProperty = null;
-               for (BeanPropertyMeta p : beanMeta.getPropertyMetas()) {
-                       RdfBeanPropertyMeta bpm = mp.getRdfBeanPropertyMeta(p);
-                       if (bpm.isBeanUri())
-                               t_beanUriProperty = p;
-               }
-
-               this.beanUriProperty = t_beanUriProperty;
+               this.beanUriProperty = beanMeta.firstProperty(x -> 
mp.getRdfBeanPropertyMeta(x).isBeanUri(), x -> x).orElse(null);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
index 36655c8..37e2199 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
@@ -51,12 +51,12 @@ public class RdfBeanPropertyMeta extends 
ExtendedBeanPropertyMeta {
                List<Rdf> rdfs = bpm.getAllAnnotationsParentFirst(Rdf.class);
                List<RdfSchema> schemas = 
bpm.getAllAnnotationsParentFirst(RdfSchema.class);
 
-               for (Rdf rdf : rdfs) {
-                       if (rdf.collectionFormat() != 
RdfCollectionFormat.DEFAULT)
-                               collectionFormat = rdf.collectionFormat();
-                       if (rdf.beanUri())
+               rdfs.forEach(x -> {
+                       if (x.collectionFormat() != RdfCollectionFormat.DEFAULT)
+                               collectionFormat = x.collectionFormat();
+                       if (x.beanUri())
                                isBeanUri = true;
-               }
+               });
 
                namespace = RdfUtils.findNamespace(rdfs, schemas);
        }
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
index 7eafb5d..92ac030 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
@@ -47,11 +47,7 @@ public class RdfClassMeta extends ExtendedClassMeta {
                cm.forEachAnnotation(Rdf.class, x -> true, x -> rdfs.add(x));
                cm.forEachAnnotation(RdfSchema.class, x -> true, x -> 
schemas.add(x));
 
-               RdfCollectionFormat _collectionFormat = 
RdfCollectionFormat.DEFAULT;
-               for (Rdf a : rdfs)
-                       if (a.collectionFormat() != RdfCollectionFormat.DEFAULT)
-                               _collectionFormat = a.collectionFormat();
-               this.collectionFormat = _collectionFormat;
+               this.collectionFormat = rdfs.stream().map(x -> 
x.collectionFormat()).filter(x -> x != 
RdfCollectionFormat.DEFAULT).findFirst().orElse(RdfCollectionFormat.DEFAULT);
                this.namespace = RdfUtils.findNamespace(rdfs, schemas);
        }
 
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
index 9b34b5f..89e29cf 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java
@@ -20,6 +20,7 @@ import java.io.*;
 import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
+import java.util.concurrent.atomic.*;
 import java.util.function.*;
 
 import org.apache.jena.rdf.model.*;
@@ -224,10 +225,8 @@ public class RdfParserSession extends ReaderParserSession {
                rdfReader = model.getReader(ctx.getLanguage());
 
                // Note: NTripleReader throws an exception if you try to set 
any properties on it.
-               if (! ctx.getLanguage().equals(LANG_NTRIPLE)) {
-                       for (Map.Entry<String,Object> e : 
ctx.getJenaSettings().entrySet())
-                               rdfReader.setProperty(e.getKey(), e.getValue());
-               }
+               if (! ctx.getLanguage().equals(LANG_NTRIPLE))
+                       ctx.getJenaSettings().forEach((k,v) -> 
rdfReader.setProperty(k, v));
        }
 
        @Override /* ReaderParserSession */
@@ -250,10 +249,9 @@ public class RdfParserSession extends ReaderParserSession {
                                        : new OList(this)
                                );
 
-                       int argIndex = 0;
-                       for (Resource resource : roots)
-                               c.add(parseAnything(type.isArgs() ? 
type.getArg(argIndex++) : type.getElementType(), resource,
-                                       getOuter(), null));
+                       AtomicInteger argIndex = new AtomicInteger(0);
+                       Collection c2 = c;
+                       roots.forEach(x -> c2.add(parseAnything(type.isArgs() ? 
type.getArg(argIndex.getAndIncrement()) : type.getElementType(), x, getOuter(), 
null)));
 
                        if (type.isArray() || type.isArgs())
                                return (T)toArray(type, c);
@@ -327,7 +325,7 @@ public class RdfParserSession extends ReaderParserSession {
                return l;
        }
 
-       private <T> BeanMap<T> parseIntoBeanMap(Resource r2, BeanMap<T> m) 
throws IOException, ParseException, ExecutableException {
+       private <T> BeanMap<T> parseIntoBeanMap(Resource r2, BeanMap<T> m) 
throws ParseException {
                BeanMeta<T> bm = m.getMeta();
                RdfBeanMeta rbm = getRdfBeanMeta(bm);
                if (rbm.hasBeanUri() && r2.getURI() != null)
@@ -380,7 +378,7 @@ public class RdfParserSession extends ReaderParserSession {
                return getCollectionFormat() == 
RdfCollectionFormat.MULTI_VALUED;
        }
 
-       private <T> T parseAnything(ClassMeta<?> eType, RDFNode n, Object 
outer, BeanPropertyMeta pMeta) throws IOException, ParseException, 
ExecutableException {
+       private <T> T parseAnything(ClassMeta<?> eType, RDFNode n, Object 
outer, BeanPropertyMeta pMeta) throws ParseException {
 
                if (eType == null)
                        eType = object();
@@ -541,7 +539,7 @@ public class RdfParserSession extends ReaderParserSession {
                return false;
        }
 
-       private Object getValue(RDFNode n, Object outer) throws IOException, 
ParseException, ExecutableException {
+       private Object getValue(RDFNode n, Object outer) throws ParseException {
                if (n.isLiteral())
                        return n.asLiteral().getValue();
                if (n.isResource()) {
@@ -556,8 +554,7 @@ public class RdfParserSession extends ReaderParserSession {
                throw new ParseException(this, "Unknown value type for node 
''{0}''", n);
        }
 
-       private <K,V> Map<K,V> parseIntoMap(Resource r, Map<K,V> m, 
ClassMeta<K> keyType,
-                       ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws 
IOException, ParseException, ExecutableException {
+       private <K,V> Map<K,V> parseIntoMap(Resource r, Map<K,V> m, 
ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws 
ParseException {
                // Add URI as "uri" to generic maps.
                if (r.getURI() != null) {
                        K uri = convertAttrToType(m, "uri", keyType);
@@ -581,8 +578,7 @@ public class RdfParserSession extends ReaderParserSession {
                return m;
        }
 
-       private <E> Collection<E> parseIntoCollection(Container c, 
Collection<E> l,
-                       ClassMeta<?> type, BeanPropertyMeta pMeta) throws 
IOException, ParseException, ExecutableException {
+       private <E> Collection<E> parseIntoCollection(Container c, 
Collection<E> l, ClassMeta<?> type, BeanPropertyMeta pMeta) throws 
ParseException {
                int argIndex = 0;
                for (NodeIterator ni = c.iterator(); ni.hasNext();) {
                        E e = (E)parseAnything(type.isArgs() ? 
type.getArg(argIndex++) : type.getElementType(), ni.next(), l, pMeta);
@@ -591,8 +587,7 @@ public class RdfParserSession extends ReaderParserSession {
                return l;
        }
 
-       private <E> Collection<E> parseIntoCollection(RDFList list, 
Collection<E> l,
-                       ClassMeta<?> type, BeanPropertyMeta pMeta) throws 
IOException, ParseException, ExecutableException {
+       private <E> Collection<E> parseIntoCollection(RDFList list, 
Collection<E> l, ClassMeta<?> type, BeanPropertyMeta pMeta) throws 
ParseException {
                int argIndex = 0;
                for (ExtendedIterator<RDFNode> ni = list.iterator(); 
ni.hasNext();) {
                        E e = (E)parseAnything(type.isArgs() ? 
type.getArg(argIndex++) : type.getElementType(), ni.next(), l, pMeta);
diff --git 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
index 74b5872..936046c 100644
--- 
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
+++ 
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfSerializerSession.java
@@ -257,9 +257,10 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
                        writer.setProperty("attributeQuoteChar", 
Character.toString(getQuoteChar()));
                }
 
-               for (Map.Entry<String,Object> e : 
ctx.getJenaSettings().entrySet())
-                       if (e.getKey().startsWith(propPrefix, 5))
-                               writer.setProperty(e.getKey().substring(5 + 
propPrefix.length()), e.getValue());
+               ctx.getJenaSettings().forEach((k,v) -> {
+                       if (k.startsWith(propPrefix, 5))
+                               writer.setProperty(k.substring(5 + 
propPrefix.length()), v);
+               });
        }
 
        /*
@@ -287,15 +288,14 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
        }
 
        @Override /* Serializer */
-       protected void doSerialize(SerializerPipe out, Object o) throws 
IOException, SerializeException {
+       protected void doSerialize(SerializerPipe out, Object o) throws 
SerializeException {
 
                Resource r = null;
 
                ClassMeta<?> cm = getClassMetaForObject(o);
                if (isLooseCollections() && cm != null && 
cm.isCollectionOrArray()) {
                        Collection c = sort(cm.isCollection() ? (Collection)o : 
toList(cm.getInnerClass(), o));
-                       for (Object o2 : c)
-                               serializeAnything(o2, false, object(), "root", 
null, null);
+                       c.forEach(x -> serializeAnything(x, false, object(), 
"root", null, null));
                } else {
                        RDFNode n = serializeAnything(o, false, 
getExpectedRootType(o), "root", null, null);
                        if (n.isLiteral()) {
@@ -312,8 +312,7 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
                writer.write(model, out.getWriter(), "http://unknown/";);
        }
 
-       private RDFNode serializeAnything(Object o, boolean isURI, ClassMeta<?> 
eType,
-                       String attrName, BeanPropertyMeta bpm, Resource 
parentResource) throws IOException, SerializeException {
+       private RDFNode serializeAnything(Object o, boolean isURI, ClassMeta<?> 
eType, String attrName, BeanPropertyMeta bpm, Resource parentResource) throws 
SerializeException {
                Model m = model;
 
                ClassMeta<?> aType = null;       // The actual type
@@ -438,9 +437,9 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
                        }
 
                } else if (sType.isReader()) {
-                       n = 
m.createLiteral(encodeTextInvalidChars(read((Reader)o)));
+                       n = 
m.createLiteral(encodeTextInvalidChars(read((Reader)o, 
SerializerSession::handleThrown)));
                } else if (sType.isInputStream()) {
-                       n = 
m.createLiteral(encodeTextInvalidChars(read((InputStream)o)));
+                       n = 
m.createLiteral(encodeTextInvalidChars(read((InputStream)o, 
SerializerSession::handleThrown)));
 
                } else {
                        n = 
m.createLiteral(encodeTextInvalidChars(toString(o)));
@@ -462,7 +461,7 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
                return getUriResolver().resolve(s);
        }
 
-       private void serializeMap(Map m, Resource r, ClassMeta<?> type) throws 
IOException, SerializeException {
+       private void serializeMap(Map m, Resource r, ClassMeta<?> type) throws 
SerializeException {
 
                m = sort(m);
 
@@ -470,20 +469,18 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
 
                ArrayList<Map.Entry<Object,Object>> l = listFrom(m.entrySet());
                Collections.reverse(l);
-               for (Map.Entry<Object,Object> me : l) {
-                       Object value = me.getValue();
-
-                       Object key = generalize(me.getKey(), keyType);
-
+               l.forEach(x -> {
+                       Object value = x.getValue();
+                       Object key = generalize(x.getKey(), keyType);
                        Namespace ns = getJuneauBpNs();
                        Property p = model.createProperty(ns.getUri(), 
encodeElementName(toString(key)));
                        RDFNode n = serializeAnything(value, false, valueType, 
toString(key), null, r);
                        if (n != null)
                                r.addProperty(p, n);
-               }
+               });
        }
 
-       private void serializeBeanMap(BeanMap<?> m, Resource r, String 
typeName) throws IOException, SerializeException {
+       private void serializeBeanMap(BeanMap<?> m, Resource r, String 
typeName) throws SerializeException {
                List<BeanPropertyValue> l = new ArrayList<>();
 
                if (typeName != null) {
@@ -497,24 +494,23 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
                });
 
                Collections.reverse(l);
-               for (BeanPropertyValue bpv : l) {
-
-                       BeanPropertyMeta bpMeta = bpv.getMeta();
+               l.forEach(x -> {
+                       BeanPropertyMeta bpMeta = x.getMeta();
                        ClassMeta<?> cMeta = bpMeta.getClassMeta();
                        RdfBeanPropertyMeta bpRdf = 
getRdfBeanPropertyMeta(bpMeta);
                        XmlBeanPropertyMeta bpXml = 
getXmlBeanPropertyMeta(bpMeta);
 
                        if (bpRdf.isBeanUri())
-                               continue;
+                               return;
 
-                       String key = bpv.getName();
-                       Object value = bpv.getValue();
-                       Throwable t = bpv.getThrown();
+                       String key = x.getName();
+                       Object value = x.getValue();
+                       Throwable t = x.getThrown();
                        if (t != null)
                                onBeanGetterException(bpMeta, t);
 
                        if (canIgnoreValue(cMeta, key, value))
-                               continue;
+                               return;
 
                        Namespace ns = bpRdf.getNamespace();
                        if (ns == null && isUseXmlNamespaces())
@@ -528,37 +524,31 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
                        RDFNode n = serializeAnything(value, bpMeta.isUri(), 
cMeta, key, bpMeta, r);
                        if (n != null)
                                r.addProperty(p, n);
-               }
+               });
        }
 
 
-       private Container serializeToContainer(Collection c, ClassMeta<?> type, 
Container list) throws IOException, SerializeException {
-
+       private Container serializeToContainer(Collection c, ClassMeta<?> type, 
Container list) throws SerializeException {
                ClassMeta<?> elementType = type.getElementType();
-               for (Object e : c) {
-                       RDFNode n = serializeAnything(e, false, elementType, 
null, null, null);
-                       list = list.add(n);
-               }
+               c.forEach(x -> list.add(serializeAnything(x, false, 
elementType, null, null, null)));
                return list;
        }
 
-       private RDFList serializeToList(Collection c, ClassMeta<?> type) throws 
IOException, SerializeException {
+       private RDFList serializeToList(Collection c, ClassMeta<?> type) throws 
SerializeException {
                ClassMeta<?> elementType = type.getElementType();
                List<RDFNode> l = list(c.size());
-               for (Object e : c) {
-                       l.add(serializeAnything(e, false, elementType, null, 
null, null));
-               }
+               c.forEach(x -> l.add(serializeAnything(x, false, elementType, 
null, null, null)));
                return model.createList(l.iterator());
        }
 
        private void serializeToMultiProperties(Collection c, ClassMeta<?> 
sType,
-                       BeanPropertyMeta bpm, String attrName, Resource 
parentResource) throws IOException, SerializeException {
+                       BeanPropertyMeta bpm, String attrName, Resource 
parentResource) throws SerializeException {
 
                ClassMeta<?> elementType = sType.getElementType();
                RdfBeanPropertyMeta bpRdf = getRdfBeanPropertyMeta(bpm);
                XmlBeanPropertyMeta bpXml = getXmlBeanPropertyMeta(bpm);
 
-               for (Object e : c) {
+               c.forEach(x -> {
                        Namespace ns = bpRdf.getNamespace();
                        if (ns == null && isUseXmlNamespaces())
                                ns = bpXml.getNamespace();
@@ -566,10 +556,10 @@ public final class RdfSerializerSession extends 
WriterSerializerSession {
                                ns = getJuneauBpNs();
                        else if (isAutoDetectNamespaces())
                                addModelPrefix(ns);
-                       RDFNode n2 = serializeAnything(e, false, elementType, 
null, null, null);
+                       RDFNode n2 = serializeAnything(x, false, elementType, 
null, null, null);
                        Property p = model.createProperty(ns.getUri(), 
encodeElementName(attrName));
                        parentResource.addProperty(p, n2);
-               }
+               });
        }
 
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index e6fdfe6..31da94d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -829,6 +829,20 @@ public class BeanMeta<T> {
        }
 
        /**
+        * Performs a function on the first property that matches the specified 
filter.
+        *
+        * @param filter The filter to apply.
+        * @param function The function to apply to the matching property.
+        * @return The result of the function.  Never <jk>null</jk>.
+        */
+       public <T2> Optional<T2> firstProperty(Predicate<BeanPropertyMeta> 
filter, Function<BeanPropertyMeta,T2> function) {
+               for (BeanPropertyMeta x : propertyArray)
+                       if (filter.test(x))
+                               return Optional.ofNullable(function.apply(x));
+               return Optional.empty();
+       }
+
+       /**
         * Returns metadata about the specified property.
         *
         * @param name The name of the property on this bean.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
index 407062b..94c3df0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvSerializerSession.java
@@ -250,7 +250,7 @@ public final class CsvSerializerSession extends 
WriterSerializerSession {
                }
        }
 
-       final CsvWriter getCsvWriter(SerializerPipe out) throws IOException {
+       final CsvWriter getCsvWriter(SerializerPipe out) {
                Object output = out.getRawOutput();
                if (output instanceof CsvWriter)
                        return (CsvWriter)output;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/IOUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/IOUtils.java
index cfb8d8c..3110b01 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/IOUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/IOUtils.java
@@ -475,6 +475,26 @@ public final class IOUtils {
        }
 
        /**
+        * Reads the contents of a reader into a string.
+        *
+        * @param in
+        *      The input reader.
+        *      <br>Can be <jk>null</jk>.
+        *      <br>Stream is automatically closed.
+        * @param onException Consumer of any {@link IOException I/O 
exceptions}.
+        * @return
+        *      The contents of the reader as a string, or <jk>null</jk> if the 
reader was <jk>null</jk>.
+        */
+       public static String read(Reader in, Consumer<IOException> onException) 
{
+               try (Reader in2 = in) {
+                       return read(in, -1);
+               } catch (IOException e) {
+                       onException.accept(e);
+                       return null;
+               }
+       }
+
+       /**
         * Reads the specified input into a {@link String} until the end of the 
input is reached.
         *
         * @param in
@@ -519,6 +539,24 @@ public final class IOUtils {
        }
 
        /**
+        * Reads the contents of an input stream into a string.
+        *
+        * <p>
+        * Assumes UTF-8 encoding.
+        *
+        * @param in
+        *      The input stream.
+        *      <br>Can be <jk>null</jk>.
+        *      <br>Stream is automatically closed.
+        * @param onException Consumer of any {@link IOException I/O 
exceptions}.
+        * @return
+        *      The contents of the reader as a string, or <jk>null</jk> if the 
input stream was <jk>null</jk>.
+        */
+       public static String read(InputStream in, Consumer<IOException> 
onException) {
+               return read(in, UTF8, onException);
+       }
+
+       /**
         * Reads the contents of an input stream into a string using the 
specified charset.
         *
         * @param in
@@ -540,6 +578,30 @@ public final class IOUtils {
        }
 
        /**
+        * Reads the contents of an input stream into a string using the 
specified charset.
+        *
+        * @param in
+        *      The input stream.
+        *      <br>Can be <jk>null</jk>.
+        *      <br>Stream is automatically closed.
+        * @param cs
+        *      The charset of the contents of the input stream.
+        * @param onException Consumer of any {@link IOException I/O 
exceptions}.
+        * @return
+        *      The contents of the reader as a string or <jk>null</jk> if 
input stream was <jk>null</jk>.
+        */
+       public static String read(InputStream in, Charset cs, 
Consumer<IOException> onException) {
+               if (in == null)
+                       return null;
+               try (InputStreamReader isr = new InputStreamReader(in, cs)) {
+                       return read(isr);
+               } catch (IOException e) {
+                       onException.accept(e);
+                       return null;
+               }
+       }
+
+       /**
         * Reads the specified input stream into the specified byte array.
         *
         * @param in
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ThrowableUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ThrowableUtils.java
index 3f4b311..0b24282 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ThrowableUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ThrowableUtils.java
@@ -15,6 +15,8 @@ package org.apache.juneau.internal;
 import java.io.*;
 
 import org.apache.juneau.assertions.*;
+import org.apache.juneau.parser.*;
+import org.apache.juneau.serializer.*;
 
 /**
  * Various utility methods for creating and working with throwables.
@@ -156,6 +158,68 @@ public class ThrowableUtils {
        }
 
        /**
+        * Creates a new builder for {@link ParseException} objects.
+        *
+        * @return A new builder for {@link ParseException} objects.
+        */
+       public static ExceptionBuilder<SerializeException> serializeException() 
{
+               return new ExceptionBuilder<>(SerializeException.class);
+       }
+
+       /**
+        * Creates a new {@link ParseException}.
+        *
+        * @param msg The exception message.  Can be <jk>null</jk>.
+        *      <br>If <jk>null</jk>, then the caused-by message is used if 
available.
+        * @param args The exception message arguments.
+        * @return A new {@link ParseException}.
+        */
+       public static SerializeException serializeException(String msg, 
Object...args) {
+               return serializeException().message(msg, args).build();
+       }
+
+       /**
+        * Creates a new {@link SerializeException}.
+        *
+        * @param cause The caused-by exception.
+        * @return A new {@link SerializeException}, or the same exception if 
it's already of that type.
+        */
+       public static SerializeException serializeException(Throwable cause) {
+               return cause instanceof SerializeException ? 
(SerializeException)cause : serializeException().causedBy(cause).build();
+       }
+
+       /**
+        * Creates a new builder for {@link ParseException} objects.
+        *
+        * @return A new builder for {@link ParseException} objects.
+        */
+       public static ExceptionBuilder<ParseException> parseException() {
+               return new ExceptionBuilder<>(ParseException.class);
+       }
+
+       /**
+        * Creates a new {@link ParseException}.
+        *
+        * @param msg The exception message.  Can be <jk>null</jk>.
+        *      <br>If <jk>null</jk>, then the caused-by message is used if 
available.
+        * @param args The exception message arguments.
+        * @return A new {@link ParseException}.
+        */
+       public static ParseException parseException(String msg, Object...args) {
+               return parseException().message(msg, args).build();
+       }
+
+       /**
+        * Creates a new {@link ParseException}.
+        *
+        * @param cause The caused-by exception.
+        * @return A new {@link ParseException}, or the same exception if it's 
already of that type.
+        */
+       public static ParseException parseException(Throwable cause) {
+               return cause instanceof ParseException ? (ParseException)cause 
: parseException().causedBy(cause).build();
+       }
+
+       /**
         * Same as {@link Throwable#getCause()} but searches the throwable 
chain for an exception of the specified type.
         *
         * @param c The throwable type to search for.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
index 6f915db..ec5679f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
@@ -960,12 +960,11 @@ public class ParserSession extends BeanSession {
         * @param type The class type to convert the string to.
         * @return The string converted as an object of the specified type.
         * @param <T> The class type to convert the string to.
-        * @throws IOException Thrown by underlying stream.
         * @throws ParseException Malformed input encountered.
         * @throws ExecutableException Exception occurred on invoked 
constructor/method/field.
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
-       protected final <T> T convertAttrToType(Object outer, String s, 
ClassMeta<T> type) throws IOException, ParseException, ExecutableException {
+       protected final <T> T convertAttrToType(Object outer, String s, 
ClassMeta<T> type) throws ParseException {
                if (s == null)
                        return null;
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerPipe.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerPipe.java
index 389c00a..71402c5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerPipe.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerPipe.java
@@ -133,22 +133,26 @@ public final class SerializerPipe implements Closeable {
         *      The output object wrapped in a writer.
         *      Calling {@link Writer#close()} on the returned object simply 
flushes the response and does not close
         *      the underlying writer.
-        * @throws IOException If object could not be converted to a writer.
+        * @throws SerializeException If object could not be converted to a 
writer.
         */
-       public Writer getWriter() throws IOException {
+       public Writer getWriter() throws SerializeException {
                if (output == null)
-                       throw ioException("Output cannot be null.");
+                       throw serializeException("Output cannot be null.");
 
-               if (output instanceof Writer)
-                       writer = (Writer)output;
-               else if (output instanceof OutputStream)
-                       writer = new OutputStreamWriter((OutputStream)output, 
charset);
-               else if (output instanceof File)
-                       writer = new OutputStreamWriter(new 
BufferedOutputStream(new FileOutputStream((File)output)));
-               else if (output instanceof StringBuilder)
-                       writer = new StringBuilderWriter((StringBuilder)output);
-               else
-                       throw ioException("Cannot convert object of type {0} to 
a Writer.", className(output));
+               try {
+                       if (output instanceof Writer)
+                               writer = (Writer)output;
+                       else if (output instanceof OutputStream)
+                               writer = new 
OutputStreamWriter((OutputStream)output, charset);
+                       else if (output instanceof File)
+                               writer = new OutputStreamWriter(new 
BufferedOutputStream(new FileOutputStream((File)output)));
+                       else if (output instanceof StringBuilder)
+                               writer = new 
StringBuilderWriter((StringBuilder)output);
+                       else
+                               throw serializeException("Cannot convert object 
of type {0} to a Writer.", className(output));
+               } catch (FileNotFoundException e) {
+                       throw serializeException(e);
+               }
 
                return new NoCloseWriter(writer);
        }

Reply via email to