package de.unistuttgart.iaas.bpel.extensions.bpel4restlight; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.bpel.common.FaultException; import org.apache.ode.bpel.runtime.extension.AbstractSyncExtensionOperation; import org.apache.ode.bpel.runtime.extension.ExtensionContext; import org.opentosca.bpel4restlight.rest.HighLevelRestApi; import org.opentosca.bpel4restlight.rest.HttpMethod; import org.opentosca.bpel4restlight.rest.HttpResponseMessage; /** * * Copyright 2011 IAAS University of Stuttgart
*
* * This class provides 4 BPEL4RestLight ExtensionActivity-operations which * correspond to the 4 typical REST-Operations GET, PUT, POST and Delete. * * @author uwe.breitenbuecher@iaas.uni-stuttgart.de * */ import org.w3c.dom.Element; import de.unistuttgart.iaas.bpel.extensions.bpel4restlight.util.Bpel4RestLightUtil; import de.unistuttgart.iaas.bpel.util.BPELVariableInjectionUtil; import de.unistuttgart.iaas.bpel.util.BpelUtil; public class Bpel4RestLightOperation extends AbstractSyncExtensionOperation { protected static final Log log = LogFactory.getLog(Bpel4RestLightOperation.class); private static final String EXT_PROPERTIES = "wso2bps-ext.properties"; // extra properties setting private static final String MSB_URL = "MSB_URL"; // http://msb:port, ext property msb url, if exist replace the request url public static String wrapper = "temporary-simple-type-wrapper"; private static String msbUrl = null; static { try { File file = new File(EXT_PROPERTIES); if(file.exists()) { Properties p=new Properties(); InputStream inputStream = new FileInputStream(file); p.load(inputStream); inputStream.close(); msbUrl = p.getProperty(MSB_URL); } } catch (Exception e) { e.printStackTrace(); } } private void processResponseMessage(HttpResponseMessage responseMessage, ExtensionContext context, Element element) throws FaultException { // Write responsePayload to designated variable String responsePayloadVariableName = Bpel4RestLightUtil.getMethodAttributeValue(element, MethodAttribute.RESPONSEPAYLOADVARIABLE); String statusCodeVariableName = Bpel4RestLightUtil.getMethodAttributeValue(element, MethodAttribute.STATUSCODEVARIABLE); if (responsePayloadVariableName != null && !responsePayloadVariableName.equals("")) { BpelUtil.writeResponsePayloadToVariable(context, responseMessage.getResponseBody(), responsePayloadVariableName, Bpel4RestLightOperation.wrapper); } if (statusCodeVariableName != null && !statusCodeVariableName.equals("")) { String StatusCode = "" + responseMessage.getStatusCode(); // int can not be casted to String BpelUtil.writeResponsePayloadToVariable(context, StatusCode, statusCodeVariableName, Bpel4RestLightOperation.wrapper); } } /** {@inheritDoc} */ @Override protected void runSync(ExtensionContext context, Element element) throws FaultException { element = BPELVariableInjectionUtil.replaceExtensionVariables(context, element); log.debug("LocalName of edited element: " + element.getLocalName()); String httpMethod = element.getLocalName(); // Extract requestUri String requestUri = getRequestUrl(element); HttpResponseMessage responseMessage = null; String acceptHeader = Bpel4RestLightUtil.extractAcceptHeader(context, element); String contentTypeHeader = Bpel4RestLightUtil.extractContentTypeHeader(context, element); String requestPayload = Bpel4RestLightUtil.extractRequestPayload(context, element); // Execute corresponding HttpMethod via the HighLevelRestApi switch (HttpMethod.valueOf(httpMethod)) { case PUT: { responseMessage = HighLevelRestApi.Put(requestUri, requestPayload, acceptHeader, contentTypeHeader); break; } case POST: { responseMessage = HighLevelRestApi.Post(requestUri, requestPayload, acceptHeader, contentTypeHeader); break; } case GET: { responseMessage = HighLevelRestApi.Get(requestUri, acceptHeader, contentTypeHeader); break; } case DELETE: { responseMessage = HighLevelRestApi.Delete(requestUri, acceptHeader, contentTypeHeader); break; } } processResponseMessage(responseMessage, context, element); // Bpel4RestLightOperation.wrapper = null; } /** * getRequestUrl * get request url from element, if exists msbUrl property, then replace the ip and port * @param element * @return */ private String getRequestUrl(Element element) { String requestUri = Bpel4RestLightUtil.getMethodAttributeValue(element, MethodAttribute.REQUESTURI); log.debug("original url:" + requestUri); if(msbUrl == null || "".equals(msbUrl) || "http://msb:port".equals(msbUrl)) { return requestUri; } else { requestUri = requestUri.substring(requestUri.indexOf("//") + 2); int index = requestUri.indexOf("/"); if(index == -1) { } else { requestUri = requestUri.substring(index); } requestUri = msbUrl + requestUri; log.debug("changed url:" + requestUri); return requestUri; } } }