init code
[vfc/nfvo/wfengine.git] / wso2 / wso2bpel-ext / wso2bpel-core / BPEL4RESTLight / src / main / java / de / unistuttgart / iaas / bpel / extensions / bpel4restlight / Bpel4RestLightOperation.java
1 package de.unistuttgart.iaas.bpel.extensions.bpel4restlight;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.InputStream;
6 import java.util.Properties;
7
8 import org.apache.commons.logging.Log;
9 import org.apache.commons.logging.LogFactory;
10 import org.apache.ode.bpel.common.FaultException;
11 import org.apache.ode.bpel.runtime.extension.AbstractSyncExtensionOperation;
12 import org.apache.ode.bpel.runtime.extension.ExtensionContext;
13 import org.opentosca.bpel4restlight.rest.HighLevelRestApi;
14 import org.opentosca.bpel4restlight.rest.HttpMethod;
15 import org.opentosca.bpel4restlight.rest.HttpResponseMessage;
16 /**
17  * 
18  * Copyright 2011 IAAS University of Stuttgart <br>
19  * <br>
20  * 
21  * This class provides 4 BPEL4RestLight ExtensionActivity-operations which
22  * correspond to the 4 typical REST-Operations GET, PUT, POST and Delete.
23  * 
24  * @author uwe.breitenbuecher@iaas.uni-stuttgart.de
25  * 
26  */
27 import org.w3c.dom.Element;
28
29 import de.unistuttgart.iaas.bpel.extensions.bpel4restlight.util.Bpel4RestLightUtil;
30 import de.unistuttgart.iaas.bpel.util.BPELVariableInjectionUtil;
31 import de.unistuttgart.iaas.bpel.util.BpelUtil;
32
33
34 public class Bpel4RestLightOperation extends AbstractSyncExtensionOperation {
35   protected static final Log log = LogFactory.getLog(Bpel4RestLightOperation.class);
36   private static final String EXT_PROPERTIES = "wso2bps-ext.properties"; // extra properties setting
37   private static final String MSB_URL = "MSB_URL";  // http://msb:port, ext property msb url, if exist replace the request url 
38   
39   
40         public static String wrapper = "temporary-simple-type-wrapper";
41         private static String msbUrl = null;
42         
43         static {
44       
45       try {
46           File file = new File(EXT_PROPERTIES);
47           if(file.exists()) {
48               Properties p=new Properties();
49               InputStream inputStream = new FileInputStream(file);
50               p.load(inputStream);
51               inputStream.close();
52               msbUrl = p.getProperty(MSB_URL);
53           }
54           
55       } catch (Exception e) {
56           e.printStackTrace();
57       }
58       
59   }
60         
61         
62         private void processResponseMessage(HttpResponseMessage responseMessage, ExtensionContext context, Element element) throws FaultException {
63                 // Write responsePayload to designated variable
64                 String responsePayloadVariableName = Bpel4RestLightUtil.getMethodAttributeValue(element, MethodAttribute.RESPONSEPAYLOADVARIABLE);
65                 String statusCodeVariableName = Bpel4RestLightUtil.getMethodAttributeValue(element, MethodAttribute.STATUSCODEVARIABLE);
66                 
67                 if (responsePayloadVariableName != null && !responsePayloadVariableName.equals("")) {
68                         BpelUtil.writeResponsePayloadToVariable(context, responseMessage.getResponseBody(), responsePayloadVariableName, Bpel4RestLightOperation.wrapper);
69                 }
70                 
71                 if (statusCodeVariableName != null && !statusCodeVariableName.equals("")) {
72                         String StatusCode = "" + responseMessage.getStatusCode();  // int can not be casted to String
73                         
74                         BpelUtil.writeResponsePayloadToVariable(context, StatusCode, statusCodeVariableName, Bpel4RestLightOperation.wrapper);
75                         
76                 }
77         }
78         
79         /** {@inheritDoc} */
80         @Override
81         protected void runSync(ExtensionContext context, Element element) throws FaultException {
82                 element = BPELVariableInjectionUtil.replaceExtensionVariables(context, element);
83                 log.debug("LocalName of edited element: " + element.getLocalName());
84                 String httpMethod = element.getLocalName();
85                 
86                 // Extract requestUri
87                 String requestUri = getRequestUrl(element);
88                 
89                 HttpResponseMessage responseMessage = null;
90                 String acceptHeader = Bpel4RestLightUtil.extractAcceptHeader(context, element);
91                 String contentTypeHeader = Bpel4RestLightUtil.extractContentTypeHeader(context, element);
92                 String requestPayload = Bpel4RestLightUtil.extractRequestPayload(context, element);
93                 
94                 // Execute corresponding HttpMethod via the HighLevelRestApi
95                 switch (HttpMethod.valueOf(httpMethod)) {
96                 
97                         case PUT: {
98                                 responseMessage = HighLevelRestApi.Put(requestUri, requestPayload, acceptHeader, contentTypeHeader);
99                                 break;
100                         }
101
102                         case POST: {
103                                 responseMessage = HighLevelRestApi.Post(requestUri, requestPayload, acceptHeader, contentTypeHeader);
104                                 break;
105                         }
106                         
107                         case GET: {
108                                 responseMessage = HighLevelRestApi.Get(requestUri, acceptHeader, contentTypeHeader);
109                                 break;
110                         }
111                         
112                         case DELETE: {
113                                 responseMessage = HighLevelRestApi.Delete(requestUri, acceptHeader, contentTypeHeader);
114                                 break;
115                         }
116                 }
117                 
118                 processResponseMessage(responseMessage, context, element);
119                 // Bpel4RestLightOperation.wrapper = null;
120         }
121         
122         
123         /**
124          * getRequestUrl
125          * get request url from element, if exists msbUrl property, then replace the ip and port
126          * @param element
127          * @return
128          */
129         private String getRequestUrl(Element element) {
130           String requestUri = Bpel4RestLightUtil.getMethodAttributeValue(element, MethodAttribute.REQUESTURI);
131           log.debug("original url:" + requestUri);
132       if(msbUrl == null || "".equals(msbUrl) || "http://msb:port".equals(msbUrl)) {
133           return requestUri;
134       } else {
135           requestUri = requestUri.substring(requestUri.indexOf("//") + 2);
136           int index = requestUri.indexOf("/");
137           if(index == -1) {
138               
139           } else {
140               requestUri = requestUri.substring(index);
141           }
142           requestUri = msbUrl + requestUri;
143           log.debug("changed url:" + requestUri);
144           return requestUri;
145       }
146   }
147 }