Author: objectiser
Date: 2009-10-31 15:03:06 -0400 (Sat, 31 Oct 2009)
New Revision: 71
Modified:
tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/generator/Generator.java
tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/model/change/ConversationModelChangeRule.java
Log:
Generate initial partner link types to separate wsdl. Needs more work/testing.
Modified:
tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/generator/Generator.java
===================================================================
---
tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/generator/Generator.java 2009-10-31
15:49:57 UTC (rev 70)
+++
tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/generator/Generator.java 2009-10-31
19:03:06 UTC (rev 71)
@@ -17,15 +17,22 @@
*/
package org.jboss.savara.tools.bpel.generator;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
import org.apache.commons.logging.*;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.jboss.savara.tools.bpel.generator.BuildSystem;
import org.jboss.savara.tools.bpel.model.*;
+import org.jboss.savara.tools.bpel.model.component.PartnerLink;
import org.jboss.savara.tools.bpel.util.XMLUtils;
import org.jboss.savara.tools.wsdl.soap.SOAPRPCWSDLBinding;
import org.scribble.contract.model.Contract;
+import org.scribble.contract.model.Interface;
import org.scribble.conversation.model.*;
import org.scribble.extensions.RegistryFactory;
import org.scribble.model.*;
@@ -160,8 +167,7 @@
lcm);
generateRoleProject(projectName, role,
- target.getBPELProcess().getDOMElement(),
- lcm, target);
+ target.getBPELProcess(), lcm, target);
} else {
logger.error("Unable to find model generator");
}
@@ -170,12 +176,12 @@
}
protected void generateRoleProject(String projectName, Role role,
- org.w3c.dom.Element bpel, ConversationModel localcm,
+ org.jboss.savara.tools.bpel.model.component.Process bpelProcess, ConversationModel
localcm,
BPELLanguageModel model) throws Exception {
final IProject proj=createProject(projectName);
- if (proj != null && bpel != null) {
+ if (proj != null && bpelProcess != null) {
// Store BPEL configuration
IPath bpelPath=proj.getFullPath().append(
@@ -188,7 +194,7 @@
bpelFile.create(null, true,
new org.eclipse.core.runtime.NullProgressMonitor());
- String bpelText=XMLUtils.toText(bpel);
+ String bpelText=XMLUtils.toText(bpelProcess.getDOMElement());
if (bpelText != null) {
bpelFile.setContents(new java.io.ByteArrayInputStream(
@@ -204,6 +210,9 @@
for (int i=0; i < roles.size(); i++) {
generateWSDL(roles.get(i), proj, localcm);
}
+
+ // Generate WSDL with partner link types
+ generatePartnerLinkTypes(role, proj, localcm, bpelProcess);
}
}
@@ -262,7 +271,180 @@
}
}
+ protected void generatePartnerLinkTypes(Role role, IProject proj, ConversationModel
localcm,
+ org.jboss.savara.tools.bpel.model.component.Process bpelProcess) throws Exception {
+
+ org.w3c.dom.Document
doc=javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();;
+
+ org.w3c.dom.Element
defn=doc.createElementNS("http://schemas.xmlsoap.org/wsdl/",
"definition");
+ doc.appendChild(defn);
+
+ defn.setAttribute("xmlns:plnk",
"http://docs.oasis-open.org/wsbpel/2.0/plnktype");
+
+ for (PartnerLink pl : bpelProcess.getPartnerLinks()) {
+ org.w3c.dom.Element plt=doc.createElement("plnk:partnerLinkType");
+
+ plt.setAttribute("name", pl.getPartnerLinkType());
+
+ if (pl.getPartnerRole() != null && pl.getPartnerRole().trim().length() > 0)
{
+ org.w3c.dom.Element plRole=doc.createElement("plnk:role");
+
+ plt.appendChild(plRole);
+
+ plRole.setAttribute("name", pl.getPartnerRole());
+
+ Role useRole=null;
+
+ for (int i=0; useRole == null &&
+ i < localcm.getConversation().getRoles().size(); i++) {
+ if
(pl.getPartnerRole().startsWith(localcm.getConversation().getRoles().get(i).getName())) {
+ useRole = localcm.getConversation().getRoles().get(i);
+ }
+ }
+
+ if (useRole != null &&
+ useRole.getAnnotations().containsKey(Contract.class.getName())) {
+ Contract contract=(Contract)useRole.getAnnotations().get(Contract.class.getName());
+
+ if (contract.getInterfaces().size() > 0) {
+ Interface intf=contract.getInterfaces().get(0);
+
+ plRole.setAttribute("portType", intf.getName());
+ }
+ }
+ }
+
+ if (pl.getMyRole() != null && pl.getMyRole().trim().length() > 0) {
+ org.w3c.dom.Element plRole=doc.createElement("plnk:role");
+
+ plt.appendChild(plRole);
+
+ plRole.setAttribute("name", pl.getMyRole());
+
+ if (role.getAnnotations().containsKey(Contract.class.getName())) {
+ Contract contract=(Contract)role.getAnnotations().get(Contract.class.getName());
+
+ if (contract.getInterfaces().size() > 0) {
+ Interface intf=contract.getInterfaces().get(0);
+
+ plRole.setAttribute("portType", intf.getName());
+ }
+ }
+ }
+
+ defn.appendChild(plt);
+ }
+
+ IPath wsdlPath=proj.getFullPath().append(
+ new Path(getBuildSystem().getBPELFilePath())).
+ append(role.getName()+"PartnerLinkTypes.wsdl");
+
+ IFile wsdlFile=proj.getProject().getWorkspace().getRoot().getFile(wsdlPath);
+ GeneratorUtil.createParentFolder(wsdlFile);
+ wsdlFile.create(null, true,
+ new org.eclipse.core.runtime.NullProgressMonitor());
+
+ java.io.ByteArrayOutputStream xmlstr=
+ new java.io.ByteArrayOutputStream();
+
+ DOMSource source=new DOMSource();
+ source.setNode(doc);
+
+ StreamResult result=new StreamResult(xmlstr);
+
+ Transformer trans=
+ TransformerFactory.newInstance().newTransformer();
+ trans.transform(source, result);
+
+ xmlstr.close();
+
+ String xml=reformat(new String(xmlstr.toByteArray()));
+
+ wsdlFile.setContents(new java.io.ByteArrayInputStream(xml.getBytes()), true, false,
+ new org.eclipse.core.runtime.NullProgressMonitor());
+ }
+
/**
+ * This method reformats the XML text for presentation.
+ *
+ * @param xmltext The original XML text
+ * @return The reformatted text
+ */
+ private static String reformat(String xmltext) {
+ String ret=xmltext;
+ int pos=0;
+ int prevpos=0;
+ StringBuffer buf=new StringBuffer();
+ int level=0;
+
+ while ((pos=ret.indexOf('<', prevpos)) != -1) {
+
+ if (prevpos < pos &&
+ ret.substring(prevpos, pos).trim().length() > 0 &&
+ ret.charAt(prevpos-1) != '?') {
+
+ if (ret.charAt(prevpos) == '\r' &&
+ ret.charAt(prevpos+1) == '\n') {
+ prevpos += 2;
+ }
+ for (int i=0; i < level; i++) {
+ buf.append(" ");
+ }
+
+ buf.append(ret.substring(prevpos, pos).trim());
+ buf.append("\r\n");
+ }
+
+ int endpos=ret.indexOf('>', pos);
+
+ if (endpos > 0) {
+ boolean noreturn=false;
+
+ if (pos > 0 && ret.charAt(pos+1) == '/') {
+ level--;
+ }
+
+ for (int i=0; i < level; i++) {
+ buf.append(" ");
+ }
+ buf.append(ret.substring(pos, endpos+1));
+
+ if (ret.charAt(endpos-1)== '?') {
+ //noreturn = true;
+
+ } else if (ret.charAt(endpos-1) == '/') {
+ // Ignore
+ } else if (pos > 0 && ret.charAt(pos+1) == '/') {
+ // Ignore
+
+ } else if (pos > 0 && ret.charAt(pos+1) == '!') {
+ // Ignore
+
+ } else {
+ level++;
+ }
+
+ if (noreturn == false) {
+ buf.append("\r\n");
+ }
+
+ pos = endpos+1;
+ }
+
+ prevpos = pos;
+ }
+
+ if (prevpos != -1 &&
+ ret.substring(prevpos).trim().length() > 0) {
+ buf.append(ret.substring(prevpos));
+ }
+
+ ret = buf.toString();
+
+ return(ret);
+ }
+
+ /**
* This method returns the WSDL file name for the supplied role and local
* conversation model.
*
Modified:
tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/model/change/ConversationModelChangeRule.java
===================================================================
---
tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/model/change/ConversationModelChangeRule.java 2009-10-31
15:49:57 UTC (rev 70)
+++
tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel/model/change/ConversationModelChangeRule.java 2009-10-31
19:03:06 UTC (rev 71)
@@ -91,6 +91,7 @@
Model model, ModelObject mobj, ModelObject ref) {
DefaultBPELLanguageModel bpelModel=(DefaultBPELLanguageModel)model;
Conversation conv=(Conversation)mobj;
+ String roleNamespace=null;
Sequence seq=new Sequence(bpelModel);
@@ -106,6 +107,8 @@
Contract contract=(Contract)conv.getLocatedName().
getRole().getAnnotations().get(Contract.class.getName());
+ roleNamespace = contract.getNamespace();
+
// Set namespace
bpelModel.getBPELProcess().setTargetNamespace(contract.getNamespace());
@@ -151,6 +154,14 @@
addImport(context, bpelModel, conv, roles.get(i));
}
+ // Add import for partner link types
+ Import imp=new Import(bpelModel);
+ imp.setLocation(context.getRole().getName()+"PartnerLinkTypes.wsdl");
+ imp.setNamespace(roleNamespace);
+
imp.setImportType("http://schemas.xmlsoap.org/wsdl/");
+
+ bpelModel.getBPELProcess().addImport(imp, -1);
+
// Add sequence to model
bpelModel.getBPELProcess().setActivity(seq);