Deploy plan file to WSO2 get error
[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.common.Config;
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("/")
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 = 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);
118     }
119     if (configMap.containsKey(key)) {
120       return configMap.get(key);
121     } else {
122       return "";
123     }
124   }
125
126   public static boolean lockPackageName(String packageName) {
127     boolean succeed = false;
128     synchronized (packageNameSet) {
129       if (!packageNameSet.contains(packageName)) {
130         packageNameSet.add(packageName);
131         succeed = true;
132       }
133     }
134     return succeed;
135   }
136
137   public static boolean unlockPackageName(String packageName) {
138     boolean succeed = false;
139     synchronized (packageNameSet) {
140       if (packageNameSet.contains(packageName)) {
141         packageNameSet.remove(packageName);
142         succeed = true;
143       }
144     }
145     return succeed;
146   }
147
148   @POST
149   @Path(value = "package")
150   @Consumes(MediaType.MULTIPART_FORM_DATA)
151   @Produces(value = MediaType.APPLICATION_JSON)
152   @ApiOperation(value = "package process", response = Map.class)
153   @Timed
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)
158           throws IOException {
159     Map<String, Object> map = new LinkedHashMap<String, Object>();
160     String errorMessage = "unkown";
161
162     String fileName = fileDetail.getFileName();
163     String fullName = getConfig("uploadFilePath") + "/" + fileName;
164     File file = new File(fullName);
165     String packageName = null;
166     try {
167       if (fileName.endsWith(".zip")) {
168         packageName = fileName.substring(0, fileName.length() - 4);
169       } else {
170         throw new Exception("Only support *.zip file.");
171       }
172       if (!lockPackageName(packageName)) {
173         throw new Exception("Package " + packageName + " is operating.");
174       }
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"));
180
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);
189
190       map.putAll(bpsDeployPackage(fileName, fullName, packageName, authenticator));
191
192       map.put("status", STATUS_SUCCESS);
193       map.put("message", "success");
194       return map;
195     } catch (AxisFault e) {
196       errorMessage = e.getLocalizedMessage();
197       log.error(e.getMessage(), e);
198       e.printStackTrace();
199     } catch (IOException e) {
200       errorMessage = e.getLocalizedMessage();
201       log.error(e.getMessage(), e);
202       e.printStackTrace();
203     } catch (Throwable e) {
204       errorMessage = e.getLocalizedMessage();
205       log.error(e.getMessage(), e);
206       e.printStackTrace();
207     } finally {
208       if (packageName != null) {
209         unlockPackageName(packageName);
210       }
211     }
212     map.put("status", STATUS_FAIL);
213     map.put("message", errorMessage);
214     return map;
215   }
216
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.");
226     }
227     OMElement element = deployPackage(fileName, fullName, authenticator);
228     System.out.println(Xml2JsonUtil.xml2JSON(element.toString()));
229
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) {
235         Thread.sleep(2000);
236       } else {
237         break;
238       }
239     }
240     if (deployedPackageInfoMap.get("packageName") == null) {
241       throw new Exception(
242           "Package " + packageName + " deploy failed or deploy information is lost.");
243     }
244     map.put("packageName", deployedPackageInfoMap.get("packageName"));
245     map.put("processId", deployedPackageInfoMap.get("pid"));
246     return map;
247   }
248
249   private OMElement deployPackage(String fileName, String fullName,
250       HttpTransportProperties.Authenticator authenticator) throws AxisFault {
251     String url =
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);
261
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");
266
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);
271     return element;
272   }
273
274   @Path(value = "package/{packageName}")
275   @DELETE
276   @Produces(value = MediaType.APPLICATION_JSON)
277   @ApiOperation(value = "delete", response = Map.class)
278   @Timed
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";
283     try {
284       if (!lockPackageName(packageName)) {
285         throw new Exception("Package " + packageName + " is operating.");
286       }
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"));
291
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);
300
301       map.putAll(bpsUndeployPackage(packageName, authenticator));
302
303       return map;
304     } catch (AxisFault e) {
305       errorMessage = e.getLocalizedMessage();
306       log.error(e.getMessage(), e);
307       e.printStackTrace();
308     } catch (Throwable e) {
309       errorMessage = e.getLocalizedMessage();
310       log.error(e.getMessage(), e);
311       e.printStackTrace();
312     } finally {
313       if (packageName != null) {
314         unlockPackageName(packageName);
315       }
316     }
317     map.put("status", STATUS_FAIL);
318     map.put("message", errorMessage);
319     return map;
320   }
321
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.");
331     }
332     OMElement element = undeployPackage(authenticator, packageName);
333     deployedPackageInfoMap = getDeployedPackageInfo(authenticator, packageName);
334     if (deployedPackageInfoMap.get("packageName") != null) {
335       throw new Exception(
336           "Package " + deployedPackageInfoMap.get("packageName") + " undeploy failed.");
337     }
338     map.put("status", STATUS_SUCCESS);
339     map.put("message", "success");
340
341     return map;
342   }
343
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);
362     method.build();
363     OMElement res = serviceClient.sendReceive(method);
364     return res;
365   }
366
367   @SuppressWarnings({"rawtypes", "unchecked"})
368   private Map getDeployedPackageInfo(HttpTransportProperties.Authenticator authenticator,
369       String packageName) throws Exception {
370     Map resultMap = new HashMap();
371
372     String result;
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;
390           break;
391         }
392       }
393     } else if (packages instanceof Map) {
394       String deployedPackageName = (String) ((Map) packages).get("name");
395       if (deployedPackageName.equals(packageName)) {
396         deployedPackage = (Map) packages;
397       }
398     }
399     if (deployedPackage != null) {
400       String fullPackageName = null;
401       String pid = 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;
409           }
410         }
411       } else if (versions instanceof Map) {
412         lastestVersion = (Map) versions;
413       }
414       fullPackageName = (String) ((Map) ((Map) lastestVersion.get("processes")).get("process"))
415           .get("packageName");
416       pid = (String) ((Map) ((Map) lastestVersion.get("processes")).get("process")).get("pid");
417       resultMap.put("packageName", fullPackageName);
418       resultMap.put("pid", pid);
419     }
420     return resultMap;
421   }
422
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);
431     }
432     return JsonUtil.json2Bean(json, Map.class);
433   }
434
435   @SuppressWarnings("rawtypes")
436   public static void main(String[] args) {
437     try {
438
439       boolean remoteDebug = true;
440       boolean localDebug = false;
441       if (remoteDebug) {
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);
451       }
452       //
453       // System.out.println("************************************************************************");
454       //
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);
464       //
465       if (localDebug) {
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);
479         //
480         // String packageName = "RESTProcess";
481         // Map deployedPackageInfoMap =
482         // getDeployedPackageInfo(authenticator, packageName);
483
484         BpsPackage packageTest = new BpsPackage();
485         Map map;
486         // map = packageTest.bpsUndeployPackage("AssignDate",
487         // authenticator);
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));
494       }
495
496     } catch (Exception e) {
497       e.printStackTrace();
498     }
499   }
500 }