e58a19572ec832e4b7813afca96c91e2de8a71a2
[portal/sdk.git] /
1 /*
2  * ============LICENSE_START==========================================
3  * ONAP Portal SDK
4  * ===================================================================
5  * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * ===================================================================
7  *
8  * Unless otherwise specified, all software contained herein is licensed
9  * under the Apache License, Version 2.0 (the "License");
10  * you may not use this software except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *             http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  * Unless otherwise specified, all documentation contained herein is licensed
22  * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
23  * you may not use this documentation except in compliance with the License.
24  * You may obtain a copy of the License at
25  *
26  *             https://creativecommons.org/licenses/by/4.0/
27  *
28  * Unless required by applicable law or agreed to in writing, documentation
29  * distributed under the License is distributed on an "AS IS" BASIS,
30  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31  * See the License for the specific language governing permissions and
32  * limitations under the License.
33  *
34  * ============LICENSE_END============================================
35  *
36  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
37  */
38 package org.onap.portalsdk.core.restful.client;
39
40 import java.io.IOException;
41 import java.net.URI;
42 import java.net.URISyntaxException;
43 import java.util.ArrayList;
44 import java.util.HashMap;
45 import java.util.List;
46
47 import org.apache.http.client.utils.URIBuilder;
48 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
49 import org.onap.portalsdk.core.onboarding.exception.CipherUtilException;
50 import org.onap.portalsdk.core.onboarding.util.PortalApiConstants;
51 import org.onap.portalsdk.core.onboarding.util.PortalApiProperties;
52 import org.onap.portalsdk.core.restful.domain.SharedContext;
53 import org.springframework.stereotype.Component;
54
55 import com.fasterxml.jackson.core.JsonProcessingException;
56 import com.fasterxml.jackson.core.type.TypeReference;
57 import com.fasterxml.jackson.databind.ObjectMapper;
58
59 /**
60  * Provides convenience methods to use the shared-context service at Portal.
61  * This hides all JSON; instead it accepts and returns Java objects. Usage
62  * caveats (repeated from superclass):
63  * <OL>
64  * <LI>Must be auto-wired by Spring, because this in turn auto-wires a data
65  * access service to read application credentials from the FN_APP table.
66  * <LI>If HTTP access is used and the server uses a self-signed certificate, the
67  * local trust store must be extended appropriately. The HTTP client throws
68  * exceptions if the JVM cannot validate the server certificate.
69  * </OL>
70  */
71 @Component
72 public class SharedContextRestClient extends PortalRestClientBase {
73
74         private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(SharedContextRestClient.class);
75
76         /**
77          * Reusable JSON (de)serializer
78          */
79         private final ObjectMapper mapper = new ObjectMapper();
80
81         /**
82          * Builds the URl for the shared context service using the portal.properties
83          * value for the AUXAPI endpoint.
84          * 
85          * @throws IllegalArgumentException
86          *             if the ECOMP_REST_URL property is not found
87          */
88         private String getSharedContextUrl() throws IllegalArgumentException {
89                 String restUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REST_URL);
90                 if (restUrl == null || restUrl.length() == 0)
91                         throw new IllegalArgumentException("getSharedContextUrl: no property " + PortalApiConstants.ECOMP_REST_URL);
92                 String contextUrl = restUrl + (restUrl.endsWith("/") ? "" : "/") + "context/";
93                 return contextUrl;
94         }
95
96         /**
97          * Gets the shared-context value for the specified context ID and key.
98          * 
99          * @param contextId
100          *            An Ecomp Portal session ID
101          * @param key
102          *            Key for the shared-context entry; e.g., "lastName"
103          * @return SharedContext object; null if not found.
104          * @throws Exception
105          *             If URI cannot be built, host cannot be reached, etc.
106          */
107         public SharedContext getContextValue(String contextId, String key) throws Exception {
108                 HttpStatusAndResponse hsr = getContext("get", contextId, key);
109                 logger.info(EELFLoggerDelegate.debugLogger, "getSharedContext: resp is " + hsr);
110                 if (hsr == null) {
111                         logger.error(EELFLoggerDelegate.applicationLogger, "getContextValue: unexpected null response");
112                         return null;
113                 }
114                 SharedContext jsonObj = mapper.readValue(hsr.getResponse(), SharedContext.class);
115                 // Response means no data.
116                 if (jsonObj != null && jsonObj.getResponse() != null)
117                         return null;
118                 return jsonObj;
119         }
120
121         /**
122          * Gets user information for the specified context ID.
123          * 
124          * @param contextId
125          *            An Ecomp Portal session ID
126          * @return List of SharedContext objects corresponding to the following keys:
127          *         USER_FIRST_NAME, USER_LAST_NAME, USER_EMAIL and USER_ORGUSERID; empty
128          *         if none were found; null if an error happens.
129          * @throws Exception
130          *             If URI cannot be built, host cannot be reached, etc.
131          */
132         public List<SharedContext> getUserContext(String contextId) throws Exception {
133                 HttpStatusAndResponse hsr = getContext("get_user", contextId, null);
134                 logger.info(EELFLoggerDelegate.debugLogger, "getUserContext: resp is " + hsr);
135                 if (hsr == null) {
136                         logger.error(EELFLoggerDelegate.applicationLogger, "getUserContext: unexpected null response");
137                         return new ArrayList<>();
138                 }
139                 TypeReference<List<SharedContext>> typeRef = new TypeReference<List<SharedContext>>() {
140                 };
141                 List<SharedContext> jsonList = mapper.readValue(hsr.getResponse(), typeRef);
142                 return jsonList;
143         }
144
145         /**
146          * Checks whether a shared-context entry exists for the specified context ID and
147          * key.
148          * 
149          * @param contextId
150          *            An Ecomp Portal session ID
151          * @param key
152          *            Key for the shared-context entry; e.g., "lastName"
153          * @return True if the object exists, false otherwise; null on error.
154          * @throws Exception
155          *             If URI cannot be built, host cannot be reached, etc.
156          */
157         public Boolean checkSharedContext(String contextId, String key) throws Exception {
158                 HttpStatusAndResponse hsr = getContext("check", contextId, key);
159                 logger.info(EELFLoggerDelegate.debugLogger, "checkSharedContext: resp is " + hsr);
160                 if (hsr == null) {
161                         logger.error(EELFLoggerDelegate.applicationLogger, "checkSharedContext: unexpected null response");
162                         return null;
163                 }
164                 SharedContext jsonObj = mapper.readValue(hsr.getResponse(), SharedContext.class);
165                 String response = jsonObj.getResponse();
166                 if (response == null)
167                         return null;
168                 return "exists".equals(response);
169         }
170
171         /**
172          * Removes a shared-context entry with the specified context ID and key.
173          * 
174          * @param contextId
175          *            An Ecomp Portal session ID
176          * @param key
177          *            Key for the shared-context entry; e.g., "lastName"
178          * @return True if the entry was removed, false otherwise; null on error.
179          * @throws Exception
180          *             If URI cannot be built, host cannot be reached, etc.
181          */
182         public Boolean removeSharedContext(String contextId, String key) throws Exception {
183                 HttpStatusAndResponse hsr = getContext("remove", contextId, key);
184                 logger.info(EELFLoggerDelegate.debugLogger, "removeSharedContext: resp is " + hsr);
185                 if (hsr == null) {
186                         logger.error(EELFLoggerDelegate.applicationLogger, "removeSharedContext: unexpected null response");
187                         return null;
188                 }
189                 SharedContext jsonObj = mapper.readValue(hsr.getResponse(), SharedContext.class);
190                 if (jsonObj == null)
191                         return null;
192                 String response = jsonObj.getResponse();
193                 return "removed".equals(response);
194         }
195
196         /**
197          * Clears the shared context for the specified context ID; i.e., removes all
198          * key-value pairs.
199          * 
200          * @param contextId
201          *            An Ecomp Portal session ID
202          * @return Number of key-value pairs removed; -1 if not found or any problems
203          *         occur.
204          * @throws Exception
205          *             If URI cannot be built, host cannot be reached, etc.
206          */
207         public int clearSharedContext(String contextId) throws Exception {
208                 HttpStatusAndResponse hsr = getContext("remove", contextId, null);
209                 logger.info(EELFLoggerDelegate.debugLogger, "clearSharedContext: resp is " + hsr);
210                 if (hsr == null) {
211                         logger.error(EELFLoggerDelegate.applicationLogger, "clearSharedContext: unexpected null response");
212                         return -1;
213                 }
214                 SharedContext jsonObj = mapper.readValue(hsr.getResponse(), SharedContext.class);
215                 if (jsonObj == null)
216                         return -1;
217                 String response = jsonObj.getResponse();
218                 if (response == null)
219                         return -1;
220                 return Integer.parseInt(response);
221         }
222
223         /**
224          * Creates a shared-context entry.
225          * 
226          * @param contextId
227          *            An Ecomp Portal session ID
228          * @param key
229          *            Key for the shared-context entry; e.g., "lastName"
230          * @param value
231          *            Value for the entry
232          * @return True if the object previously existed, false otherwise; null if any
233          *         problem happened.
234          * @throws Exception
235          *             If URI cannot be built, host cannot be reached, etc.
236          */
237         public Boolean setSharedContext(String contextId, String key, String value) throws Exception {
238                 String body = buildContext(contextId, key, value);
239                 HttpStatusAndResponse hsr = postContext("set", body);
240                 logger.info(EELFLoggerDelegate.debugLogger, "setSharedContext: resp is " + hsr);
241                 if (hsr == null) {
242                         logger.error(EELFLoggerDelegate.applicationLogger, "setSharedContext: unexpected null response");
243                         return null;
244                 }
245                 SharedContext jsonObj = mapper.readValue(hsr.getResponse(), SharedContext.class);
246                 if (jsonObj == null)
247                         return null;
248                 String response = jsonObj.getResponse();
249                 return "replaced".equals(response);
250         }
251
252         /**
253          * Builds the full URL with the specified parameters, then calls the method that
254          * adds credentials and GETs.
255          * 
256          * @param requestPath
257          * @param contextId
258          * @param contextKey
259          * @return HttpStatusAndResponse object; may be null.
260          * @throws URISyntaxException
261          * @throws IllegalArgumentException
262          * @throws IOException
263          * @throws CipherUtilException
264          */
265         private HttpStatusAndResponse getContext(String requestPath, String contextId, String contextKey)
266                         throws IllegalArgumentException, URISyntaxException, CipherUtilException, IOException {
267                 URIBuilder uriBuilder = new URIBuilder(getSharedContextUrl() + requestPath);
268                 uriBuilder.addParameter("context_id", contextId);
269                 if (contextKey != null)
270                         uriBuilder.addParameter("ckey", contextKey);
271                 final URI uri = uriBuilder.build();
272                 return getRestWithCredentials(uri);
273         }
274
275         /**
276          * Builds the full URL, then calls the method that adds credentials and POSTs.
277          * 
278          * @param requestPath
279          * @param contextId
280          * @param contextKey
281          * @return HttpStatusAndResponse object; may be null.
282          * @throws IOException
283          * @throws CipherUtilException
284          * @throws URISyntaxException
285          * @throws IllegalArgumentException
286          */
287         private HttpStatusAndResponse postContext(String requestPath, String json)
288                         throws CipherUtilException, IOException, IllegalArgumentException, URISyntaxException {
289                 URIBuilder uriBuilder = new URIBuilder(getSharedContextUrl() + requestPath);
290                 URI uri = uriBuilder.build();
291                 return postRestWithCredentials(uri, json);
292         }
293
294         /**
295          * Builds a JSON block with a single shared-context entry.
296          * 
297          * @param cxid
298          *            Context ID
299          * @param ckey
300          *            Context Key
301          * @param cvalue
302          *            Context value
303          * @return JSON block
304          */
305         private String buildContext(String cxid, String ckey, String cvalue) throws JsonProcessingException {
306                 HashMap<String, String> stringMap = new HashMap<>();
307                 stringMap.put("context_id", cxid);
308                 stringMap.put("ckey", ckey);
309                 stringMap.put("cvalue", cvalue);
310                 String json = mapper.writeValueAsString(stringMap);
311                 return json;
312         }
313
314         // Simple test scaffold
315         public static void main(String[] args) throws Exception {
316                 SharedContextRestClient client = new SharedContextRestClient();
317                 SharedContext get = client.getContextValue("abc", "123");
318                 System.out.println("Get yields " + get.toString());
319         }
320
321 }