Author: dkulp
Date: Mon Jan 4 22:40:10 2010
New Revision: 895811
URL: http://svn.apache.org/viewvc?rev=895811&view=rev
Log:
[CXF-2599] More attempts to work around JAXB having issues with "jar"
URL's. Also logged a bug with them:
https://jaxb.dev.java.net/issues/show_bug.cgi?id=728
Modified:
cxf/trunk/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java
Modified:
cxf/trunk/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java
URL:
http://svn.apache.org/viewvc/cxf/trunk/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java?rev=895811&r1=895810&r2=895811&view=diff
==============================================================================
---
cxf/trunk/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java
(original)
+++
cxf/trunk/tools/wsdlto/databinding/jaxb/src/main/java/org/apache/cxf/tools/wsdlto/databinding/jaxb/JAXBDataBinding.java
Mon Jan 4 22:40:10 2010
@@ -56,9 +56,14 @@
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
import org.xml.sax.SAXException;
+import org.xml.sax.helpers.XMLFilterImpl;
import com.sun.codemodel.ClassType;
import com.sun.codemodel.JClass;
@@ -67,6 +72,7 @@
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JType;
import com.sun.tools.xjc.BadCommandLineException;
+import com.sun.tools.xjc.ErrorReceiver;
import com.sun.tools.xjc.Options;
import com.sun.tools.xjc.Plugin;
import com.sun.tools.xjc.api.Mapping;
@@ -75,6 +81,10 @@
import com.sun.tools.xjc.api.SchemaCompiler;
import com.sun.tools.xjc.api.TypeAndAnnotation;
import com.sun.tools.xjc.api.XJC;
+import com.sun.tools.xjc.reader.internalizer.AbstractReferenceFinderImpl;
+import com.sun.tools.xjc.reader.internalizer.DOMForest;
+import com.sun.tools.xjc.reader.xmlschema.parser.LSInputSAXWrapper;
+import com.sun.tools.xjc.reader.xmlschema.parser.XMLSchemaInternalizationLogic;
import org.apache.cxf.Bus;
import org.apache.cxf.catalog.OASISCatalogManager;
@@ -88,6 +98,7 @@
import org.apache.cxf.helpers.FileUtils;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.helpers.XPathUtils;
+import org.apache.cxf.resource.URIResolver;
import org.apache.cxf.service.model.SchemaInfo;
import org.apache.cxf.service.model.ServiceInfo;
import org.apache.cxf.staxutils.StaxUtils;
@@ -268,8 +279,11 @@
this.context = c;
SchemaCompiler schemaCompiler = XJC.createSchemaCompiler();
+ Bus bus = context.get(Bus.class);
+ OASISCatalogManager catalog =
bus.getExtension(OASISCatalogManager.class);
+ hackInNewInternalizationLogic(schemaCompiler, catalog);
+
ClassCollector classCollector = context.get(ClassCollector.class);
- //installResolverIntoSchemaCompiler(schemaCompiler);
ClassNameAllocatorImpl allocator
= new ClassNameAllocatorImpl(classCollector,
@@ -379,6 +393,50 @@
}
initialized = true;
}
+
+ private static final class ReferenceFinder extends
AbstractReferenceFinderImpl {
+ private Locator locator;
+ private OASISCatalogManager catalog;
+
+ ReferenceFinder(DOMForest parent, OASISCatalogManager cat) {
+ super(parent);
+ catalog = cat;
+ }
+
+ public void setDocumentLocator(Locator loc) {
+ super.setDocumentLocator(loc);
+ this.locator = loc;
+ }
+ protected String findExternalResource(String nsURI, String localName,
Attributes atts) {
+ if (XMLConstants.W3C_XML_SCHEMA_NS_URI.equals(nsURI)
+ && ("import".equals(localName)
+ || "include".equals(localName))) {
+ String s = atts.getValue("schemaLocation");
+ if (!StringUtils.isEmpty(s)) {
+ s = JAXBDataBinding.mapSchemaLocation(s,
locator.getSystemId(), catalog);
+ }
+ return s;
+ }
+ return null;
+ }
+ }
+ private void hackInNewInternalizationLogic(SchemaCompiler schemaCompiler,
+ final OASISCatalogManager
catalog) {
+ try {
+ Field f = schemaCompiler.getClass().getDeclaredField("forest");
+ f.setAccessible(true);
+ DOMForest forest = new DOMForest(new
XMLSchemaInternalizationLogic() {
+ public XMLFilterImpl createExternalReferenceFinder(DOMForest
parent) {
+ return new ReferenceFinder(parent, catalog);
+ }
+
+ });
+ forest.setErrorHandler((ErrorReceiver)schemaCompiler);
+ f.set(schemaCompiler, forest);
+ } catch (Throwable ex) {
+ //ignore
+ }
+ }
private void addBindingFiles(Options opts, List<InputSource> jaxbBindings,
SchemaCollection schemas) {
for (InputSource binding : jaxbBindings) {
XMLStreamReader r = StaxUtils.createXMLStreamReader(binding);
@@ -483,7 +541,7 @@
} catch (Throwable ex) {
//ignore - DOM level 3
}
- validateSchema(ele, uri);
+ validateSchema(ele, uri, catalog);
}
try {
docs[0].setDocumentURI(key);
@@ -551,7 +609,7 @@
Element ele = sci.getElement();
ele = removeImportElement(ele, key, catalog);
if (context.get(ToolConstants.CFG_VALIDATE_WSDL) != null) {
- validateSchema(ele, sci.getSystemId());
+ validateSchema(ele, sci.getSystemId(), catalog);
}
InputSource is = new InputSource((InputStream)null);
//key = key.replaceFirst("#types[0-9]+$", "");
@@ -772,8 +830,19 @@
}
- public void validateSchema(Element ele, String uri) throws ToolException {
+ public void validateSchema(Element ele, String uri,
+ final OASISCatalogManager catalog) throws
ToolException {
SchemaFactory schemaFact =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+ schemaFact.setResourceResolver(new LSResourceResolver() {
+ public LSInput resolveResource(String type,
+ String namespaceURI,
+ String publicId,
+ String systemId,
+ String baseURI) {
+ String s = JAXBDataBinding.mapSchemaLocation(systemId,
baseURI, catalog);
+ return new LSInputSAXWrapper(new InputSource(s));
+ }
+ });
DOMSource domSrc = new DOMSource(ele, uri);
try {
schemaFact.newSchema(domSrc);
@@ -1075,15 +1144,15 @@
//ignore
}
}
+
try {
- //JAXB xjc cannot properly do this for "jar" URL's so we'll go
ahead and do
- //the resolving ourselves.
- URL url = new URL(base);
- url = new URL(url, target);
- return url.toString();
+ URIResolver resolver = new URIResolver(base, target);
+ if (resolver.isResolved()) {
+ target = resolver.getURI().toString();
+ }
} catch (Exception ex) {
//ignore
- }
+ }
return target;
}