Skip to content

Commit 044608b

Browse files
authored
Merge pull request #1072 from kushalagrawal1/master
Issue : #[1070](#1070)
2 parents b8ede13 + 438f522 commit 044608b

File tree

6 files changed

+151
-104
lines changed

6 files changed

+151
-104
lines changed

connectors/resteasy/pom.xml

+13-2
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,20 @@
1111
<packaging>jar</packaging>
1212

1313
<properties>
14-
<resteasy-version>2.3.7.Final</resteasy-version>
14+
<resteasy-version>3.1.4.Final</resteasy-version>
1515
</properties>
1616

1717
<dependencies>
1818
<dependency>
1919
<groupId>org.jboss.resteasy</groupId>
20-
<artifactId>resteasy-jaxrs</artifactId>
20+
<artifactId>resteasy-client</artifactId>
2121
<version>${resteasy-version}</version>
22+
<exclusions>
23+
<exclusion>
24+
<artifactId>httpclient</artifactId>
25+
<groupId>org.apache.httpcomponents</groupId>
26+
</exclusion>
27+
</exclusions>
2228
</dependency>
2329
<dependency>
2430
<groupId>com.fasterxml.jackson.jaxrs</groupId>
@@ -30,6 +36,11 @@
3036
<artifactId>commons-logging</artifactId>
3137
<version>1.2</version>
3238
</dependency>
39+
<dependency>
40+
<groupId>org.apache.httpcomponents</groupId>
41+
<artifactId>httpclient</artifactId>
42+
<version>4.5.3</version>
43+
</dependency>
3344
</dependencies>
3445

3546
<build>
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
11
package org.openstack4j.connectors.resteasy;
22

3-
import java.util.List;
4-
import java.util.Map;
5-
6-
import javax.ws.rs.core.UriBuilder;
7-
8-
import org.jboss.resteasy.client.ClientRequest;
9-
import org.jboss.resteasy.client.ClientResponse;
10-
import org.openstack4j.connectors.resteasy.executors.ApacheHttpClientExecutor;
3+
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
4+
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
5+
import org.openstack4j.connectors.resteasy.executors.ApacheHttpClientEngine;
116
import org.openstack4j.core.transport.ClientConstants;
127
import org.openstack4j.core.transport.HttpRequest;
138
import org.openstack4j.core.transport.functions.EndpointURIFromRequestFunction;
149

