summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openecomp/sparky/dal/rest
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openecomp/sparky/dal/rest')
-rw-r--r--src/main/java/org/openecomp/sparky/dal/rest/HttpMethod.java34
-rw-r--r--src/main/java/org/openecomp/sparky/dal/rest/OperationResult.java198
-rw-r--r--src/main/java/org/openecomp/sparky/dal/rest/RestClientBuilder.java148
-rw-r--r--src/main/java/org/openecomp/sparky/dal/rest/RestDataProvider.java112
-rw-r--r--src/main/java/org/openecomp/sparky/dal/rest/RestOperationalStatistics.java256
-rw-r--r--src/main/java/org/openecomp/sparky/dal/rest/RestfulDataAccessor.java357
6 files changed, 1105 insertions, 0 deletions
diff --git a/src/main/java/org/openecomp/sparky/dal/rest/HttpMethod.java b/src/main/java/org/openecomp/sparky/dal/rest/HttpMethod.java
new file mode 100644
index 0000000..6a7c3db
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/rest/HttpMethod.java
@@ -0,0 +1,34 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * 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 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 and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.rest;
+
+
+/**
+ * The Enum HttpMethod.
+ */
+public enum HttpMethod {
+ GET, PUT, POST, DELETE, PATCH, HEAD
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/rest/OperationResult.java b/src/main/java/org/openecomp/sparky/dal/rest/OperationResult.java
new file mode 100644
index 0000000..fcceb2b
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/rest/OperationResult.java
@@ -0,0 +1,198 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * 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 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 and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.rest;
+
+/**
+ * The Class OperationResult.
+ */
+public class OperationResult {
+
+ private String result;
+
+ private String objectId;
+ private String requestLink;
+ private String requestPayload;
+
+ private int resultCode;
+
+ private boolean resolvedLinkFromCache;
+
+ private boolean resolvedLinkFromServer;
+
+ private boolean resolvedLinkFailure;
+
+ private int numRequestRetries;
+
+ private long responseTimeInMs;
+
+ /**
+ * Reset.
+ */
+ public void reset() {
+ this.objectId = null;
+ this.result = null;
+ this.requestLink = null;
+ this.requestPayload = null;
+ this.resultCode = -1;
+ this.resolvedLinkFailure = false;
+ this.resolvedLinkFromServer = false;
+ this.resolvedLinkFromCache = false;
+ this.responseTimeInMs = 0;
+ this.numRequestRetries = 0;
+ }
+
+ public String getObjectId() {
+ return objectId;
+ }
+
+ public void setObjectId(String objectId) {
+ this.objectId = objectId;
+ }
+
+ public boolean isResolvedLinkFromCache() {
+ return resolvedLinkFromCache;
+ }
+
+ /**
+ * Was successful.
+ *
+ * @return true, if successful
+ */
+ public boolean wasSuccessful() {
+ return (resultCode > 199 && resultCode < 300);
+ }
+
+ public String getRequestLink() {
+ return requestLink;
+ }
+
+ public void setRequestLink(String requestLink) {
+ this.requestLink = requestLink;
+ }
+
+ public String getRequestPayload() {
+ return requestPayload;
+ }
+
+ public void setRequestPayload(String requestPayload) {
+ this.requestPayload = requestPayload;
+ }
+
+ public void setResolvedLinkFromCache(boolean resolvedLinkFromCache) {
+ this.resolvedLinkFromCache = resolvedLinkFromCache;
+ }
+
+ public boolean isResolvedLinkFromServer() {
+ return resolvedLinkFromServer;
+ }
+
+ public void setResolvedLinkFromServer(boolean resolvedLinkFromServer) {
+ this.resolvedLinkFromServer = resolvedLinkFromServer;
+ }
+
+ public boolean isResolvedLinkFailure() {
+ return resolvedLinkFailure;
+ }
+
+ public void setResolvedLinkFailure(boolean resolvedLinkFailure) {
+ this.resolvedLinkFailure = resolvedLinkFailure;
+ }
+
+ public String getResult() {
+ return result;
+ }
+
+ public int getResultCode() {
+ return resultCode;
+ }
+
+ public void setResultCode(int resultCode) {
+ this.resultCode = resultCode;
+ }
+
+ public void setResult(String result) {
+ this.result = result;
+ }
+
+ /**
+ * Sets the result.
+ *
+ * @param resultCode the result code
+ * @param result the result
+ */
+ public void setResult(int resultCode, String result) {
+ this.resultCode = resultCode;
+ this.result = result;
+ }
+
+ /**
+ * Instantiates a new operation result.
+ */
+ public OperationResult() {
+ super();
+ }
+
+ /**
+ * Instantiates a new operation result.
+ *
+ * @param resultCode the result code
+ * @param result the result
+ */
+ public OperationResult(int resultCode, String result) {
+ super();
+ this.resultCode = resultCode;
+ this.result = result;
+ }
+
+ public long getResponseTimeInMs() {
+ return responseTimeInMs;
+ }
+
+ public void setResponseTimeInMs(long responseTimeInMs) {
+ this.responseTimeInMs = responseTimeInMs;
+ }
+
+ public int getNumRequestRetries() {
+ return numRequestRetries;
+ }
+
+ public void setNumRequestRetries(int numRequestRetries) {
+ this.numRequestRetries = numRequestRetries;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "OperationResult [result=" + result + ", resultCode=" + resultCode
+ + ", resolvedLinkFromCache=" + resolvedLinkFromCache + ", resolvedLinkFromServer="
+ + resolvedLinkFromServer + ", resolvedLinkFailure=" + resolvedLinkFailure
+ + ", numRequestRetries=" + numRequestRetries + ", responseTimeInMs=" + responseTimeInMs
+ + "]";
+ }
+
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/rest/RestClientBuilder.java b/src/main/java/org/openecomp/sparky/dal/rest/RestClientBuilder.java
new file mode 100644
index 0000000..267061a
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/rest/RestClientBuilder.java
@@ -0,0 +1,148 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * 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 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 and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.rest;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.client.urlconnection.HTTPSProperties;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+
+import org.openecomp.sparky.security.SecurityContextFactory;
+import org.openecomp.sparky.security.SecurityContextFactoryImpl;
+
+/**
+ * This is a generic REST Client builder with flexible security validation. Sometimes it's nice to
+ * be able to disable server chain cert validation and hostname validation to work-around lab
+ * issues, but at the same time be able to provide complete validation with client cert + hostname +
+ * server cert chain validation.
+ * I used the ModelLoader REST client as a base and merged in the TSUI client I wrote which also
+ * validates the server hostname and server certificate chain.
+ *
+ * @author DAVEA
+ *
+ */
+public class RestClientBuilder {
+
+ /*
+ * TODO: implement fluent interface?
+ */
+
+ private boolean useHttps;
+ private boolean validateServerHostname;
+ private int connectTimeoutInMs;
+ private int readTimeoutInMs;
+ protected SecurityContextFactory sslContextFactory;
+
+ /**
+ * Instantiates a new rest client builder.
+ */
+ public RestClientBuilder() {
+ validateServerHostname = false;
+ connectTimeoutInMs = 60000;
+ readTimeoutInMs = 60000;
+ useHttps = true;
+ sslContextFactory = new SecurityContextFactoryImpl();
+ }
+
+ public SecurityContextFactory getSslContextFactory() {
+ return sslContextFactory;
+ }
+
+ public void setSslContextFactory(SecurityContextFactory sslContextFactory) {
+ this.sslContextFactory = sslContextFactory;
+ }
+
+ public boolean isUseHttps() {
+ return useHttps;
+ }
+
+ public void setUseHttps(boolean useHttps) {
+ this.useHttps = useHttps;
+ }
+
+ public int getConnectTimeoutInMs() {
+ return connectTimeoutInMs;
+ }
+
+ public void setConnectTimeoutInMs(int connectTimeoutInMs) {
+ this.connectTimeoutInMs = connectTimeoutInMs;
+ }
+
+ public int getReadTimeoutInMs() {
+ return readTimeoutInMs;
+ }
+
+ public void setReadTimeoutInMs(int readTimeoutInMs) {
+ this.readTimeoutInMs = readTimeoutInMs;
+ }
+
+ public boolean isValidateServerHostname() {
+ return validateServerHostname;
+ }
+
+ public void setValidateServerHostname(boolean validateServerHostname) {
+ this.validateServerHostname = validateServerHostname;
+ }
+
+ public Client getClient() throws Exception {
+
+ Client client = null;
+ ClientConfig clientConfig = new DefaultClientConfig();
+
+ if (useHttps) {
+ SSLContext sslContext = sslContextFactory.getSecureContext();
+
+ if (validateServerHostname) {
+
+ clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
+ new HTTPSProperties(null, sslContext));
+
+ } else {
+ clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
+ new HTTPSProperties(new HostnameVerifier() {
+ @Override
+ public boolean verify(String string, SSLSession sslSession) {
+ return true;
+ }
+ }, sslContext));
+
+ }
+ }
+
+ client = Client.create(clientConfig);
+
+ client.setConnectTimeout(connectTimeoutInMs);
+ client.setReadTimeout(readTimeoutInMs);
+
+ return client;
+
+ }
+
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/rest/RestDataProvider.java b/src/main/java/org/openecomp/sparky/dal/rest/RestDataProvider.java
new file mode 100644
index 0000000..15dad28
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/rest/RestDataProvider.java
@@ -0,0 +1,112 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * 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 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 and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.rest;
+
+/**
+ * The Interface RestDataProvider.
+ */
+public interface RestDataProvider {
+
+ /**
+ * Do get.
+ *
+ * @param url the url
+ * @param acceptContentType the accept content type
+ * @return the operation result
+ */
+ OperationResult doGet(String url, String acceptContentType);
+
+ /**
+ * Do delete.
+ *
+ * @param url the url
+ * @param acceptContentType the accept content type
+ * @return the operation result
+ */
+ OperationResult doDelete(String url, String acceptContentType);
+
+ /**
+ * Do post.
+ *
+ * @param url the url
+ * @param jsonPayload the json payload
+ * @param acceptContentType the accept content type
+ * @return the operation result
+ */
+ OperationResult doPost(String url, String jsonPayload, String acceptContentType);
+
+ /**
+ * Do put.
+ *
+ * @param url the url
+ * @param jsonPayload the json payload
+ * @param acceptContentType the accept content type
+ * @return the operation result
+ */
+ OperationResult doPut(String url, String jsonPayload, String acceptContentType);
+
+ /**
+ * Do patch.
+ *
+ * @param url the url
+ * @param jsonPayload the json payload
+ * @param acceptContentType the accept content type
+ * @return the operation result
+ */
+ OperationResult doPatch(String url, String jsonPayload, String acceptContentType);
+
+ /**
+ * Do head.
+ *
+ * @param url the url
+ * @param acceptContentType the accept content type
+ * @return the operation result
+ */
+ OperationResult doHead(String url, String acceptContentType);
+
+ /**
+ * Do restful operation.
+ *
+ * @param method the method
+ * @param url the url
+ * @param payload the payload
+ * @param payloadType the payload type
+ * @param acceptContentType the accept content type
+ * @return the operation result
+ */
+ OperationResult doRestfulOperation(HttpMethod method, String url, String payload,
+ String payloadType, String acceptContentType);
+
+ /**
+ * Shutdown.
+ */
+ void shutdown();
+
+ /**
+ * Clear cache.
+ */
+ void clearCache();
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/rest/RestOperationalStatistics.java b/src/main/java/org/openecomp/sparky/dal/rest/RestOperationalStatistics.java
new file mode 100644
index 0000000..7b0ca48
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/rest/RestOperationalStatistics.java
@@ -0,0 +1,256 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * 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 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 and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.rest;
+
+import org.openecomp.sparky.analytics.AbstractStatistics;
+import org.openecomp.sparky.dal.NetworkTransaction;
+
+/**
+ * The Class RestOperationalStatistics.
+ */
+public class RestOperationalStatistics extends AbstractStatistics {
+
+ private static final String GET_1XX = "GET_1XX";
+ private static final String GET_2XX = "GET_2XX";
+ private static final String GET_3XX = "GET_3XX";
+ private static final String GET_4XX = "GET_4XX";
+ private static final String GET_5XX = "GET_5XX";
+ private static final String GET_6XX = "GET_6XX";
+
+ private static final String PUT_1XX = "PUT_1XX";
+ private static final String PUT_2XX = "PUT_2XX";
+ private static final String PUT_3XX = "PUT_3XX";
+ private static final String PUT_4XX = "PUT_4XX";
+ private static final String PUT_5XX = "PUT_5XX";
+ private static final String PUT_6XX = "PUT_6XX";
+
+ private static final String POST_1XX = "POST_1XX";
+ private static final String POST_2XX = "POST_2XX";
+ private static final String POST_3XX = "POST_3XX";
+ private static final String POST_4XX = "POST_4XX";
+ private static final String POST_5XX = "POST_5XX";
+ private static final String POST_6XX = "POST_6XX";
+
+ private static final String DELETE_1XX = "DELETE_1XX";
+ private static final String DELETE_2XX = "DELETE_2XX";
+ private static final String DELETE_3XX = "DELETE_3XX";
+ private static final String DELETE_4XX = "DELETE_4XX";
+ private static final String DELETE_5XX = "DELETE_5XX";
+ private static final String DELETE_6XX = "DELETE_6XX";
+
+ /**
+ * Creates the counters.
+ */
+ private void createCounters() {
+
+ addCounter(GET_1XX);
+ addCounter(GET_2XX);
+ addCounter(GET_3XX);
+ addCounter(GET_4XX);
+ addCounter(GET_5XX);
+ addCounter(GET_6XX);
+
+ addCounter(PUT_1XX);
+ addCounter(PUT_2XX);
+ addCounter(PUT_3XX);
+ addCounter(PUT_4XX);
+ addCounter(PUT_5XX);
+ addCounter(PUT_6XX);
+
+ addCounter(POST_1XX);
+ addCounter(POST_2XX);
+ addCounter(POST_3XX);
+ addCounter(POST_4XX);
+ addCounter(POST_5XX);
+ addCounter(POST_6XX);
+
+ addCounter(DELETE_1XX);
+ addCounter(DELETE_2XX);
+ addCounter(DELETE_3XX);
+ addCounter(DELETE_4XX);
+ addCounter(DELETE_5XX);
+ addCounter(DELETE_6XX);
+
+
+ }
+
+ /**
+ * Gets the result code.
+ *
+ * @param txn the txn
+ * @return the result code
+ */
+ private int getResultCode(NetworkTransaction txn) {
+
+ if (txn == null) {
+ return -1;
+ }
+
+ if (txn.getOperationResult() == null) {
+ return -1;
+ }
+
+ return txn.getOperationResult().getResultCode();
+
+ }
+
+ /**
+ * Update counters.
+ *
+ * @param txn the txn
+ */
+ public void updateCounters(NetworkTransaction txn) {
+
+ if (txn == null) {
+ return;
+ }
+
+ int rc = getResultCode(txn);
+
+ switch (txn.getOperationType()) {
+
+ case GET: {
+
+ if (100 <= rc && rc <= 199) {
+ pegCounter(GET_1XX);
+ } else if (200 <= rc && rc <= 299) {
+ pegCounter(GET_2XX);
+ } else if (300 <= rc && rc <= 399) {
+ pegCounter(GET_3XX);
+ } else if (400 <= rc && rc <= 499) {
+ pegCounter(GET_4XX);
+ } else if (500 <= rc && rc <= 599) {
+ pegCounter(GET_5XX);
+ } else if (600 <= rc && rc <= 699) {
+ pegCounter(GET_6XX);
+ }
+
+ break;
+ }
+
+ case PUT: {
+
+ if (100 <= rc && rc <= 199) {
+ pegCounter(PUT_1XX);
+ } else if (200 <= rc && rc <= 299) {
+ pegCounter(PUT_2XX);
+ } else if (300 <= rc && rc <= 399) {
+ pegCounter(PUT_3XX);
+ } else if (400 <= rc && rc <= 499) {
+ pegCounter(PUT_4XX);
+ } else if (500 <= rc && rc <= 599) {
+ pegCounter(PUT_5XX);
+ } else if (600 <= rc && rc <= 699) {
+ pegCounter(PUT_6XX);
+ }
+
+ break;
+ }
+
+ case POST: {
+
+ if (100 <= rc && rc <= 199) {
+ pegCounter(POST_1XX);
+ } else if (200 <= rc && rc <= 299) {
+ pegCounter(POST_2XX);
+ } else if (300 <= rc && rc <= 399) {
+ pegCounter(POST_3XX);
+ } else if (400 <= rc && rc <= 499) {
+ pegCounter(POST_4XX);
+ } else if (500 <= rc && rc <= 599) {
+ pegCounter(POST_5XX);
+ } else if (600 <= rc && rc <= 699) {
+ pegCounter(POST_6XX);
+ }
+
+ break;
+ }
+
+ case DELETE: {
+
+ if (100 <= rc && rc <= 199) {
+ pegCounter(DELETE_1XX);
+ } else if (200 <= rc && rc <= 299) {
+ pegCounter(DELETE_2XX);
+ } else if (300 <= rc && rc <= 399) {
+ pegCounter(DELETE_3XX);
+ } else if (400 <= rc && rc <= 499) {
+ pegCounter(DELETE_4XX);
+ } else if (500 <= rc && rc <= 599) {
+ pegCounter(DELETE_5XX);
+ } else if (600 <= rc && rc <= 699) {
+ pegCounter(DELETE_6XX);
+ }
+
+ break;
+ }
+
+ default: {
+ // not expecting anything else yet
+ }
+
+ }
+
+ }
+
+ /**
+ * Instantiates a new rest operational statistics.
+ */
+ public RestOperationalStatistics() {
+ createCounters();
+ }
+
+ public String getStatisticsReport() {
+
+ StringBuilder sb = new StringBuilder(128);
+
+ sb.append("\n ")
+ .append(String.format(
+ "%-12s 1XX: %-12d 2XX: %-12d 3XX: %-12d 4XX: %-12d 5XX: %-12d 6XX: %-12d ",
+ HttpMethod.DELETE, getCounterValue(DELETE_1XX), getCounterValue(DELETE_2XX),
+ getCounterValue(DELETE_3XX), getCounterValue(DELETE_4XX), getCounterValue(DELETE_5XX),
+ getCounterValue(DELETE_6XX)));
+
+ sb.append("\n ").append(String.format(
+ "%-12s 1XX: %-12d 2XX: %-12d 3XX: %-12d 4XX: %-12d 5XX: %-12d 6XX: %-12d ", HttpMethod.PUT,
+ getCounterValue(PUT_1XX), getCounterValue(PUT_2XX), getCounterValue(PUT_3XX),
+ getCounterValue(PUT_4XX), getCounterValue(PUT_5XX), getCounterValue(PUT_6XX)));
+
+ sb.append("\n ").append(String.format(
+ "%-12s 1XX: %-12d 2XX: %-12d 3XX: %-12d 4XX: %-12d 5XX: %-12d 6XX: %-12d ", HttpMethod.POST,
+ getCounterValue(POST_1XX), getCounterValue(POST_2XX), getCounterValue(POST_3XX),
+ getCounterValue(POST_4XX), getCounterValue(POST_5XX), getCounterValue(POST_6XX)));
+
+ sb.append("\n ").append(String.format(
+ "%-12s 1XX: %-12d 2XX: %-12d 3XX: %-12d 4XX: %-12d 5XX: %-12d 6XX: %-12d ", HttpMethod.GET,
+ getCounterValue(GET_1XX), getCounterValue(GET_2XX), getCounterValue(GET_3XX),
+ getCounterValue(GET_4XX), getCounterValue(GET_5XX), getCounterValue(GET_6XX)));
+
+ return sb.toString();
+ }
+
+
+}
diff --git a/src/main/java/org/openecomp/sparky/dal/rest/RestfulDataAccessor.java b/src/main/java/org/openecomp/sparky/dal/rest/RestfulDataAccessor.java
new file mode 100644
index 0000000..1c2fb07
--- /dev/null
+++ b/src/main/java/org/openecomp/sparky/dal/rest/RestfulDataAccessor.java
@@ -0,0 +1,357 @@
+/**
+ * ============LICENSE_START===================================================
+ * SPARKY (AAI UI service)
+ * ============================================================================
+ * 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 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 and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+
+package org.openecomp.sparky.dal.rest;
+
+import java.security.SecureRandom;
+
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.sparky.dal.cache.EntityCache;
+import org.openecomp.sparky.logging.AaiUiMsgs;
+import org.openecomp.sparky.util.NodeUtils;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.WebResource.Builder;
+
+/**
+ * The Class RestfulDataAccessor.
+ */
+public class RestfulDataAccessor implements RestDataProvider {
+
+ protected SecureRandom txnIdGenerator;
+
+ protected RestClientBuilder clientBuilder;
+
+ protected EntityCache entityCache;
+ private boolean cacheEnabled;
+ private static final Logger LOG =
+ LoggerFactory.getInstance().getLogger(RestfulDataAccessor.class);
+
+ private boolean resourceNotFoundErrorsSurpressed;
+
+ public static final String APPLICATION_JSON = "application/json";
+ public static final String APPLICATION_MERGE_PATCH_JSON = "application/merge-patch+json";
+ public static final String APPLICATION_X_WWW_FORM_URL_ENCODED =
+ "application/x-www-form-urlencoded";
+
+
+ /**
+ * Instantiates a new restful data accessor.
+ *
+ * @param clientBuilder the client builder
+ */
+ public RestfulDataAccessor(RestClientBuilder clientBuilder) {
+ this.clientBuilder = clientBuilder;
+ txnIdGenerator = new SecureRandom();
+ resourceNotFoundErrorsSurpressed = false;
+ cacheEnabled = false;
+ entityCache = null;
+ }
+
+ protected boolean isCacheEnabled() {
+ return cacheEnabled;
+ }
+
+ public void setCacheEnabled(boolean cacheEnabled) {
+ this.cacheEnabled = cacheEnabled;
+ }
+
+ protected EntityCache getEntityCache() {
+ return entityCache;
+ }
+
+ public void setEntityCache(EntityCache entityCache) {
+ this.entityCache = entityCache;
+ }
+
+ /**
+ * Cache result.
+ *
+ * @param result the result
+ */
+ private void cacheResult(OperationResult result) {
+ if (cacheEnabled && entityCache != null) {
+ final String id =
+ NodeUtils.generateUniqueShaDigest(result.getRequestLink(), result.getRequestPayload());
+ entityCache.put(id, result);
+ }
+ }
+
+ /**
+ * Populate operation result.
+ *
+ * @param response the response
+ * @param opResult the op result
+ */
+ protected void populateOperationResult(ClientResponse response, OperationResult opResult) {
+
+ if (response == null) {
+ opResult.setResult(500, "Client response was null");
+ return;
+ }
+
+ int statusCode = response.getStatus();
+ String payload = response.getEntity(String.class);
+
+ opResult.setResult(statusCode, payload);
+
+ }
+
+ /**
+ * Gets the cached data.
+ *
+ * @param link the link
+ * @param payload the payload
+ * @return the cached data
+ */
+ private OperationResult getCachedData(String link, String payload) {
+ if (cacheEnabled && entityCache != null) {
+ final String id = NodeUtils.generateUniqueShaDigest(link, payload);
+ return entityCache.get(id, link);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doRestfulOperation(org.openecomp.sparky.dal.rest.HttpMethod, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doRestfulOperation(HttpMethod method, String url, String payload,
+ String payloadType, String acceptContentType) {
+
+ ClientResponse clientResponse = null;
+
+ long startTimeInMs = System.currentTimeMillis();
+ Client client = null;
+ Builder builder = null;
+
+ OperationResult operationResult = null;
+
+ /*
+ * Attempt to get cached data for the requested URL. We don't currently cache the other
+ * operations.
+ */
+
+ operationResult = getCachedData(url, payload);
+
+ if (operationResult != null) {
+
+ /*
+ * cache-hit, return what we found
+ */
+
+ // System.out.println("operationResult = " + operationResult.getResultCode());
+ // System.out.println("opresult = " + operationResult.getResult());
+ return operationResult;
+ }
+
+ /*
+ * else cache miss / cache disabled (default operation)
+ */
+
+ operationResult = new OperationResult();
+ operationResult.setRequestLink(url);
+
+ try {
+
+ client = clientBuilder.getClient();
+
+ switch (method) {
+ case GET: {
+ builder = setClientDefaults(client, url, null, acceptContentType);
+ clientResponse = builder.get(ClientResponse.class);
+ break;
+ }
+
+ case PUT: {
+ builder = setClientDefaults(client, url, payloadType, acceptContentType);
+ clientResponse = builder.put(ClientResponse.class, payload);
+ break;
+ }
+
+ case POST: {
+ builder = setClientDefaults(client, url, payloadType, acceptContentType);
+ clientResponse = builder.post(ClientResponse.class, payload);
+ break;
+ }
+
+ case DELETE: {
+ builder = setClientDefaults(client, url, null, acceptContentType);
+ clientResponse = builder.delete(ClientResponse.class);
+ break;
+ }
+
+ case PATCH: {
+ builder = setClientDefaults(client, url, payloadType, acceptContentType);
+ builder = builder.header("X-HTTP-Method-Override", "PATCH");
+ clientResponse = builder.post(ClientResponse.class, payload);
+ break;
+ }
+
+ case HEAD: {
+ builder = setClientDefaults(client, url, null, acceptContentType);
+ clientResponse = builder.head();
+ break;
+ }
+
+
+ default: {
+ operationResult.setResult(500, "Unhandled HTTP Method operation = " + method);
+ return operationResult;
+ }
+
+ }
+
+ } catch (Exception ex) {
+ LOG.error(AaiUiMsgs.RESTFULL_OP_ERROR_VERBOSE, url, ex.getLocalizedMessage());
+ operationResult.setResult(500,
+ String.format("Error retrieving link = '%s' from restful endpoint due to error = '%s'",
+ url, ex.getLocalizedMessage()));
+ return operationResult;
+ }
+
+ populateOperationResult(clientResponse, operationResult);
+
+ if (operationResult.getResultCode() != 404
+ || (operationResult.getResultCode() == 404 && !isResourceNotFoundErrorsSurpressed())) {
+ LOG.info(AaiUiMsgs.RESTFULL_OP_COMPLETE, method.toString(),
+ String.valueOf(System.currentTimeMillis() - startTimeInMs), url,
+ String.valueOf(operationResult.getResultCode()));
+ }
+
+ cacheResult(operationResult);
+
+ return operationResult;
+
+ }
+
+ public boolean isResourceNotFoundErrorsSurpressed() {
+ return resourceNotFoundErrorsSurpressed;
+ }
+
+ public void setResourceNotFoundErrorsSurpressed(boolean resourceNotFoundErrorsSurpressed) {
+ this.resourceNotFoundErrorsSurpressed = resourceNotFoundErrorsSurpressed;
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doGet(java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doGet(String url, String acceptContentType) {
+ return doRestfulOperation(HttpMethod.GET, url, null, null, acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doDelete(java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doDelete(String url, String acceptContentType) {
+ return doRestfulOperation(HttpMethod.DELETE, url, null, null, acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doPost(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doPost(String url, String jsonPayload, String acceptContentType) {
+ return doRestfulOperation(HttpMethod.POST, url, jsonPayload, APPLICATION_JSON,
+ acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doPut(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doPut(String url, String jsonPayload, String acceptContentType) {
+ return doRestfulOperation(HttpMethod.PUT, url, jsonPayload, APPLICATION_JSON,
+ acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doPatch(java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doPatch(String url, String jsonPayload, String acceptContentType) {
+ return doRestfulOperation(HttpMethod.PATCH, url, jsonPayload, APPLICATION_MERGE_PATCH_JSON,
+ acceptContentType);
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#doHead(java.lang.String, java.lang.String)
+ */
+ @Override
+ public OperationResult doHead(String url, String acceptContentType) {
+ return doRestfulOperation(HttpMethod.HEAD, url, null, null, acceptContentType);
+ }
+
+ /**
+ * Sets the client defaults.
+ *
+ * @param client the client
+ * @param url the url
+ * @param payloadContentType the payload content type
+ * @param acceptContentType the accept content type
+ * @return the builder
+ */
+ protected Builder setClientDefaults(Client client, String url, String payloadContentType,
+ String acceptContentType) {
+ WebResource resource = client.resource(url);
+ Builder builder = null;
+ builder = resource.accept(acceptContentType);
+
+ if (payloadContentType != null) {
+ builder = builder.header("Content-Type", payloadContentType);
+ }
+
+ return builder;
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#shutdown()
+ */
+ @Override
+ public void shutdown() {
+
+ if (entityCache != null) {
+ entityCache.shutdown();
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.openecomp.sparky.dal.rest.RestDataProvider#clearCache()
+ */
+ @Override
+ public void clearCache() {
+ if (cacheEnabled) {
+ entityCache.clear();
+ }
+
+ }
+
+}