From 3e372947d497014b4aad4c2c1d04d6c50a74e2e0 Mon Sep 17 00:00:00 2001 From: "Bansal, Nitin (nb121v)" Date: Mon, 8 May 2017 17:20:38 -0400 Subject: Initial OpenECOMP Data Router Core commit Change-Id: Iee15b2f7870476eb48e4fb95f2564d3377749c6b Signed-off-by: Bansal, Nitin (nb121v) --- .../org/openecomp/rest/RestClientProducer.java | 256 +++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 src/main/java/org/openecomp/rest/RestClientProducer.java (limited to 'src/main/java/org/openecomp/rest/RestClientProducer.java') diff --git a/src/main/java/org/openecomp/rest/RestClientProducer.java b/src/main/java/org/openecomp/rest/RestClientProducer.java new file mode 100644 index 0000000..3a8df18 --- /dev/null +++ b/src/main/java/org/openecomp/rest/RestClientProducer.java @@ -0,0 +1,256 @@ +/** + * ============LICENSE_START======================================================= + * DataRouter + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. + * Copyright © 2017 Amdocs + * All rights reserved. + * ================================================================================ + * 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 ati + * + * 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 and OpenECOMP are trademarks + * and service marks of AT&T Intellectual Property. + */ +package org.openecomp.rest; + +import org.apache.camel.Exchange; +import org.apache.camel.impl.DefaultProducer; +import org.eclipse.jetty.util.security.Password; +import org.openecomp.cl.api.Logger; +import org.openecomp.cl.eelf.LoggerFactory; +import org.openecomp.event.EventBusConsumer; + +import org.openecomp.restclient.client.Headers; +import org.openecomp.restclient.client.OperationResult; +import org.openecomp.restclient.client.RestClient; +import org.openecomp.restclient.rest.HttpUtil; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + + +/** + * The EcompRest producer. + */ +public class RestClientProducer extends DefaultProducer { + + private static enum Operation { + GET, PUT, POST, DELETE + } + + private RestClientEndpoint endpoint; + + /** REST client used for sending HTTP requests. */ + private RestClient restClient; + + private Logger logger = LoggerFactory.getInstance().getLogger(RestClientProducer.class); + + + public RestClientProducer(RestClientEndpoint endpoint) { + super(endpoint); + this.endpoint = endpoint; + } + + @Override + public void process(Exchange exchange) { + + // Extract the URL for our REST request from the IN message header. + String url = exchange.getIn().getHeader(RestClientEndpoint.IN_HEADER_URL).toString(); + + // Populate the HTTP Request header values from any values passed in via the + // IN message headers. + Map> headers = populateRestHeaders(exchange); + + if (logger.isDebugEnabled()) { + StringBuilder sb = new StringBuilder(); + sb.append("Process REST request - operation=").append(getOperation(exchange)); + sb.append(" headers=["); + for (String key : headers.keySet()) { + sb.append("{").append(key).append("->").append(headers.get(key)).append("} "); + } + sb.append("]"); + sb.append(" content: ").append(exchange.getIn().getBody()); + logger.debug(sb.toString()); + } + + // Now, invoke the REST client to perform the operation. + OperationResult result = null; + switch (getOperation(exchange)) { + + case GET: + result = getRestClient().get(url, headers, MediaType.APPLICATION_JSON_TYPE); + break; + + case PUT: + result = getRestClient().put(url, exchange.getIn().getBody().toString(), headers, + MediaType.APPLICATION_JSON_TYPE, null); + break; + + case POST: + result = getRestClient().post(url, exchange.getIn().getBody().toString(), headers, + MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE); + break; + + case DELETE: + result = getRestClient().delete(url, headers, MediaType.APPLICATION_JSON_TYPE); + break; + + default: + // The supplied operation is not supported. + result = new OperationResult(); + result.setResultCode(Response.Status.BAD_REQUEST.getStatusCode()); + result.setFailureCause("Unsupported HTTP Operation: " + getOperation(exchange)); + + break; + } + + // Populate the OUT message with our result. + exchange.getOut().setHeader(RestClientEndpoint.OUT_HEADER_RESPONSE_CODE, + result.getResultCode()); + if (HttpUtil.isHttpResponseClassSuccess(result.getResultCode())) { + exchange.getOut().setHeader(RestClientEndpoint.OUT_HEADER_RESPONSE_MSG, + responseStatusStringFromResult(result)); + exchange.getOut().setBody(result.getResult()); + } else { + exchange.getOut().setHeader(RestClientEndpoint.OUT_HEADER_RESPONSE_MSG, + result.getFailureCause()); + } + + } + + + /** + * Extracts the requested REST operation from the exchange message. + * + * @param exchange - The Camel exchange to pull the operation from. + * + * @return - The REST operation being requested. + */ + private Operation getOperation(Exchange exchange) { + + String toEndpoint = ((String) exchange.getProperty(Exchange.TO_ENDPOINT)); + + String operation = toEndpoint.substring((toEndpoint.lastIndexOf("://") + 3)); + + int position = operation.indexOf('?'); + if (position >= 0) { + operation = operation.substring(0, position); + } + + return Operation.valueOf(operation.toUpperCase()); + } + + + + /** + * This method extracts values from the IN message which are intended to be used to populate the + * HTTP Header entries for our REST request. + * + * @param exchange - The Camel exchange to extract the HTTP header parameters from. + * + * @return - A map of HTTP header names and values. + */ + private Map> populateRestHeaders(Exchange exchange) { + + Map> headers = new HashMap<>(); + + if (exchange.getIn().getHeader(Headers.FROM_APP_ID) != null) { + headers.put(Headers.FROM_APP_ID, + Arrays.asList(exchange.getIn().getHeader(Headers.FROM_APP_ID).toString())); + } + if (exchange.getIn().getHeader(Headers.TRANSACTION_ID) != null) { + headers.put(Headers.TRANSACTION_ID, + Arrays.asList(exchange.getIn().getHeader(Headers.TRANSACTION_ID).toString())); + } + if (exchange.getIn().getHeader(Headers.RESOURCE_VERSION) != null) { + headers.put(Headers.RESOURCE_VERSION, + Arrays.asList(exchange.getIn().getHeader(Headers.RESOURCE_VERSION).toString())); + } + if (exchange.getIn().getHeader(Headers.ETAG) != null) { + headers.put(Headers.ETAG, Arrays.asList(exchange.getIn().getHeader(Headers.ETAG).toString())); + } + if (exchange.getIn().getHeader(Headers.IF_MATCH) != null) { + headers.put(Headers.IF_MATCH, + Arrays.asList(exchange.getIn().getHeader(Headers.IF_MATCH).toString())); + } + if (exchange.getIn().getHeader(Headers.IF_NONE_MATCH) != null) { + headers.put(Headers.IF_NONE_MATCH, + Arrays.asList(exchange.getIn().getHeader(Headers.IF_NONE_MATCH).toString())); + } + if (exchange.getIn().getHeader(Headers.ACCEPT) != null) { + headers.put(Headers.ACCEPT, + Arrays.asList(exchange.getIn().getHeader(Headers.ACCEPT).toString())); + } + if (exchange.getIn().getHeader("Content-Type") != null) { + headers.put("Content-Type", + Arrays.asList(exchange.getIn().getHeader("Content-Type").toString())); + } + + return headers; + } + + + /** + * This helper method converts an HTTP response code into the associated string. + * + * @param result - A result object to get the response code from. + * + * @return - The string message associated with the supplied response code. + */ + private String responseStatusStringFromResult(OperationResult result) { + + // Not every valid response code is actually represented by the Response.Status + // object, so we need to guard against missing codes, otherwise we throw null + // pointer exceptions when we try to generate our metrics logs... + Response.Status responseStatus = Response.Status.fromStatusCode(result.getResultCode()); + String responseStatusCodeString = ""; + if (responseStatus != null) { + responseStatusCodeString = responseStatus.toString(); + } + + return responseStatusCodeString; + } + + /** + * Instantiate the REST client that will be used for sending our HTTP requests. + * + * @return - An instance of the REST client. + */ + private RestClient getRestClient() { + + if (restClient == null) { + + String keystoreFilename = endpoint.getEcompKeystore(); + String keystorePassword = endpoint.getEcompKeystorePassword(); + String clientCertFilename = endpoint.getEcompClientCert(); + + if (logger.isDebugEnabled()) { + logger.debug("Instantiating REST Client with client_cert=" + clientCertFilename + + " keystore=" + keystoreFilename + " keystorePassword=" + keystorePassword); + } + + // Create REST client for search service + restClient = new RestClient().validateServerHostname(false).validateServerCertChain(true) + .clientCertFile(clientCertFilename) + .clientCertPassword(Password.deobfuscate(keystorePassword)).trustStore(keystoreFilename); + } + + return restClient; + } +} -- cgit 1.2.3-korg