X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Faai%2Fdatarouter%2Fquery%2FChameleonRouter.java;h=4e9f75b77ce2b47f55cd2552ba0baa831240d773;hb=refs%2Fchanges%2F53%2F40753%2F2;hp=2df25241de8db9ac20b8d6213ba96771ed73aabe;hpb=d46b0b9c3ce9ad5eca684ebeccb89f04d3cbcf6c;p=aai%2Fdata-router.git diff --git a/src/main/java/org/onap/aai/datarouter/query/ChameleonRouter.java b/src/main/java/org/onap/aai/datarouter/query/ChameleonRouter.java index 2df2524..4e9f75b 100644 --- a/src/main/java/org/onap/aai/datarouter/query/ChameleonRouter.java +++ b/src/main/java/org/onap/aai/datarouter/query/ChameleonRouter.java @@ -18,26 +18,40 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.datarouter.query; +package org.onap.aai.datarouter.query; import java.security.InvalidParameterException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.ws.rs.BadRequestException; +import javax.annotation.PostConstruct; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response.Status; -import org.apache.camel.Exchange; -import org.apache.camel.RuntimeCamelException; -import org.onap.aai.rest.RestClientEndpoint; +import org.eclipse.jetty.util.security.Password; import org.onap.aai.cl.api.Logger; import org.onap.aai.cl.eelf.LoggerFactory; +import org.onap.aai.datarouter.exception.DataRouterException; +import org.onap.aai.datarouter.util.DataRouterConstants; +import org.onap.aai.restclient.client.OperationResult; +import org.onap.aai.restclient.client.RestClient; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; -public class ChameleonRouter extends QueryRouter { +@Component +@Qualifier("chameleon") +public class ChameleonRouter implements QueryRouter { Logger logger = LoggerFactory.getInstance().getLogger(ChameleonRouter.class.getName()); private String chameleonBaseURL; + private RestClient restClient ; + private enum ChameleonAction { GET_OBJECT_BY_ID, GET_REL_BY_ID, GET_OBJECT_RELS, GET_OBJECTS_BY_FILTER, GET_RELS_BY_FILTER }; @@ -48,13 +62,26 @@ public class ChameleonRouter extends QueryRouter { private static final Pattern QUERY_OBJECT_ID_URL_MATCH = Pattern.compile("/objects/(.*)"); private static final Pattern QUERY_REL_ID_URL_MATCH = Pattern.compile("/relationships/(.*)"); - private static final String ECOMP_QUERY_ID = "ECOMP_QUERY_ID"; - private static final String ECOMP_QUERY_TYPE = "ECOMP_QUERY_TYPE"; - public ChameleonRouter(String chameleonBaseURL) { + public ChameleonRouter(){} + + + public ChameleonRouter(String chameleonBaseURL, RestClientConfig config) { + this.chameleonBaseURL = chameleonBaseURL; + this.restClient = new RestClient().validateServerHostname(false).validateServerCertChain(true) + .clientCertFile(config.getCertPath()) + .clientCertPassword(Password.deobfuscate(config.getCertPassword())) + .trustStore(config.getTrustStorePath()) + .connectTimeoutMs(config.getConnectionTimeout()) + .readTimeoutMs(config.getReadTimeout()); + validate(); + } + + + public void validate() { String baseURL = chameleonBaseURL.endsWith("/") ? chameleonBaseURL.substring(0, chameleonBaseURL.length() - 1) : chameleonBaseURL; - if (checkRecursion(baseURL)) { + if (baseURL.contains(DATA_ROUTER_PORT)) { logger.error(QueryMsgs.QUERY_ERROR, "Invalid chameleonBaseURL : Can't re-route back to DataRouter " + chameleonBaseURL); throw new InvalidParameterException( @@ -63,17 +90,6 @@ public class ChameleonRouter extends QueryRouter { this.chameleonBaseURL = baseURL; } - public void setQueryRequest(Exchange exchange) { - setMDC(exchange); - ChameleonAction action = resolveChameleonAction(exchange); - String ecompUrl = buildUrl(exchange, action); - logger.info(QueryMsgs.QUERY_INFO, "Routing request to Chameleon service URL: " + ecompUrl); - exchange.getIn().setHeader(RestClientEndpoint.IN_HEADER_URL, ecompUrl); - exchange.getIn().setHeader("X-FromAppId", SERVICE_NAME); - exchange.getIn().setHeader("X-TransactionId", getTxId(exchange)); - - } - private boolean urlMatcher(Pattern p, String url) { Matcher m = p.matcher(url); if (m.matches() && !m.group(1).contains("/")) { @@ -83,40 +99,39 @@ public class ChameleonRouter extends QueryRouter { } } - private ChameleonAction resolveChameleonAction(Exchange exchange) { - String path = exchange.getIn().getHeader(Exchange.HTTP_PATH, String.class); - path = path.endsWith("/") ? path.substring(0, path.length() - 1) : path; + private ChameleonAction resolveChameleonAction(String urlContext) throws DataRouterException { + + urlContext = urlContext.endsWith("/") ? urlContext.substring(0, urlContext.length() - 1) : urlContext; ChameleonAction action; - if (urlMatcher(QUERY_OBJECT_FILTER_URL_MATCH, path)) { + if (urlMatcher(QUERY_OBJECT_FILTER_URL_MATCH, urlContext)) { action = ChameleonAction.GET_OBJECTS_BY_FILTER; - } else if (urlMatcher(QUERY_REL_FILTER_URL_MATCH, path)) { + } else if (urlMatcher(QUERY_REL_FILTER_URL_MATCH, urlContext)) { action = ChameleonAction.GET_RELS_BY_FILTER; - } else if (urlMatcher(QUERY_OBJECT_REL_URL_MATCH, path)) { + } else if (urlMatcher(QUERY_OBJECT_REL_URL_MATCH, urlContext)) { action = ChameleonAction.GET_OBJECT_RELS; - } else if (urlMatcher(QUERY_OBJECT_ID_URL_MATCH, path)) { + } else if (urlMatcher(QUERY_OBJECT_ID_URL_MATCH, urlContext)) { action = ChameleonAction.GET_OBJECT_BY_ID; - } else if (urlMatcher(QUERY_REL_ID_URL_MATCH, path)) { + } else if (urlMatcher(QUERY_REL_ID_URL_MATCH, urlContext)) { action = ChameleonAction.GET_REL_BY_ID; } else { - exchange.getIn().setHeader(ChameleonErrorProcessor.ECOMP_QUERY_ERROR_CODE, 404); - throw new RuntimeCamelException(); + + throw new DataRouterException("", Status.NOT_FOUND); } return action; } - private String buildUrl(Exchange exchange, ChameleonAction action) { - String path = exchange.getIn().getHeader(Exchange.HTTP_PATH, String.class); - path = path.endsWith("/") ? path.substring(0, path.length() - 1) : path; - String queryParams = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class); + private String buildUrl(String urlContext, String queryParams, ChameleonAction action) { + + urlContext = urlContext.endsWith("/") ? urlContext.substring(0, urlContext.length() - 1) : urlContext; String ecompUrl = ""; String ID = ""; switch (action) { case GET_OBJECT_BY_ID: - ID = path.substring(path.lastIndexOf("/") + 1, path.length()); + ID = urlContext.substring(urlContext.lastIndexOf("/") + 1, urlContext.length()); if (ID == null || ID.isEmpty()) { - throw new IllegalArgumentException("Invalid URI path with no Object ID: " + path); + throw new IllegalArgumentException("Invalid URI path with no Object ID: " + urlContext); } else { if (queryParams != null && !queryParams.isEmpty()) { ecompUrl = chameleonBaseURL + "/" + ID + "?" + queryParams; @@ -125,14 +140,13 @@ public class ChameleonRouter extends QueryRouter { ecompUrl = chameleonBaseURL + "/" + ID; } } - exchange.getIn().setHeader(ECOMP_QUERY_ID, ID); - exchange.getIn().setHeader(ECOMP_QUERY_TYPE, ChameleonAction.GET_OBJECT_BY_ID); + break; case GET_REL_BY_ID: - ID = path.substring(path.lastIndexOf("/") + 1, path.length()); + ID = urlContext.substring(urlContext.lastIndexOf("/") + 1, urlContext.length()); if (ID == null || ID.isEmpty()) { - throw new IllegalArgumentException("Invalid URI path with no Relationship ID: " + path); + throw new IllegalArgumentException("Invalid URI path with no Relationship ID: " + urlContext); } else { if (queryParams != null && !queryParams.isEmpty()) { ecompUrl = chameleonBaseURL + "/" + ID + "?" + queryParams; @@ -141,14 +155,13 @@ public class ChameleonRouter extends QueryRouter { ecompUrl = chameleonBaseURL + "/" + ID; } } - exchange.getIn().setHeader(ECOMP_QUERY_ID, ID); - exchange.getIn().setHeader(ECOMP_QUERY_TYPE, ChameleonAction.GET_REL_BY_ID); + break; case GET_OBJECT_RELS: - ID = path.substring(path.lastIndexOf("/") + 1, path.length()); + ID = urlContext.substring(urlContext.lastIndexOf("/") + 1, urlContext.length()); if (ID == null || ID.isEmpty()) { - throw new IllegalArgumentException("Invalid URI path with no Object ID: " + path); + throw new IllegalArgumentException("Invalid URI path with no Object ID: " + urlContext); } else { if (queryParams != null && !queryParams.isEmpty()) { // TODO: Fix the URL for getting object relations when Chameloen @@ -159,8 +172,7 @@ public class ChameleonRouter extends QueryRouter { ecompUrl = chameleonBaseURL + "/relations" + ID; } } - exchange.getIn().setHeader(ECOMP_QUERY_ID, ID); - exchange.getIn().setHeader(ECOMP_QUERY_TYPE, ChameleonAction.GET_OBJECT_RELS); + break; case GET_OBJECTS_BY_FILTER: @@ -171,7 +183,7 @@ public class ChameleonRouter extends QueryRouter { } else { ecompUrl = chameleonBaseURL + "/filter"; } - exchange.getIn().setHeader(ECOMP_QUERY_TYPE, ChameleonAction.GET_OBJECTS_BY_FILTER); + break; case GET_RELS_BY_FILTER: @@ -182,7 +194,7 @@ public class ChameleonRouter extends QueryRouter { } else { ecompUrl = chameleonBaseURL + "/filter"; } - exchange.getIn().setHeader(ECOMP_QUERY_TYPE, ChameleonAction.GET_RELS_BY_FILTER); + break; } @@ -190,86 +202,83 @@ public class ChameleonRouter extends QueryRouter { return ecompUrl; } - public void setQueryResponse(Exchange exchange) { - parseResponse(exchange); - adjustHeaders(exchange); - } - - private void adjustHeaders(Exchange exchange) { - // Remove the internal heders - exchange.getIn().removeHeader(ECOMP_QUERY_ID); - exchange.getIn().removeHeader(ECOMP_QUERY_TYPE); - } + private String parseResponse(String urlContext, OperationResult result, ChameleonAction action) + throws DataRouterException { - private void parseResponse(Exchange exchange) throws BadRequestException { - - ChameleonAction action = exchange.getIn().getHeader(ECOMP_QUERY_TYPE, ChameleonAction.class); - Integer httpResponseCode = exchange.getIn().getHeader(RestClientEndpoint.OUT_HEADER_RESPONSE_CODE, Integer.class); - String ID = ""; + Integer httpResponseCode = result.getResultCode(); + String ID = urlContext.substring(urlContext.lastIndexOf("/") + 1, urlContext.length()); switch (action) { case GET_OBJECT_BY_ID: if (httpResponseCode >= 200 && httpResponseCode <= 299) { - ID = exchange.getIn().getHeader(ECOMP_QUERY_ID, String.class); if (ID == null || ID.isEmpty()) { - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 400); + throw new DataRouterException("", Status.BAD_REQUEST); } else { - ChameleonResponseBuiler.buildEntity(exchange, ID); + return ChameleonResponseBuiler.buildEntity(result.getResult(), ID); } } else { - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, httpResponseCode); + throw new DataRouterException("", Status.fromStatusCode(httpResponseCode)); } - break; + case GET_REL_BY_ID: if (httpResponseCode >= 200 && httpResponseCode <= 299) { - ID = exchange.getIn().getHeader(ECOMP_QUERY_ID, String.class); + if (ID == null || ID.isEmpty()) { - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 400); + throw new DataRouterException("", Status.BAD_REQUEST); } else { - ChameleonResponseBuiler.buildEntity(exchange, ID); + return ChameleonResponseBuiler.buildEntity(result.getResult(), ID); } } else { - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, httpResponseCode); + throw new DataRouterException("", Status.fromStatusCode(httpResponseCode)); } - break; + case GET_OBJECT_RELS: - if (httpResponseCode >= 200 && httpResponseCode <= 299) { - ID = exchange.getIn().getHeader(ECOMP_QUERY_ID, String.class); - if (ID == null || ID.isEmpty()) { - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 400); - } else { - ChameleonResponseBuiler.buildObjectRelationship(exchange, ID); - } + + // TODO:Return 200 with empty body for now until chameleon supports this + // query + if (ID == null || ID.isEmpty()) { + throw new DataRouterException("", Status.BAD_REQUEST); } else { - // TODO:Return 200 with empty body for now until chameleon supports this - // query - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 200); - exchange.getIn().setBody("[]"); + return ChameleonResponseBuiler.buildObjectRelationship(result.getResult(), ID); } - break; + case GET_OBJECTS_BY_FILTER: - if (httpResponseCode >= 200 && httpResponseCode <= 299) { - ChameleonResponseBuiler.buildCollection(exchange); - } else { - // TODO:Return 200 with empty body for now until chameleon supports this - // query - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 200); - exchange.getIn().setBody("[]"); - } - break; + // TODO:Return 200 with empty body for now until chameleon supports this + // query + return ChameleonResponseBuiler.buildCollection(result.getResult()); + case GET_RELS_BY_FILTER: - if (httpResponseCode >= 200 && httpResponseCode <= 299) { - ChameleonResponseBuiler.buildCollection(exchange); - } else { - // TODO:Return 200 with empty body for now until chameleon supports this - // query - exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 200); - exchange.getIn().setBody("[]"); - } - break; + // TODO:Return 200 with empty body for now until chameleon supports this + // query + return ChameleonResponseBuiler.buildCollection(result.getResult()); + default: + throw new DataRouterException("", Status.NOT_FOUND); + + } + + } + @Override + public String process(String urlContext, String queryParams, Map> headers) + throws DataRouterException { + String response; + ChameleonAction action = resolveChameleonAction(urlContext); + String chameleonURL = buildUrl(urlContext, queryParams, action); + logger.info(QueryMsgs.QUERY_INFO, "Routing request to Chameleon service URL: " + chameleonURL); + + headers = headers == null ? new HashMap>() : headers; + headers.put("X-FromAppId", Arrays.asList(DataRouterConstants.DATA_ROUTER_SERVICE_NAME)); + OperationResult result = restClient.get(chameleonURL, headers, MediaType.APPLICATION_JSON_TYPE); + + try { + response = parseResponse(urlContext, result, action); + } catch (DataRouterException ex) { + logger.info(QueryMsgs.QUERY_ERROR, + "Error while calling Chameleon service URL: " + chameleonURL + " failure cause: " + result.getFailureCause()); + throw ex; } + return response; } }