Remove redundant String constructor calls
[so.git] / bpmn / MSOCommonBPMN / src / main / java / org / openecomp / mso / bpmn / common / recipe / BpmnRestClient.java
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP - SO\r
4  * ================================================================================\r
5  * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  *\r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 package org.openecomp.mso.bpmn.common.recipe;\r
22 \r
23 import java.io.IOException;\r
24 import java.security.GeneralSecurityException;\r
25 \r
26 import javax.xml.bind.DatatypeConverter;\r
27 \r
28 import org.apache.http.HttpResponse;\r
29 import org.apache.http.client.ClientProtocolException;\r
30 import org.apache.http.client.HttpClient;\r
31 import org.apache.http.client.config.RequestConfig;\r
32 import org.apache.http.client.methods.HttpPost;\r
33 import org.apache.http.entity.StringEntity;\r
34 import org.apache.http.impl.client.HttpClientBuilder;\r
35 import org.openecomp.mso.logger.MessageEnum;\r
36 import org.openecomp.mso.logger.MsoLogger;\r
37 import org.openecomp.mso.properties.MsoJavaProperties;\r
38 import org.openecomp.mso.properties.MsoPropertiesFactory;\r
39 import org.openecomp.mso.utils.CryptoUtils;\r
40 \r
41 /**\r
42  * Support to call resource recipes from the BPMN workflow.\r
43  * Such as call resource recipe in service workflow.\r
44  * <br>\r
45  * <p>\r
46  * </p>\r
47  * \r
48  * @author\r
49  * @version ONAP Beijing Release 2018-02-27\r
50  */\r
51 public class BpmnRestClient {\r
52 \r
53     public static final String DEFAULT_BPEL_AUTH = "admin:admin";\r
54 \r
55     public static final String ENCRYPTION_KEY = "aa3871669d893c7fb8abbcda31b88b4f";\r
56 \r
57     public static final String CONTENT_TYPE_JSON = "application/json";\r
58 \r
59     public static final String CAMUNDA_AUTH = "camundaAuth";\r
60 \r
61     private final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";\r
62 \r
63     private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();\r
64 \r
65     private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL);\r
66 \r
67     private static boolean noProperties = true;\r
68 \r
69     public synchronized static MsoJavaProperties loadMsoProperties() {\r
70         MsoJavaProperties msoProperties;\r
71         try {\r
72             msoProperties = msoPropertiesFactory.getMsoJavaProperties(MSO_PROP_APIHANDLER_INFRA);\r
73         } catch(Exception e) {\r
74             msoLogger.error(MessageEnum.APIH_LOAD_PROPERTIES_FAIL, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError,\r
75                     "Exception when loading MSO Properties", e);\r
76             return null;\r
77         }\r
78 \r
79         if(msoProperties != null && msoProperties.size() > 0) {\r
80             noProperties = false;\r
81             msoLogger.info(MessageEnum.APIH_PROPERTY_LOAD_SUC, "", "");\r
82             return msoProperties;\r
83         } else {\r
84             msoLogger.error(MessageEnum.APIH_NO_PROPERTIES, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError,\r
85                     "No MSO APIH_INFRA Properties found");\r
86             return null;\r
87         }\r
88     }\r
89 \r
90     public synchronized static final boolean getNoPropertiesState() {\r
91         return noProperties;\r
92     }\r
93 \r
94     /**\r
95      * post the recipe Uri\r
96      * <br>\r
97      * \r
98      * @param recipeUri The request recipe uri\r
99      * @param requestId the request id\r
100      * @param recipeTimeout The recipe time out\r
101      * @param requestAction The request action\r
102      * @param serviceInstanceId The service instance id\r
103      * @param serviceType The service Type\r
104      * @param requestDetails The request Details, these information is from runtime\r
105      * @param recipeParamXsd The recipe params, its from recipe design\r
106      * @return The response of the recipe.\r
107      * @throws ClientProtocolException\r
108      * @throws IOException\r
109      * @since ONAP Beijing Release\r
110      */\r
111     public static HttpResponse post(String recipeUri, String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType,\r
112             String requestDetails, String recipeParamXsd) throws ClientProtocolException, IOException {\r
113 \r
114         HttpClient client = HttpClientBuilder.create().build();\r
115 \r
116         HttpPost post = new HttpPost(recipeUri);\r
117         MsoJavaProperties props = loadMsoProperties();\r
118         RequestConfig requestConfig =\r
119                 RequestConfig.custom().setSocketTimeout(recipeTimeout).setConnectTimeout(recipeTimeout).setConnectionRequestTimeout(recipeTimeout).build();\r
120         post.setConfig(requestConfig);\r
121         msoLogger.debug("call the bpmn,  url:" + recipeUri);\r
122         String jsonReq = wrapResourceRequest(requestId, recipeTimeout, requestAction, serviceInstanceId, serviceType, requestDetails, recipeParamXsd);\r
123 \r
124         StringEntity input = new StringEntity(jsonReq);\r
125         input.setContentType(CONTENT_TYPE_JSON);\r
126         String encryptedCredentials;\r
127         if(props != null) {\r
128             encryptedCredentials = props.getProperty(CAMUNDA_AUTH, null);\r
129             if(encryptedCredentials != null) {\r
130                 String userCredentials = getEncryptedPropValue(encryptedCredentials, DEFAULT_BPEL_AUTH, ENCRYPTION_KEY);\r
131                 if(userCredentials != null) {\r
132                     post.addHeader("Authorization", "Basic " + DatatypeConverter.printBase64Binary(userCredentials.getBytes()));\r
133                 }\r
134             }\r
135         }\r
136         post.setEntity(input);\r
137         return client.execute(post);\r
138     }\r
139 \r
140     /**\r
141      * prepare the resource recipe bpmn request.\r
142      * <br>\r
143      * \r
144      * @param requestId\r
145      * @param recipeTimeout\r
146      * @param requestAction\r
147      * @param serviceInstanceId\r
148      * @param serviceType\r
149      * @param requestDetails\r
150      * @param recipeParams\r
151      * @return\r
152      * @since ONAP Beijing Release\r
153      */\r
154     private static String wrapResourceRequest(String requestId, int recipeTimeout, String requestAction, String serviceInstanceId, String serviceType,\r
155             String requestDetails, String recipeParams) {\r
156         String jsonReq = null;\r
157         if(requestId == null) {\r
158             requestId = "";\r
159         }\r
160         if(requestAction == null) {\r
161             requestAction = "";\r
162         }\r
163         if(serviceInstanceId == null) {\r
164             serviceInstanceId = "";\r
165         }\r
166 \r
167         if(requestDetails == null) {\r
168             requestDetails = "";\r
169         }\r
170 \r
171         try {\r
172             ResourceRecipeRequest recipeRequest = new ResourceRecipeRequest();\r
173             BpmnParam resourceInput = new BpmnParam();\r
174             BpmnParam host = new BpmnParam();\r
175             BpmnParam requestIdInput = new BpmnParam();\r
176             BpmnParam requestActionInput = new BpmnParam();\r
177             BpmnParam serviceInstanceIdInput = new BpmnParam();\r
178             BpmnParam serviceTypeInput = new BpmnParam();\r
179             BpmnParam recipeParamsInput = new BpmnParam();\r
180             // host.setValue(parseURL());\r
181             requestIdInput.setValue(requestId);\r
182             requestActionInput.setValue(requestAction);\r
183             serviceInstanceIdInput.setValue(serviceInstanceId);\r
184             recipeParamsInput.setValue(recipeParams);\r
185             resourceInput.setValue(requestDetails);\r
186             recipeRequest.setHost(host);\r
187             recipeRequest.setRequestId(requestIdInput);\r
188             recipeRequest.setRequestAction(requestActionInput);\r
189             recipeRequest.setServiceInstanceId(serviceInstanceIdInput);\r
190             recipeRequest.setServiceType(serviceTypeInput);\r
191             recipeRequest.setRecipeParams(recipeParamsInput);\r
192             jsonReq = recipeRequest.toString();\r
193             msoLogger.debug("request body is " + jsonReq);\r
194         } catch(Exception e) {\r
195             msoLogger.error(MessageEnum.APIH_WARP_REQUEST, "Camunda", "wrapVIDRequest", MsoLogger.ErrorCode.BusinessProcesssError, "Error in APIH Warp request",\r
196                     e);\r
197         }\r
198         return jsonReq;\r
199     }\r
200 \r
201     /**\r
202      * <br>\r
203      * \r
204      * @param prop\r
205      * @param defaultValue\r
206      * @param encryptionKey\r
207      * @return\r
208      * @since ONAP Beijing Release\r
209      */\r
210     protected static String getEncryptedPropValue(String prop, String defaultValue, String encryptionKey) {\r
211         try {\r
212             return CryptoUtils.decrypt(prop, encryptionKey);\r
213         } catch(GeneralSecurityException e) {\r
214             msoLogger.debug("Security exception", e);\r
215         }\r
216         return defaultValue;\r
217     }\r
218 \r
219 }\r