Author: rfeng
Date: Wed Jun  4 16:02:52 2008
New Revision: 663401

URL: http://svn.apache.org/viewvc?rev=663401&view=rev
Log:
Add cache support for Interface or a set of classes

Modified:
    
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java
    
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
    
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBDataBinding.java
    
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java

Modified: 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java?rev=663401&r1=663400&r2=663401&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextCache.java
 Wed Jun  4 16:02:52 2008
@@ -53,6 +53,8 @@
  * @version $Rev$ $Date$
  */
 public class JAXBContextCache {
+    private static final int CACHE_SIZE = 128;
+
     private static HashMap<String, Class<?>> loadClassMap = new 
HashMap<String, Class<?>>();
 
     static {
@@ -89,7 +91,7 @@
     protected JAXBContext commonContext;
 
     public JAXBContextCache() {
-        this(64, 64, 64);
+        this(CACHE_SIZE, CACHE_SIZE, CACHE_SIZE);
     }
 
     public JAXBContextCache(int contextSize, int marshallerSize, int 
unmarshallerSize) {
@@ -197,6 +199,10 @@
         }
     }
 
+    public Map<Object, JAXBContext> getCache() {
+        return cache.getCache();
+    }
+
     public JAXBContext getJAXBContext(Class<?> cls) throws JAXBException {
         if (COMMON_CLASSES_SET.contains(cls)) {
             return commonContext;
@@ -226,6 +232,29 @@
         }
     }
 
+    public JAXBContext getJAXBContext(Class<?>[] classes) throws JAXBException 
{
+        Set<Class<?>> classSet = new HashSet<Class<?>>(Arrays.asList(classes));
+        return getJAXBContext(classSet);
+    }
+
+    public JAXBContext getJAXBContext(Set<Class<?>> classes) throws 
JAXBException {
+        if (COMMON_CLASSES_SET.containsAll(classes)) {
+            return commonContext;
+        }
+        if (classes.size() == 1) {
+            return getJAXBContext(classes.iterator().next());
+        }
+        synchronized (cache) {
+            JAXBContext context = cache.get(classes);
+            if (context != null) {
+                return context;
+            }
+            context = JAXBContext.newInstance(classes.toArray(new 
Class<?>[classes.size()]));
+            cache.put(classes, context);
+            return context;
+        }
+    }
+
     public void clear() {
         synchronized (cache) {
             cache.clear();

Modified: 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java?rev=663401&r1=663400&r2=663401&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBContextHelper.java
 Wed Jun  4 16:02:52 2008
@@ -20,6 +20,9 @@
 
 import java.beans.Introspector;
 import java.io.IOException;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBElement;
@@ -40,6 +43,9 @@
 import org.apache.tuscany.sca.databinding.TransformationException;
 import org.apache.tuscany.sca.databinding.impl.SimpleTypeMapperImpl;
 import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.Interface;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.util.WrapperInfo;
 import org.apache.tuscany.sca.interfacedef.util.XMLType;
 import org.w3c.dom.Node;
 
@@ -59,6 +65,12 @@
     private JAXBContextHelper() {
     }
 
+    /**
+     * Create a JAXBContext for a given class
+     * @param cls
+     * @return
+     * @throws JAXBException
+     */
     public static JAXBContext createJAXBContext(Class<?> cls) throws 
JAXBException {
         return cache.getJAXBContext(cls);
     }
@@ -147,6 +159,63 @@
         }
     }
 
+    /**
+     * Create a JAXContext for an array of classes
+     * @param classes
+     * @return
+     * @throws JAXBException
+     */
+    public static JAXBContext createJAXBContext(Class<?>[] classes) throws 
JAXBException {
+        return cache.getJAXBContext(classes);
+    }
+    
+    /**
+     * Create a JAXBContext for a given java interface
+     * @param intf
+     * @return
+     * @throws JAXBException
+     */
+    public static JAXBContext createJAXBContext(Interface intf) throws 
JAXBException {
+        synchronized (cache) {
+            Map<Object, JAXBContext> map = cache.getCache();
+            JAXBContext context = map.get(intf);
+            if (context != null) {
+                return context;
+            }
+            Set<Class<?>> classes = new HashSet<Class<?>>();
+            for (Operation op : intf.getOperations()) {
+                WrapperInfo wrapper = op.getWrapper();
+                if (wrapper != null) {
+                    DataType dt1 = wrapper.getInputWrapperType();
+                    if (dt1 != null) {
+                        classes.add(dt1.getPhysical());
+                    }
+                    DataType dt2 = wrapper.getOutputWrapperType();
+                    if (dt2 != null) {
+                        classes.add(dt2.getPhysical());
+                    }
+                } else {
+                    for (DataType dt1 : op.getInputType().getLogical()) {
+                        classes.add(dt1.getPhysical());
+                    }
+                    DataType dt2 = op.getOutputType();
+                    if (dt2 != null) {
+                        classes.add(dt2.getPhysical());
+                    }
+                    for (DataType<DataType> dt3 : op.getFaultTypes()) {
+                        DataType dt4 = dt3.getLogical();
+                        if (dt4 != null) {
+                            classes.add(dt4.getPhysical());
+                        }
+                    }
+                }
+            }
+
+            context = createJAXBContext(classes.toArray(new 
Class<?>[classes.size()]));
+            return context;
+        }
+    }
+
     public static Class<?> getJavaType(DataType<?> dataType) {
         if (dataType == null) {
             return null;

Modified: 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBDataBinding.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBDataBinding.java?rev=663401&r1=663400&r2=663401&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBDataBinding.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBDataBinding.java
 Wed Jun  4 16:02:52 2008
@@ -102,7 +102,7 @@
             } else {
                 arg = new JAXBElement(ROOT_ELEMENT, Object.class, arg);
             }
-            JAXBContext context = JAXBContext.newInstance(cls);
+            JAXBContext context = JAXBContextHelper.createJAXBContext(cls);
             Document doc = DOMHelper.newDocument();
             context.createMarshaller().marshal(arg, doc);
             JAXBElement<?> element = 
context.createUnmarshaller().unmarshal(doc, cls);

Modified: 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java?rev=663401&r1=663400&r2=663401&view=diff
==============================================================================
--- 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
 (original)
+++ 
incubator/tuscany/java/sca/modules/databinding-jaxb/src/main/java/org/apache/tuscany/sca/databinding/jaxb/JAXBTypeHelper.java
 Wed Jun  4 16:02:52 2008
@@ -119,7 +119,7 @@
                 XmlSchemaCollection collection = new XmlSchemaCollection();
                 Class[] typesArray = new Class[types.size()];
                 typesArray = types.toArray(typesArray);
-                JAXBContext context = JAXBContext.newInstance(typesArray);
+                JAXBContext context = 
JAXBContextHelper.createJAXBContext(typesArray);
                 Map<String, String> results = generateSchema(context);
                 collection.setSchemaResolver(new XSDResolver(results));
                 


Reply via email to