You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2018/02/21 15:36:31 UTC
[isis] 03/11: ISIS-1867: caches JAXBContext by class (in JaxbUtil
utility class in applib)
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 4de622087a5cd750a3efa7d617c68cee61e78103
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Feb 21 14:56:52 2018 +0000
ISIS-1867: caches JAXBContext by class (in JaxbUtil utility class in applib)
---
.../java/org/apache/isis/applib/util/JaxbUtil.java | 27 ++++++++++++++--------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/JaxbUtil.java b/core/applib/src/main/java/org/apache/isis/applib/util/JaxbUtil.java
index 0bac18a..5127bf5 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/JaxbUtil.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/util/JaxbUtil.java
@@ -23,16 +23,18 @@ import java.io.StringReader;
import java.io.Writer;
import java.net.URL;
import java.nio.charset.Charset;
+import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
-import org.apache.isis.applib.internal.base._Casts;
-
+import com.google.common.collect.MapMaker;
import com.google.common.io.Resources;
+import org.apache.isis.applib.internal.base._Casts;
+
/**
* Helper methods for converting {@link javax.xml.bind.annotation.XmlRootElement}-annotated class to-and-from XML. Intended primarily for
* test use only (the {@link JAXBContext} is not cached).
@@ -50,7 +52,7 @@ public class JaxbUtil {
final Class<T> dtoClass) {
Unmarshaller un = null;
try {
- un = getJaxbContext(dtoClass).createUnmarshaller();
+ un = jaxbContextFor(dtoClass).createUnmarshaller();
return _Casts.uncheckedCast(un.unmarshal(reader));
} catch (JAXBException e) {
throw new RuntimeException(e);
@@ -77,7 +79,7 @@ public class JaxbUtil {
Marshaller m = null;
try {
final Class<?> aClass = dto.getClass();
- m = getJaxbContext(aClass).createMarshaller();
+ m = jaxbContextFor(aClass).createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(dto, writer);
} catch (JAXBException e) {
@@ -85,11 +87,18 @@ public class JaxbUtil {
}
}
- private static JAXBContext getJaxbContext(Class<?> dtoClass) {
- try {
- return JAXBContext.newInstance(dtoClass);
- } catch (JAXBException e) {
- throw new RuntimeException(e);
+ private static Map<Class<?>, JAXBContext> jaxbContextByClass = new MapMaker().concurrencyLevel(10).makeMap();
+
+ private static <T> JAXBContext jaxbContextFor(final Class<T> dtoClass) {
+ JAXBContext jaxbContext = jaxbContextByClass.get(dtoClass);
+ if(jaxbContext == null) {
+ try {
+ jaxbContext = JAXBContext.newInstance(dtoClass);
+ } catch (JAXBException e) {
+ throw new RuntimeException(e);
+ }
+ jaxbContextByClass.put(dtoClass, jaxbContext);
}
+ return jaxbContext;
}
}
--
To stop receiving notification emails like this one, please contact
danhaywood@apache.org.