ee819de1893109d9295f569b27dbb825a46bff89
[vfc/nfvo/wfengine.git] / wso2bpel-ext / wso2bpel-core / wso2bpel-mgr / src / main / java / org / openo / carbon / bpel / resources / BpsPackage.java
1 /**
2  * Copyright 2016 ZTE Corporation.
3  *
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package org.openo.carbon.bpel.resources;
17
18 import java.io.File;
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;
27 import java.util.Map;
28 import java.util.Set;
29 import java.util.concurrent.atomic.AtomicLong;
30
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;
49
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;
73
74 import com.codahale.metrics.annotation.Timed;
75 import com.fasterxml.jackson.core.JsonParseException;
76 import com.fasterxml.jackson.databind.JsonMappingException;
77
78 import io.swagger.annotations.Api;
79 import io.swagger.annotations.ApiOperation;
80
81 @Path("/openoapi/wso2bpel/v1")
82 @Api(tags = {"wso2 bpel api"})
83 public class BpsPackage {
84
85   private static final Log log = LogFactory.getLog(BpsPackage.class);
86
87   public static final int STATUS_SUCCESS = 1;
88   public static final int STATUS_FAIL = 0;
89
90   public static Set<String> packageNameSet = new HashSet<String>();
91
92   private Map<String, String> configMap = null;
93
94   @SuppressWarnings("unused")
95   private final AtomicLong counter;
96
97   public BpsPackage() {
98     this.counter = new AtomicLong();
99   }
100
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);
121     }
122     if (configMap.containsKey(key)) {
123       return configMap.get(key);
124     } else {
125       return ConfigManager.getInstance().getProperty(key);
126     }
127   }
128
129   public static boolean lockPackageName(String packageName) {
130     boolean succeed = false;
131     synchronized (packageNameSet) {
132       if (!packageNameSet.contains(packageName)) {
133         packageNameSet.add(packageName);
134         succeed = true;
135       }
136     }
137     return succeed;
138   }
139
140   public static boolean unlockPackageName(String packageName) {
141     boolean succeed = false;
142     synchronized (packageNameSet) {
143       if (packageNameSet.contains(packageName)) {
144         packageNameSet.remove(packageName);
145         succeed = true;
146       }
147     }
148     return succeed;
149   }
150
151   @POST
152   @Path(value = "package")
153   @Consumes(MediaType.MULTIPART_FORM_DATA)
154   @Produces(value = MediaType.APPLICATION_JSON)
155   @ApiOperation(value = "package process", response = Map.class)
156   @Timed
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)
161           throws IOException {
162     Map<String, Object> map = new LinkedHashMap<String, Object>();
163     String errorMessage = "unkown";
164
165     String fileName = fileDetail.getFileName();
166     String fullName = getConfig("uploadFilePath") + "/" + fileName;
167     File file = new File(fullName);
168     String packageName = null;
169     try {
170       if (fileName.endsWith(".zip")) {
171         packageName = fileName.substring(0, fileName.length() - 4);
172       } else {
173         throw new Exception("Only support *.zip file.");
174       }
175       if (!lockPackageName(packageName)) {
176         throw new Exception("Package " + packageName + " is operating.");
177       }
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"));
183
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);
192
193       map.putAll(bpsDeployPackage(fileName, fullName, packageName, authenticator));
194
195       map.put("status", STATUS_SUCCESS);
196       map.put("message", "success");
197       return map;
198     } catch (AxisFault e) {
199       errorMessage = e.getLocalizedMessage();
200       log.error(e.getMessage(), e);
201       e.printStackTrace();
202     } catch (IOException e) {
203       errorMessage = e.getLocalizedMessage();
204       log.error(e.getMessage(), e);
205       e.printStackTrace();
206     } catch (Throwable e) {
207       errorMessage = e.getLocalizedMessage();
208       log.error(e.getMessage(), e);
209       e.printStackTrace();
210     } finally {
211       if (packageName != null) {
212         unlockPackageName(packageName);
213       }
214     }
215     map.put("status", STATUS_FAIL);
216     map.put("message", errorMessage);
217     return map;
218   }
219
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.");
229     }
230     OMElement element = deployPackage(fileName, fullName, authenticator);
231     System.out.println(Xml2JsonUtil.xml2JSON(element.toString()));
232
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) {
238         Thread.sleep(2000);
239       } else {
240         break;
241       }
242     }
243     if (deployedPackageInfoMap.get("packageName") == null) {
244       throw new Exception(
245           "Package " + packageName + " deploy failed or deploy information is lost.");
246     }
247     map.put("packageName", deployedPackageInfoMap.get("packageName"));
248     map.put("processId", deployedPackageInfoMap.get("pid"));
249     return map;
250   }
251
252   private OMElement deployPackage(String fileName, String fullName,
253       HttpTransportProperties.Authenticator authenticator) throws AxisFault {
254     String url =
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);
264
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");
269
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);
274     return element;
275   }
276
277   @Path(value = "package/{packageName}")
278   @DELETE
279   @Produces(value = MediaType.APPLICATION_JSON)
280   @ApiOperation(value = "delete", response = Map.class)
281   @Timed
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";
286     try {
287       if (!lockPackageName(packageName)) {
288         throw new Exception("Package " + packageName + " is operating.");
289       }
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"));
294
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);
303
304       map.putAll(bpsUndeployPackage(packageName, authenticator));
305
306       return map;
307     } catch (AxisFault e) {
308       errorMessage = e.getLocalizedMessage();
309       log.error(e.getMessage(), e);
310       e.printStackTrace();
311     } catch (Throwable e) {
312       errorMessage = e.getLocalizedMessage();
313       log.error(e.getMessage(), e);
314       e.printStackTrace();
315     } finally {
316       if (packageName != null) {
317         unlockPackageName(packageName);
318       }
319     }
320     map.put("status", STATUS_FAIL);
321     map.put("message", errorMessage);
322     return map;
323   }
324
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.");
334     }
335     OMElement element = undeployPackage(authenticator, packageName);
336     deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
337     if (deployedPackageInfoMap.get("packageName") != null) {
338       throw new Exception(
339           "Package " + deployedPackageInfoMap.get("packageName") + " undeploy failed.");
340     }
341     map.put("status", STATUS_SUCCESS);
342     map.put("message", "success");
343
344     return map;
345   }
346
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);
365     method.build();
366     OMElement res = serviceClient.sendReceive(method);
367     return res;
368   }
369
370   @SuppressWarnings({"rawtypes", "unchecked"})
371   private Map getDeployedPackageInfo(HttpTransportProperties.Authenticator authenticator,
372       String packageName) throws Exception {
373     Map resultMap = new HashMap();
374
375     String result;
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;
393           break;
394         }
395       }
396     } else if (packages instanceof Map) {
397       String deployedPackageName = (String) ((Map) packages).get("name");
398       if (deployedPackageName.equals(packageName)) {
399         deployedPackage = (Map) packages;
400       }
401     }
402     if (deployedPackage != null) {
403       String fullPackageName = null;
404       String pid = 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;
412           }
413         }
414       } else if (versions instanceof Map) {
415         lastestVersion = (Map) versions;
416       }
417       fullPackageName = (String) ((Map) ((Map) lastestVersion.get("processes")).get("process"))
418           .get("packageName");
419       pid = (String) ((Map) ((Map) lastestVersion.get("processes")).get("process")).get("pid");
420       resultMap.put("packageName", fullPackageName);
421       resultMap.put("pid", pid);
422     }
423     return resultMap;
424   }
425
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);
434     }
435     return JsonUtil.json2Bean(json, Map.class);
436   }
437
438   @SuppressWarnings("rawtypes")
439   public static void main(String[] args) {
440     try {
441
442       boolean remoteDebug = true;
443       boolean localDebug = false;
444       if (remoteDebug) {
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);
454       }
455       //
456       // System.out.println("************************************************************************");
457       //
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);
467       //
468       if (localDebug) {
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);
482         //
483         // String packageName = "RESTProcess";
484         // Map deployedPackageInfoMap =
485         // getDeployedPackageInfo(authenticator, packageName);
486
487         BpsPackage packageTest = new BpsPackage();
488         Map map;
489         // map = packageTest.bpsUndeployPackage("AssignDate",
490         // authenticator);
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));
497       }
498
499     } catch (Exception e) {
500       e.printStackTrace();
501     }
502   }
503 }