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:30 UTC

[isis] 02/11: ISIS-1867: caches JAXBContext by class in JaxbService.Default implementation

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 1921a342d9a2d2a7b7bdb06f12b46df359b6e172
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Feb 21 14:49:06 2018 +0000

    ISIS-1867: caches JAXBContext by class in JaxbService.Default implementation
---
 .../isis/applib/services/jaxb/JaxbService.java     | 34 +++++++++++++---------
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
index 9df01a3..dae78d2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbService.java
@@ -29,16 +29,16 @@ import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 
+import com.google.common.collect.MapMaker;
+import com.google.common.collect.Maps;
+
 import org.apache.isis.applib.ApplicationException;
-import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.internal.base._Casts;
 import org.apache.isis.applib.internal.base._NullSafe;
 import org.apache.isis.applib.services.dto.Dto_downloadXsd;
 
-import com.google.common.collect.Maps;
-
 public interface JaxbService {
 
     @Programmatic
@@ -103,7 +103,7 @@ public interface JaxbService {
 
         @Override
         public Object fromXml(final JAXBContext jaxbContext, final String xml) {
-            return fromXml(jaxbContext, xml, Maps.<String,Object>newHashMap());
+            return fromXml(jaxbContext, xml, Maps.newHashMap());
         }
         @Override
         public Object fromXml(final JAXBContext jaxbContext, final String xml, final Map<String, Object> unmarshallerProperties) {
@@ -127,12 +127,12 @@ public interface JaxbService {
 
         @Override
         public <T> T fromXml(final Class<T> domainClass, final String xml) {
-            return fromXml(domainClass, xml, Maps.<String,Object>newHashMap());
+            return fromXml(domainClass, xml, Maps.newHashMap());
         }
         @Override
         public <T> T fromXml(final Class<T> domainClass, final String xml, final Map<String, Object> unmarshallerProperties) {
             try {
-                final JAXBContext context = JAXBContext.newInstance(domainClass);
+                final JAXBContext context = jaxbContextFor(domainClass);
                 return _Casts.uncheckedCast(fromXml(context, xml, unmarshallerProperties));
 
             } catch (final JAXBException ex) {
@@ -140,9 +140,21 @@ public interface JaxbService {
             }
         }
 
+        private Map<Class<?>, JAXBContext> jaxbContextByClass = new MapMaker().concurrencyLevel(10).makeMap();
+
+        private <T> JAXBContext jaxbContextFor(final Class<T> dtoClass) throws JAXBException {
+            JAXBContext jaxbContext = jaxbContextByClass.get(dtoClass);
+            if(jaxbContext == null) {
+                jaxbContext = JAXBContext.newInstance(dtoClass);
+                jaxbContextByClass.put(dtoClass, jaxbContext);
+            }
+            return jaxbContext;
+        }
+
+
         @Override
         public String toXml(final Object domainObject) {
-            return toXml(domainObject, Maps.<String,Object>newHashMap());
+            return toXml(domainObject, Maps.newHashMap());
         }
 
         @Override
@@ -150,7 +162,7 @@ public interface JaxbService {
 
             final Class<?> domainClass = domainObject.getClass();
             try {
-                final JAXBContext context = JAXBContext.newInstance(domainClass);
+                final JAXBContext context = jaxbContextFor(domainClass);
 
                 final Marshaller marshaller = context.createMarshaller();
 
@@ -218,7 +230,7 @@ public interface JaxbService {
 
             try {
                 final Class<?> domainClass = domainObject.getClass();
-                final JAXBContext context = JAXBContext.newInstance(domainClass);
+                final JAXBContext context = jaxbContextFor(domainClass);
 
                 final CatalogingSchemaOutputResolver outputResolver = new CatalogingSchemaOutputResolver(isisSchemas);
                 context.generateSchema(outputResolver);
@@ -228,10 +240,6 @@ public interface JaxbService {
                 throw new ApplicationException(ex);
             }
         }
-
-
-        @javax.inject.Inject
-        DomainObjectContainer container;
     }
 
 

-- 
To stop receiving notification emails like this one, please contact
danhaywood@apache.org.