diff options
Diffstat (limited to '')
-rw-r--r-- | sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModelResolver.java | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModelResolver.java b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModelResolver.java new file mode 100644 index 0000000000..190f1d2b81 --- /dev/null +++ b/sandbox/ant/relax-ws/src/main/java/org/apache/tuscany/sca/interfacedef/relaxws/RelaxWSModelResolver.java @@ -0,0 +1,151 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.interfacedef.relaxws; + +import static org.apache.tuscany.sca.interfacedef.wsdl.xml.WSDLModelResolver.XSD_QNAME_LIST; + +import java.net.URI; +import java.util.List; + +import javax.wsdl.Definition; +import javax.wsdl.Types; +import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.UnknownExtensibilityElement; +import javax.wsdl.extensions.schema.Schema; + +import org.apache.tuscany.sca.contribution.Contribution; +import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory; +import org.apache.tuscany.sca.interfacedef.wsdl.XSDefinition; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + +/** + * A ModelResolver that takes a RelaxWSModel object and gives the + * underlying WSDLDefinition to the WSDL model resolver. + */ +public class RelaxWSModelResolver implements ModelResolver { + + private ModelResolver modelresolver; + Contribution contribution; + private WSDLFactory wsdlFactory; + + public RelaxWSModelResolver(Contribution contribution, ModelFactoryExtensionPoint modelFactories) { + modelresolver = contribution.getModelResolver(); + this.contribution = contribution; + this.wsdlFactory = modelFactories.getFactory(WSDLFactory.class); + } + + public void addModel(Object arg0) { + RelaxWSModel rwsModel = (RelaxWSModel)arg0; + readInlineSchemas(rwsModel.wsdlDefinition, rwsModel.wsdlDefinition.getDefinition()); + modelresolver.addModel(rwsModel.wsdlDefinition); + } + + public Object removeModel(Object arg0) { + RelaxWSModel rwsModel = (RelaxWSModel)arg0; + return modelresolver.removeModel(rwsModel.wsdlDefinition); + } + + public <T> T resolveModel(Class<T> arg0, T arg1) { + // nothing needed for RelaxWSModelResolver + return null; + } + + // TODO following methods are a direct copy from the WSDLModelResolver + // need to refactor so the code can be shared + + protected void readInlineSchemas(WSDLDefinition wsdlDefinition, Definition definition) { + if (contribution == null) { + // Check null for test cases + return; + } + Types types = definition.getTypes(); + if (types != null) { + int index = 0; + for (Object ext : types.getExtensibilityElements()) { + ExtensibilityElement extElement = (ExtensibilityElement)ext; + Element element = null; + if (XSD_QNAME_LIST.contains(extElement.getElementType())) { + if (extElement instanceof Schema) { + element = ((Schema)extElement).getElement(); + } else if (extElement instanceof UnknownExtensibilityElement) { + element = ((UnknownExtensibilityElement)extElement).getElement(); + } + } + if (element != null) { + Document doc = promote(element); + XSDefinition xsDefinition = wsdlFactory.createXSDefinition(); + xsDefinition.setUnresolved(true); + xsDefinition.setNamespace(element.getAttribute("targetNamespace")); + xsDefinition.setDocument(doc); + xsDefinition.setLocation(URI.create(doc.getDocumentURI() + "#" + index)); + XSDefinition resolved = + contribution.getModelResolver().resolveModel(XSDefinition.class, xsDefinition); + if (resolved != null && !resolved.isUnresolved()) { + if (!wsdlDefinition.getXmlSchemas().contains(resolved)) { + wsdlDefinition.getXmlSchemas().add(xsDefinition); + } + } + index++; + } + } + } + for (Object imports : definition.getImports().values()) { + List impList = (List)imports; + for (Object i : impList) { + javax.wsdl.Import anImport = (javax.wsdl.Import)i; + // Read inline schemas + if (anImport.getDefinition() != null) { + readInlineSchemas(wsdlDefinition, anImport.getDefinition()); + } + } + } + } + + private Document promote(Element element) { + Document doc = (Document)element.getOwnerDocument().cloneNode(false); + Element schema = (Element)doc.importNode(element, true); + doc.appendChild(schema); + Node parent = element.getParentNode(); + while (parent instanceof Element) { + Element root = (Element)parent; + NamedNodeMap nodeMap = root.getAttributes(); + for (int i = 0; i < nodeMap.getLength(); i++) { + Attr attr = (Attr)nodeMap.item(i); + String name = attr.getName(); + if ("xmlns".equals(name) || name.startsWith("xmlns:")) { + if (schema.getAttributeNode(name) == null) { + schema.setAttributeNodeNS((Attr)doc.importNode(attr, true)); + } + } + } + parent = parent.getParentNode(); + } + doc.setDocumentURI(element.getOwnerDocument().getDocumentURI()); + return doc; + } + +} |