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.