Adding support for external microservice
[aai/data-router.git] / src / main / java / org / openecomp / datarouter / util / client / NoAuthRestClient.java
1 /**
2  * ============LICENSE_START=======================================================
3  * DataRouter
4  * ================================================================================
5  * Copyright © 2017 AT&T Intellectual Property.
6  * Copyright © 2017 Amdocs
7  * All rights reserved.
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file 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  * ============LICENSE_END=========================================================
21  *
22  * ECOMP and OpenECOMP are trademarks
23  * and service marks of AT&T Intellectual Property.
24  */
25 package org.openecomp.datarouter.util.client;
26
27 import java.util.Arrays;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Map;
31
32 import javax.ws.rs.core.MediaType;
33
34 import org.apache.camel.Exchange;
35 import org.apache.camel.component.http.HttpMessage;
36 import org.apache.camel.Message;
37 import org.openecomp.cl.api.Logger;
38 import org.openecomp.cl.eelf.LoggerFactory;
39 import org.openecomp.cl.mdc.MdcContext;
40 import org.openecomp.datarouter.logging.DataRouterMsgs;
41 import org.openecomp.datarouter.util.AaiUiSvcPolicyUtil;
42 import org.openecomp.datarouter.util.NodeUtils;
43 import org.openecomp.datarouter.util.RouterServiceUtil;
44 import org.openecomp.restclient.client.Headers;
45 import org.openecomp.restclient.client.OperationResult;
46 import org.openecomp.restclient.client.RestClient;
47 import org.openecomp.restclient.enums.RestAuthenticationMode;
48 import org.slf4j.MDC;
49
50 import org.springframework.http.HttpStatus;
51
52 import org.openecomp.restclient.rest.HttpUtil;
53 import com.fasterxml.jackson.databind.JsonNode;
54
55 public class NoAuthRestClient implements SvcRoutingRestClient {
56
57   private RestClient restClient;
58   
59   private String host;
60   private String port;
61   private String originUrl;
62   private String targetUri;
63   private JsonNode targetPayload;
64   private Logger logger;
65   private Logger auditLogger;
66   
67   public NoAuthRestClient(int connectTimeOut, int readTimeOut) {
68     LoggerFactory loggerFactoryInstance = LoggerFactory.getInstance();
69     logger = loggerFactoryInstance.getLogger(NoAuthRestClient.class.getName());
70     auditLogger = loggerFactoryInstance.getAuditLogger(NoAuthRestClient.class.getName());
71     restClient = new RestClient().authenticationMode(RestAuthenticationMode.HTTP_NOAUTH)
72         .connectTimeoutMs(connectTimeOut).readTimeoutMs(readTimeOut);
73   }
74   
75
76   private OperationResult getResults(String url, JsonNode payload){
77     Map<String, List<String>> headers = new HashMap<>();
78     headers.put(Headers.FROM_APP_ID, Arrays.asList("Synapse"));
79     headers.put(Headers.TRANSACTION_ID, Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));
80     return this.getRestClient().post(url, payload.asText(), headers, MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);
81   }
82   
83   public final void handleRequest (String host, String port, Exchange exchange) throws Exception {
84     RouterServiceUtil.setMdcContext(exchange);
85     Message message = exchange.getIn();
86     String body = message.getBody(String.class);
87     OperationResult result = new OperationResult();
88     
89     this.setHost(host);
90     this.setPort(port);
91     
92     this.setOriginUrl(message.getHeader(Exchange.HTTP_URL).toString());
93     if (body != null && body.length() != 0) {
94       JsonNode node = NodeUtils.convertJsonStrToJsonNode(body);
95       this.setTargetPayload(AaiUiSvcPolicyUtil.getOriginPayload(node));
96       this.setTargetUri(AaiUiSvcPolicyUtil.getTargetUri(node));
97     } 
98
99     if ( this.getTargetPayload() == null || this.getTargetUri() == null){
100       logger.error(DataRouterMsgs.INVALID_ORIGIN_PAYLOAD, body);
101       result.setResultCode(HttpStatus.BAD_REQUEST.value());
102       result.setFailureCause("Invalid payload");
103     }
104     
105     String targetUrl = "http://" + host + ":" + port + "/" + this.targetUri;
106     auditLogger.info(DataRouterMsgs.ROUTING_FROM_TO, this.getOriginUrl(), targetUrl);
107     long startTimeInMs = System.currentTimeMillis();
108
109     result = this.getResults(targetUrl, targetPayload);
110
111     long targetMsOpTime = (System.currentTimeMillis() - startTimeInMs);
112     auditLogger.info(DataRouterMsgs.OP_TIME, "Target service at "+ targetUrl, String.valueOf(targetMsOpTime));
113     
114     int rc = result.getResultCode();
115     String resultStr = "";
116     if (HttpUtil.isHttpResponseClassSuccess(rc)) {
117       resultStr = result.getResult();
118     } else {
119       resultStr = result.getFailureCause();
120     }
121     
122     logger.debug(DataRouterMsgs.ROUTING_RESPONSE, targetUrl, result.toString());
123     exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, rc);
124     exchange.getOut().setBody(resultStr);
125   }
126
127
128   /* (non-Javadoc)
129    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#getHost()
130    */
131   @Override
132   public String getHost() {
133     return host;
134   }
135
136   /* (non-Javadoc)
137    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#setHost(java.lang.String)
138    */
139   @Override
140   public void setHost(String host) {
141     this.host = host;
142   }
143
144
145   /* (non-Javadoc)
146    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#getPort()
147    */
148   @Override
149   public String getPort() {
150     return port;
151   }
152
153
154   /* (non-Javadoc)
155    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#setPort(java.lang.String)
156    */
157   @Override
158   public void setPort(String port) {
159     this.port = port;
160   }
161
162
163   /* (non-Javadoc)
164    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#getTargetUri()
165    */
166   @Override
167   public String getTargetUri() {
168     return targetUri;
169   }
170
171
172   /* (non-Javadoc)
173    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#setTargetUri(java.lang.String)
174    */
175   @Override
176   public void setTargetUri(String targetUri) {
177     this.targetUri = targetUri;
178   }
179
180
181   /* (non-Javadoc)
182    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#getTargetPayload()
183    */
184   @Override
185   public JsonNode getTargetPayload() {
186     return targetPayload;
187   }
188
189
190   /* (non-Javadoc)
191    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#setTargetPayload(com.fasterxml.jackson.databind.JsonNode)
192    */
193   @Override
194   public void setTargetPayload(JsonNode targetPayload) {
195     this.targetPayload = targetPayload;
196   }
197
198
199   /* (non-Javadoc)
200    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#getRestClient()
201    */
202   @Override
203   public RestClient getRestClient() {
204     return restClient;
205   }
206   
207   /* (non-Javadoc)
208    * @see org.openecomp.datarouter.util.client.SvcRoutingRestClient#setRestClient()
209    */
210   @Override
211   public void setRestClient(RestClient client) {
212     this.restClient = client;
213   }
214
215
216   public String getOriginUrl() {
217     return originUrl;
218   }
219
220
221   public void setOriginUrl(String originUrl) {
222     this.originUrl = originUrl;
223   }
224  
225
226 }