You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/04/27 15:52:18 UTC

svn commit: r1331432 - /cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java

Author: dkulp
Date: Fri Apr 27 13:52:17 2012
New Revision: 1331432

URL: http://svn.apache.org/viewvc?rev=1331432&view=rev
Log:
Delay parsing the "built in" schemas until they are actually needed.
Speeds up start time in some cases and reduces memory if not needed.

Modified:
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java?rev=1331432&r1=1331431&r2=1331432&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java Fri Apr 27 13:52:17 2012
@@ -20,12 +20,12 @@
 package org.apache.cxf.jaxb;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -57,6 +57,8 @@ import javax.xml.transform.dom.DOMSource
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
+import org.xml.sax.InputSource;
+
 import org.apache.cxf.common.injection.NoJSR250Annotations;
 import org.apache.cxf.common.jaxb.JAXBContextCache;
 import org.apache.cxf.common.jaxb.JAXBContextCache.CachedContextAndSchemas;
@@ -72,7 +74,6 @@ import org.apache.cxf.databinding.DataRe
 import org.apache.cxf.databinding.DataWriter;
 import org.apache.cxf.databinding.WrapperCapableDatabinding;
 import org.apache.cxf.databinding.WrapperHelper;
-import org.apache.cxf.helpers.XMLUtils;
 import org.apache.cxf.interceptor.Interceptor;
 import org.apache.cxf.interceptor.InterceptorProvider;
 import org.apache.cxf.jaxb.attachment.JAXBAttachmentSchemaValidationHack;
@@ -84,6 +85,7 @@ import org.apache.cxf.service.Service;
 import org.apache.cxf.service.factory.ReflectionServiceFactoryBean;
 import org.apache.cxf.service.factory.ServiceConstructionException;
 import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.staxutils.StaxUtils;
 import org.apache.cxf.ws.addressing.ObjectFactory;
 
 @NoJSR250Annotations
@@ -106,17 +108,41 @@ public class JAXBDataBinding extends Abs
                                                                                Node.class,
                                                                                XMLEventWriter.class,
                                                                                XMLStreamWriter.class};
-
+    
+    private static class DelayedDOMResult extends DOMResult {
+        private final URL resource;
+        private final String publicId;
+        public DelayedDOMResult(URL url, String sysId, String pId) {
+            super(null, sysId);
+            resource = url;
+            publicId = pId;
+        }
+        public synchronized Node getNode() {
+            Node nd = super.getNode();
+            if (nd == null) {
+                try {
+                    InputSource src = new InputSource(resource.openStream());
+                    src.setSystemId(this.getSystemId());
+                    src.setPublicId(publicId);
+                    Document doc = StaxUtils.read(src);
+                    setNode(doc);
+                } catch (Exception ex) {
+                    throw new RuntimeException(ex);
+                }
+            }
+            return nd;
+        }
+    }
     private static final Map<String, DOMResult> BUILT_IN_SCHEMAS = new HashMap<String, DOMResult>();
     static {
         URIResolver resolver = new URIResolver();
         try {
             resolver.resolve("", "classpath:/schemas/wsdl/ws-addr-wsdl.xsd", JAXBDataBinding.class);
             if (resolver.isResolved()) {
-                InputStream ins = resolver.getInputStream();
-                Document doc = XMLUtils.parse(ins);
-                ins.close();
-                DOMResult dr = new DOMResult(doc, "classpath:/schemas/wsdl/ws-addr-wsdl.xsd");
+                resolver.getInputStream().close();
+                DOMResult dr = new DelayedDOMResult(resolver.getURL(),
+                                                    "classpath:/schemas/wsdl/ws-addr-wsdl.xsd",
+                                                    "http://www.w3.org/2005/02/addressing/wsdl");
                 BUILT_IN_SCHEMAS.put("http://www.w3.org/2005/02/addressing/wsdl", dr);
                 resolver.unresolve();
             }
@@ -126,10 +152,10 @@ public class JAXBDataBinding extends Abs
         try {
             resolver.resolve("", "classpath:/schemas/wsdl/ws-addr.xsd", JAXBDataBinding.class);
             if (resolver.isResolved()) {
-                InputStream ins = resolver.getInputStream();
-                Document doc = XMLUtils.parse(ins);
-                ins.close();
-                DOMResult dr = new DOMResult(doc, "classpath:/schemas/wsdl/ws-addr.xsd");
+                resolver.getInputStream().close();
+                DOMResult dr = new DelayedDOMResult(resolver.getURL(),
+                                                    "classpath:/schemas/wsdl/ws-addr.xsd",
+                                                    "http://www.w3.org/2005/08/addressing");
                 BUILT_IN_SCHEMAS.put("http://www.w3.org/2005/08/addressing", dr);
                 resolver.unresolve();
             }
@@ -139,10 +165,10 @@ public class JAXBDataBinding extends Abs
         try {
             resolver.resolve("", "classpath:/schemas/wsdl/wsrm.xsd", JAXBDataBinding.class);
             if (resolver.isResolved()) {
-                InputStream ins = resolver.getInputStream();
-                Document doc = XMLUtils.parse(ins);
-                ins.close();
-                DOMResult dr = new DOMResult(doc, "classpath:/schemas/wsdl/wsrm.xsd");
+                resolver.getInputStream().close();
+                DOMResult dr = new DelayedDOMResult(resolver.getURL(),
+                                                    "classpath:/schemas/wsdl/wsrm.xsd",
+                                                    "http://schemas.xmlsoap.org/ws/2005/02/rm");
                 BUILT_IN_SCHEMAS.put("http://schemas.xmlsoap.org/ws/2005/02/rm", dr);
                 resolver.unresolve();
             }