From 84f4d06360055e619fc1af86a7a2196ef5ec93ce Mon Sep 17 00:00:00 2001 From: Zhaoxing Date: Wed, 9 Aug 2017 13:07:00 +0800 Subject: [PATCH] activiti-extention added Change-Id: I21cae6691190a32ef5ef9883cb1418f769f1b043 Signed-off-by: Zhaoxing --- activiti-extension/.gitignore | 37 +++ activiti-extension/pom.xml | 287 +++++++++++++++++++++ .../onap/workflow/activitiext/ActivitiExtApp.java | 41 +++ .../workflow/activitiext/ActivitiExtAppConfig.java | 43 +++ .../workflow/activitiext/ActivitiExtAppInit.java | 39 +++ .../onap/workflow/activitiext/common/Config.java | 39 +++ .../activitiext/common/MsbClientConfig.java | 26 ++ .../activitiext/restservicetask/ConstString.java | 70 +++++ .../restservicetask/DeployBpmnFileResponse.java | 31 +++ .../restservicetask/HighLevelRestApi.java | 210 +++++++++++++++ .../restservicetask/HttpResponseMessage.java | 56 ++++ .../activitiext/restservicetask/HttpUtil.java | 176 +++++++++++++ .../restservicetask/LowLevelRestApi.java | 79 ++++++ .../activitiext/restservicetask/Parameter.java | 56 ++++ .../activitiext/restservicetask/PropertyUtil.java | 46 ++++ .../restservicetask/StartProcessRequest.java | 33 +++ .../src/main/resources/api-doc/index.html | 99 +++++++ activiti-extension/src/main/resources/banner.txt | 6 + 18 files changed, 1374 insertions(+) create mode 100644 activiti-extension/.gitignore create mode 100644 activiti-extension/pom.xml create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtApp.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtAppConfig.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtAppInit.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/common/Config.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/common/MsbClientConfig.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/ConstString.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/DeployBpmnFileResponse.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HighLevelRestApi.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HttpResponseMessage.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HttpUtil.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/LowLevelRestApi.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/Parameter.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/PropertyUtil.java create mode 100644 activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/StartProcessRequest.java create mode 100644 activiti-extension/src/main/resources/api-doc/index.html create mode 100644 activiti-extension/src/main/resources/banner.txt diff --git a/activiti-extension/.gitignore b/activiti-extension/.gitignore new file mode 100644 index 0000000..7e2df70 --- /dev/null +++ b/activiti-extension/.gitignore @@ -0,0 +1,37 @@ +### JAVA +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### MAVEN +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties + +# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) +!/.mvn/wrapper/maven-wrapper.jar \ No newline at end of file diff --git a/activiti-extension/pom.xml b/activiti-extension/pom.xml new file mode 100644 index 0000000..d1a518a --- /dev/null +++ b/activiti-extension/pom.xml @@ -0,0 +1,287 @@ + + + + + org.onap.oparent + oparent + 1.0.0-SNAPSHOT + + + 4.0.0 + activiti-extension + workflow/activiti-extension + jar + + + 1.9.6 + 1.6.2 + 0.9.1 + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.8 + + copy-dependencies + + + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.6 + + + + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4 + + false + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + package + + shade + + + + + + org.onap.workflow.activitiext.activitiExtApp + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.10 + + + copy-dependencies + package + + copy-dependencies + + + + + io.dropwizard + dropwizard-core + 0.8.0 + true + + + + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + + org.apache.maven.plugins + + + maven-checkstyle-plugin + + + [2.17,) + + + check + + + + + + + + + + + + + + + + io.dropwizard + dropwizard-core + 0.8.0 + + + io.dropwizard + dropwizard-assets + 0.8.0 + + + io.dropwizard + dropwizard-hibernate + 0.8.0 + + + io.dropwizard + dropwizard-migrations + 0.8.0 + + + io.swagger + swagger-jersey2-jaxrs + 1.5.3 + + + org.projectlombok + lombok + 1.16.4 + + + org.glassfish.jersey.core + jersey-server + 2.16 + + + org.glassfish.jersey.media + jersey-media-multipart + 2.16 + + + org.glassfish.jersey.containers + jersey-container-servlet-core + 2.16 + + + com.eclipsesource.jaxrs + consumer + 5.0 + + + com.eclipsesource.jaxrs + jersey-all + + + + + com.jcraft + jsch + 0.1.53 + + + io.dropwizard + dropwizard-jdbi + 0.8.0 + + + commons-io + commons-io + 2.4 + + + junit + junit + 4.12 + + + org.powermock + powermock-module-junit4 + 1.6.1 + + + org.powermock + powermock-api-mockito + 1.6.1 + + + org.mockito + mockito-all + 1.9.5 + + + org.apache.ant + ant + ${ant.version} + + + com.alibaba + fastjson + 1.2.23 + + + org.activiti + activiti-engine + 5.21.0 + provided + + + commons-httpclient + commons-httpclient + 3.1 + + + diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtApp.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtApp.java new file mode 100644 index 0000000..dd56610 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtApp.java @@ -0,0 +1,41 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.workflow.activitiext; + +import org.glassfish.jersey.media.multipart.MultiPartFeature; + +import io.dropwizard.Application; +import io.dropwizard.setup.Environment; + +public class ActivitiExtApp extends Application { + + public static void main(String[] args) throws Exception { + new ActivitiExtApp().run(args); + } + + @Override + public String getName() { + return " Activiti Ext APP "; + } + + @Override + public void run(ActivitiExtAppConfig configuration, Environment environment) throws Exception { + + environment.jersey().register(MultiPartFeature.class); + } +} + diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtAppConfig.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtAppConfig.java new file mode 100644 index 0000000..ffe3c9e --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtAppConfig.java @@ -0,0 +1,43 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.workflow.activitiext; + +import io.dropwizard.Configuration; + +import javax.validation.Valid; + +import org.hibernate.validator.constraints.NotEmpty; +import org.onap.workflow.activitiext.common.MsbClientConfig; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ActivitiExtAppConfig extends Configuration { + + @NotEmpty + private String defaultName = "WORKFLOW-ACTIVITI-EXT"; + @NotEmpty + @JsonProperty + private String apidescription = "ZTE workflow-activiti-ext rest API"; + + @JsonProperty + @Valid + private MsbClientConfig msbClientConfig; + + public MsbClientConfig getMsbClientConfig() { + return msbClientConfig; + } +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtAppInit.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtAppInit.java new file mode 100644 index 0000000..0291e3b --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/ActivitiExtAppInit.java @@ -0,0 +1,39 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.workflow.activitiext; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; + +import org.jvnet.hk2.annotations.Service; +import org.onap.workflow.activitiext.common.Config; + + +@Service +public class ActivitiExtAppInit { + @Inject + private ActivitiExtAppConfig appconfig; + + @PostConstruct + private void run() { + runConfigComponent(); + } + + private void runConfigComponent() { + Config.getInstance().setAppconfig(appconfig); + } +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/common/Config.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/common/Config.java new file mode 100644 index 0000000..62ee72a --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/common/Config.java @@ -0,0 +1,39 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.workflow.activitiext.common; + +import org.onap.workflow.activitiext.ActivitiExtAppConfig; + +public class Config { + + private static Config instance = new Config(); + + private ActivitiExtAppConfig appconfig; + + public static Config getInstance(){ + return instance; + } + + public ActivitiExtAppConfig getAppconfig() { + return appconfig; + } + + public void setAppconfig(ActivitiExtAppConfig config) { + this.appconfig = config; + } + +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/common/MsbClientConfig.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/common/MsbClientConfig.java new file mode 100644 index 0000000..338a1ff --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/common/MsbClientConfig.java @@ -0,0 +1,26 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.workflow.activitiext.common; + +import lombok.Data; + +@Data +public class MsbClientConfig { + + private String msbSvrIp; + private Integer msbSvrPort; +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/ConstString.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/ConstString.java new file mode 100644 index 0000000..371d8d7 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/ConstString.java @@ -0,0 +1,70 @@ +/** + * Copyright 2016-2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.workflow.activitiext.restservicetask; + +/** + * + * @author 10222158 + * + */ +public class ConstString { + + /** + * http method type : get + */ + public static final String HTTP_GET = "GET"; + + /** + * http method type : post + */ + public static final String HTTP_POST = "POST"; + + /** + * http method type : delete + */ + public static final String HTTP_DELETE = "DELETE"; + + /** + * http method type : put + */ + public static final String HTTP_PUT = "PUT"; + + /** + * parameter position : in the uri path + */ + public static final String PARAMETER_POSITION_PATH = "path"; + + /** + * parameter positoin : after the uri + */ + public static final String PARAMETER_POSITION_QUERY = "query"; + + /** + * parameter positoin : in the request body + */ + public static final String PARAMETER_POSITION_BODY = "body"; + + /** + * parameter type : string + */ + public static final String PARAMETER_TYPE_STRING = "string"; + + /** + * parameter type : acitviti expression + */ + public static final String PARAMETER_TYPE_EXPRESSION = "expression"; + +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/DeployBpmnFileResponse.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/DeployBpmnFileResponse.java new file mode 100644 index 0000000..83b8514 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/DeployBpmnFileResponse.java @@ -0,0 +1,31 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.workflow.activitiext.restservicetask; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeployBpmnFileResponse { + private int status; + private String message; + private String deployedId; + private String processId; +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HighLevelRestApi.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HighLevelRestApi.java new file mode 100644 index 0000000..31001b7 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HighLevelRestApi.java @@ -0,0 +1,210 @@ +/** + * Copyright 2016-2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.workflow.activitiext.restservicetask; + +import org.activiti.engine.ActivitiException; +import org.apache.commons.httpclient.HttpMethodBase; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.methods.DeleteMethod; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.PutMethod; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author 10222158 + * + */ +public class HighLevelRestApi { + + private static final Logger logger = LoggerFactory.getLogger(HighLevelRestApi.class); + + /** + * invoke http service + * + * @param methodValue + * @param uri + * @param requestPayload + * @param acceptValue + * @param contentTypeValue + * @return + */ + public static HttpResponseMessage invoke(String methodValue, String uri, String requestPayload, String acceptValue, + String contentTypeValue) throws ActivitiException { + + // complete uri + uri = completeUri(uri); + + logger.info("uri: " + uri); + logger.info("method: " + methodValue); + logger.info("requestbody: " + requestPayload); + logger.info("accept: " + acceptValue); + logger.info("content-type: " + contentTypeValue); + + HttpResponseMessage msg = new HttpResponseMessage(); + switch (methodValue.toUpperCase()) { + case ConstString.HTTP_GET: + msg = HighLevelRestApi.Get(uri, acceptValue, contentTypeValue); + break; + case ConstString.HTTP_POST: + msg = HighLevelRestApi.Post(uri, requestPayload, acceptValue, contentTypeValue); + break; + case ConstString.HTTP_DELETE: + msg = HighLevelRestApi.Delete(uri, acceptValue, contentTypeValue); + break; + case ConstString.HTTP_PUT: + msg = HighLevelRestApi.Put(uri, requestPayload, acceptValue, contentTypeValue); + break; + default: + throw new ActivitiException("can not find the http method type '" + methodValue + "'!"); + } + return msg; + } + + /** + * This method implements the HTTP Put Method + * + * @param uri + * Resource URI + * @param requestPayload + * Content which has to be put into the Resource + * @return ResponseCode of HTTP Interaction + */ + @SuppressWarnings("deprecation") + public static HttpResponseMessage Put(String uri, String requestPayload, String acceptValue, + String contentTypeValue) { + + PutMethod method = new PutMethod(uri); + + HighLevelRestApi.setAcceptHeader(method, acceptValue); + HighLevelRestApi.setContentTypeHeader(method, contentTypeValue); + method.setRequestBody(requestPayload); + + HttpResponseMessage responseMessage = LowLevelRestApi.executeHttpMethod(method); + + return responseMessage; + } + + /** + * This method implements the HTTP Post Method + * + * @param uri + * Resource URI + * @param requestPayload + * Content which has to be posted into the Resource + * @return ResponseCode of HTTP Interaction + */ + @SuppressWarnings("deprecation") + public static HttpResponseMessage Post(String uri, String requestPayload, String acceptValue, + String contentTypeValue) { + + PostMethod method = null; + if (uri.contains("?")) { + String[] split = uri.split("\\?"); + method = new PostMethod(split[0]); + method.setQueryString(HighLevelRestApi.createNameValuePairArrayFromQuery(split[1])); + } else { + method = new PostMethod(uri); + } + method.setRequestBody(requestPayload); + HighLevelRestApi.setAcceptHeader(method, acceptValue); + HighLevelRestApi.setContentTypeHeader(method, contentTypeValue); + HttpResponseMessage responseMessage = LowLevelRestApi.executeHttpMethod(method); + return responseMessage; + } + + /** + * This method implements the HTTP Get Method + * + * @param uri + * Resource URI + * @return Content represented by the Resource URI + */ + public static HttpResponseMessage Get(String uri, String acceptValue, String contentTypeValue) { + GetMethod method = null; + if (uri.contains("?")) { + String[] split = uri.split("\\?"); + method = new GetMethod(split[0]); + method.setQueryString(HighLevelRestApi.createNameValuePairArrayFromQuery(split[1])); + } else { + method = new GetMethod(uri); + } + + HighLevelRestApi.setAcceptHeader(method, acceptValue); + HighLevelRestApi.setContentTypeHeader(method, contentTypeValue); + HttpResponseMessage responseMessage = LowLevelRestApi.executeHttpMethod(method); + return responseMessage; + } + + private static NameValuePair[] createNameValuePairArrayFromQuery(String query) { + String[] pairs = query.trim().split("&"); + NameValuePair[] nameValuePairArray = new NameValuePair[pairs.length]; + int count = 0; + for (String pair : pairs) { + String[] keyValue = pair.split("="); + NameValuePair nameValuePair = new NameValuePair(); + nameValuePair.setName(keyValue[0]); + nameValuePair.setValue(keyValue[1]); + nameValuePairArray[count] = nameValuePair; + count++; + } + return nameValuePairArray; + } + + /** + * This method implements the HTTP Delete Method + * + * @param uri + * Resource URI + * @return ResponseCode of HTTP Interaction + */ + public static HttpResponseMessage Delete(String uri, String acceptValue, String contentTypeValue) { + + DeleteMethod method = new DeleteMethod(uri); + HighLevelRestApi.setAcceptHeader(method, acceptValue); + HighLevelRestApi.setContentTypeHeader(method, contentTypeValue); + HttpResponseMessage responseMessage = LowLevelRestApi.executeHttpMethod(method); + return responseMessage; + } + + private static void setAcceptHeader(HttpMethodBase method, String value) { + if (!StringUtils.isEmpty(value)) { + method.setRequestHeader("Accept", value); + } else { + method.setRequestHeader("Accept", "application/xml"); + } + } + + private static void setContentTypeHeader(HttpMethodBase method, String value) { + if (!StringUtils.isEmpty(value)) { + method.setRequestHeader("content-type", value); + } else { + method.setRequestHeader("content-type", "application/json"); + } + } + + private static String completeUri(String uri) { + + String urlReg = "^http[\\s\\S]*"; + if (uri != null && !uri.matches(urlReg)) { + uri = PropertyUtil.getBasePath() + uri; + } + + return uri; + } +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HttpResponseMessage.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HttpResponseMessage.java new file mode 100644 index 0000000..2128c18 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HttpResponseMessage.java @@ -0,0 +1,56 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.workflow.activitiext.restservicetask; + +import java.io.Serializable; + +/** + */ +public class HttpResponseMessage implements Serializable { + + private int statusCode; + private String responseBody; + + + /** + * @return the statusCode + */ + public int getStatusCode() { + return this.statusCode; + } + + /** + * @param statusCode the statusCode to set + */ + protected void setStatusCode(int statusCode) { + this.statusCode = statusCode; + } + + /** + * @return the responseBody + */ + public String getResponseBody() { + return this.responseBody; + } + + /** + * @param responseBody the responseBody to set + */ + protected void setResponseBody(String responseBody) { + this.responseBody = responseBody; + } + +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HttpUtil.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HttpUtil.java new file mode 100644 index 0000000..75a6b2f --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/HttpUtil.java @@ -0,0 +1,176 @@ +/** + * Copyright 2016-2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.workflow.activitiext.restservicetask; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.BpmnError; +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.Expression; +import org.activiti.engine.delegate.JavaDelegate; +import org.activiti.engine.impl.context.Context; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; + +/** + * rest service + * + * @author 10222158 + * + */ +public class HttpUtil implements JavaDelegate { + + private static final Logger logger = LoggerFactory.getLogger(HttpUtil.class); + + private Expression uri; + private Expression method; + private Expression accept; + private Expression contentType; + private Expression parameters; + + @Override + public void execute(DelegateExecution execution) throws ActivitiException { + + try { + this.executeMethod(execution); + } catch (Exception e) { + + logger.error("Invoke rest service failed!", e); + throw new BpmnError(e.getMessage()); + } + } + + /** + * invoke rest service + * + * @param execution + */ + public boolean executeMethod(DelegateExecution execution) throws Exception { + + String uriValue = getValue(uri, execution); + String methodValue = getValue(method, execution); + String acceptValue = getValue(accept, execution); + String contentTypeValue = getValue(contentType, execution); + String parametersValue = getValue(parameters, execution); + + Map requestBody = new HashMap(); + + if (!StringUtils.isEmpty(parametersValue)) { + + // Parse the parameter into Object List + List parameters = JSONArray.parseArray(parametersValue, Parameter.class); + + for (Parameter param : parameters) { + + handleParam(execution, param, requestBody, uriValue); + } + } + + String requestPayload = JSON.toJSONString(requestBody); + + // invoke http service + HttpResponseMessage msg = HighLevelRestApi.invoke(methodValue, uriValue, requestPayload, acceptValue, + contentTypeValue); + + // inject the result to variable + execution.setVariable(execution.getCurrentActivityId(), msg); + + logger.info("statusCode: " + msg.getStatusCode()); + logger.info("responseBody: " + msg.getResponseBody()); + + return true; + } + + /** + * + * @param execution + * @param param + * @param requestBody + * @param uriValue + */ + public void handleParam(DelegateExecution execution, Parameter param, Map requestBody, + String uriValue) throws ActivitiException { + + if (ConstString.PARAMETER_TYPE_EXPRESSION.equals(param.getType())) { + handleExpression(execution, param); + } + + switch (param.getPosition()) { + case ConstString.PARAMETER_POSITION_PATH: + + // replace the path parameter + uriValue = uriValue.replaceAll("\\{+" + param.getName() + "+\\}", param.getValue()); + break; + case ConstString.PARAMETER_POSITION_QUERY: + + // add the query parameter + if (!uriValue.contains("?")) { + uriValue = uriValue + "?" + param.getName() + "=" + param.getValue(); + } else { + uriValue = uriValue + "&" + param.getName() + "=" + param.getValue(); + } + break; + case ConstString.PARAMETER_POSITION_BODY: + + // add parameter to request body + requestBody.put(param.getName(), param.getValue()); + break; + default: + throw new ActivitiException( + "The position '" + param.getPosition() + "' is illegal, please check your input!"); + } + } + + /** + * get value from VariableScope + * + * @param expression + * @param execution + * @return + */ + public String getValue(Expression expression, DelegateExecution execution) { + + String value = new String(); + if (expression != null) { + value = (String) expression.getValue(execution); + } + + return value; + } + + /** + * parse expression in the parameter + * + * @param execution + * @param param + */ + public void handleExpression(DelegateExecution execution, Parameter param) { + + Expression expression = Context.getProcessEngineConfiguration().getExpressionManager() + .createExpression(param.getValue()); + + String value = String.valueOf(expression.getValue(execution)); + + param.setValue(value); + } +} \ No newline at end of file diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/LowLevelRestApi.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/LowLevelRestApi.java new file mode 100644 index 0000000..9171c31 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/LowLevelRestApi.java @@ -0,0 +1,79 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.workflow.activitiext.restservicetask; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; + +/** + * This static-class eases HTTP-method execution by self-managed fault-handling and automated + * Response-information processing + */ +public class LowLevelRestApi { + + // Local HttpClient used for every communication (Singleton implementation) + private static HttpClient httpClient = new HttpClient(); + + + /** + * Executes a passed HttpMethod (Method type is either PUT, POST, GET or DELETE) and returns a + * HttpResponseMessage + * + * @param method Method to execute + * @return HttpResponseMessage which contains all information about the execution + */ + public static HttpResponseMessage executeHttpMethod(HttpMethod method) { + + HttpResponseMessage responseMessage = null; + + try { + + // Execute Request + LowLevelRestApi.httpClient.executeMethod(method); + responseMessage = LowLevelRestApi.extractResponseInformation(method); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + + // Release Connection anyway + method.releaseConnection(); + } + + // Extract response information and return + return responseMessage; + } + + /** + * Extracts the response information from an executed HttpMethod + * + * @param method Executed Method + * @return Packaged response information + */ + private static HttpResponseMessage extractResponseInformation(HttpMethod method) { + // Create and return HttpResponseMethod + HttpResponseMessage responseMessage = new HttpResponseMessage(); + responseMessage.setStatusCode(method.getStatusCode()); + try { + responseMessage.setResponseBody(method.getResponseBodyAsString()); + } catch (Exception e) { + e.printStackTrace(); + } + return responseMessage; + + } + +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/Parameter.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/Parameter.java new file mode 100644 index 0000000..9397d33 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/Parameter.java @@ -0,0 +1,56 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.workflow.activitiext.restservicetask; + +public class Parameter { + + private String position; + private String type; + private String name; + private String value; + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/PropertyUtil.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/PropertyUtil.java new file mode 100644 index 0000000..5391757 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/PropertyUtil.java @@ -0,0 +1,46 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.workflow.activitiext.restservicetask; + +import java.util.ResourceBundle; + +public class PropertyUtil { + + public static final String REST_PROPERTY_LOCATION = "config"; + + public static final String BASE_URL = "baseurl"; + + private static ResourceBundle resource; + + static{ + resource = ResourceBundle.getBundle(REST_PROPERTY_LOCATION); + } + + public static String findByKey(String key){ + + String value = resource.getString(key); + + return value; + } + + public static String getBasePath(){ + + String basepath = findByKey(BASE_URL); + + return basepath; + } +} diff --git a/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/StartProcessRequest.java b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/StartProcessRequest.java new file mode 100644 index 0000000..9d712f2 --- /dev/null +++ b/activiti-extension/src/main/java/org/onap/workflow/activitiext/restservicetask/StartProcessRequest.java @@ -0,0 +1,33 @@ +/** + * Copyright 2017 ZTE Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.workflow.activitiext.restservicetask; + +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class StartProcessRequest { + private String processId; + private Map params; +} diff --git a/activiti-extension/src/main/resources/api-doc/index.html b/activiti-extension/src/main/resources/api-doc/index.html new file mode 100644 index 0000000..fb25d00 --- /dev/null +++ b/activiti-extension/src/main/resources/api-doc/index.html @@ -0,0 +1,99 @@ + + + + Swagger UI + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+
+ + diff --git a/activiti-extension/src/main/resources/banner.txt b/activiti-extension/src/main/resources/banner.txt new file mode 100644 index 0000000..ec90bd7 --- /dev/null +++ b/activiti-extension/src/main/resources/banner.txt @@ -0,0 +1,6 @@ + _ ____ _____ ___ __ __ ___ _____ ___ _____ __ __ _____ + / \ / ___| |_ _| |_ _| \ \ / / |_ _| |_ _| |_ _| | ____| \ \/ / |_ _| + / _ \ | | | | | | \ \ / / | | | | | | _____ | _| \ / | | + / ___ \ | |___ | | | | \ V / | | | | | | |_____| | |___ / \ | | + /_/ \_\ \____| |_| |___| \_/ |___| |_| |___| |_____| /_/\_\ |_| + \ No newline at end of file -- 2.16.6