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.common.Config;
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;
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 = Config.getConfigration().getWso2UploadFilePath();
105 String jksFile = Config.getConfigration().getWso2SslJksFile();
106 String trustStorePassword = Config.getConfigration().getWso2SslJksPassword();
107 String httpUsername = Config.getConfigration().getWso2AuthUserName();
108 String httpPassword = Config.getConfigration().getWso2AuthPassword();
109 String host = Config.getConfigration().getWso2Host();
110 String port = Config.getConfigration().getWso2HostPort();
111 configMap.put("uploadFilePath", uploadFilePath);
112 configMap.put("jksFile", jksFile);
113 configMap.put("trustStorePassword", trustStorePassword);
114 configMap.put("httpUsername", httpUsername);
115 configMap.put("httpPassword", httpPassword);
116 configMap.put("host", host);
117 configMap.put("port", port);
119 if (configMap.containsKey(key)) {
120 return configMap.get(key);
126 public static boolean lockPackageName(String packageName) {
127 boolean succeed = false;
128 synchronized (packageNameSet) {
129 if (!packageNameSet.contains(packageName)) {
130 packageNameSet.add(packageName);
137 public static boolean unlockPackageName(String packageName) {
138 boolean succeed = false;
139 synchronized (packageNameSet) {
140 if (packageNameSet.contains(packageName)) {
141 packageNameSet.remove(packageName);
149 @Path(value = "package")
150 @Consumes(MediaType.MULTIPART_FORM_DATA)
151 @Produces(value = MediaType.APPLICATION_JSON)
152 @ApiOperation(value = "package process", response = Map.class)
154 public Map<String, Object> uploadFile(@FormDataParam("filename") String filename,
155 @FormDataParam("file") InputStream fileInputStream,
156 @FormDataParam("file") FormDataContentDisposition fileDetail,
157 @Context HttpServletRequest request, @Context HttpServletResponse response)
159 Map<String, Object> map = new LinkedHashMap<String, Object>();
160 String errorMessage = "unkown";
162 String fileName = fileDetail.getFileName();
163 String fullName = getConfig("uploadFilePath") + "/" + fileName;
164 File file = new File(fullName);
165 String packageName = null;
167 if (fileName.endsWith(".zip")) {
168 packageName = fileName.substring(0, fileName.length() - 4);
170 throw new Exception("Only support *.zip file.");
172 if (!lockPackageName(packageName)) {
173 throw new Exception("Package " + packageName + " is operating.");
175 FileUtils.copyInputStreamToFile(fileInputStream, file);
176 System.setProperty("javax.net.ssl.trustStore", "*.keystore");
177 System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
178 System.setProperty("javax.net.ssl.trustStore", getConfig("jksFile"));
179 System.setProperty("javax.net.ssl.trustStorePassword", getConfig("trustStorePassword"));
181 HttpTransportProperties.Authenticator authenticator =
182 new HttpTransportProperties.Authenticator();
183 List<String> auth = new ArrayList<String>();
184 auth.add(Authenticator.BASIC);
185 authenticator.setAuthSchemes(auth);
186 authenticator.setUsername(getConfig("httpUsername"));
187 authenticator.setPassword(getConfig("httpPassword"));
188 authenticator.setPreemptiveAuthentication(true);
190 map.putAll(bpsDeployPackage(fileName, fullName, packageName, authenticator));
192 map.put("status", STATUS_SUCCESS);
193 map.put("message", "success");
195 } catch (AxisFault e) {
196 errorMessage = e.getLocalizedMessage();
197 log.error(e.getMessage(), e);
199 } catch (IOException e) {
200 errorMessage = e.getLocalizedMessage();
201 log.error(e.getMessage(), e);
203 } catch (Throwable e) {
204 errorMessage = e.getLocalizedMessage();
205 log.error(e.getMessage(), e);
208 if (packageName != null) {
209 unlockPackageName(packageName);
212 map.put("status", STATUS_FAIL);
213 map.put("message", errorMessage);
217 @SuppressWarnings("rawtypes")
218 private Map<String, Object> bpsDeployPackage(String fileName, String fullName, String packageName,
219 HttpTransportProperties.Authenticator authenticator)
220 throws JsonParseException, JsonMappingException, IOException, AxisFault, Exception {
221 Map<String, Object> map = new HashMap<String, Object>();
222 Map deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
223 if (deployedPackageInfoMap.get("packageName") != null) {
224 throw new Exception("Package " + deployedPackageInfoMap.get("packageName")
225 + " exist, please undeploy it first.");
227 OMElement element = deployPackage(fileName, fullName, authenticator);
228 System.out.println(Xml2JsonUtil.xml2JSON(element.toString()));
230 long timeout = 60 * 1000L;
231 long timeStart = System.currentTimeMillis();
232 while (System.currentTimeMillis() - timeStart < timeout) {
233 deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
234 if (deployedPackageInfoMap.get("packageName") == null) {
240 if (deployedPackageInfoMap.get("packageName") == null) {
242 "Package " + packageName + " deploy failed or deploy information is lost.");
244 map.put("packageName", deployedPackageInfoMap.get("packageName"));
245 map.put("processId", deployedPackageInfoMap.get("pid"));
249 private OMElement deployPackage(String fileName, String fullName,
250 HttpTransportProperties.Authenticator authenticator) throws AxisFault {
252 "https://" + getConfig("host") + ":" + getConfig("port") + "/services/BPELUploader?wsdl";
253 RPCServiceClient serviceClient = new RPCServiceClient();
254 EndpointReference targetEPR = new EndpointReference(url);
255 Options options = serviceClient.getOptions();
256 options.setTo(targetEPR);
257 options.setAction("urn:uploadService");
258 options.setProperty(HTTPConstants.SO_TIMEOUT, new Integer(300000));
259 options.setProperty(HTTPConstants.AUTHENTICATE, authenticator);
260 serviceClient.setOptions(options);
262 QName qname = new QName("http://services.deployer.bpel.carbon.wso2.org", "uploadService");
263 UploadedFileItem fileItem = new UploadedFileItem();
264 fileItem.setFileName(fileName);
265 fileItem.setFileType("zip");
267 DataSource dataSource = new FileDataSource(fullName);
268 fileItem.setDataHandler(new DataHandler(dataSource));
269 UploadedFileItem[] parameters = new UploadedFileItem[] {fileItem};
270 OMElement element = serviceClient.invokeBlocking(qname, parameters);
274 @Path(value = "package/{packageName}")
276 @Produces(value = MediaType.APPLICATION_JSON)
277 @ApiOperation(value = "delete", response = Map.class)
279 public Map<String, Object> delete(@PathParam("packageName") String packageName,
280 @PathParam("param") String param, @Context HttpServletRequest request) {
281 Map<String, Object> map = new LinkedHashMap<String, Object>();
282 String errorMessage = "unkown";
284 if (!lockPackageName(packageName)) {
285 throw new Exception("Package " + packageName + " is operating.");
287 System.setProperty("javax.net.ssl.trustStore", "*.keystore");
288 System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
289 System.setProperty("javax.net.ssl.trustStore", getConfig("jksFile"));
290 System.setProperty("javax.net.ssl.trustStorePassword", getConfig("trustStorePassword"));
292 HttpTransportProperties.Authenticator authenticator =
293 new HttpTransportProperties.Authenticator();
294 List<String> auth = new ArrayList<String>();
295 auth.add(Authenticator.BASIC);
296 authenticator.setAuthSchemes(auth);
297 authenticator.setUsername("admin");
298 authenticator.setPassword("admin");
299 authenticator.setPreemptiveAuthentication(true);
301 map.putAll(bpsUndeployPackage(packageName, authenticator));
304 } catch (AxisFault e) {
305 errorMessage = e.getLocalizedMessage();
306 log.error(e.getMessage(), e);
308 } catch (Throwable e) {
309 errorMessage = e.getLocalizedMessage();
310 log.error(e.getMessage(), e);
313 if (packageName != null) {
314 unlockPackageName(packageName);
317 map.put("status", STATUS_FAIL);
318 map.put("message", errorMessage);
322 @SuppressWarnings({"rawtypes", "unused"})
323 private Map<String, Object> bpsUndeployPackage(String packageName,
324 HttpTransportProperties.Authenticator authenticator)
325 throws JsonParseException, JsonMappingException, IOException, AxisFault, Exception {
326 Map<String, Object> map = new HashMap<String, Object>();
327 Map deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
328 if (deployedPackageInfoMap.get("packageName") == null) {
329 throw new Exception("Package " + deployedPackageInfoMap.get("packageName")
330 + " does not exist, please deploy it first.");
332 OMElement element = undeployPackage(authenticator, packageName);
333 deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
334 if (deployedPackageInfoMap.get("packageName") != null) {
336 "Package " + deployedPackageInfoMap.get("packageName") + " undeploy failed.");
338 map.put("status", STATUS_SUCCESS);
339 map.put("message", "success");
344 private OMElement undeployPackage(HttpTransportProperties.Authenticator authenticator,
345 String packageName) throws AxisFault {
346 String url = "https://" + getConfig("host") + ":" + getConfig("port")
347 + "/services/BPELPackageManagementService?wsdl";
348 RPCServiceClient serviceClient = new RPCServiceClient();
349 EndpointReference targetEPR = new EndpointReference(url);
350 Options options = serviceClient.getOptions();
351 options.setTo(targetEPR);
352 options.setAction("sch:undeployBPELPackage");
353 options.setProperty(HTTPConstants.SO_TIMEOUT, new Integer(300000));
354 options.setProperty(HTTPConstants.AUTHENTICATE, authenticator);
355 serviceClient.setOptions(options);
356 OMFactory fac = OMAbstractFactory.getOMFactory();
357 OMNamespace omNs = fac.createOMNamespace("http://wso2.org/bps/management/schema", "sch");
358 OMElement method = fac.createOMElement("undeployBPELPackage", omNs);
359 OMElement content = fac.createOMElement("package", omNs);
360 content.addChild(fac.createOMText(content, packageName));
361 method.addChild(content);
363 OMElement res = serviceClient.sendReceive(method);
367 @SuppressWarnings({"rawtypes", "unchecked"})
368 private Map getDeployedPackageInfo(HttpTransportProperties.Authenticator authenticator,
369 String packageName) throws Exception {
370 Map resultMap = new HashMap();
373 String jsonTemplate =
374 "{'listDeployedPackagesPaginated':{'page':'','packageSearchString':'${searchString}'}}";
375 Map jsonParamMap = new HashMap();
376 jsonParamMap.put("searchString", packageName);
377 Object params = getParams(jsonTemplate, jsonParamMap);
378 result = BpsProcess.invokeWsdl("https://" + getConfig("host") + ":" + getConfig("port")
379 + "/services/BPELPackageManagementService?wsdl", params, authenticator);
380 System.out.println(result);
381 Map<String, Object> processMap = JsonUtil.json2Bean(result, Map.class);
382 Object packages = ((Map) processMap.get("deployedPackagesPaginated")).get("package");
383 Map deployedPackage = null;
384 if (packages instanceof List) {
385 for (Iterator iter = ((List) packages).iterator(); iter.hasNext();) {
386 Map packageMap = (Map) iter.next();
387 String deployedPackageName = (String) packageMap.get("name");
388 if (deployedPackageName.equals(packageName)) {
389 deployedPackage = packageMap;
393 } else if (packages instanceof Map) {
394 String deployedPackageName = (String) ((Map) packages).get("name");
395 if (deployedPackageName.equals(packageName)) {
396 deployedPackage = (Map) packages;
399 if (deployedPackage != null) {
400 String fullPackageName = null;
402 Object versions = ((Map) deployedPackage.get("versions")).get("version");
403 Map lastestVersion = null;
404 if (versions instanceof List) {
405 for (Iterator iter = ((List) versions).iterator(); iter.hasNext();) {
406 Map version = (Map) iter.next();
407 if (version.get("isLatest").equals("true")) {
408 lastestVersion = version;
411 } else if (versions instanceof Map) {
412 lastestVersion = (Map) versions;
414 fullPackageName = (String) ((Map) ((Map) lastestVersion.get("processes")).get("process"))
416 pid = (String) ((Map) ((Map) lastestVersion.get("processes")).get("process")).get("pid");
417 resultMap.put("packageName", fullPackageName);
418 resultMap.put("pid", pid);
423 @SuppressWarnings({"rawtypes", "unchecked"})
424 public static Map<String, Object> getParams(String jsonTemplate, Map<String, Object> paramMap)
425 throws JsonParseException, JsonMappingException, IOException {
426 String json = jsonTemplate.replaceAll("'", "\"");
427 for (Iterator iter = paramMap.keySet().iterator(); iter.hasNext();) {
428 String key = (String) iter.next();
429 String value = paramMap.get(key).toString().replaceAll("\"", "\\\\\"");
430 json = json.replaceAll("\\$\\{" + key + "\\}", value);
432 return JsonUtil.json2Bean(json, Map.class);
435 @SuppressWarnings("rawtypes")
436 public static void main(String[] args) {
439 boolean remoteDebug = true;
440 boolean localDebug = false;
442 Client client = ClientBuilder.newBuilder().register(MultiPartFeature.class).build();
443 WebTarget target = client.target("http://localhost:8101/openoapi/wso2bpel/v1/package");
444 FileDataBodyPart bodyPart = new FileDataBodyPart("file",
445 new File("F:\\wso2bps-3.5.1\\wso2bps-3.5.1\\repository\\samples\\bpel\\Alarm.zip"));
446 FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
447 formDataMultiPart.field("fileName", "Alarm.zip").bodyPart(bodyPart);
448 String result = target.request(MediaType.APPLICATION_JSON)
449 .post(Entity.entity(formDataMultiPart, formDataMultiPart.getMediaType()), String.class);
450 System.out.println(result);
453 // System.out.println("************************************************************************");
455 // bodyPart = new FileDataBodyPart("file", new
456 // File("D:\\temp\\bpel-sample\\AssignDate\\AssignDate.zip"));
457 // formDataMultiPart = new FormDataMultiPart();
458 // formDataMultiPart.field("fileName",
459 // "AssignDate.zip").bodyPart(bodyPart);
460 // result = target.request(MediaType.APPLICATION_JSON)
461 // .post(Entity.entity(formDataMultiPart,
462 // formDataMultiPart.getMediaType()), String.class);
463 // System.out.println(result);
466 System.setProperty("javax.net.ssl.trustStore", "*.keystore");
467 System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
468 System.setProperty("javax.net.ssl.trustStore",
469 "D:\\software\\WSO2\\wso2bps-3.5.1\\repository\\resources\\security\\wso2carbon.jks");
470 System.setProperty("javax.net.ssl.trustStorePassword", "wso2carbon");
471 HttpTransportProperties.Authenticator authenticator =
472 new HttpTransportProperties.Authenticator();
473 List<String> auth = new ArrayList<String>();
474 auth.add(Authenticator.BASIC);
475 authenticator.setAuthSchemes(auth);
476 authenticator.setUsername("admin");
477 authenticator.setPassword("admin");
478 authenticator.setPreemptiveAuthentication(true);
480 // String packageName = "RESTProcess";
481 // Map deployedPackageInfoMap =
482 // getDeployedPackageInfo(authenticator, packageName);
484 BpsPackage packageTest = new BpsPackage();
486 // map = packageTest.bpsUndeployPackage("AssignDate",
488 // System.out.println(JsonUtil.bean2Json(map));
489 map = packageTest.bpsDeployPackage("AssignDate.zip",
490 "D:\\temp\\bpel-sample\\AssignDate\\AssignDate.zip", "AssignDate", authenticator);
491 System.out.println(JsonUtil.bean2Json(map));
492 map = packageTest.bpsUndeployPackage("AssignDate", authenticator);
493 System.out.println(JsonUtil.bean2Json(map));
496 } catch (Exception e) {