2 * Copyright 2016 ZTE Corporation.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.openo.carbon.bpel.resources;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.HashSet;
24 import java.util.Iterator;
25 import java.util.LinkedHashMap;
26 import java.util.List;
29 import java.util.concurrent.atomic.AtomicLong;
31 import javax.activation.DataHandler;
32 import javax.activation.DataSource;
33 import javax.activation.FileDataSource;
34 import javax.servlet.http.HttpServletRequest;
35 import javax.servlet.http.HttpServletResponse;
36 import javax.ws.rs.Consumes;
37 import javax.ws.rs.DELETE;
38 import javax.ws.rs.POST;
39 import javax.ws.rs.Path;
40 import javax.ws.rs.PathParam;
41 import javax.ws.rs.Produces;
42 import javax.ws.rs.client.Client;
43 import javax.ws.rs.client.ClientBuilder;
44 import javax.ws.rs.client.Entity;
45 import javax.ws.rs.client.WebTarget;
46 import javax.ws.rs.core.Context;
47 import javax.ws.rs.core.MediaType;
48 import javax.xml.namespace.QName;
50 import org.apache.axiom.om.OMAbstractFactory;
51 import org.apache.axiom.om.OMElement;
52 import org.apache.axiom.om.OMFactory;
53 import org.apache.axiom.om.OMNamespace;
54 import org.apache.axis2.AxisFault;
55 import org.apache.axis2.addressing.EndpointReference;
56 import org.apache.axis2.client.Options;
57 import org.apache.axis2.rpc.client.RPCServiceClient;
58 import org.apache.axis2.transport.http.HTTPConstants;
59 import org.apache.axis2.transport.http.HttpTransportProperties;
60 import org.apache.axis2.transport.http.HttpTransportProperties.Authenticator;
61 import org.apache.commons.io.FileUtils;
62 import org.apache.commons.logging.Log;
63 import org.apache.commons.logging.LogFactory;
64 import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
65 import org.glassfish.jersey.media.multipart.FormDataMultiPart;
66 import org.glassfish.jersey.media.multipart.FormDataParam;
67 import org.glassfish.jersey.media.multipart.MultiPartFeature;
68 import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
69 import org.wso2.carbon.bpel.stub.upload.types.UploadedFileItem;
70 import org.openo.carbon.bpel.config.ConfigManager;
71 import org.openo.carbon.bpel.util.JsonUtil;
72 import org.openo.carbon.bpel.util.Xml2JsonUtil;
74 import com.codahale.metrics.annotation.Timed;
75 import com.fasterxml.jackson.core.JsonParseException;
76 import com.fasterxml.jackson.databind.JsonMappingException;
78 import io.swagger.annotations.Api;
79 import io.swagger.annotations.ApiOperation;
81 @Path("/openoapi/wso2bpel/v1")
82 @Api(tags = {"wso2 bpel api"})
83 public class BpsPackage {
85 private static final Log log = LogFactory.getLog(BpsPackage.class);
87 public static final int STATUS_SUCCESS = 1;
88 public static final int STATUS_FAIL = 0;
90 public static Set<String> packageNameSet = new HashSet<String>();
92 private Map<String, String> configMap = null;
94 @SuppressWarnings("unused")
95 private final AtomicLong counter;
98 this.counter = new AtomicLong();
101 private synchronized String getConfig(String key) {
102 if (configMap == null) {
103 configMap = new HashMap<String, String>();
104 String uploadFilePath = ConfigManager.getInstance().getProperty("wso2.uploadfile.path");
105 String jksFile = ConfigManager.getInstance().getProperty("wso2.ssl.jks.file");
106 String trustStorePassword =
107 ConfigManager.getInstance().getProperty("wso2.ssl.trustStorePassword");
108 String httpUsername =
109 ConfigManager.getInstance().getProperty("wso2.http.authenticator.username");
110 String httpPassword =
111 ConfigManager.getInstance().getProperty("wso2.http.authenticator.password");
112 String host = ConfigManager.getInstance().getProperty("wso2.host");
113 String port = ConfigManager.getInstance().getProperty("wso2.http.port");
114 configMap.put("uploadFilePath", uploadFilePath);
115 configMap.put("jksFile", jksFile);
116 configMap.put("trustStorePassword", trustStorePassword);
117 configMap.put("httpUsername", httpUsername);
118 configMap.put("httpPassword", httpPassword);
119 configMap.put("host", host);
120 configMap.put("port", port);
122 if (configMap.containsKey(key)) {
123 return configMap.get(key);
125 return ConfigManager.getInstance().getProperty(key);
129 public static boolean lockPackageName(String packageName) {
130 boolean succeed = false;
131 synchronized (packageNameSet) {
132 if (!packageNameSet.contains(packageName)) {
133 packageNameSet.add(packageName);
140 public static boolean unlockPackageName(String packageName) {
141 boolean succeed = false;
142 synchronized (packageNameSet) {
143 if (packageNameSet.contains(packageName)) {
144 packageNameSet.remove(packageName);
152 @Path(value = "package")
153 @Consumes(MediaType.MULTIPART_FORM_DATA)
154 @Produces(value = MediaType.APPLICATION_JSON)
155 @ApiOperation(value = "package process", response = Map.class)
157 public Map<String, Object> uploadFile(@FormDataParam("filename") String filename,
158 @FormDataParam("file") InputStream fileInputStream,
159 @FormDataParam("file") FormDataContentDisposition fileDetail,
160 @Context HttpServletRequest request, @Context HttpServletResponse response)
162 Map<String, Object> map = new LinkedHashMap<String, Object>();
163 String errorMessage = "unkown";
165 String fileName = fileDetail.getFileName();
166 String fullName = getConfig("uploadFilePath") + "/" + fileName;
167 File file = new File(fullName);
168 String packageName = null;
170 if (fileName.endsWith(".zip")) {
171 packageName = fileName.substring(0, fileName.length() - 4);
173 throw new Exception("Only support *.zip file.");
175 if (!lockPackageName(packageName)) {
176 throw new Exception("Package " + packageName + " is operating.");
178 FileUtils.copyInputStreamToFile(fileInputStream, file);
179 System.setProperty("javax.net.ssl.trustStore", "*.keystore");
180 System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
181 System.setProperty("javax.net.ssl.trustStore", getConfig("jksFile"));
182 System.setProperty("javax.net.ssl.trustStorePassword", getConfig("trustStorePassword"));
184 HttpTransportProperties.Authenticator authenticator =
185 new HttpTransportProperties.Authenticator();
186 List<String> auth = new ArrayList<String>();
187 auth.add(Authenticator.BASIC);
188 authenticator.setAuthSchemes(auth);
189 authenticator.setUsername(getConfig("httpUsername"));
190 authenticator.setPassword(getConfig("httpPassword"));
191 authenticator.setPreemptiveAuthentication(true);
193 map.putAll(bpsDeployPackage(fileName, fullName, packageName, authenticator));
195 map.put("status", STATUS_SUCCESS);
196 map.put("message", "success");
198 } catch (AxisFault e) {
199 errorMessage = e.getLocalizedMessage();
200 log.error(e.getMessage(), e);
202 } catch (IOException e) {
203 errorMessage = e.getLocalizedMessage();
204 log.error(e.getMessage(), e);
206 } catch (Throwable e) {
207 errorMessage = e.getLocalizedMessage();
208 log.error(e.getMessage(), e);
211 if (packageName != null) {
212 unlockPackageName(packageName);
215 map.put("status", STATUS_FAIL);
216 map.put("message", errorMessage);
220 @SuppressWarnings("rawtypes")
221 private Map<String, Object> bpsDeployPackage(String fileName, String fullName, String packageName,
222 HttpTransportProperties.Authenticator authenticator)
223 throws JsonParseException, JsonMappingException, IOException, AxisFault, Exception {
224 Map<String, Object> map = new HashMap<String, Object>();
225 Map deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
226 if (deployedPackageInfoMap.get("packageName") != null) {
227 throw new Exception("Package " + deployedPackageInfoMap.get("packageName")
228 + " exist, please undeploy it first.");
230 OMElement element = deployPackage(fileName, fullName, authenticator);
231 System.out.println(Xml2JsonUtil.xml2JSON(element.toString()));
233 long timeout = 60 * 1000L;
234 long timeStart = System.currentTimeMillis();
235 while (System.currentTimeMillis() - timeStart < timeout) {
236 deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
237 if (deployedPackageInfoMap.get("packageName") == null) {
243 if (deployedPackageInfoMap.get("packageName") == null) {
245 "Package " + packageName + " deploy failed or deploy information is lost.");
247 map.put("packageName", deployedPackageInfoMap.get("packageName"));
248 map.put("processId", deployedPackageInfoMap.get("pid"));
252 private OMElement deployPackage(String fileName, String fullName,
253 HttpTransportProperties.Authenticator authenticator) throws AxisFault {
255 "https://" + getConfig("host") + ":" + getConfig("port") + "/services/BPELUploader?wsdl";
256 RPCServiceClient serviceClient = new RPCServiceClient();
257 EndpointReference targetEPR = new EndpointReference(url);
258 Options options = serviceClient.getOptions();
259 options.setTo(targetEPR);
260 options.setAction("urn:uploadService");
261 options.setProperty(HTTPConstants.SO_TIMEOUT, new Integer(300000));
262 options.setProperty(HTTPConstants.AUTHENTICATE, authenticator);
263 serviceClient.setOptions(options);
265 QName qname = new QName("http://services.deployer.bpel.carbon.wso2.org", "uploadService");
266 UploadedFileItem fileItem = new UploadedFileItem();
267 fileItem.setFileName(fileName);
268 fileItem.setFileType("zip");
270 DataSource dataSource = new FileDataSource(fullName);
271 fileItem.setDataHandler(new DataHandler(dataSource));
272 UploadedFileItem[] parameters = new UploadedFileItem[] {fileItem};
273 OMElement element = serviceClient.invokeBlocking(qname, parameters);
277 @Path(value = "package/{packageName}")
279 @Produces(value = MediaType.APPLICATION_JSON)
280 @ApiOperation(value = "delete", response = Map.class)
282 public Map<String, Object> delete(@PathParam("packageName") String packageName,
283 @PathParam("param") String param, @Context HttpServletRequest request) {
284 Map<String, Object> map = new LinkedHashMap<String, Object>();
285 String errorMessage = "unkown";
287 if (!lockPackageName(packageName)) {
288 throw new Exception("Package " + packageName + " is operating.");
290 System.setProperty("javax.net.ssl.trustStore", "*.keystore");
291 System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
292 System.setProperty("javax.net.ssl.trustStore", getConfig("jksFile"));
293 System.setProperty("javax.net.ssl.trustStorePassword", getConfig("trustStorePassword"));
295 HttpTransportProperties.Authenticator authenticator =
296 new HttpTransportProperties.Authenticator();
297 List<String> auth = new ArrayList<String>();
298 auth.add(Authenticator.BASIC);
299 authenticator.setAuthSchemes(auth);
300 authenticator.setUsername("admin");
301 authenticator.setPassword("admin");
302 authenticator.setPreemptiveAuthentication(true);
304 map.putAll(bpsUndeployPackage(packageName, authenticator));
307 } catch (AxisFault e) {
308 errorMessage = e.getLocalizedMessage();
309 log.error(e.getMessage(), e);
311 } catch (Throwable e) {
312 errorMessage = e.getLocalizedMessage();
313 log.error(e.getMessage(), e);
316 if (packageName != null) {
317 unlockPackageName(packageName);
320 map.put("status", STATUS_FAIL);
321 map.put("message", errorMessage);
325 @SuppressWarnings({"rawtypes", "unused"})
326 private Map<String, Object> bpsUndeployPackage(String packageName,
327 HttpTransportProperties.Authenticator authenticator)
328 throws JsonParseException, JsonMappingException, IOException, AxisFault, Exception {
329 Map<String, Object> map = new HashMap<String, Object>();
330 Map deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
331 if (deployedPackageInfoMap.get("packageName") == null) {
332 throw new Exception("Package " + deployedPackageInfoMap.get("packageName")
333 + " does not exist, please deploy it first.");
335 OMElement element = undeployPackage(authenticator, packageName);
336 deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
337 if (deployedPackageInfoMap.get("packageName") != null) {
339 "Package " + deployedPackageInfoMap.get("packageName") + " undeploy failed.");
341 map.put("status", STATUS_SUCCESS);
342 map.put("message", "success");
347 private OMElement undeployPackage(HttpTransportProperties.Authenticator authenticator,
348 String packageName) throws AxisFault {
349 String url = "https://" + getConfig("host") + ":" + getConfig("port")
350 + "/services/BPELPackageManagementService?wsdl";
351 RPCServiceClient serviceClient = new RPCServiceClient();
352 EndpointReference targetEPR = new EndpointReference(url);
353 Options options = serviceClient.getOptions();
354 options.setTo(targetEPR);
355 options.setAction("sch:undeployBPELPackage");
356 options.setProperty(HTTPConstants.SO_TIMEOUT, new Integer(300000));
357 options.setProperty(HTTPConstants.AUTHENTICATE, authenticator);
358 serviceClient.setOptions(options);
359 OMFactory fac = OMAbstractFactory.getOMFactory();
360 OMNamespace omNs = fac.createOMNamespace("http://wso2.org/bps/management/schema", "sch");
361 OMElement method = fac.createOMElement("undeployBPELPackage", omNs);
362 OMElement content = fac.createOMElement("package", omNs);
363 content.addChild(fac.createOMText(content, packageName));
364 method.addChild(content);
366 OMElement res = serviceClient.sendReceive(method);
370 @SuppressWarnings({"rawtypes", "unchecked"})
371 private Map getDeployedPackageInfo(HttpTransportProperties.Authenticator authenticator,
372 String packageName) throws Exception {
373 Map resultMap = new HashMap();
376 String jsonTemplate =
377 "{'listDeployedPackagesPaginated':{'page':'','packageSearchString':'${searchString}'}}";
378 Map jsonParamMap = new HashMap();
379 jsonParamMap.put("searchString", packageName);
380 Object params = getParams(jsonTemplate, jsonParamMap);
381 result = BpsProcess.invokeWsdl("https://" + getConfig("host") + ":" + getConfig("port")
382 + "/services/BPELPackageManagementService?wsdl", params, authenticator);
383 System.out.println(result);
384 Map<String, Object> processMap = JsonUtil.json2Bean(result, Map.class);
385 Object packages = ((Map) processMap.get("deployedPackagesPaginated")).get("package");
386 Map deployedPackage = null;
387 if (packages instanceof List) {
388 for (Iterator iter = ((List) packages).iterator(); iter.hasNext();) {
389 Map packageMap = (Map) iter.next();
390 String deployedPackageName = (String) packageMap.get("name");
391 if (deployedPackageName.equals(packageName)) {
392 deployedPackage = packageMap;
396 } else if (packages instanceof Map) {
397 String deployedPackageName = (String) ((Map) packages).get("name");
398 if (deployedPackageName.equals(packageName)) {
399 deployedPackage = (Map) packages;
402 if (deployedPackage != null) {
403 String fullPackageName = null;
405 Object versions = ((Map) deployedPackage.get("versions")).get("version");
406 Map lastestVersion = null;
407 if (versions instanceof List) {
408 for (Iterator iter = ((List) versions).iterator(); iter.hasNext();) {
409 Map version = (Map) iter.next();
410 if (version.get("isLatest").equals("true")) {
411 lastestVersion = version;
414 } else if (versions instanceof Map) {
415 lastestVersion = (Map) versions;
417 fullPackageName = (String) ((Map) ((Map) lastestVersion.get("processes")).get("process"))
419 pid = (String) ((Map) ((Map) lastestVersion.get("processes")).get("process")).get("pid");
420 resultMap.put("packageName", fullPackageName);
421 resultMap.put("pid", pid);
426 @SuppressWarnings({"rawtypes", "unchecked"})
427 public static Map<String, Object> getParams(String jsonTemplate, Map<String, Object> paramMap)
428 throws JsonParseException, JsonMappingException, IOException {
429 String json = jsonTemplate.replaceAll("'", "\"");
430 for (Iterator iter = paramMap.keySet().iterator(); iter.hasNext();) {
431 String key = (String) iter.next();
432 String value = paramMap.get(key).toString().replaceAll("\"", "\\\\\"");
433 json = json.replaceAll("\\$\\{" + key + "\\}", value);
435 return JsonUtil.json2Bean(json, Map.class);
438 @SuppressWarnings("rawtypes")
439 public static void main(String[] args) {
442 boolean remoteDebug = true;
443 boolean localDebug = false;
445 Client client = ClientBuilder.newBuilder().register(MultiPartFeature.class).build();
446 WebTarget target = client.target("http://localhost:8101/openoapi/wso2bpel/v1/package");
447 FileDataBodyPart bodyPart = new FileDataBodyPart("file",
448 new File("F:\\wso2bps-3.5.1\\wso2bps-3.5.1\\repository\\samples\\bpel\\Alarm.zip"));
449 FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
450 formDataMultiPart.field("fileName", "Alarm.zip").bodyPart(bodyPart);
451 String result = target.request(MediaType.APPLICATION_JSON)
452 .post(Entity.entity(formDataMultiPart, formDataMultiPart.getMediaType()), String.class);
453 System.out.println(result);
456 // System.out.println("************************************************************************");
458 // bodyPart = new FileDataBodyPart("file", new
459 // File("D:\\temp\\bpel-sample\\AssignDate\\AssignDate.zip"));
460 // formDataMultiPart = new FormDataMultiPart();
461 // formDataMultiPart.field("fileName",
462 // "AssignDate.zip").bodyPart(bodyPart);
463 // result = target.request(MediaType.APPLICATION_JSON)
464 // .post(Entity.entity(formDataMultiPart,
465 // formDataMultiPart.getMediaType()), String.class);
466 // System.out.println(result);
469 System.setProperty("javax.net.ssl.trustStore", "*.keystore");
470 System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
471 System.setProperty("javax.net.ssl.trustStore",
472 "D:\\software\\WSO2\\wso2bps-3.5.1\\repository\\resources\\security\\wso2carbon.jks");
473 System.setProperty("javax.net.ssl.trustStorePassword", "wso2carbon");
474 HttpTransportProperties.Authenticator authenticator =
475 new HttpTransportProperties.Authenticator();
476 List<String> auth = new ArrayList<String>();
477 auth.add(Authenticator.BASIC);
478 authenticator.setAuthSchemes(auth);
479 authenticator.setUsername("admin");
480 authenticator.setPassword("admin");
481 authenticator.setPreemptiveAuthentication(true);
483 // String packageName = "RESTProcess";
484 // Map deployedPackageInfoMap =
485 // getDeployedPackageInfo(authenticator, packageName);
487 BpsPackage packageTest = new BpsPackage();
489 // map = packageTest.bpsUndeployPackage("AssignDate",
491 // System.out.println(JsonUtil.bean2Json(map));
492 map = packageTest.bpsDeployPackage("AssignDate.zip",
493 "D:\\temp\\bpel-sample\\AssignDate\\AssignDate.zip", "AssignDate", authenticator);
494 System.out.println(JsonUtil.bean2Json(map));
495 map = packageTest.bpsUndeployPackage("AssignDate", authenticator);
496 System.out.println(JsonUtil.bean2Json(map));
499 } catch (Exception e) {