23bfe8838afeebaa12761f0049668b25a82d096f
[aai/sparky-be.git] / src / main / java / org / onap / aai / sparky / dal / proxy / processor / AaiUiProxyProcessor.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017-2018 Amdocs
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 package org.onap.aai.sparky.dal.proxy.processor;
22
23 import java.util.Arrays;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27
28 import javax.json.Json;
29 import javax.json.JsonObjectBuilder;
30 import javax.servlet.http.HttpServletRequest;
31
32 import org.apache.camel.Exchange;
33 import org.onap.aai.cl.api.Logger;
34 import org.onap.aai.cl.eelf.LoggerFactory;
35 import org.onap.aai.cl.mdc.MdcContext;
36 import org.onap.aai.restclient.client.OperationResult;
37 import org.onap.aai.restclient.client.RestClient;
38 import org.onap.aai.restclient.rest.HttpUtil;
39 import org.onap.aai.sparky.dal.rest.RestClientConstructionException;
40 import org.onap.aai.sparky.dal.rest.RestClientFactory;
41 import org.onap.aai.sparky.dal.rest.config.RestEndpointConfig;
42 import org.onap.aai.sparky.logging.AaiUiMsgs;
43 import org.onap.aai.sparky.util.NodeUtils;
44 import org.onap.aai.sparky.viewandinspect.config.SparkyConstants;
45 import org.slf4j.MDC;
46
47 /**
48  * The Class AaiUiProxyProcessor.
49  */
50 public class AaiUiProxyProcessor {
51   private static final Logger LOG =
52       LoggerFactory.getInstance().getLogger(AaiUiProxyProcessor.class);
53   private static Logger auditLogger =
54       LoggerFactory.getInstance().getAuditLogger(AaiUiProxyProcessor.class.getName());
55
56   private RestClient client;
57   private String synapseBaseUrl;
58
59   private OperationResult operationResult = null;
60
61   private String xTransactionId;
62   private String xFromAppId;
63
64   private static final String ROUTER_SERVICE = "routerService";
65
66
67   /**
68    * Instantiates a new AaiUiProxyProcessor.
69    * 
70    * @throws RestClientConstructionException
71    */
72
73   public AaiUiProxyProcessor(RestEndpointConfig endpointConfig, String apiGatewayEndpoint)
74       throws RestClientConstructionException {
75     client = RestClientFactory.buildClient(endpointConfig);
76     synapseBaseUrl = "https://" + endpointConfig.getEndpointIpAddress() + ":"
77         + endpointConfig.getEndpointServerPort() + "/" + apiGatewayEndpoint;
78   }
79
80
81   void setUpMdcContext(final Exchange exchange, final HttpServletRequest request) {
82
83     Object xTransactionId = exchange.getIn().getHeader("X-TransactionId");
84     if (xTransactionId == null) {
85       this.xTransactionId = NodeUtils.getRandomTxnId();
86     } else {
87       this.xTransactionId = (String) xTransactionId;
88     }
89
90     Object partnerName = exchange.getIn().getHeader("X-FromAppId");
91     if (partnerName == null) {
92       xFromAppId = "Browser";
93     } else {
94       xFromAppId = (String) partnerName;
95     }
96
97     MdcContext.initialize((String) xTransactionId, "AAI-UI", "", xFromAppId,
98         request.getRequestURI() + ":" + request.getLocalPort());
99   }
100
101   private Map<String, List<String>> getHeaders() {
102     Map<String, List<String>> headers = new HashMap<>();
103     headers.put("X-FromAppId", Arrays.asList(SparkyConstants.APP_NAME));
104     headers.put("X-TransactionId", Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));
105     headers.put("X-FromAppId", Arrays.asList(MDC.get(MdcContext.MDC_PARTNER_NAME)));
106     return headers;
107   }
108
109   private String getProxyPayloadAsString(final Exchange exchange) {
110     JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
111     String srcUri = "";
112     try {
113       srcUri = (String) exchange.getIn().getHeader(Exchange.HTTP_URI);
114       jsonBuilder.add("origin-uri", srcUri);
115
116       String body = exchange.getIn().getBody(String.class);
117
118       if (body != null && body.length() != 0) {
119         jsonBuilder.add("origin-payload", body);
120       }
121
122     } catch (Exception e) {
123       LOG.error(AaiUiMsgs.ERROR_GENERIC,
124           "Failed to extract payload for proxying.\n" + "Requestor URL: " + srcUri);
125     }
126
127     return jsonBuilder.build().toString();
128   }
129
130   private String getSynapseUrl(String requestUri) {
131     String url = "";
132     int pos = requestUri.indexOf(ROUTER_SERVICE);
133     if (pos != -1) {
134       url = synapseBaseUrl + requestUri.substring(pos + ROUTER_SERVICE.length());
135     } else {
136       LOG.error(AaiUiMsgs.DR_REQUEST_URI_FOR_PROXY_UNKNOWN, requestUri);
137     }
138     return url;
139   }
140
141   public void proxyMessage(Exchange exchange) {
142     HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
143
144     setUpMdcContext(exchange, request);
145
146     try {
147       Map<String, List<String>> headers = getHeaders();
148       String proxyPayload = getProxyPayloadAsString(exchange);
149       String fromUrl = (String) exchange.getIn().getHeader(Exchange.HTTP_URI);
150       String toUrl = getSynapseUrl(fromUrl);
151       auditLogger.info(AaiUiMsgs.DR_PROXY_FROM_TO, fromUrl, toUrl);
152       LOG.debug(AaiUiMsgs.DEBUG_GENERIC,
153           "Proxying request:\n" + proxyPayload + "\n" + "Target URL:\n" + toUrl);
154
155       long startTimeInMs = System.currentTimeMillis();
156
157       operationResult = client.post(toUrl, proxyPayload, headers,
158           javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE,
159           javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE);
160
161       long drOpTime = (System.currentTimeMillis() - startTimeInMs);
162       int rc = operationResult.getResultCode();
163       String result = "";
164
165       if (HttpUtil.isHttpResponseClassSuccess(rc)) {
166         result = operationResult.getResult();
167       } else {
168         result = operationResult.getFailureCause();
169         LOG.info(AaiUiMsgs.DR_PROCESSING_FAILURE, String.valueOf(rc), proxyPayload);
170       }
171
172       auditLogger.info(AaiUiMsgs.DR_PROCESSING_TIME, String.valueOf(drOpTime));
173
174       exchange.getOut().setHeader("X-TransactionId", xTransactionId);
175       exchange.getOut().setHeader("X-FromAppId", xFromAppId);
176       exchange.getOut().setHeader("RequestUrl", request.getRequestURI());
177       exchange.getOut().setHeader("RequestPort", request.getLocalPort());
178       exchange.getOut().setBody(result);
179     } catch (Exception exc) {
180       LOG.error(AaiUiMsgs.ERROR_PROCESSING_REQUEST, exc);
181     }
182   }
183
184   public String getSynapseBaseUrl() {
185     return synapseBaseUrl;
186   }
187
188   public void setSynapseBaseUrl(String synapseBaseUrl) {
189     this.synapseBaseUrl = synapseBaseUrl;
190   }
191
192   public RestClient getClient() {
193     return client;
194   }
195
196   public void setClient(RestClient client) {
197     this.client = client;
198   }
199
200   protected OperationResult getOperationResult() {
201     return operationResult;
202   }
203 }