diff options
author | Smokowski, Steve (ss835w) <ss835w@us.att.com> | 2019-05-02 09:42:55 -0400 |
---|---|---|
committer | Smokowski, Steve (ss835w) <ss835w@us.att.com> | 2019-05-07 10:02:17 -0400 |
commit | 3f9a0c3183480d150089c0d5a6e507c877f7d121 (patch) | |
tree | b3db04cbe2cef23f81503177a50edc5360ffa486 /openstack-client-connectors/http-connector/src | |
parent | e153f0adfbed711ce1e215748594a4d04fd1edaf (diff) |
Enhance Openstack Client
Update Openstack Client to support additional fields
Updat all formatting issues
Issue-ID: SO-1844
Change-Id: I1369e0c18cc25274db8df7e12855a020b8da38da
Signed-off-by: Smokowski, Steve (ss835w) <ss835w@us.att.com>
Diffstat (limited to 'openstack-client-connectors/http-connector/src')
4 files changed, 177 insertions, 206 deletions
diff --git a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java index 27bbe87..418268b 100644 --- a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java +++ b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientConnector.java @@ -1,27 +1,20 @@ -/* - * ONAP-SO - * ============LICENSE_START========================================== - * =================================================================== - * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. - * =================================================================== +/*- + * ============LICENSE_START======================================================= * 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 + * 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. - * + * ============LICENSE_END========================================================= */ + package com.woorea.openstack.connector; import java.io.IOException; @@ -30,7 +23,6 @@ import java.net.URISyntaxException; import java.net.UnknownHostException; import java.util.List; import java.util.Map.Entry; - import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; @@ -47,7 +39,6 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonRootName; import com.fasterxml.jackson.core.JsonProcessingException; @@ -85,7 +76,7 @@ public class HttpClientConnector implements OpenStackClientConnector { WRAPPED_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); } - protected static <T> ObjectMapper getObjectMapper (Class<T> type) { + protected static <T> ObjectMapper getObjectMapper(Class<T> type) { return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER; } @@ -105,7 +96,7 @@ public class HttpClientConnector implements OpenStackClientConnector { uri = uriBuilder.build(); } catch (URISyntaxException e) { - throw new HttpClientException (e); + throw new HttpClientException(e); } HttpEntity entity = null; @@ -114,17 +105,18 @@ public class HttpClientConnector implements OpenStackClientConnector { try { // Get appropriate mapper, based on existence of a root element in Entity class - ObjectMapper mapper = getObjectMapper (request.entity().getEntity().getClass()); + ObjectMapper mapper = getObjectMapper(request.entity().getEntity().getClass()); - String entityJson = mapper.writeValueAsString (request.entity().getEntity()); + String entityJson = mapper.writeValueAsString(request.entity().getEntity()); entity = new StringEntity(entityJson, ContentType.create(request.entity().getContentType())); - logger.debug ("Request JSON Body: " + entityJson.replaceAll("\"password\":\"[^\"]*\"", "\"password\":\"***\"")); + logger.debug("Request JSON Body: " + + entityJson.replaceAll("\"password\":\"[^\"]*\"", "\"password\":\"***\"")); } catch (JsonProcessingException e) { - throw new HttpClientException ("Json processing error on request entity", e); + throw new HttpClientException("Json processing error on request entity", e); } catch (IOException e) { - throw new HttpClientException ("Json IO error on request entity", e); + throw new HttpClientException("Json IO error on request entity", e); } } @@ -141,52 +133,46 @@ public class HttpClientConnector implements OpenStackClientConnector { httpRequest.addHeader(h.getKey(), sb.toString()); } - logger.debug ("Sending HTTP request: " + httpRequest.toString()); + logger.debug("Sending HTTP request: " + httpRequest.toString()); - // Get the Response. But don't get the body entity yet, as this response - // will be wrapped in an HttpClientResponse. The HttpClientResponse + // Get the Response. But don't get the body entity yet, as this response + // will be wrapped in an HttpClientResponse. The HttpClientResponse // buffers the body in constructor, so can close the response here. HttpClientResponse httpClientResponse = null; CloseableHttpResponse httpResponse = null; // Catch known HttpClient exceptions, and wrap them in OpenStack Client Exceptions - // so calling functions can distinguish. Only RuntimeExceptions are allowed. + // so calling functions can distinguish. Only RuntimeExceptions are allowed. try { httpResponse = httpClient.execute(httpRequest); - logger.debug ("Response status: " + httpResponse.getStatusLine().getStatusCode()); + logger.debug("Response status: " + httpResponse.getStatusLine().getStatusCode()); - httpClientResponse = new HttpClientResponse (httpResponse); + httpClientResponse = new HttpClientResponse(httpResponse); int status = httpResponse.getStatusLine().getStatusCode(); - if (status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED || - status == HttpStatus.SC_NO_CONTENT || status == HttpStatus.SC_ACCEPTED) - { + if (status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED || status == HttpStatus.SC_NO_CONTENT + || status == HttpStatus.SC_ACCEPTED) { return httpClientResponse; } - } - catch (HttpResponseException e) { - // What exactly does this mean? It does not appear to get thrown for + } catch (HttpResponseException e) { + // What exactly does this mean? It does not appear to get thrown for // non-2XX responses as documented. - logger.error ("HttpResponseException: " +e.getMessage()); + logger.error("HttpResponseException: " + e.getMessage()); throw new OpenStackResponseException(e.getMessage(), e.getStatusCode()); - } - catch (UnknownHostException e) { - logger.error ("Unknown Host: " +e.getMessage()); + } catch (UnknownHostException e) { + logger.error("Unknown Host: " + e.getMessage()); throw new OpenStackConnectException("Unknown Host: " + e.getMessage()); - } - catch (IOException e) { - logger.error ("IOException: " +e.getMessage()); + } catch (IOException e) { + logger.error("IOException: " + e.getMessage()); // Catch all other IOExceptions and throw as OpenStackConnectException throw new OpenStackConnectException(e.getMessage()); - } - catch (Exception e) { + } catch (Exception e) { // Catchall for anything else, must throw as a RuntimeException - logger.error ("Unexpected client exception: " +e.getMessage()); + logger.error("Unexpected client exception: " + e.getMessage()); throw new RuntimeException("Unexpected client exception", e); - } - finally { - // Have the body. Close the stream + } finally { + // Have the body. Close the stream if (httpResponse != null) try { httpResponse.close(); @@ -197,8 +183,7 @@ public class HttpClientConnector implements OpenStackClientConnector { // Get here on an error response (4XX-5XX) throw new OpenStackResponseException(httpResponse.getStatusLine().getReasonPhrase(), - httpResponse.getStatusLine().getStatusCode(), - httpClientResponse); + httpResponse.getStatusLine().getStatusCode(), httpClientResponse); } private <T> HttpUriRequest getHttpUriRequest(OpenStackRequest<T> request, URI uri, HttpEntity entity) { @@ -206,7 +191,7 @@ public class HttpClientConnector implements OpenStackClientConnector { switch (request.method()) { case POST: HttpPost post = new HttpPost(uri); - post.setEntity (entity); + post.setEntity(entity); httpRequest = post; break; @@ -216,7 +201,7 @@ public class HttpClientConnector implements OpenStackClientConnector { case PUT: HttpPut put = new HttpPut(uri); - put.setEntity (entity); + put.setEntity(entity); httpRequest = put; break; @@ -231,11 +216,11 @@ public class HttpClientConnector implements OpenStackClientConnector { } private <T> void setUriBuilderParams(OpenStackRequest<T> request, URIBuilder uriBuilder) { - for(Entry<String, List<Object>> entry : request.queryParams().entrySet()) { + for (Entry<String, List<Object>> entry : request.queryParams().entrySet()) { for (Object o : entry.getValue()) { uriBuilder.setParameter(entry.getKey(), String.valueOf(o)); } } } -}
\ No newline at end of file +} diff --git a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java index ecdc1d7..b2e08b4 100644 --- a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java +++ b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientException.java @@ -1,39 +1,39 @@ -/*-
- * ============LICENSE_START=======================================================
- * 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 com.woorea.openstack.connector;
-
-/*
- * Declare a RuntimeException since the Interface does not declare any
- * throwables. Any caught exception will be wrapped in HttpClientException
- */
-public class HttpClientException extends RuntimeException {
-
- private static final long serialVersionUID = 1L;
-
- public HttpClientException (String s) {
- super (s);
- }
-
- public HttpClientException (Exception e) {
- super ("Caught nested exception in HttpClient", e);
- }
-
- public HttpClientException (String s, Exception e) {
- super (s, e);
- }
-}
\ No newline at end of file +/*- + * ============LICENSE_START======================================================= + * 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 com.woorea.openstack.connector; + +/* + * Declare a RuntimeException since the Interface does not declare any throwables. Any caught exception will be wrapped + * in HttpClientException + */ +public class HttpClientException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public HttpClientException(String s) { + super(s); + } + + public HttpClientException(Exception e) { + super("Caught nested exception in HttpClient", e); + } + + public HttpClientException(String s, Exception e) { + super(s, e); + } +} diff --git a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java index c611e13..4c5946d 100644 --- a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java +++ b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientRedirectStrategy.java @@ -1,103 +1,92 @@ -/*-
- * ============LICENSE_START=======================================================
- * 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 com.woorea.openstack.connector;
-
-import java.net.URI;
-
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.ProtocolException;
-import org.apache.http.annotation.Immutable;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpHead;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.methods.RequestBuilder;
-import org.apache.http.impl.client.DefaultRedirectStrategy;
-import org.apache.http.protocol.HttpContext;
-
-/**
- * Custom {@link org.apache.http.client.RedirectStrategy} implementation
- * that automatically redirects all HEAD, GET and DELETE requests.
- * The {@link org.apache.http.client.DefaultRedirectStrategy} only
- * redirects GET and HEAD automatically, per the HTTP specification
- * (POST and PUT typically have bodies and thus cannot be redirected).
- *
- * A custom strategy is needed for the Openstack API, which can also send
- * 302 on a DELETE (by name) request, expecting the client to follow the
- * redirect to perform the actual deletion.
- */
-@Immutable
-public class HttpClientRedirectStrategy extends DefaultRedirectStrategy {
-
- /**
- * Redirectable methods.
- */
- private static final String[] REDIRECT_METHODS = new String[] {
- HttpGet.METHOD_NAME,
- HttpDelete.METHOD_NAME,
- HttpHead.METHOD_NAME
- };
-
- /**
- * Determine if the request should be redirected.
- * This may not actually be needed, since the REDIRECT_METHODS
- * array has been updated with the DELETE.
- */
- @Override
- protected boolean isRedirectable(final String method) {
- for (final String m: REDIRECT_METHODS) {
- if (m.equalsIgnoreCase(method)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Override the default redirect handling method. As implemented
- * in HttpClient, it does not preserve the method on 301 or 302
- * responses, always redirecting to a GET.
- */
- @Override
- public HttpUriRequest getRedirect(
- final HttpRequest request,
- final HttpResponse response,
- final HttpContext context) throws ProtocolException {
-
- final URI uri = getLocationURI(request, response, context);
- final String method = request.getRequestLine().getMethod();
- if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {
- return new HttpHead(uri);
- } else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {
- return new HttpGet(uri);
- } else {
-
- final int status = response.getStatusLine().getStatusCode();
-
- HttpUriRequest newRequest;
- if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_TEMPORARILY) {
- newRequest = RequestBuilder.copy(request).setUri(uri).build();
- } else {
- newRequest = new HttpGet(uri);
- }
- return newRequest;
- }
- }
-}
\ No newline at end of file +/*- + * ============LICENSE_START======================================================= + * 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 com.woorea.openstack.connector; + +import java.net.URI; +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.ProtocolException; +import org.apache.http.annotation.Immutable; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpHead; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.impl.client.DefaultRedirectStrategy; +import org.apache.http.protocol.HttpContext; + +/** + * Custom {@link org.apache.http.client.RedirectStrategy} implementation that automatically redirects all HEAD, GET and + * DELETE requests. The {@link org.apache.http.client.DefaultRedirectStrategy} only redirects GET and HEAD + * automatically, per the HTTP specification (POST and PUT typically have bodies and thus cannot be redirected). + * + * A custom strategy is needed for the Openstack API, which can also send 302 on a DELETE (by name) request, expecting + * the client to follow the redirect to perform the actual deletion. + */ +@Immutable +public class HttpClientRedirectStrategy extends DefaultRedirectStrategy { + + /** + * Redirectable methods. + */ + private static final String[] REDIRECT_METHODS = + new String[] {HttpGet.METHOD_NAME, HttpDelete.METHOD_NAME, HttpHead.METHOD_NAME}; + + /** + * Determine if the request should be redirected. This may not actually be needed, since the REDIRECT_METHODS array + * has been updated with the DELETE. + */ + @Override + protected boolean isRedirectable(final String method) { + for (final String m : REDIRECT_METHODS) { + if (m.equalsIgnoreCase(method)) { + return true; + } + } + return false; + } + + /** + * Override the default redirect handling method. As implemented in HttpClient, it does not preserve the method on + * 301 or 302 responses, always redirecting to a GET. + */ + @Override + public HttpUriRequest getRedirect(final HttpRequest request, final HttpResponse response, final HttpContext context) + throws ProtocolException { + + final URI uri = getLocationURI(request, response, context); + final String method = request.getRequestLine().getMethod(); + if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) { + return new HttpHead(uri); + } else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) { + return new HttpGet(uri); + } else { + + final int status = response.getStatusLine().getStatusCode(); + + HttpUriRequest newRequest; + if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_TEMPORARILY) { + newRequest = RequestBuilder.copy(request).setUri(uri).build(); + } else { + newRequest = new HttpGet(uri); + } + return newRequest; + } + } +} diff --git a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java index f1c8c78..24541cd 100644 --- a/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java +++ b/openstack-client-connectors/http-connector/src/main/java/com/woorea/openstack/connector/HttpClientResponse.java @@ -21,10 +21,8 @@ import org.apache.http.Header; import org.apache.http.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import com.fasterxml.jackson.databind.ObjectMapper; import com.woorea.openstack.base.client.OpenStackResponse; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -39,14 +37,13 @@ public class HttpClientResponse implements OpenStackResponse { private HttpResponse response = null; private String entityBody = null; - public HttpClientResponse(HttpResponse response) - { + public HttpClientResponse(HttpResponse response) { this.response = response; // Read the body so InputStream can be closed if (response.getEntity() == null) { // No body - logger.debug ("No Response Body"); + logger.debug("No Response Body"); return; } @@ -54,23 +51,23 @@ public class HttpClientResponse implements OpenStackResponse { try { response.getEntity().writeTo(responseBody); } catch (IOException e) { - throw new HttpClientException ("Error Reading Response Body", e); + throw new HttpClientException("Error Reading Response Body", e); } entityBody = responseBody.toString(); - logger.debug (entityBody); + logger.debug(entityBody); } @Override - public <T> T getEntity (Class<T> returnType) { + public <T> T getEntity(Class<T> returnType) { // Get appropriate mapper, based on existence of a root element - ObjectMapper mapper = HttpClientConnector.getObjectMapper (returnType); + ObjectMapper mapper = HttpClientConnector.getObjectMapper(returnType); T resp = null; try { resp = mapper.readValue(entityBody, returnType); } catch (Exception e) { - throw new HttpClientException ("Caught exception in getEntity", e); + throw new HttpClientException("Caught exception in getEntity", e); } return resp; } @@ -82,7 +79,7 @@ public class HttpClientResponse implements OpenStackResponse { @Override public InputStream getInputStream() { - return new ByteArrayInputStream (entityBody.getBytes()); + return new ByteArrayInputStream(entityBody.getBytes()); } @Override @@ -102,4 +99,4 @@ public class HttpClientResponse implements OpenStackResponse { return headers; } -}
\ No newline at end of file +} |