Adding UI extensibility
[aai/sparky-be.git] / src / main / java / org / onap / aai / sparky / viewandinspect / SchemaVisualizationProcessor.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017 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  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  */
23 package org.onap.aai.sparky.viewandinspect;
24
25 import java.security.SecureRandom;
26 import java.util.concurrent.ExecutorService;
27
28 import org.apache.camel.Exchange;
29 import org.apache.camel.component.restlet.RestletConstants;
30 import org.onap.aai.cl.api.Logger;
31 import org.onap.aai.cl.eelf.LoggerFactory;
32 import org.onap.aai.cl.mdc.MdcContext;
33 import org.onap.aai.restclient.client.OperationResult;
34 import org.onap.aai.sparky.config.oxm.OxmModelLoader;
35 import org.onap.aai.sparky.dal.ActiveInventoryAdapter;
36 import org.onap.aai.sparky.dal.ElasticSearchAdapter;
37 import org.onap.aai.sparky.dal.aai.config.ActiveInventoryConfig;
38 import org.onap.aai.sparky.logging.AaiUiMsgs;
39 import org.onap.aai.sparky.sync.config.ElasticSearchEndpointConfig;
40 import org.onap.aai.sparky.sync.config.ElasticSearchSchemaConfig;
41 import org.onap.aai.sparky.util.NodeUtils;
42 import org.onap.aai.sparky.viewandinspect.config.VisualizationConfigs;
43 import org.onap.aai.sparky.viewandinspect.entity.ActiveInventoryNode;
44 import org.onap.aai.sparky.viewandinspect.entity.JsonNode;
45 import org.onap.aai.sparky.viewandinspect.entity.NodeMeta;
46 import org.onap.aai.sparky.viewandinspect.entity.QueryRequest;
47 import org.onap.aai.sparky.viewandinspect.services.VisualizationContext;
48 import org.onap.aai.sparky.viewandinspect.services.VisualizationService;
49 import org.onap.aai.sparky.viewandinspect.services.VisualizationTransformer;
50 import org.onap.aai.sparky.viewinspect.sync.ViewInspectSyncController;
51 import org.restlet.Request;
52 import org.restlet.Response;
53 import org.restlet.data.ClientInfo;
54 import org.restlet.data.MediaType;
55 import org.restlet.data.Status;
56
57 public class SchemaVisualizationProcessor {
58
59
60   private static final Logger LOG =
61       LoggerFactory.getInstance().getLogger(SchemaVisualizationProcessor.class);
62
63   private final VisualizationService visualizationService;
64   private VisualizationTransformer visualizationTransformer;
65   private VisualizationContext visualizationContext;
66   private NodeMeta nodeMeta;
67   private JsonNode jsonNode;
68   private ActiveInventoryNode activeInventoryNode;
69   private final ExecutorService tabularExecutorService;
70   private final ExecutorService aaiExecutorService;
71   private final SecureRandom secureRandom;
72   private ActiveInventoryAdapter aaiAdapter;
73   private ElasticSearchAdapter esAdapter;
74   private ElasticSearchEndpointConfig endpointConfig;
75   private ElasticSearchSchemaConfig schemaConfig;
76   private ActiveInventoryConfig aaiConfig;
77
78   public SchemaVisualizationProcessor(VisualizationConfigs visualizationConfigs,
79       OxmModelLoader oxmModelLoader, ViewInspectSyncController viewInspectSynController)
80       throws Exception {
81
82     this.aaiAdapter = viewInspectSynController.getAaiAdapter();
83     this.esAdapter = viewInspectSynController.getElasticSearchAdapter();
84     this.endpointConfig = viewInspectSynController.getendpointConfig();
85     this.schemaConfig = viewInspectSynController.getschemaConfig();
86
87     this.visualizationService = new VisualizationService(oxmModelLoader, visualizationConfigs,
88         aaiAdapter, esAdapter, endpointConfig, schemaConfig);
89     this.activeInventoryNode = new ActiveInventoryNode(visualizationConfigs);
90     this.nodeMeta = new NodeMeta(visualizationConfigs);
91     secureRandom = new SecureRandom();
92     this.tabularExecutorService = NodeUtils.createNamedExecutor("TABULAR-WORKER",
93         visualizationConfigs.getNumOfThreadsToFetchNodeIntegrity(), LOG);
94     /*
95      * Fix ActiveInvenotryConfig with properly wired in properties
96      */
97     this.aaiConfig = ActiveInventoryConfig.getConfig();
98     this.aaiExecutorService = NodeUtils.createNamedExecutor("SLNC-WORKER",
99         aaiConfig.getAaiRestConfig().getNumResolverWorkers(), LOG);
100
101     this.visualizationContext = new VisualizationContext(secureRandom.nextLong(), aaiAdapter,
102         tabularExecutorService, aaiExecutorService, visualizationConfigs);
103     this.visualizationTransformer = new VisualizationTransformer(visualizationConfigs);
104     this.jsonNode = new JsonNode(activeInventoryNode, visualizationConfigs);
105
106   }
107
108   protected String generateJsonErrorResponse(String message) {
109     return String.format("{ \"errorMessage\" : %s }", message);
110   }
111
112   public void processVisualizationRequest(Exchange exchange) {
113
114     String visualizationPayload = "";
115     QueryRequest hashId = null;
116     OperationResult operationResult = null;
117     Request request = null;
118     Response response = null;
119     Object xTransactionId = null;
120     Object partnerName = null;
121
122     xTransactionId = exchange.getIn().getHeader("X-TransactionId");
123     if (xTransactionId == null) {
124       xTransactionId = NodeUtils.getRandomTxnId();
125     }
126     partnerName = exchange.getIn().getHeader("X-FromAppId");
127     if (partnerName == null) {
128       partnerName = "Browser";
129     }
130
131     request = exchange.getIn().getHeader(RestletConstants.RESTLET_REQUEST, Request.class);
132     response = exchange.getIn().getHeader(RestletConstants.RESTLET_RESPONSE, Response.class);
133
134     /*
135      * Disables automatic Apache Camel Restlet component logging which prints out an undesirable log
136      * entry which includes client (e.g. browser) information
137      */
138     request.setLoggable(false);
139
140     ClientInfo clientInfo = request.getClientInfo();
141     MdcContext.initialize((String) xTransactionId, "AAI-UI", "", (String) partnerName,
142         clientInfo.getAddress() + ":" + clientInfo.getPort());
143
144     visualizationPayload = exchange.getIn().getBody(String.class);
145     hashId = visualizationService.analyzeQueryRequestBody(visualizationPayload);
146
147     if (hashId != null) {
148
149       operationResult = visualizationService.buildVisualizationUsingGenericQuery(hashId);
150
151       if (operationResult.getResultCode() == Status.SUCCESS_OK.getCode()) {
152
153         response.setStatus(Status.SUCCESS_OK);
154       } else {
155         response.setStatus(Status.SERVER_ERROR_INTERNAL);
156         LOG.error(AaiUiMsgs.FAILURE_TO_PROCESS_REQUEST, String
157             .format("Failed to process Visualization Schema Payload = '%s'", visualizationPayload));
158       }
159
160     } else {
161       operationResult = new OperationResult();
162       operationResult.setResult(String
163           .format("Failed to analyze Visualization Schema Payload = '%s'", visualizationPayload));
164       response.setStatus(Status.SERVER_ERROR_INTERNAL);
165       LOG.error(AaiUiMsgs.FAILED_TO_ANALYZE, String
166           .format("Failed to analyze Visualization Schema Payload = '%s'", visualizationPayload));
167
168     }
169
170
171     response.setEntity(operationResult.getResult(), MediaType.APPLICATION_JSON);
172     exchange.getOut().setBody(response);
173   }
174 }