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);
}