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