summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/onap/aai/sparky/dal/proxy/processor/AaiUiProxyProcessor.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/onap/aai/sparky/dal/proxy/processor/AaiUiProxyProcessor.java')
-rw-r--r--src/main/java/org/onap/aai/sparky/dal/proxy/processor/AaiUiProxyProcessor.java227
1 files changed, 227 insertions, 0 deletions
diff --git a/src/main/java/org/onap/aai/sparky/dal/proxy/processor/AaiUiProxyProcessor.java b/src/main/java/org/onap/aai/sparky/dal/proxy/processor/AaiUiProxyProcessor.java
new file mode 100644
index 0000000..444a34b
--- /dev/null
+++ b/src/main/java/org/onap/aai/sparky/dal/proxy/processor/AaiUiProxyProcessor.java
@@ -0,0 +1,227 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright © 2017 Amdocs
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.sparky.dal.proxy.processor;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.json.Json;
+import javax.json.JsonObjectBuilder;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.camel.Exchange;
+import org.onap.aai.cl.api.Logger;
+import org.onap.aai.cl.eelf.LoggerFactory;
+import org.onap.aai.cl.mdc.MdcContext;
+import org.onap.aai.restclient.client.OperationResult;
+import org.onap.aai.restclient.client.RestClient;
+import org.onap.aai.restclient.rest.HttpUtil;
+import org.onap.aai.sparky.dal.proxy.config.DataRouterConfig;
+import org.onap.aai.sparky.logging.AaiUiMsgs;
+import org.onap.aai.sparky.util.ConfigHelper;
+import org.onap.aai.sparky.util.Encryptor;
+import org.onap.aai.sparky.util.NodeUtils;
+import org.onap.aai.sparky.viewandinspect.config.TierSupportUiConstants;
+import org.slf4j.MDC;
+
+/**
+ * The Class AaiUiProxyProcessor.
+ */
+public class AaiUiProxyProcessor {
+ private static final Logger LOG =
+ LoggerFactory.getInstance().getLogger(AaiUiProxyProcessor.class);
+ private static Logger auditLogger =
+ LoggerFactory.getInstance().getAuditLogger(AaiUiProxyProcessor.class.getName());
+ public String configFile =
+ TierSupportUiConstants.DYNAMIC_CONFIG_APP_LOCATION + "data-router.properties";
+
+ private RestClient client;
+ private DataRouterConfig config;
+ private String drBaseUrl;
+ private OperationResult operationResult = null;
+
+ private String xTransactionId;
+ private String xFromAppId;
+
+ private static final String ROUTER_SERVICE = "routerService";
+
+ public String getDrBaseUrl() {
+ return drBaseUrl;
+ }
+
+ public void setDrBaseUrl(String drBaseUrl) {
+ this.drBaseUrl = drBaseUrl;
+ }
+
+ /**
+ * Instantiates a new AaiUiProxyProcessor.
+ */
+
+ public AaiUiProxyProcessor() {
+ Properties props = ConfigHelper.loadConfigFromExplicitPath(configFile);
+ config = new DataRouterConfig(props);
+ initializeProxyProcessor(config);
+ }
+
+ public AaiUiProxyProcessor(DataRouterConfig config) {
+ initializeProxyProcessor(config);
+ }
+
+ private void initializeProxyProcessor(DataRouterConfig config) {
+ Encryptor encryptor = new Encryptor();
+ client = new RestClient().validateServerHostname(false).validateServerCertChain(false)
+ .clientCertFile(TierSupportUiConstants.CONFIG_AUTH_LOCATION + config.getCertName())
+ .clientCertPassword(encryptor.decryptValue(config.getKeystorePassword()))
+ .trustStore(TierSupportUiConstants.CONFIG_AUTH_LOCATION + config.getKeystore())
+ .connectTimeoutMs(config.getConnectTimeout()).readTimeoutMs(config.getReadTimeout());
+
+ drBaseUrl =
+ "https://" + config.getHost() + ":" + config.getPort() + "/" + config.getDrUriSuffix();
+ }
+
+ void setUpMdcContext(final Exchange exchange, final HttpServletRequest request) {
+
+ Object xTransactionId = exchange.getIn().getHeader("X-TransactionId");
+ if (xTransactionId == null) {
+ this.xTransactionId = NodeUtils.getRandomTxnId();
+ } else {
+ this.xTransactionId = (String) xTransactionId;
+ }
+
+ Object partnerName = exchange.getIn().getHeader("X-FromAppId");
+ if (partnerName == null) {
+ xFromAppId = "Browser";
+ } else {
+ xFromAppId = (String) partnerName;
+ }
+
+ MdcContext.initialize((String) xTransactionId, "AAI-UI", "", xFromAppId,
+ request.getRequestURI() + ":" + request.getLocalPort());
+ }
+
+ private Map<String, List<String>> getHeaders() {
+ Map<String, List<String>> headers = new HashMap<>();
+ headers.put("X-FromAppId", Arrays.asList(TierSupportUiConstants.APP_NAME));
+ headers.put("X-TransactionId", Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));
+ headers.put("X-FromAppId", Arrays.asList(MDC.get(MdcContext.MDC_PARTNER_NAME)));
+ return headers;
+ }
+
+ private String getProxyPayloadAsString(final Exchange exchange) {
+ JsonObjectBuilder jsonBuilder = Json.createObjectBuilder();
+ String srcUri = "";
+ try {
+ srcUri = (String) exchange.getIn().getHeader(Exchange.HTTP_URI);
+ jsonBuilder.add("origin-uri", srcUri);
+
+ String body = exchange.getIn().getBody(String.class);
+
+ if (body != null && body.length() != 0) {
+ jsonBuilder.add("origin-payload", body);
+ }
+
+ } catch (Exception e) {
+ LOG.error(AaiUiMsgs.ERROR_GENERIC,
+ "Failed to extract payload for proxying.\n" + "Requestor URL: " + srcUri);
+ }
+
+ return jsonBuilder.build().toString();
+ }
+
+ private String getDrUrl(String requestUri) {
+ String url = "";
+ int pos = requestUri.indexOf(ROUTER_SERVICE);
+ if (pos != -1) {
+ url = drBaseUrl + requestUri.substring(pos + ROUTER_SERVICE.length());
+ } else {
+ LOG.error(AaiUiMsgs.DR_REQUEST_URI_FOR_PROXY_UNKNOWN, requestUri);
+ }
+ return url;
+ }
+
+ public void proxyMessage(Exchange exchange) {
+ HttpServletRequest request = exchange.getIn().getBody(HttpServletRequest.class);
+
+ setUpMdcContext(exchange, request);
+
+ try {
+ Map<String, List<String>> headers = getHeaders();
+ String proxyPayload = getProxyPayloadAsString(exchange);
+ String fromUrl = (String) exchange.getIn().getHeader(Exchange.HTTP_URI);
+ String toUrl = getDrUrl(fromUrl);
+ auditLogger.info(AaiUiMsgs.DR_PROXY_FROM_TO, fromUrl, toUrl);
+ LOG.debug(AaiUiMsgs.DEBUG_GENERIC,
+ "Proxying request:\n" + proxyPayload + "\n" + "Target URL:\n" + toUrl);
+
+ long startTimeInMs = System.currentTimeMillis();
+
+ operationResult = client.post(toUrl, proxyPayload, headers,
+ javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE,
+ javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE);
+
+ long drOpTime = (System.currentTimeMillis() - startTimeInMs);
+ int rc = operationResult.getResultCode();
+ String result = "";
+
+ if (HttpUtil.isHttpResponseClassSuccess(rc)) {
+ result = operationResult.getResult();
+ } else {
+ result = operationResult.getFailureCause();
+ LOG.info(AaiUiMsgs.DR_PROCESSING_FAILURE, String.valueOf(rc), proxyPayload);
+ }
+
+ auditLogger.info(AaiUiMsgs.DR_PROCESSING_TIME, String.valueOf(drOpTime));
+
+ exchange.getOut().setHeader("X-TransactionId", xTransactionId);
+ exchange.getOut().setHeader("X-FromAppId", xFromAppId);
+ exchange.getOut().setHeader("RequestUrl", request.getRequestURI());
+ exchange.getOut().setHeader("RequestPort", request.getLocalPort());
+ exchange.getOut().setBody(result);
+ } catch (Exception exc) {
+ LOG.error(AaiUiMsgs.ERROR_PROCESSING_REQUEST, exc);
+ }
+ }
+
+ public RestClient getClient() {
+ return client;
+ }
+
+ public void setClient(RestClient client) {
+ this.client = client;
+ }
+
+ public DataRouterConfig getConfig() {
+ return config;
+ }
+
+ public void setConfig(DataRouterConfig config) {
+ this.config = config;
+ }
+
+ protected OperationResult getOperationResult() {
+ return operationResult;
+ }
+}