Convert Sparky to Spring-Boot
[aai/sparky-be.git] / sparkybe-onap-service / src / main / java / org / onap / aai / sparky / dal / proxy / processor / AaiUiProxyProcessor.java
1 /**
2  * ============LICENSE_START===================================================
3  * SPARKY (AAI UI service)
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.onap.aai.sparky.dal.proxy.processor;
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.json.Json;
33 import javax.json.JsonObjectBuilder;
34 import javax.servlet.http.HttpServletRequest;
35
36 import org.apache.camel.Exchange;
37 import org.onap.aai.cl.api.Logger;
38 import org.onap.aai.cl.eelf.LoggerFactory;
39 import org.onap.aai.cl.mdc.MdcContext;
40 import org.onap.aai.restclient.client.OperationResult;
41 import org.onap.aai.restclient.client.RestClient;
42 import org.onap.aai.restclient.rest.HttpUtil;
43 import org.onap.aai.sparky.dal.rest.RestClientConstructionException;
44 import org.onap.aai.sparky.dal.rest.RestClientFactory;
45 import org.onap.aai.sparky.dal.rest.config.RestEndpointConfig;
46 import org.onap.aai.sparky.logging.AaiUiMsgs;
47 import org.onap.aai.sparky.util.NodeUtils;
48 import org.onap.aai.sparky.viewandinspect.config.SparkyConstants;
49 import org.slf4j.MDC;
50
51 /**
52  * The Class AaiUiProxyProcessor.
53  */
54 public class AaiUiProxyProcessor {
55   private static final Logger LOG =
56       LoggerFactory.getInstance().getLogger(AaiUiProxyProcessor.class);
57   private static Logger auditLogger =
58       LoggerFactory.getInstance().getAuditLogger(AaiUiProxyProcessor.class.getName());
59
60   private RestClient client;
61   private String synapseBaseUrl;
62
63   private OperationResult operationResult = null;
64
65   private String xTransactionId;
66   private String xFromAppId;
67
68   private static final String ROUTER_SERVICE = "routerService";
69
70
71   /**
72    * Instantiates a new AaiUiProxyProcessor.
73    * 
74    * @throws RestClientConstructionException
75    */
76
77   public AaiUiProxyProcessor(RestEndpointConfig endpointConfig, String apiGatewayEndpoint)
78       throws RestClientConstructionException {
79     client = RestClientFactory.buildClient(endpointConfig);
80     synapseBaseUrl = "https://" + endpointConfig.getEndpointIpAddress() + ":"
81         + endpointConfig.getEndpointServerPort() + "/" + apiGatewayEndpoint;
82   }
83
84
85   void setUpMdcContext(final Exchange exchange, final HttpServletRequest request) {
86
87     Object xTransactionId = exchange.getIn().getHeader("X-TransactionId");
88     if (xTransactionId == null) {
89       this.xTransactionId = NodeUtils.getRandomTxnId();
90     } else {
91       this.xTransactionId = (String) xTransactionId;
92     }
93
94     Object partnerName = exchange.getIn().getHeader("X-FromAppId");
95     if (partnerName == null) {
96       xFromAppId = "Browser";
97     } else {
98       xFromAppId = (String) partnerName;
99     }
100
101     MdcContext.initialize((String) xTransactionId, "AAI-UI", "", xFromAppId,
102         request.getRequestURI() + ":" + request.getLocalPort());
103   }
104
105   private Map<String, List<String>> getHeaders() {
106     Map<String, List<String>> headers = new HashMap<>();
107     headers.put("X-FromAppId", Arrays.asList(SparkyConstants.APP_NAME));
108     headers.put("X-TransactionId", Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));
109     headers.put("X-FromAppId", Arrays.asList(MDC.get(MdcContext.MDC_PARTNER_NAME)));
110     return headers;
111   }
112
113   private String getProxyPayloadAsString(final Exchange exchange) {
114     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
115     String srcUri = "";
116     try {
117       srcUri = (String) exchange.getIn().getHeader(Exchange.HTTP_URI);
118       jsonBuilder.add("origin-uri", srcUri);
119
120       String body = exchange.getIn().getBody(String.class);
121
122       if (body != null && body.length() != 0) {
123         jsonBuilder.add("origin-payload", body);
124       }
125
126     } catch (Exception e) {
127       LOG.error(AaiUiMsgs.ERROR_GENERIC,
128           "Failed to extract payload for proxying.\n" + "Requestor URL: " + srcUri);
129     }
130
131     return jsonBuilder.build().toString();
132   }
133
134   private String getSynapseUrl(String requestUri) {
135     String url = "";
136     int pos = requestUri.indexOf(ROUTER_SERVICE);
137     if (pos != -1) {
138       url = synapseBaseUrl + requestUri.substring(pos + ROUTER_SERVICE.length());
139     } else {
140       LOG.error(AaiUiMsgs.DR_REQUEST_URI_FOR_PROXY_UNKNOWN, requestUri);
141     }
142     return url;
143   }
144
145   public void proxyMessage(Exchange exchange) {
146     HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
147
148     setUpMdcContext(exchange, request);
149
150     try {
151       Map<String, List<String>> headers = getHeaders();
152       String proxyPayload = getProxyPayloadAsString(exchange);
153       String fromUrl = (String) exchange.getIn().getHeader(Exchange.HTTP_URI);
154       String toUrl = getSynapseUrl(fromUrl);
155       auditLogger.info(AaiUiMsgs.DR_PROXY_FROM_TO, fromUrl, toUrl);
156       LOG.debug(AaiUiMsgs.DEBUG_GENERIC,
157           "Proxying request:\n" + proxyPayload + "\n" + "Target URL:\n" + toUrl);
158
159       long startTimeInMs = System.currentTimeMillis();
160
161       operationResult = client.post(toUrl, proxyPayload, headers,
162           javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE,
163           javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE);
164
165       long drOpTime = (System.currentTimeMillis() - startTimeInMs);
166       int rc = operationResult.getResultCode();
167       String result = "";
168
169       if (HttpUtil.isHttpResponseClassSuccess(rc)) {
170         result = operationResult.getResult();
171       } else {
172         result = operationResult.getFailureCause();
173         LOG.info(AaiUiMsgs.DR_PROCESSING_FAILURE, String.valueOf(rc), proxyPayload);
174       }
175
176       auditLogger.info(AaiUiMsgs.DR_PROCESSING_TIME, String.valueOf(drOpTime));
177
178       exchange.getOut().setHeader("X-TransactionId", xTransactionId);
179       exchange.getOut().setHeader("X-FromAppId", xFromAppId);
180       exchange.getOut().setHeader("RequestUrl", request.getRequestURI());
181       exchange.getOut().setHeader("RequestPort", request.getLocalPort());
182       exchange.getOut().setBody(result);
183     } catch (Exception exc) {
184       LOG.error(AaiUiMsgs.ERROR_PROCESSING_REQUEST, exc);
185     }
186   }
187
188   public String getSynapseBaseUrl() {
189     return synapseBaseUrl;
190   }
191
192   public void setSynapseBaseUrl(String synapseBaseUrl) {
193     this.synapseBaseUrl = synapseBaseUrl;
194   }
195
196   public RestClient getClient() {
197     return client;
198   }
199
200   public void setClient(RestClient client) {
201     this.client = client;
202   }
203
204   protected OperationResult getOperationResult() {
205     return operationResult;
206   }
207 }