[savara-commits] savara SVN: r71 - in tools/eclipse/trunk/plugins/org.jboss.savara.tools.bpel/src/java/org/jboss/savara/tools/bpel: model/change and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Sat Oct 31 15:03:07 EDT 2009


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);
 			



More information about the savara-commits mailing list