public void testTuscanySerialization() throws Exception {
// read in WSDL
String contributionLocation = "target/classes";
NodeImpl node = (NodeImpl)NodeFactory.newInstance().createNode("org/apache/tuscany/sca/binding/ws/axis2/wsdl-serialize.composite",
new Contribution("test", contributionLocation));
node.start();
try {
RuntimeEndpointImpl endpoint = (RuntimeEndpointImpl)node.getDomainComposite().getComponents().get(0).getServices().get(0).getEndpoints().get(0);
WSDLInterface wsdlInterface = (WSDLInterface)endpoint.getBindingInterfaceContract().getInterface();
WSDLDefinition wsdlDefinition = wsdlInterface.getWsdlDefinition();
Definition definition = wsdlDefinition.getDefinition();
// write out a flattened WSDL along with XSD
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
try {
WSDLWriter writer = WSDLFactory.newInstance().newWSDLWriter();
String baseURI = null;
if (wsdlDefinition.getLocation() != null) {
baseURI = wsdlDefinition.getLocation().toString();
} else {
baseURI = "GeneratedWSDL";
}
outStream.write(baseURI.getBytes());
outStream.write(separator);
writer.writeWSDL(definition, outStream);
for (WSDLDefinition importedWSDLDefintion : wsdlDefinition.getImportedDefinitions()){
outStream.write(separator);
baseURI = importedWSDLDefintion.getLocation().toString();
outStream.write(baseURI.getBytes());
outStream.write(separator);
writer.writeWSDL(importedWSDLDefintion.getDefinition(), outStream);
}
for (XSDefinition xsdDefinition : wsdlDefinition.getXmlSchemas()){
// we store a reference to the schema schema. We don't need to write that out.
// also ignore schema that are extract from the original WSDL (have in their location)
if (!xsdDefinition.getNamespace().equals("http://www.w3.org/2001/XMLSchema") &&
xsdDefinition.getSchema() != null){
writeSchema(outStream, xsdDefinition.getSchema());
}
}
} catch (Exception e){
throw new RuntimeException(e);
}
String wsdlString = outStream.toString();
//System.out.println(wsdlString);
// Read the WSDL and XSD back in from the string
String xmlArray[] = wsdlString.split("_X_");
String topWSDLLocation = null;
Map<String, XMLString> xmlMap = new HashMap<String, XMLString>();
for (int i = 0; i < xmlArray.length; i = i + 2){
String location = xmlArray[i];
String xml = xmlArray[i+1];
// strip the file name out of the location
location = location.substring(location.lastIndexOf("/") + 1);
if (location.endsWith(".wsdl")){
xmlMap.put(location,
new WSDLInfo(xmlArray[i],
xml));
if (topWSDLLocation == null){
topWSDLLocation = location;
}
} else {
xmlMap.put(location,
new XSDInfo(xmlArray[i],
xml));
}
}
ExtensionPointRegistry registry = endpoint.getCompositeContext().getExtensionPointRegistry();
FactoryExtensionPoint modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class);
org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory wsdlFactory = modelFactories.getFactory(org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory.class);
XSDFactory xsdFactory = modelFactories.getFactory(XSDFactory.class);
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.setSchemaResolver(new XSDURIResolverImpl(xmlMap));
ContributionFactory contributionFactory = modelFactories.getFactory(ContributionFactory.class);
final org.apache.tuscany.sca.contribution.Contribution contribution = contributionFactory.createContribution();
ProcessorContext processorContext = new ProcessorContext();
ExtensibleModelResolver extensibleResolver = new ExtensibleModelResolver(contribution, registry.getExtensionPoint(ModelResolverExtensionPoint.class), modelFactories);
WSDLModelResolver wsdlResolver = (WSDLModelResolver)extensibleResolver.getModelResolverInstance(WSDLDefinition.class);
XSDModelResolver xsdResolver = (XSDModelResolver)extensibleResolver.getModelResolverInstance(XSDefinition.class);
contribution.setURI("temp");
contribution.setLocation(topWSDLLocation);
contribution.setModelResolver(extensibleResolver);
// read
for (XMLString xmlString : xmlMap.values()){
if (xmlString instanceof WSDLInfo){
WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
reader.setFeature("javax.wsdl.verbose", false);
reader.setFeature("javax.wsdl.importDocuments", true);
WSDLLocatorImpl locator = new WSDLLocatorImpl(xmlString.getBaseURI(), xmlMap);
Definition readDefinition = reader.readWSDL(locator);
wsdlDefinition = wsdlFactory.createWSDLDefinition();
wsdlDefinition.setDefinition(readDefinition);
wsdlDefinition.setLocation(new URI(xmlString.getBaseURI()));
((WSDLInfo)xmlString).setWsdlDefintion(wsdlDefinition);
wsdlResolver.addModel(wsdlDefinition, processorContext);
} else {
InputStream inputStream = new ByteArrayInputStream(xmlString.getXmlString().getBytes());
InputSource inputSource = new InputSource(inputStream);
inputSource.setSystemId(xmlString.getBaseURI());
XmlSchema schema = schemaCollection.read(inputSource, null);
inputStream.close();
XSDefinition xsdDefinition = xsdFactory.createXSDefinition();
xsdDefinition.setSchema(schema);
((XSDInfo)xmlString).setXsdDefinition(xsdDefinition);
xsdResolver.addModel(xsdDefinition, processorContext);
}
}
// resolve
for (XMLString xmlString : xmlMap.values()){
if (xmlString instanceof WSDLInfo){
wsdlDefinition = ((WSDLInfo)xmlString).getWsdlDefintion();
// link to imports
for (Map.Entry<String, List<javax.wsdl.Import>> entry :
((Map<String, List<javax.wsdl.Import>>)wsdlDefinition.getDefinition().getImports()).entrySet()) {
for (javax.wsdl.Import imp : entry.getValue()) {
String wsdlName = imp.getDefinition().getDocumentBaseURI();
WSDLInfo wsdlInfo = (WSDLInfo)xmlMap.get(getFilenameWithoutPath(wsdlName));
wsdlDefinition.getImportedDefinitions().add(wsdlInfo.getWsdlDefintion());
}
}
// link to in-line types
Types types = wsdlDefinition.getDefinition().getTypes();
if ( types != null){
for (int i=0; i < types.getExtensibilityElements().size(); i++){
String schemaName = xmlString.getBaseURI() + "#" + i++;
XSDInfo xsdInfo = (XSDInfo)xmlMap.get(getFilenameWithoutPath(schemaName));
wsdlDefinition.getXmlSchemas().add(xsdInfo.getXsdDefinition());
}
}
} else {
}
}
WSDLInfo topWSDL = (WSDLInfo)xmlMap.get(topWSDLLocation);
WSDLDefinition topWSDLDefinition = topWSDL.getWsdlDefintion();
PortType portType = (PortType)topWSDLDefinition.getDefinition().getAllPortTypes().values().iterator().next();
WSDLInterface readWSDLInterface = wsdlFactory.createWSDLInterface(portType, topWSDLDefinition, extensibleResolver, null);
// now check what we have just read with what we started out with to see if the compatibility test passes
// in the real system have to check contracts not interfaces
UtilityExtensionPoint utils = registry.getExtensionPoint(UtilityExtensionPoint.class);
InterfaceContractMapper interfaceContractMapper = utils.getUtility(InterfaceContractMapper.class);
boolean match = interfaceContractMapper.isCompatibleSubset(wsdlInterface, readWSDLInterface);
Assert.assertTrue(match);
} catch(Exception ex){
System.out.println(ex.toString());
ex.printStackTrace();
node.stop();
Assert.fail();
}
node.stop();
}