Author: objectiser
Date: 2009-10-12 17:27:38 -0400 (Mon, 12 Oct 2009)
New Revision: 42
Modified:
trunk/tools/eclipse/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/generator/Generator.java
trunk/tools/eclipse/plugins/org.jboss.savara.tools.wsdl.tests/src/java/org/jboss/savara/tools/wsdl/tests/WSDLGeneratorTest.java
trunk/tools/eclipse/plugins/org.jboss.savara.tools.wsdl/src/java/org/jboss/savara/tools/wsdl/WSDLGenerator.java
Log:
Enable multiple WSDL files to be generated from a contract, based on their namespaces.
Modified:
trunk/tools/eclipse/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/generator/Generator.java
===================================================================
---
trunk/tools/eclipse/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/generator/Generator.java 2009-10-10
21:11:20 UTC (rev 41)
+++
trunk/tools/eclipse/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/generator/Generator.java 2009-10-12
21:27:38 UTC (rev 42)
@@ -216,30 +216,34 @@
new org.jboss.savara.tools.wsdl.WSDLGenerator();
Contract contract=(Contract)role.getAnnotations().get(Contract.class.getName());
- javax.wsdl.Definition defn=generator.generateDefinition(contract);
+ java.util.List<javax.wsdl.Definition>
defns=generator.generateDefinitions(contract);
- // Check if definition has a port type
- if (defn.getPortTypes().size() > 0) {
- java.io.ByteArrayOutputStream baos=new java.io.ByteArrayOutputStream();
-
- writer.writeWSDL(defn, baos);
-
- byte[] b=baos.toByteArray();
-
- baos.close();
-
- IPath wsdlPath=proj.getFullPath().append(
- new Path(getBuildSystem().getBPELFilePath())).
- append(localcm.getModelName().getName()+"_"+
- role.getName()+".wsdl");
-
- IFile wsdlFile=proj.getProject().getWorkspace().getRoot().getFile(wsdlPath);
- GeneratorUtil.createParentFolder(wsdlFile);
- wsdlFile.create(null, true,
- new org.eclipse.core.runtime.NullProgressMonitor());
-
- wsdlFile.setContents(new java.io.ByteArrayInputStream(b), true, false,
+ for (int i=0; i < defns.size(); i++) {
+ javax.wsdl.Definition defn=defns.get(i);
+
+ // Check if definition has a port type
+ if (defn.getPortTypes().size() > 0) {
+ java.io.ByteArrayOutputStream baos=new java.io.ByteArrayOutputStream();
+
+ writer.writeWSDL(defn, baos);
+
+ byte[] b=baos.toByteArray();
+
+ baos.close();
+
+ IPath wsdlPath=proj.getFullPath().append(
+ new Path(getBuildSystem().getBPELFilePath())).
+ append(localcm.getModelName().getName()+"_"+
+ role.getName()+i+".wsdl");
+
+ IFile wsdlFile=proj.getProject().getWorkspace().getRoot().getFile(wsdlPath);
+ GeneratorUtil.createParentFolder(wsdlFile);
+ wsdlFile.create(null, true,
new org.eclipse.core.runtime.NullProgressMonitor());
+
+ wsdlFile.setContents(new java.io.ByteArrayInputStream(b), true, false,
+ new org.eclipse.core.runtime.NullProgressMonitor());
+ }
}
}
}
Modified:
trunk/tools/eclipse/plugins/org.jboss.savara.tools.wsdl/src/java/org/jboss/savara/tools/wsdl/WSDLGenerator.java
===================================================================
---
trunk/tools/eclipse/plugins/org.jboss.savara.tools.wsdl/src/java/org/jboss/savara/tools/wsdl/WSDLGenerator.java 2009-10-10
21:11:20 UTC (rev 41)
+++
trunk/tools/eclipse/plugins/org.jboss.savara.tools.wsdl/src/java/org/jboss/savara/tools/wsdl/WSDLGenerator.java 2009-10-12
21:27:38 UTC (rev 42)
@@ -41,20 +41,84 @@
* @param contract The contract model
* @return The WSDL definition
*/
- public javax.wsdl.Definition generateDefinition(org.scribble.contract.model.Contract
contract) {
+ public java.util.List<javax.wsdl.Definition>
generateDefinitions(org.scribble.contract.model.Contract contract) {
+ java.util.List<javax.wsdl.Definition> ret=new
java.util.Vector<javax.wsdl.Definition>();
+
+ try {
+ // Create definition for contract's target namespace
+ javax.wsdl.Definition main=getDefinition(ret, contract, contract.getNamespace());
+
+ // Define a port type per interface
+ for (int i=0; i < contract.getInterfaces().size(); i++) {
+ createPortType(ret, contract, contract.getInterfaces().get(i));
+ }
+
+ // TODO: Add service with port type bindings
+
+ } catch(Exception e) {
+ logger.error("Failed to generate WSDL", e);
+ }
+
+ return(ret);
+ }
+
+ /**
+ * This method returns the definition associated with the supplied target namespace.
+ *
+ * @param wsdls The list of current WSDL definitions
+ * @param contract The contract
+ * @param targetNamespace The target namespace
+ * @return The WSDL definition for the target namespace, or null if unable to find or
create
+ */
+ protected javax.wsdl.Definition
getDefinition(java.util.List<javax.wsdl.Definition> wsdls,
+ org.scribble.contract.model.Contract contract, String targetNamespace) {
javax.wsdl.Definition ret=null;
+ if (targetNamespace != null) {
+ for (int i=0; ret == null && i < wsdls.size(); i++) {
+ ret = wsdls.get(i);
+
+ if (ret.getTargetNamespace() == null ||
+ ret.getTargetNamespace().equals(targetNamespace) == false) {
+ ret = null;
+ }
+ }
+
+ if (ret == null) {
+ ret = createDefinition(contract, targetNamespace);
+
+ if (ret != null) {
+ wsdls.add(ret);
+ }
+ }
+ }
+
+ return(ret);
+ }
+
+ /**
+ * This method creates a new WSDL definition associated with the supplied
+ * target namespace.
+ *
+ * @param contract The contract
+ * @param targetNamespace The target namespace
+ * @return The WSDL definition
+ */
+ protected javax.wsdl.Definition createDefinition(org.scribble.contract.model.Contract
contract,
+ String targetNamespace) {
+ javax.wsdl.Definition ret=null;
+
try {
javax.wsdl.factory.WSDLFactory fact=
- javax.wsdl.factory.WSDLFactory.newInstance();
-
+ javax.wsdl.factory.WSDLFactory.newInstance();
+
ret = fact.newDefinition();
// Set details on the definition
if (contract.getName() != null) {
ret.setQName(new javax.xml.namespace.QName(contract.getName()));
}
- ret.setTargetNamespace(contract.getNamespace());
+ ret.setTargetNamespace(targetNamespace);
// Set up namespace mappings
for (int i=0; i < contract.getNamespaces().size(); i++) {
@@ -62,51 +126,48 @@
ret.addNamespace(ns.getPrefix(), ns.getURI());
}
-
- // Define a port type per interface
- for (int i=0; i < contract.getInterfaces().size(); i++) {
- javax.wsdl.PortType ptype=generatePortType(ret, contract.getInterfaces().get(i));
-
- // Only add portType to definition if they have atleast one operation
- if (ptype != null && ptype.getOperations().size() > 0) {
- ret.addPortType(ptype);
- }
- }
-
+
} catch(Exception e) {
- logger.error("Failed to generate WSDL", e);
+ logger.error("Failed to create WSDL definition for target namespace
'"+targetNamespace+"'", e);
}
-
+
return(ret);
}
/**
* This method generates a port type, using the supplied WSDL definition,
- * based on the information in the supplied interface definition. Note that
- * the port type is not automatically added to the definition.
+ * based on the information in the supplied interface definition.
*
- * @param defn The WSDL definition used to create the port type
+ * @param wsdls The list of current WSDL definitions
+ * @param contract The contract
* @param intf The interface model
* @return The WSDL port type
*/
- public javax.wsdl.PortType generatePortType(javax.wsdl.Definition defn,
+ public javax.wsdl.PortType createPortType(java.util.List<javax.wsdl.Definition>
wsdls,
+ org.scribble.contract.model.Contract contract,
org.scribble.contract.model.Interface intf) {
javax.wsdl.PortType ret=null;
- if (defn != null && intf != null) {
- ret = defn.createPortType();
- ret.setUndefined(false);
-
- if (intf.getName() != null) {
- ret.setQName(new javax.xml.namespace.QName(intf.getNamespace(), intf.getName()));
- }
-
- for (int i=0; i < intf.getMessageExchangePatterns().size(); i++) {
- javax.wsdl.Operation op=generateOperation(defn,
- intf.getMessageExchangePatterns().get(i));
- if (op != null) {
- ret.addOperation(op);
+ if (intf != null) {
+ javax.wsdl.Definition defn=getDefinition(wsdls, contract, intf.getNamespace());
+
+ if (defn != null) {
+ ret = defn.createPortType();
+ ret.setUndefined(false);
+
+ if (intf.getName() != null) {
+ ret.setQName(new javax.xml.namespace.QName(intf.getNamespace(), intf.getName()));
}
+
+ for (int i=0; i < intf.getMessageExchangePatterns().size(); i++) {
+ createOperation(wsdls, contract, ret,
+ intf.getMessageExchangePatterns().get(i));
+ }
+
+ // Only add portType to definition if they have atleast one operation
+ if (ret != null && ret.getOperations().size() > 0) {
+ defn.addPortType(ret);
+ }
}
}
@@ -117,13 +178,22 @@
* This method generates an operation, using the supplied WSDL definition,
* based on the information in the supplied message exchange pattern.
*
- * @param defn The WSDL definition
+ * @param wsdls The list of current WSDL definitions
+ * @param contract The contract
+ * @param portType The port type
* @param mep The message exchange pattern
* @return The WSDL operation
*/
- public javax.wsdl.Operation generateOperation(javax.wsdl.Definition defn,
+ public javax.wsdl.Operation createOperation(java.util.List<javax.wsdl.Definition>
wsdls,
+ org.scribble.contract.model.Contract contract, javax.wsdl.PortType portType,
org.scribble.contract.model.MessageExchangePattern mep) {
javax.wsdl.Operation ret=null;
+
+ javax.wsdl.Definition defn=null;
+
+ if (portType != null) {
+ defn = getDefinition(wsdls, contract, portType.getQName().getNamespaceURI());
+ }
if (defn != null && mep != null) {
ret = defn.createOperation();
@@ -131,7 +201,7 @@
ret.setName(mep.getOperation());
- javax.wsdl.Message mesg=getMessage(defn, mep.getTypes());
+ javax.wsdl.Message mesg=getMessage(wsdls, contract, mep.getTypes());
if (mesg != null) {
javax.wsdl.Input input=defn.createInput();
@@ -143,7 +213,7 @@
if (mep instanceof RequestResponseMEP) {
RequestResponseMEP rr=(RequestResponseMEP)mep;
- javax.wsdl.Message om=getMessage(defn, rr.getResponseTypes());
+ javax.wsdl.Message om=getMessage(wsdls, contract, rr.getResponseTypes());
if (om != null) {
javax.wsdl.Output output=defn.createOutput();
output.setMessage(om);
@@ -155,7 +225,7 @@
for (int i=0; i < rr.getFaultDetails().size(); i++) {
FaultDetails fd=rr.getFaultDetails().get(i);
- javax.wsdl.Message fm=getMessage(defn, fd.getTypes());
+ javax.wsdl.Message fm=getMessage(wsdls, contract, fd.getTypes());
if (fm != null) {
javax.wsdl.Fault fault=defn.createFault();
fault.setName(fd.getName());
@@ -166,6 +236,8 @@
}
}
}
+
+ portType.addOperation(ret);
}
return(ret);
@@ -182,20 +254,25 @@
* does not exist prior to the call to this method, then it will be
* created and added to the definition upon returning the message.
*
- * @param defn The WSDL definition
+ * @param wsdls The list of current WSDL definitions
+ * @param contract The contract
* @param types The list of type references
* @return The WSDL message
*/
- public javax.wsdl.Message getMessage(javax.wsdl.Definition defn,
+ public javax.wsdl.Message getMessage(java.util.List<javax.wsdl.Definition> wsdls,
+ org.scribble.contract.model.Contract contract,
java.util.List<TypeReference> types) {
javax.wsdl.Message ret=null;
- if (defn != null && types != null && types.size() > 0) {
+ if (types != null && types.size() > 0) {
javax.xml.namespace.QName qname=null;
+ javax.wsdl.Definition defn=null;
if (types.size() == 1) {
TypeReference ref=types.get(0);
qname = new javax.xml.namespace.QName(ref.getNamespace(),ref.getLocalpart());
+
+ defn = getDefinition(wsdls, contract, ref.getNamespace());
} else {
throw new UnsupportedOperationException("Currently only supports single type
reference");
}
Modified:
trunk/tools/eclipse/plugins/org.jboss.savara.tools.wsdl.tests/src/java/org/jboss/savara/tools/wsdl/tests/WSDLGeneratorTest.java
===================================================================
---
trunk/tools/eclipse/plugins/org.jboss.savara.tools.wsdl.tests/src/java/org/jboss/savara/tools/wsdl/tests/WSDLGeneratorTest.java 2009-10-10
21:11:20 UTC (rev 41)
+++
trunk/tools/eclipse/plugins/org.jboss.savara.tools.wsdl.tests/src/java/org/jboss/savara/tools/wsdl/tests/WSDLGeneratorTest.java 2009-10-12
21:27:38 UTC (rev 42)
@@ -28,6 +28,8 @@
private static final String TEST_TYPE_NS = "testTypeNS";
private static final String TEST_TYPE_LP = "testTypeLP";
private static final String TEST_NAME_SPACE = "testNameSpace";
+ private static final String TEST_NAME_SPACE2 = "testNameSpace2";
+ private static final String TEST_NAME_SPACE3 = "testNameSpace3";
private static final String TEST_NAME = "testName";
public void testDefnNameAndNamespace() {
@@ -39,12 +41,14 @@
WSDLGenerator gen=new WSDLGenerator();
- javax.wsdl.Definition defn=gen.generateDefinition(c);
+ java.util.List<javax.wsdl.Definition> defns=gen.generateDefinitions(c);
- if (defn == null) {
- fail("Definition is null");
+ if (defns.size() != 1) {
+ fail("Only one Definition found: "+defns.size());
}
+ javax.wsdl.Definition defn=defns.get(0);
+
if (defn.getTargetNamespace() == null) {
fail("Target namespace not set");
}
@@ -67,17 +71,6 @@
}
public void testPortTypeNameAndNamespace() {
- javax.wsdl.Definition defn=null;
- try {
- javax.wsdl.factory.WSDLFactory fact=
- javax.wsdl.factory.WSDLFactory.newInstance();
-
- defn = fact.newDefinition();
-
- } catch(Exception e) {
- fail("Failed to get definition");
- }
-
Interface src=new Interface();
src.setName(TEST_NAME);
@@ -85,8 +78,10 @@
WSDLGenerator gen=new WSDLGenerator();
- javax.wsdl.PortType result=gen.generatePortType(defn, src);
+ java.util.List<javax.wsdl.Definition> defns=new
java.util.Vector<javax.wsdl.Definition>();
+ javax.wsdl.PortType result=gen.createPortType(defns, new Contract(), src);
+
if (result == null) {
fail("PortType is null");
}
@@ -115,27 +110,68 @@
public void testDefnWithPortTypes() {
Contract c=new Contract();
+ c.setNamespace(TEST_NAME_SPACE);
Interface i1=new Interface();
i1.setName("I1");
+ i1.setNamespace(TEST_NAME_SPACE);
+ // Need to associate a message, to ensure port type
+ // is generated
+ OneWayRequestMEP m1=new OneWayRequestMEP();
+
+ m1.setOperation(TEST_NAME);
+
+ TypeReference ref1=new TypeReference();
+ ref1.setLocalpart(TEST_TYPE_LP);
+ ref1.setNamespace(TEST_NAME_SPACE);
+ m1.getTypes().add(ref1);
+
+ i1.getMessageExchangePatterns().add(m1);
+
Interface i2=new Interface();
i2.setName("I2");
+ i2.setNamespace(TEST_NAME_SPACE);
+ OneWayRequestMEP m2=new OneWayRequestMEP();
+
+ m2.setOperation(TEST_NAME);
+
+ TypeReference ref2=new TypeReference();
+ ref2.setLocalpart(TEST_TYPE_LP);
+ ref2.setNamespace(TEST_NAME_SPACE);
+ m2.getTypes().add(ref2);
+
+ i2.getMessageExchangePatterns().add(m2);
+
Interface i3=new Interface();
i3.setName("I3");
+ i3.setNamespace(TEST_NAME_SPACE);
+ OneWayRequestMEP m3=new OneWayRequestMEP();
+
+ m3.setOperation(TEST_NAME);
+
+ TypeReference ref3=new TypeReference();
+ ref3.setLocalpart(TEST_TYPE_LP);
+ ref3.setNamespace(TEST_NAME_SPACE);
+ m3.getTypes().add(ref3);
+
+ i3.getMessageExchangePatterns().add(m3);
+
c.getInterfaces().add(i1);
c.getInterfaces().add(i2);
c.getInterfaces().add(i3);
WSDLGenerator gen=new WSDLGenerator();
- javax.wsdl.Definition defn=gen.generateDefinition(c);
+ java.util.List<javax.wsdl.Definition> defns=gen.generateDefinitions(c);
- if (defn == null) {
- fail("Definition is null");
+ if (defns.size() != 1) {
+ fail("Only one Definition found: "+defns.size());
}
+
+ javax.wsdl.Definition defn=defns.get(0);
if (defn.getPortTypes().size() != c.getInterfaces().size()) {
fail("Number of port types ("+defn.getPortTypes().size()+
@@ -167,8 +203,16 @@
WSDLGenerator gen=new WSDLGenerator();
- javax.wsdl.Operation result=gen.generateOperation(defn, src);
+ java.util.List<javax.wsdl.Definition> defns=new
java.util.Vector<javax.wsdl.Definition>();
+ defns.add(defn);
+ defn.setTargetNamespace(TEST_NAME_SPACE);
+
+ javax.wsdl.PortType ptype=defn.createPortType();
+ ptype.setQName(new javax.xml.namespace.QName(TEST_NAME_SPACE, TEST_NAME));
+
+ javax.wsdl.Operation result=gen.createOperation(defns, new Contract(), ptype, src);
+
if (result == null) {
fail("Operation is null");
}
@@ -238,8 +282,16 @@
WSDLGenerator gen=new WSDLGenerator();
- javax.wsdl.Operation result=gen.generateOperation(defn, src);
+ java.util.List<javax.wsdl.Definition> defns=new
java.util.Vector<javax.wsdl.Definition>();
+ defns.add(defn);
+ defn.setTargetNamespace(TEST_NAME_SPACE);
+
+ javax.wsdl.PortType ptype=defn.createPortType();
+ ptype.setQName(new javax.xml.namespace.QName(TEST_NAME_SPACE, TEST_NAME));
+
+ javax.wsdl.Operation result=gen.createOperation(defns, new Contract(), ptype, src);
+
if (result == null) {
fail("Operation is null");
}
@@ -283,8 +335,10 @@
WSDLGenerator gen=new WSDLGenerator();
- javax.wsdl.Message result=gen.getMessage(defn, refs);
+ java.util.List<javax.wsdl.Definition> defns=new
java.util.Vector<javax.wsdl.Definition>();
+ javax.wsdl.Message result=gen.getMessage(defns, new Contract(), refs);
+
if (result == null) {
fail("Message is null");
}
@@ -309,4 +363,105 @@
fail("QName namespace not correct: "+result.getQName().getNamespaceURI());
}
}
+
+ public void testDefnWithPortTypesAndMesgsInDiffNamespaces() {
+
+ Contract c=new Contract();
+ c.setNamespace(TEST_NAME_SPACE);
+
+ Interface i1=new Interface();
+ i1.setName("I1");
+ i1.setNamespace(TEST_NAME_SPACE);
+
+ // Need to associate a message, to ensure port type
+ // is generated
+ OneWayRequestMEP m1=new OneWayRequestMEP();
+
+ m1.setOperation(TEST_NAME);
+
+ TypeReference ref1=new TypeReference();
+ ref1.setLocalpart(TEST_TYPE_LP);
+ ref1.setNamespace(TEST_NAME_SPACE);
+ m1.getTypes().add(ref1);
+
+ i1.getMessageExchangePatterns().add(m1);
+
+ Interface i2=new Interface();
+ i2.setName("I2");
+ i2.setNamespace(TEST_NAME_SPACE2);
+
+ OneWayRequestMEP m2=new OneWayRequestMEP();
+
+ m2.setOperation(TEST_NAME);
+
+ TypeReference ref2=new TypeReference();
+ ref2.setLocalpart(TEST_TYPE_LP);
+ ref2.setNamespace(TEST_NAME_SPACE2);
+ m2.getTypes().add(ref2);
+
+ i2.getMessageExchangePatterns().add(m2);
+
+ Interface i3=new Interface();
+ i3.setName("I3");
+ i3.setNamespace(TEST_NAME_SPACE2);
+
+ OneWayRequestMEP m3=new OneWayRequestMEP();
+
+ m3.setOperation(TEST_NAME);
+
+ TypeReference ref3=new TypeReference();
+ ref3.setLocalpart(TEST_TYPE_LP);
+ ref3.setNamespace(TEST_NAME_SPACE3);
+ m3.getTypes().add(ref3);
+
+ i3.getMessageExchangePatterns().add(m3);
+
+ c.getInterfaces().add(i1);
+ c.getInterfaces().add(i2);
+ c.getInterfaces().add(i3);
+
+ WSDLGenerator gen=new WSDLGenerator();
+
+ java.util.List<javax.wsdl.Definition> defns=gen.generateDefinitions(c);
+
+ if (defns.size() != 3) {
+ fail("Four Definitions expected, but got: "+defns.size());
+ }
+
+ javax.wsdl.Definition defn1=defns.get(0);
+
+ if (defn1.getPortTypes().size() != 1) {
+ fail("1: Number of port types ("+defn1.getPortTypes().size()+
+ ") does not match number expected (1)");
+ }
+
+ if (defn1.getMessages().size() != 1) {
+ fail("1: Number of message ("+defn1.getMessages().size()+
+ ") does not match number expected (1)");
+ }
+
+ javax.wsdl.Definition defn2=defns.get(1);
+
+ if (defn2.getPortTypes().size() != 2) {
+ fail("2: Number of port types ("+defn2.getPortTypes().size()+
+ ") does not match number expected (2)");
+ }
+
+ if (defn2.getMessages().size() != 1) {
+ fail("2: Number of message ("+defn2.getMessages().size()+
+ ") does not match number expected (1)");
+ }
+
+ javax.wsdl.Definition defn3=defns.get(2);
+
+ if (defn3.getPortTypes().size() != 0) {
+ fail("3: Number of port types ("+defn3.getPortTypes().size()+
+ ") does not match number expected (0)");
+ }
+
+ if (defn3.getMessages().size() != 1) {
+ fail("3: Number of message ("+defn3.getMessages().size()+
+ ") does not match number expected (1)");
+ }
+ }
}