init code
[vfc/nfvo/wfengine.git] / wso2 / wso2bpel-ext / wso2bpel-core / BPEL4RESTLight / src / main / java / de / unistuttgart / iaas / bpel / util / BPELVariableInjectionUtil.java
diff --git a/wso2/wso2bpel-ext/wso2bpel-core/BPEL4RESTLight/src/main/java/de/unistuttgart/iaas/bpel/util/BPELVariableInjectionUtil.java b/wso2/wso2bpel-ext/wso2bpel-core/BPEL4RESTLight/src/main/java/de/unistuttgart/iaas/bpel/util/BPELVariableInjectionUtil.java
new file mode 100644 (file)
index 0000000..2298bf1
--- /dev/null
@@ -0,0 +1,149 @@
+/**
+ * Copyright 2011
+ * 
+ * @author Uwe Breitenbuecher
+ * 
+ *         This class provides some methods for BPEL-Variable-Injection
+ */
+ package de.unistuttgart.iaas.bpel.util;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+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.ode.bpel.common.FaultException;
+import org.apache.ode.bpel.runtime.extension.ExtensionContext;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+
+public class BPELVariableInjectionUtil {
+       
+       /**
+        * This method serializes a Node into a String
+        * 
+        * @param node
+        * @return String representation of the node
+        */
+       public static String nodeToString(Node node) {
+               try {
+                       
+                       if (node != null && node.getLocalName().equals("temporary-simple-type-wrapper")) {
+                               // this is a temporary hack for string variables and the likes,
+                               // as you may see ODE wrappes simpletypes in wrapper-elements,
+                               // but this isn't great here
+                               return node.getTextContent();
+                       }
+                       
+                       // Create transformer
+                       TransformerFactory transformerFactory = TransformerFactory.newInstance();
+                       Transformer transformer = transformerFactory.newTransformer();
+                       
+                       // Transform Node into a String representation by regarding some
+                       // formatting rules
+                       StringWriter stringWriter = new StringWriter();
+                       transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+                       transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+                       transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
+                       transformer.transform(new DOMSource(node), new StreamResult(stringWriter));
+                       
+                       // Return build string
+                       return stringWriter.toString();
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+               
+               // If any error occurs, return empty string
+               return "";
+       }
+       
+       /**
+        * This method executes the BPEL-Variable-Injection. It replaces referenced
+        * BPEL-Variables with corresponding content
+        * 
+        * @param context ExtensionContext of process
+        * @param element DOM-Representation of the BPEL-Code in which the
+        *            Variable-Injection has to be done
+        * @return modified BPEL-Code as DOM-Representation
+        */
+       public static Element replaceExtensionVariables(ExtensionContext context, Element element) {
+               
+               try {
+                       String BPELCodeAsString;
+                       
+                       // Transform BPEL-Code (DOM-Representation) into a String
+                       BPELCodeAsString = nodeToString(element);
+                       
+                       // Find and replace referenced BPEL-Variables
+                       int startIndex = BPELCodeAsString.indexOf("$bpelvar[");
+                       if (startIndex != -1) {
+                               while (startIndex != -1) {
+                                       int endIndex = startIndex;
+                                       while (BPELCodeAsString.charAt(endIndex) != ']') {
+                                               endIndex++;
+                                       }
+                                       
+                                       // Extract name of referenced variable
+                                       String variableName = BPELCodeAsString.substring(startIndex + 9, endIndex);
+                                       
+                                       // Extract content of referenced variable
+                                       Node variableContent = context.readVariable(variableName);
+                                       
+                                       System.out.println("Replacing variable " + variableName + "(" + variableContent.getNamespaceURI() + " " + variableContent.getLocalName() + ") with content: \n");
+                                       System.out.println("NodeValue(): " + variableContent.getNodeValue() + "\n");
+                                       System.out.println("TextContent(): " + variableContent.getTextContent());
+                                       System.out.println("The full bpel script (before change) as string: \n" + BPELCodeAsString + "\n");
+                                       
+                                       // Replace variable-reference with corresponding content
+                                       BPELCodeAsString = BPELCodeAsString.replace("$bpelvar[" + variableName + "]", nodeToString(variableContent));
+                                       
+                                       System.out.println("The full bpel script as string: \n" + BPELCodeAsString + "\n");
+                                       startIndex = BPELCodeAsString.indexOf("$bpelvar[");
+                               }
+                               
+                               // Transform modified code (String) into DOM-Representation
+                               DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+                               factory.setNamespaceAware(true);
+                               DocumentBuilder builder = factory.newDocumentBuilder();
+                               
+                               InputSource inputSource = new InputSource();
+                               inputSource.setCharacterStream(new StringReader(BPELCodeAsString));
+                               Document newDocument = builder.parse(inputSource);
+                               
+                               // Return first child (because Document root is not needed)
+                               return (Element) newDocument.getFirstChild();
+                               
+                       } else {
+                               
+                               // If no referenced variables are found, return original code
+                               return element;
+                       }
+               } catch (ParserConfigurationException e) {
+                       e.printStackTrace();
+               } catch (SAXException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               } catch (IOException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               } catch (FaultException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+               
+               return null;
+       }
+       
+}