aboutsummaryrefslogtreecommitdiffstats
path: root/bpmn/MSORESTClient/src/main/java/org/openecomp/mso
diff options
context:
space:
mode:
authorChrisC <cc697w@intl.att.com>2017-01-31 11:40:03 +0100
committerChrisC <cc697w@intl.att.com>2017-01-31 12:59:33 +0100
commit025301d08b061482c1f046d562bf017c8cbcfe8d (patch)
tree68a2a549736c9bf0f7cd4e71c76e40ef7e2606f2 /bpmn/MSORESTClient/src/main/java/org/openecomp/mso
parent2754ad52f833278a5c925bd788a16d1dce16a598 (diff)
Initial OpenECOMP MSO commit
Change-Id: Ia6a7574859480717402cc2f22534d9973a78fa6d Signed-off-by: ChrisC <cc697w@intl.att.com>
Diffstat (limited to 'bpmn/MSORESTClient/src/main/java/org/openecomp/mso')
-rw-r--r--bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/APIResponse.java143
-rw-r--r--bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/HostNameVerifier.java45
-rw-r--r--bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/HttpHeader.java65
-rw-r--r--bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTClient.java618
-rw-r--r--bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTConfig.java131
-rw-r--r--bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTException.java85
6 files changed, 1087 insertions, 0 deletions
diff --git a/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/APIResponse.java b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/APIResponse.java
new file mode 100644
index 0000000000..dfb9f36e9a
--- /dev/null
+++ b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/APIResponse.java
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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 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=========================================================
+ */
+
+package org.openecomp.mso.rest;
+
+import java.io.IOException;
+
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.http.util.EntityUtils;
+
+/**
+ * An immutable class that encapsulates an API response.
+ *
+ * @version 1.0
+ * @since 1.0
+ */
+public class APIResponse {
+ private final int statusCode;
+ private final byte[] responseBody;
+ private final HttpHeader[] headers;
+
+ /**
+ * Internal method used to create http headers using the specified
+ * HttpResponse object.
+ *
+ * @param httpResponse used to create headers
+ * @return http headers
+ */
+ private HttpHeader[] buildHeaders(final HttpResponse httpResponse) {
+ final Header[] headers = httpResponse.getAllHeaders();
+
+ HttpHeader[] httpHeaders = new HttpHeader[headers.length];
+ for (int i = 0; i < headers.length; ++i) {
+ final Header header = headers[i];
+ final String name = header.getName();
+ final String value = header.getValue();
+ final HttpHeader httpHeader = new HttpHeader(name, value);
+ httpHeaders[i] = httpHeader;
+ }
+
+ return httpHeaders;
+ }
+
+ /**
+ * Create an APIResponse object using the specified HttpResponse object.
+ *
+ * @param httpResponse used to create the APIResponse
+ *
+ * @throws RESTException if unable to read from the HttpResponse object
+ */
+ public APIResponse(final HttpResponse httpResponse) throws RESTException {
+ try {
+ this.statusCode = httpResponse.getStatusLine().getStatusCode();
+
+ if (httpResponse.getEntity() == null)
+ {
+ this.responseBody = null;
+ }
+ else
+ {
+ this.responseBody = EntityUtils.toByteArray(httpResponse.getEntity());
+ }
+
+ this.headers = buildHeaders(httpResponse);
+ } catch (IOException ioe) {
+ throw new RESTException(ioe);
+ }
+ }
+
+ /**
+ * Gets the http status code returned by the api server.
+ * <p>
+ * For example, status code 200 represents 'OK.'
+ *
+ * @return status code
+ */
+ public int getStatusCode() {
+ return this.statusCode;
+ }
+
+ /**
+ * Gets the http response body as a byte array.
+ *
+ * @return http response body
+ */
+ public byte[] getResponseBodyAsByteArray() {
+ return this.responseBody;
+ }
+
+ /**
+ * Gets the http response body as a string.
+ *
+ * @return http response body
+ */
+ public String getResponseBodyAsString() {
+ if (this.responseBody != null) {
+ return new String(this.responseBody);
+ } else {
+ return "";
+ }
+ }
+
+ /**
+ * Gets a list of all the headers returned by the API response.
+ *
+ * @return an array of all the HttpHeaders
+ */
+ public HttpHeader[] getAllHeaders() {
+ // avoid exposing internals, create copy
+ HttpHeader[] copy = new HttpHeader[this.headers.length];
+ for (int i = 0; i < this.headers.length; ++i) {
+ copy[i] = headers[i];
+ }
+ return copy;
+ }
+
+ public String getFirstHeader(String name) {
+ for (HttpHeader header : headers) {
+ if (header.getName().equals(name)) {
+ return header.getValue();
+ }
+ }
+ return null;
+ }
+}
diff --git a/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/HostNameVerifier.java b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/HostNameVerifier.java
new file mode 100644
index 0000000000..f597fdfaa7
--- /dev/null
+++ b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/HostNameVerifier.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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 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=========================================================
+ */
+
+package org.openecomp.mso.rest;
+
+import javax.net.ssl.SSLException;
+
+import org.apache.http.conn.ssl.AbstractVerifier;
+
+/**
+ * @version 1.0
+ * Place holder to validate host name, for now just invokes the super class method
+ *
+ */
+public class HostNameVerifier extends AbstractVerifier {
+
+ public final void verify(
+ final String host,
+ final String[] cns,
+ final String[] subjectAlts) throws SSLException {
+ try {
+ verify(host, cns, subjectAlts, true);
+ } catch (SSLException sex) {
+
+ }
+ }
+
+}
diff --git a/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/HttpHeader.java b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/HttpHeader.java
new file mode 100644
index 0000000000..e0d6c3056d
--- /dev/null
+++ b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/HttpHeader.java
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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 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=========================================================
+ */
+
+package org.openecomp.mso.rest;
+
+/**
+ * An immutable class used to wrap an http header.
+ *
+ * @version 1.0
+ * @since 1.0
+ */
+public class HttpHeader {
+ private final String name;
+ private final String value;
+
+ /**
+ * Create an http header using the specified name and value
+ *
+ * @param name name of http header
+ * @param value value of http header
+ */
+ public HttpHeader(final String name, final String value) {
+ if (name == null) {
+ throw new IllegalArgumentException("Name may not be null.");
+ }
+
+ this.name = name;
+ this.value = value;
+ }
+
+ /**
+ * Gets the header name.
+ *
+ * @return header name
+ */
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * Gets the header value.
+ *
+ * @return header value
+ */
+ public String getValue() {
+ return this.value;
+ }
+}
diff --git a/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTClient.java b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTClient.java
new file mode 100644
index 0000000000..5c200046ca
--- /dev/null
+++ b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTClient.java
@@ -0,0 +1,618 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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 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=========================================================
+ */
+
+package org.openecomp.mso.rest;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+
+import javax.net.ssl.SSLSocketFactory;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPatch;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.message.AbstractHttpMessage;
+import org.apache.http.util.EntityUtils;
+
+/**
+ * Client used to send RESTFul requests.
+ * <p>
+ * Many of the methods return a reference to the 'this,' thereby allowing
+ * method chaining.
+ * <br>
+ * An example of usage can be found below:
+ * <pre>
+ * RESTClient client;
+ * try {
+ * client = new RESTClient("http://www.openecomp.org");
+ * APIResponse response = client
+ * .setHeader("Accept", "application/json")
+ * .setHeader("Clientid", "clientid")
+ * .setHeader("header", "value")
+ * .httpPost("postbody");
+ * if (response.getStatusCode() == 200) {
+ * System.out.println("Success!");
+ * }
+ * } catch (RESTException re) {
+ * // Handle Exception
+ * }
+ * </pre>
+ *
+ * @version 1.0
+ * @since 1.0
+ */
+public class RESTClient {
+ private final String proxyHost;
+ private final int proxyPort;
+
+ private final String URL;
+
+ private final LinkedHashMap<String, List<String>> headers;
+ private final LinkedHashMap<String, List<String>> parameters;
+
+ private HttpEntity httpEntity;
+ private HttpClient unitTestClient;
+
+ /**
+ * Internal method used to build an APIResponse using the specified
+ * HttpResponse object.
+ *
+ * @param response response wrapped inside an APIResponse object
+ * @return api response
+ */
+ private APIResponse buildResponse(HttpResponse response)
+ throws RESTException {
+
+ return new APIResponse(response);
+ }
+
+ /**
+ * Used to release any resources used by the connection.
+ * @param response HttpResponse object used for releasing the connection
+ * @throws RESTException if unable to release connection
+ *
+ */
+ private void releaseConnection(HttpResponse response) throws RESTException {
+ try {
+ EntityUtils.consume(response.getEntity());
+ } catch (IOException ioe) {
+ throw new RESTException(ioe);
+ }
+ }
+
+ /**
+ * Sets headers to the http message.
+ *
+ * @param httpMsg http message to set headers for
+ */
+ private void addInternalHeaders(AbstractHttpMessage httpMsg) {
+ if (headers.isEmpty()) {
+ return;
+ }
+
+ final Set<String> keySet = headers.keySet();
+ for (final String key : keySet) {
+ final List<String> values = headers.get(key);
+ for (final String value : values) {
+ httpMsg.addHeader(key, value);
+ }
+ }
+ }
+
+ /**
+ * Builds the query part of a URL.
+ *
+ * @return query
+ */
+ private String buildQuery() {
+ if (this.parameters.size() == 0) {
+ return "";
+ }
+
+ StringBuilder sb = new StringBuilder();
+ String charSet = "UTF-8";
+ try {
+ Iterator<String> keyitr = this.parameters.keySet().iterator();
+ for (int i = 0; keyitr.hasNext(); ++i) {
+ if (i > 0) {
+ sb.append("&");
+ }
+
+ final String name = keyitr.next();
+ final List<String> values = this.parameters.get(name);
+ for(final String value : values) {
+ sb.append(URLEncoder.encode(name, charSet));
+ sb.append("=");
+ sb.append(URLEncoder.encode(value, charSet));
+ }
+ }
+ } catch (UnsupportedEncodingException e) {
+ // should not occur
+ e.printStackTrace();
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Creates an http client that can be used for sending http requests.
+ *
+ * @return created http client
+ *
+ * @throws RESTException if unable to create http client.
+ */
+ private CloseableHttpClient createClient() throws RESTException {
+ //TODO - we may want to trust self signed certificate at some point - add implementation here
+ HttpClientBuilder clientBuilder;
+
+ try {
+ SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(
+ (SSLSocketFactory) SSLSocketFactory.getDefault(),
+ new HostNameVerifier());
+ Registry<ConnectionSocketFactory> registry = RegistryBuilder
+ .<ConnectionSocketFactory> create()
+ .register("http",
+ PlainConnectionSocketFactory.getSocketFactory())
+ .register("https", sslSocketFactory).build();
+ PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(
+ registry);
+ clientBuilder = HttpClientBuilder.create().setConnectionManager(
+ manager);
+ } catch (Exception ex) {
+ throw new RESTException(ex.getMessage());
+ }
+ clientBuilder.disableRedirectHandling();
+
+ if ((this.proxyHost != null) && (this.proxyPort != -1)) {
+ HttpHost proxy = new HttpHost(this.proxyHost, this.proxyPort);
+ clientBuilder.setProxy(proxy);
+ }
+
+ return clientBuilder.build();
+ }
+
+ /**
+ * Creates a RESTClient with the specified URL, proxy host, and proxy port.
+ *
+ * @param URL URL to send request to
+ * @param proxyHost proxy host to use for sending request
+ * @param proxyPort proxy port to use for sendin request
+ *
+ * @throws RESTException if unable to create a RESTClient
+ */
+ public RESTClient(String URL, String proxyHost, int proxyPort)
+ throws RESTException {
+ this(new RESTConfig(URL, proxyHost, proxyPort));
+ }
+
+ /**
+ * Creates a RESTClient with the specified URL. No proxy host nor port will
+ * be used.
+ *
+ * @param URL URL to send request to
+ *
+ * @throws RESTException if unable to create a RESTClient
+ */
+ public RESTClient(String URL) throws RESTException {
+ this(new RESTConfig(URL));
+ }
+
+ /**
+ * Creates a RESTClient with the RESTConfig object.
+ *
+ * @param RESTConfig config to use for sending request
+ *
+ * @throws RESTException if unable to create a RESTClient
+ */
+ public RESTClient(RESTConfig cfg) throws RESTException {
+ this.headers = new LinkedHashMap<String, List<String>>();
+ this.parameters = new LinkedHashMap<String, List<String>>();
+ this.URL = cfg.getURL();
+ this.proxyHost = cfg.getProxyHost();
+ this.proxyPort = cfg.getProxyPort();
+ }
+
+ /**
+ * Adds parameter to be sent during http request.
+ * <p>
+ * Does not remove any parameters with the same name, thus allowing
+ * duplicates.
+ *
+ * @param name name of parameter
+ * @param value value of parametr
+ * @return a reference to 'this', which can be used for method chaining
+ */
+ public RESTClient addParameter(String name, String value) {
+ if (!parameters.containsKey(name)) {
+ parameters.put(name, new ArrayList<String>());
+ }
+
+ List<String> values = parameters.get(name);
+ values.add(value);
+
+ return this;
+ }
+
+ /**
+ * Sets parameter to be sent during http request.
+ * <p>
+ * Removes any parameters with the same name, thus disallowing duplicates.
+ *
+ * @param name name of parameter
+ * @param value value of parametr
+ * @return a reference to 'this', which can be used for method chaining
+ */
+ public RESTClient setParameter(String name, String value) {
+ if (parameters.containsKey(name)) {
+ parameters.get(name).clear();
+ }
+
+ addParameter(name, value);
+
+ return this;
+ }
+
+ /**
+ * Adds http header to be sent during http request.
+ * <p>
+ * Does not remove any headers with the same name, thus allowing
+ * duplicates.
+ *
+ * @param name name of header
+ * @param value value of header
+ * @return a reference to 'this', which can be used for method chaining
+ */
+ public RESTClient addHeader(String name, String value) {
+ if (!headers.containsKey(name)) {
+ headers.put(name, new ArrayList<String>());
+ }
+
+ List<String> values = headers.get(name);
+ values.add(value);
+
+ return this;
+ }
+
+ /**
+ * Sets http header to be sent during http request.
+ * <p>
+ * Does not remove any headers with the same name, thus allowing
+ * duplicates.
+ *
+ * @param name name of header
+ * @param value value of header
+ * @return a reference to 'this', which can be used for method chaining
+ */
+ public RESTClient setHeader(String name, String value) {
+ if (headers.containsKey(name)) {
+ headers.get(name).clear();
+ }
+
+ addHeader(name, value);
+
+ return this;
+ }
+
+ /**
+ * Convenience method for adding the authorization header using the
+ * specified OAuthToken object.
+ *
+ * @param token token to use for setting authorization
+ * @return a reference to 'this,' which can be used for method chaining
+ */
+ public RESTClient addAuthorizationHeader(String token) {
+ this.addHeader("Authorization", token);
+ return this;
+ }
+
+ /**
+ * Alias for httpGet().
+ *
+ * @see RESTClient#httpGet()
+ */
+ public APIResponse get() throws RESTException {
+ return httpGet();
+ }
+
+ /**
+ * Sends an http GET request using the parameters and headers previously
+ * set.
+ *
+ * @return api response
+ *
+ * @throws RESTException if request was unsuccessful
+ */
+ public APIResponse httpGet() throws RESTException {
+ HttpResponse response = null;
+
+ try (CloseableHttpClient httpClient = createClient()) {
+ String query = "";
+ if (!buildQuery().equals("")) {
+ query = "?" + buildQuery();
+ }
+ HttpGet httpGet = new HttpGet(this.getURL() + query);
+ addInternalHeaders(httpGet);
+
+ response = httpClient.execute(httpGet);
+
+ APIResponse apiResponse = buildResponse(response);
+ return apiResponse;
+ } catch (IOException ioe) {
+ throw new RESTException(ioe);
+ } finally {
+ if (response != null) {
+ this.releaseConnection(response);
+ }
+ }
+ }
+
+ /**
+ * Alias for httpPost()
+ *
+ * @see RESTClient#httpPost()
+ */
+ public APIResponse post() throws RESTException {
+ return httpPost();
+ }
+
+ /**
+ * Sends an http POST request.
+ * <p>
+ * POST body will be set to the values set using add/setParameter()
+ *
+ * @return api response
+ *
+ * @throws RESTException if POST was unsuccessful
+ */
+ public APIResponse httpPost() throws RESTException {
+ APIResponse response = httpPost(buildQuery());
+ return response;
+ }
+
+ /**
+ * Sends an http POST request using the specified body.
+ *
+ * @return api response
+ *
+ * @throws RESTException if POST was unsuccessful
+ */
+ public APIResponse httpPost(String body) throws RESTException {
+ HttpResponse response = null;
+ try (CloseableHttpClient httpClient = createClient()) {
+ HttpPost httpPost = new HttpPost(this.getURL());
+ addInternalHeaders(httpPost);
+ if (body != null && !body.equals("")) {
+ httpEntity = new StringEntity(body);
+ httpPost.setEntity(new StringEntity(body));
+ }
+
+ response = httpClient.execute(httpPost);
+
+ return buildResponse(response);
+ } catch (IOException e) {
+ throw new RESTException(e);
+ } finally {
+ if (response != null) {
+ this.releaseConnection(response);
+ }
+ }
+ }
+
+ /**
+ *
+ * @param body Data to PUT
+ * @return API response
+ * @throws RESTException
+ */
+ public APIResponse httpPut(String body) throws RESTException {
+ HttpResponse response = null;
+ try (CloseableHttpClient httpClient = createClient()) {
+
+ String query = "";
+ if (!buildQuery().equals("")) {
+ query = "?" + buildQuery();
+ }
+ HttpPut httpPut = new HttpPut(this.getURL() + query);
+ addInternalHeaders(httpPut);
+ if (body != null && !body.equals("")) {
+ httpEntity = new StringEntity(body);
+ httpPut.setEntity(httpEntity);
+ }
+
+ response = httpClient.execute(httpPut);
+
+ return buildResponse(response);
+ } catch (IOException e) {
+ throw new RESTException(e);
+ } finally {
+ if (response != null) {
+ this.releaseConnection(response);
+ }
+ }
+ }
+
+ /**
+ * Alias for httpPatch().
+ *
+ * @see RESTClient#httpPatch()
+ */
+ public APIResponse patch(String body) throws RESTException {
+ return httpPatch(body);
+ }
+
+ /**
+ *
+ * @param body Data to PATCH
+ * @return API response
+ * @throws RESTException
+ */
+ public APIResponse httpPatch(String body) throws RESTException {
+ HttpResponse response = null;
+ try (CloseableHttpClient httpClient = createClient()) {
+ String query = "";
+ if (!buildQuery().equals("")) {
+ query = "?" + buildQuery();
+ }
+ HttpPatch httpPatch = new HttpPatch(this.getURL() + query);
+ addInternalHeaders(httpPatch);
+ if (body != null && !body.equals("")) {
+ httpEntity = new StringEntity(body);
+ httpPatch.setEntity(httpEntity);
+ }
+
+ response = httpClient.execute(httpPatch);
+
+ return buildResponse(response);
+ } catch (IOException e) {
+ throw new RESTException(e);
+ } finally {
+ if (response != null) {
+ this.releaseConnection(response);
+ }
+ }
+ }
+
+ /**
+ * Alias for httpDelete().
+ *
+ * @see RESTClient#httpDelete()
+ */
+ public APIResponse delete() throws RESTException {
+ return httpDelete();
+ }
+
+ /**
+ * Sends an http DELETE request using the parameters and headers previously
+ * set.
+ *
+ * @return api response
+ *
+ * @throws RESTException if request was unsuccessful
+ */
+ public APIResponse httpDelete() throws RESTException {
+ return httpDelete(null);
+ }
+
+ /**
+ * Sends an http DELETE request with a body, using the parameters and headers
+ * previously set.
+ *
+ * @return api response
+ *
+ * @throws RESTException if request was unsuccessful
+ */
+ public APIResponse httpDelete(String body) throws RESTException {
+ HttpResponse response = null;
+
+ try (CloseableHttpClient httpClient = createClient()){
+
+ String query = "";
+ if (!buildQuery().equals("")) {
+ query = "?" + buildQuery();
+ }
+ HttpDeleteWithBody httpDelete = new HttpDeleteWithBody(this.getURL() + query);
+ addInternalHeaders(httpDelete);
+
+ if (body != null && !body.equals("")) {
+ httpEntity = new StringEntity(body);
+ httpDelete.setEntity(httpEntity);
+ }
+
+ response = httpClient.execute(httpDelete);
+
+ APIResponse apiResponse = buildResponse(response);
+ return apiResponse;
+ } catch (IOException ioe) {
+ throw new RESTException(ioe);
+ } finally {
+ if (response != null) {
+ this.releaseConnection(response);
+ }
+ }
+ }
+
+ public String getURL() {
+ return URL;
+ }
+ public LinkedHashMap<String,List<String>> getHeaders() {
+ return headers;
+ }
+ public LinkedHashMap<String,List<String>> getParameters() {
+ return parameters;
+ }
+ public HttpEntity getHttpEntity() {
+ return httpEntity;
+ }
+
+ public HttpClient getUnitTestClient() {
+ return unitTestClient;
+ }
+
+ public void setUnitTestClient(HttpClient unitTestClient) {
+ this.unitTestClient = unitTestClient;
+ }
+
+ /**
+ * Allows inclusion of a request body with DELETE.
+ */
+ private class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {
+ public static final String METHOD_NAME = "DELETE";
+
+ public String getMethod() {
+ return METHOD_NAME;
+ }
+
+ public HttpDeleteWithBody(final String uri) {
+ super();
+ setURI(URI.create(uri));
+ }
+
+ public HttpDeleteWithBody(final URI uri) {
+ super();
+ setURI(uri);
+ }
+
+ public HttpDeleteWithBody() {
+ super();
+ }
+ }
+}
diff --git a/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTConfig.java b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTConfig.java
new file mode 100644
index 0000000000..a6685067f7
--- /dev/null
+++ b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTConfig.java
@@ -0,0 +1,131 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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 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=========================================================
+ */
+
+package org.openecomp.mso.rest;
+
+/**
+ * Configuration values to be used by the RESTClient.
+ *
+ * @version 1.0
+ *
+ */
+public class RESTConfig {
+ private final String URL;
+
+ private final boolean trustAllCerts;
+ private final String proxyHost;
+ private final int proxyPort;
+
+ /**
+ * Creates a RESTConfig with the specified URL.
+ * <p>
+ * By default, no proxy will be used, and only valid certificates will
+ * be used.
+ *
+ * @param URL url to set
+ */
+ public RESTConfig(final String URL) {
+ this(URL, null, -1, false);
+ }
+
+ /**
+ * Creates a RESTConfig with the specified URL and whether to trust all
+ * certificates.
+ * <p>
+ * Trusting all certificates is useful for testing self-signed
+ * certificates. By default, no proxy will be used.
+ *
+ * @param URL url to set
+ * @param trustAllCerts whether to trust all certificates
+ */
+ public RESTConfig(final String URL, final boolean trustAllCerts) {
+ this(URL, null, -1, trustAllCerts);
+ }
+
+ /**
+ * Creates a RESTConfig with the specified URL and proxy.
+ * <p>
+ * By default, only valid certificates will be allowed.
+ *
+ * @param URL url to set
+ * @param proxyHost proxy host to set
+ * @param proxyPort proxy port to set
+ */
+ public RESTConfig(final String URL, final String proxyHost,
+ final int proxyPort) {
+
+ this(URL, proxyHost, proxyPort, false);
+ }
+
+ /**
+ * Creates a RESTConfig object with the specified URL, proxy host, proxy
+ * port, and whether to trust all certificates. Allowing all certificates
+ * is useful for testing self-signed certificates.
+ *
+ * @param URL url to set
+ * @param proxyHost proxy host to set
+ * @param proxyPort porxy port to set
+ * @param trustAllCerts whether to trust all certificates
+ */
+ public RESTConfig(final String URL, final String proxyHost,
+ final int proxyPort, boolean trustAllCerts) {
+
+ this.URL = URL;
+ this.proxyHost = proxyHost;
+ this.proxyPort = proxyPort;
+ this.trustAllCerts = trustAllCerts;
+ }
+
+ /**
+ * Gets the URL to use.
+ *
+ * @return URL to use
+ */
+ public String getURL() {
+ return this.URL;
+ }
+
+ /**
+ * Gets whether to trust all certificates.
+ *
+ * @return true if to trust all certificates, false otherwise
+ */
+ public boolean trustAllCerts() {
+ return this.trustAllCerts;
+ }
+
+ /**
+ * Gets proxy host or null if proxy host has not been set.
+ *
+ * @return proxy host
+ */
+ public String getProxyHost() {
+ return this.proxyHost;
+ }
+
+ /**
+ * Gets proxy port or -1 if no proxy port has been set.
+ *
+ * @return proxy port
+ */
+ public int getProxyPort() {
+ return this.proxyPort;
+ }
+}
diff --git a/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTException.java b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTException.java
new file mode 100644
index 0000000000..1c28aa1f09
--- /dev/null
+++ b/bpmn/MSORESTClient/src/main/java/org/openecomp/mso/rest/RESTException.java
@@ -0,0 +1,85 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OPENECOMP - MSO
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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 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=========================================================
+ */
+
+package org.openecomp.mso.rest;
+
+/**
+ * A custom exception class.
+ *
+ * @version 1.0
+ *
+ */
+public class RESTException extends Exception {
+ private static final long serialVersionUID = -6874042744590915838L;
+ // http status code
+ private final int statusCode;
+
+ // error message
+ private final String errorMessage;
+
+ /**
+ * {@inheritDoc}
+ * @see Exception#RESTException(String)
+ */
+ public RESTException(final String errorMessage) {
+ this(-1, errorMessage);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see Exception#RESTException(Throwable)
+ */
+ public RESTException(final Throwable cause) {
+ super(cause);
+ this.statusCode = -1;
+ this.errorMessage = cause.getMessage();
+ }
+
+ /**
+ * Creates a RESTException with the specified status code and error
+ * message.
+ *
+ * @param statusCode http status code
+ * @param errorMessage http error message
+ */
+ public RESTException(final int statusCode, final String errorMessage) {
+ super(statusCode + ":" + errorMessage);
+ this.statusCode = statusCode;
+ this.errorMessage = errorMessage;
+ }
+
+ /**
+ * Gets the status code or -1 if none has been set.
+ *
+ * @return status code
+ */
+ public int getStatusCode() {
+ return this.statusCode;
+ }
+
+ /**
+ * Gets the error message.
+ *
+ * @return error message
+ */
+ public String getErrorMessage() {
+ return this.errorMessage;
+ }
+}