10+
import javax.ws.rs.client.Entity;
11+
import javax.ws.rs.client.Invocation;
12+
import javax.ws.rs.core.Response;
13+
import javax.ws.rs.core.UriBuilder;
14+
import java.util.List;
15+
import java.util.Map;
16+
1517
/**
16-
* HttpCommand is responsible for executing the actual request driven by the HttpExecutor.
17-
*
18+
* HttpCommand is responsible for executing the actual request driven by the HttpExecutor.
19+
*
1820
* @param <R>
1921
*/
2022
public final class HttpCommand<R> {
2123

2224
private HttpRequest<R> request;
23-
private ClientRequest client;
25+
private ResteasyWebTarget resteasyWebTarget;
2426
private int retries;
27+
private Invocation.Builder resteasyRequest ;
2528

2629
private HttpCommand(HttpRequest<R> request) {
2730
this.request = request;
@@ -33,37 +36,39 @@ private HttpCommand(HttpRequest<R> request) {
3336
* @return the command
3437
*/
3538
public static <R> HttpCommand<R> create(HttpRequest<R> request) {
36-
HttpCommand<R> command = new HttpCommand<R>(request);
39+
HttpCommand<R> command = new HttpCommand<>(request);
3740
command.initialize();
3841
return command;
3942
}
4043

4144
private void initialize() {
42-
client = new ClientRequest(UriBuilder.fromUri(new EndpointURIFromRequestFunction().apply(request)),
43-
ApacheHttpClientExecutor.create(request.getConfig()), ResteasyClientFactory.getInstance());
44-
45-
client.followRedirects(true);
46-
45+
46+
resteasyWebTarget = new ResteasyClientBuilder().httpEngine(ApacheHttpClientEngine.create(request.getConfig()))
47+
.providerFactory(ResteasyClientFactory.getInstance()).build()
48+
.target(UriBuilder.fromUri(new EndpointURIFromRequestFunction().apply(request)));
49+
4750
populateQueryParams(request);
51+
resteasyRequest = resteasyWebTarget.request();
4852
populateHeaders(request);
4953
}
5054

5155
/**
5256
* Executes the command and returns the Response
53-
*
57+
*
5458
* @return the response
55-
* @throws Exception
5659
*/
57-
public ClientResponse<R> execute() throws Exception {
58-
60+
public Response execute(){
61+
62+
Invocation webRequest;
5963
if (request.getEntity() != null) {
60-
client.body(request.getContentType(), request.getEntity());
64+
webRequest = resteasyRequest.build(request.getMethod().name(), Entity.entity(request.getEntity(), request.getContentType()));
65+
} else if (request.hasJson()) {
66+
webRequest= resteasyRequest.build(request.getMethod().name() , Entity.entity(request.getJson(),ClientConstants.CONTENT_TYPE_JSON));
67+
}else{
68+
webRequest = resteasyRequest.build(request.getMethod().name());
6169
}
62-
else if(request.hasJson()) {
63-
client.body(ClientConstants.CONTENT_TYPE_JSON, request.getJson());
64-
}
65-
ClientResponse<R> response = client.httpMethod(request.getMethod().name(), request.getReturnType());
66-
return response;
70+
71+
return webRequest.invoke();
6772
}
6873

6974
/**
@@ -72,21 +77,21 @@ else if(request.hasJson()) {
7277
public boolean hasEntity() {
7378
return request.getEntity() != null;
7479
}
75-
80+
7681
/**
7782
* @return current retry execution count for this command
7883
*/
7984
public int getRetries() {
8085
return retries;
8186
}
82-
87+
8388
/**
8489
* @return incremement's the retry count and returns self
8590
*/
8691
public HttpCommand<R> incrementRetriesAndReturn() {
87-
initialize();
88-
retries++;
89-
return this;
92+
initialize();
93+
retries++;
94+
return this;
9095
}
9196

9297
public HttpRequest<R> getRequest() {
@@ -97,9 +102,9 @@ private void populateQueryParams(HttpRequest<R> request) {
97102

98103
if (!request.hasQueryParams()) return;
99104

100-
for(Map.Entry<String, List<Object> > entry : request.getQueryParams().entrySet()) {
105+
for (Map.Entry<String, List<Object>> entry : request.getQueryParams().entrySet()) {
101106
for (Object o : entry.getValue()) {
102-
client = client.queryParameter(entry.getKey(), o);
107+
resteasyWebTarget = resteasyWebTarget.queryParam(entry.getKey(), o);
103108
}
104109
}
105110
}
@@ -108,8 +113,8 @@ private void populateHeaders(HttpRequest<R> request) {
108113

109114
if (!request.hasHeaders()) return;
110115

111-
for(Map.Entry<String, Object> h : request.getHeaders().entrySet()) {
112-
client.header(h.getKey(), h.getValue());
116+
for (Map.Entry<String, Object> h : request.getHeaders().entrySet()) {
117+
resteasyRequest.header(h.getKey(), h.getValue());
113118
}
114119
}
115120
}

connectors/resteasy/src/main/java/org/openstack4j/connectors/resteasy/HttpExecutorServiceImpl.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.openstack4j.connectors.resteasy;
22

3-
import org.jboss.resteasy.client.ClientResponse;
43
import org.openstack4j.api.exceptions.ConnectionException;
54
import org.openstack4j.api.exceptions.ResponseException;
65
import org.openstack4j.core.transport.ClientConstants;
@@ -10,6 +9,8 @@
109
import org.openstack4j.openstack.internal.OSAuthenticator;
1110
import org.openstack4j.openstack.internal.OSClientSession;
1211

12+
import javax.ws.rs.core.Response;
13+
1314
/**
1415
* HttpExecutor is the default implementation for HttpExecutorService which is responsible for interfacing with Resteasy and mapping common status codes, requests and responses
1516
* back to the common API
@@ -58,7 +59,7 @@ private <R> HttpResponse invoke(HttpRequest<R> request) throws Exception {
5859
}
5960

6061
private <R> HttpResponse invokeRequest(HttpCommand<R> command) throws Exception {
61-
ClientResponse<R> response = command.execute();
62+
Response response = command.execute();
6263
if (command.getRetries() == 0 && response.getStatus() == 401 && !command.getRequest().getHeaders().containsKey(ClientConstants.HEADER_OS4J_AUTH))
6364
{
6465
OSAuthenticator.reAuthenticate();

connectors/resteasy/src/main/java/org/openstack4j/connectors/resteasy/HttpResponseImpl.java

+15-13
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
import java.util.Map;
77

88
import javax.ws.rs.core.MultivaluedMap;
9+
import javax.ws.rs.core.Response;
910

10-
import org.jboss.resteasy.client.ClientResponse;
1111
import org.openstack4j.core.transport.ClientConstants;
1212
import org.openstack4j.core.transport.ExecutionOptions;
1313
import org.openstack4j.core.transport.HttpEntityHandler;
1414
import org.openstack4j.core.transport.HttpResponse;
1515

1616
public class HttpResponseImpl implements HttpResponse {
1717

18-
private final ClientResponse<?> response;
18+
private final Response response;
1919

20-
private HttpResponseImpl(ClientResponse<?> response) {
20+
private HttpResponseImpl(Response response) {
2121
this.response = response;
2222
}
2323

@@ -27,7 +27,7 @@ private HttpResponseImpl(ClientResponse<?> response) {
2727
* @param response the response
2828
* @return the HttpResponse
2929
*/
30-
public static HttpResponseImpl wrap(ClientResponse<?> response) {
30+
public static HttpResponseImpl wrap(Response response) {
3131
return new HttpResponseImpl(response);
3232
}
3333

@@ -36,7 +36,7 @@ public static HttpResponseImpl wrap(ClientResponse<?> response) {
3636
*
3737
* @return the response
3838
*/
39-
public ClientResponse<?> unwrap() {
39+
public Response unwrap() {
4040
return response;
4141
}
4242

@@ -77,14 +77,15 @@ public int getStatus() {
7777
*/
7878
@Override
7979
public String getStatusMessage() {
80-
return response.getResponseStatus().getReasonPhrase();
80+
return response.getStatusInfo().getReasonPhrase();
8181
}
8282

8383
/**
8484
* @return the input stream
8585
*/
8686
public InputStream getInputStream() {
87-
return response.getEntity(InputStream.class);
87+
response.bufferEntity();
88+
return response.readEntity(InputStream.class);
8889
}
8990

9091
/**
@@ -94,31 +95,32 @@ public InputStream getInputStream() {
9495
* @return the header as a String or null if not found
9596
*/
9697
public String header(String name) {
97-
return response.getHeaders().getFirst(name);
98+
return response.getStringHeaders().getFirst(name);
9899
}
99100

100101
/**
101102
* @return the a Map of Header Name to Header Value
102103
*/
103104
public Map<String, String> headers() {
104-
Map<String, String> headers = new HashMap<String, String>();
105-
MultivaluedMap<String, String> responseHeaders = response.getHeaders();
105+
Map<String, String> headers = new HashMap<>();
106+
MultivaluedMap<String, String> responseHeaders = response.getStringHeaders();
106107

107108
for (String key : responseHeaders.keySet()) {
108-
headers.put(key, responseHeaders.getFirst(key).toString());
109+
headers.put(key, responseHeaders.getFirst(key));
109110
}
110111

111112
return headers;
112113
}
113114

114115
@Override
115116
public <T> T readEntity(Class<T> typeToReadAs) {
116-
return response.getEntity(typeToReadAs);
117+
response.bufferEntity();
118+
return response.readEntity(typeToReadAs);
117119
}
118120

119121
@Override
120122
public void close() throws IOException {
121-
response.releaseConnection();
123+
response.close();
122124
}
123125

124126
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package org.openstack4j.connectors.resteasy.executors;
2+
3+
import org.apache.http.HttpHost;
4+
import org.apache.http.client.HttpClient;
5+
import org.apache.http.client.config.RequestConfig;
6+
import org.apache.http.conn.ssl.NoopHostnameVerifier;
7+
import org.apache.http.impl.client.DefaultRedirectStrategy;
8+
import org.apache.http.impl.client.HttpClientBuilder;
9+
import org.apache.http.impl.client.HttpClients;
10+
import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine;
11+
import org.openstack4j.core.transport.Config;
12+
import org.openstack4j.core.transport.UntrustedSSL;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
import java.net.MalformedURLException;
17+
import java.net.URL;
18+
19+
/**
20+
* Default Apache HttpClient based Executor
21+
*
22+
* @author Jeremy Unruh
23+
*/
24+
public class ApacheHttpClientEngine extends ApacheHttpClient4Engine {
25+
26+
ApacheHttpClientEngine(HttpClient client) {
27+
super(client);
28+
}
29+
private static final Logger LOGGER = LoggerFactory.getLogger(ApacheHttpClientEngine.class);
30+
31+
public static ApacheHttpClientEngine create(Config config) {
32+
33+
RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
34+
35+
if (config.getReadTimeout() > 0) {
36+
requestConfigBuilder.setConnectionRequestTimeout(config.getReadTimeout());
37+
}
38+
39+
if (config.getConnectTimeout() > 0) {
40+
requestConfigBuilder.setConnectTimeout(config.getConnectTimeout());
41+
}
42+
43+
/*HttpClient client*/
44+
45+
HttpClientBuilder httpClientBuilder = HttpClients.custom();
46+
47+
if (config.isIgnoreSSLVerification()) {
48+
httpClientBuilder.setSSLContext(UntrustedSSL.getSSLContext());
49+
httpClientBuilder.setSSLHostnameVerifier(new NoopHostnameVerifier());
50+
}
51+
52+
if (config.getHostNameVerifier() != null) {
53+
httpClientBuilder.setSSLHostnameVerifier(config.getHostNameVerifier());
54+
}
55+
56+
if (config.getProxy() != null) {
57+
try {
58+
URL url = new URL(config.getProxy().getHost());
59+
HttpHost proxy = new HttpHost(url.getHost(), config.getProxy().getPort(), url.getProtocol());
60+
requestConfigBuilder.setProxy(proxy);
61+
} catch (MalformedURLException e) {
62+
LOGGER.error("Invalid proxy Url :%s",config.getProxy(),e);
63+
}
64+
}
65+
66+
httpClientBuilder.setDefaultRequestConfig(requestConfigBuilder.build());
67+
httpClientBuilder.setRedirectStrategy(new DefaultRedirectStrategy() {
68+
@Override
69+
protected boolean isRedirectable(String method)
70+
{
71+
return true;
72+
}
73+
});
74+
75+
HttpClient client = httpClientBuilder.build();
76+
return new ApacheHttpClientEngine(client);
77+
}
78+
79+
}

0 commit comments

Comments
 (0)