summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorslaws <slaws@13f79535-47bb-0310-9956-ffa450edef68>2011-09-01 10:27:50 +0000
committerslaws <slaws@13f79535-47bb-0310-9956-ffa450edef68>2011-09-01 10:27:50 +0000
commita0cba0e1277e9db8886f3c33c8e512ec08e57b52 (patch)
tree59f88d871924d1d4896e3c09964e7b4dc33d71c8
parent60bd4b15c52f930db76be0b3d7006cc20e7b6eb3 (diff)
TUSCANY-3916 - Turn remote interface match back on with a couple of restrictions. Only the top level WSDL is shared and dependent XSD is not. I've added guards for the case where parameter types cannot be converted to WSDL. If interface information is insufficient to run the match the interfaces are assumed to be compatible and matching is left until runtime. Having struggled with the WSDL based approach I'm going to look at serializing the internal Tuscany model.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1163988 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java38
-rw-r--r--sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java32
-rw-r--r--sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java14
3 files changed, 71 insertions, 13 deletions
diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java
index 2989ba1445..df2afbefcc 100644
--- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java
+++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/RuntimeEndpointImpl.java
@@ -1021,11 +1021,10 @@ public class RuntimeEndpointImpl extends EndpointImpl implements RuntimeEndpoint
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.uri = in.readUTF();
- this.xml = in.readUTF();
-/*
+ this.xml = in.readUTF();
this.wsdl = in.readUTF();
this.wsdlCallback = in.readUTF();
-*/
+
}
public void writeExternal(ObjectOutput out) throws IOException {
@@ -1039,8 +1038,7 @@ public class RuntimeEndpointImpl extends EndpointImpl implements RuntimeEndpoint
throw new IllegalStateException("No serializer is configured");
}
}
-
-/*
+
if (wsdl == null) {
wsdl = getWsdl();
}
@@ -1049,8 +1047,7 @@ public class RuntimeEndpointImpl extends EndpointImpl implements RuntimeEndpoint
if (wsdlCallback == null) {
wsdlCallback = getWsdlCallback();
}
- out.writeUTF(wsdlCallback);
-*/
+ out.writeUTF(wsdlCallback);
}
public String getAsXML() {
@@ -1065,7 +1062,16 @@ public class RuntimeEndpointImpl extends EndpointImpl implements RuntimeEndpoint
if (ic == null || ic.getInterface() == null || !ic.getInterface().isRemotable()) {
return "";
}
- WSDLInterfaceContract wsdlIC = (WSDLInterfaceContract)getGeneratedWSDLContract(ic);
+
+ WSDLInterfaceContract wsdlIC = null;
+ try {
+ wsdlIC = (WSDLInterfaceContract)getGeneratedWSDLContract(ic);
+ } catch (Exception ex){
+ // ignore WSDL generation errors as the service interface may have
+ // types that can't be converted to XML easily
+ return "";
+ }
+
if (wsdlIC == null) {
return "";
}
@@ -1091,7 +1097,16 @@ public class RuntimeEndpointImpl extends EndpointImpl implements RuntimeEndpoint
if (ic == null || ic.getCallbackInterface() == null || !ic.getCallbackInterface().isRemotable()) {
return "";
}
- WSDLInterfaceContract wsdlIC = (WSDLInterfaceContract)getGeneratedWSDLContract(ic);
+
+ WSDLInterfaceContract wsdlIC = null;
+ try {
+ wsdlIC = (WSDLInterfaceContract)getGeneratedWSDLContract(ic);
+ } catch (Exception ex){
+ // ignore WSDL generation errors as the service interface may have
+ // types that can't be converted to XML easily
+ return "";
+ }
+
if (wsdlIC == null) {
return "";
}
@@ -1139,13 +1154,16 @@ public class RuntimeEndpointImpl extends EndpointImpl implements RuntimeEndpoint
outStream.write(separator);
writer.writeWSDL(importedWSDLDefintion.getDefinition(), outStream);
}
+/* Exclude the XSD for the time being to see if we can get comparison working
+ * with the operation signatures but ignoring parameter types
for (XSDefinition xsdDefinition : wsdlDefinition.getXmlSchemas()){
// we store a reference to the schema schema. We don't need to write that out.
if (!xsdDefinition.getNamespace().equals("http://www.w3.org/2001/XMLSchema") &&
xsdDefinition.getSchema() != null){
writeSchema(outStream, xsdDefinition.getSchema());
}
- }
+ }
+*/
}
/**
diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java
index 0dfaed6791..c677b99b93 100644
--- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java
+++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/impl/WSDLHelper.java
@@ -40,6 +40,9 @@ import javax.wsdl.Definition;
import javax.wsdl.PortType;
import javax.wsdl.Types;
import javax.wsdl.WSDLException;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.UnknownExtensibilityElement;
+import javax.wsdl.extensions.schema.Schema;
import javax.wsdl.xml.WSDLLocator;
import javax.wsdl.xml.WSDLReader;
@@ -63,6 +66,8 @@ import org.apache.tuscany.sca.xsd.xml.XSDModelResolver;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.apache.ws.commons.schema.resolver.DefaultURIResolver;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
import org.xml.sax.InputSource;
public class WSDLHelper {
@@ -295,17 +300,38 @@ public class WSDLHelper {
// extract any in-line types in the Tuscany model
Types types = wsdlDefinition.getDefinition().getTypes();
- if ( types != null){
+ if ( types != null){
+/* read XSD from WSDL rather than from registry
for (int i=0; i < types.getExtensibilityElements().size(); i++){
+
String schemaName = xmlString.getBaseURI() + "#" + i++;
XSDInfo xsdInfo = (XSDInfo)xmlMap.get(getFilenameWithoutPath(schemaName));
if (xsdInfo != null){
wsdlDefinition.getXmlSchemas().add(xsdInfo.getXsdDefinition());
}
+*/
+ int index = 0;
+ for (Object ext : types.getExtensibilityElements()) {
+ ExtensibilityElement extElement = (ExtensibilityElement)ext;
+ Element element = null;
+ if (extElement instanceof Schema) {
+ element = ((Schema)extElement).getElement();
+ }
+ if (element != null) {
+ XSDefinition xsDefinition = xsdFactory.createXSDefinition();
+ xsDefinition.setUnresolved(true);
+ xsDefinition.setNamespace(element.getAttribute("targetNamespace"));
+ xsDefinition.setDocument(element.getOwnerDocument());
+ XmlSchema schema = schemaCollection.read(element, null);
+ xsDefinition.setSchema(schema);
+ xsDefinition.setLocation(URI.create(xmlString.getBaseURI() + "#" + index));
+ wsdlDefinition.getXmlSchemas().add(xsDefinition);
+ index++;
+ }
}
}
} else {
- // Schema should already be linked via the schema model
+ // TODO
}
}
@@ -484,5 +510,5 @@ public class WSDLHelper {
return filename.substring(wsdlIndex + 1);
}
// What happens with generated WSDL?
- }
+ }
}
diff --git a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
index a61b549489..2a3e466b60 100644
--- a/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
+++ b/sca-java-2.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/runtime/impl/EndpointReferenceBinderImpl.java
@@ -969,11 +969,25 @@ public class EndpointReferenceBinderImpl implements EndpointReferenceBinder {
return true;
}
+/* For testing this code turns off remote interface matching completely
if (endpoint.isRemote()){
matchAudit.append("Match because endpoint is remote");
matchAudit.appendSeperator();
return true;
}
+*/
+
+ // If the remote interface was not retrieved successfully from the registry for whatever reason
+ // then assume the interfaces match and leave the checking until runtime. We looking for an interface
+ // with no operations defined to tell us this.
+ if ((endpointContract.getInterface().getOperations().size() == 0 &&
+ endpointContract.getNormalizedWSDLContract() == null) ||
+ (endpointContract.getNormalizedWSDLContract() != null &&
+ endpointContract.getNormalizedWSDLContract().getInterface().getOperations().size() == 0)){
+ matchAudit.append("Match because the endpoint is remote and we don't have a copy of it's interface contract ");
+ matchAudit.appendSeperator();
+ return true;
+ }
// If the contracts are not of the same type use normailized interfaces
if (endpointReferenceContract.getClass() != endpointContract.getClass() ||