Jagger
 All Classes Namespaces Files Functions Variables Groups Pages
SpringBasedHttpClient.java
Go to the documentation of this file.
1 package com.griddynamics.jagger.invoker.v2;
2 
3 import org.apache.http.conn.ssl.NoopHostnameVerifier;
4 import org.apache.http.impl.client.CloseableHttpClient;
5 import org.apache.http.impl.client.HttpClients;
6 import org.springframework.http.RequestEntity;
7 import org.springframework.http.ResponseEntity;
8 import org.springframework.http.client.ClientHttpRequestFactory;
9 import org.springframework.http.client.ClientHttpRequestInterceptor;
10 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
11 import org.springframework.http.converter.HttpMessageConverter;
12 import org.springframework.web.client.ResponseErrorHandler;
13 import org.springframework.web.client.RestTemplate;
14 import org.springframework.web.util.UriTemplateHandler;
15 
16 import java.net.URI;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20 
21 
22 import static com.griddynamics.jagger.invoker.v2.SpringBasedHttpClient.JSpringBasedHttpClientParameters.DEFAULT_URI_VARIABLES;
23 import static com.griddynamics.jagger.invoker.v2.SpringBasedHttpClient.JSpringBasedHttpClientParameters.ERROR_HANDLER;
24 import static com.griddynamics.jagger.invoker.v2.SpringBasedHttpClient.JSpringBasedHttpClientParameters.INTERCEPTORS;
25 import static com.griddynamics.jagger.invoker.v2.SpringBasedHttpClient.JSpringBasedHttpClientParameters.MESSAGE_CONVERTERS;
26 import static com.griddynamics.jagger.invoker.v2.SpringBasedHttpClient.JSpringBasedHttpClientParameters.REQUEST_FACTORY;
27 import static com.griddynamics.jagger.invoker.v2.SpringBasedHttpClient.JSpringBasedHttpClientParameters.URI_TEMPLATE_HANDLER;
28 import static java.lang.String.format;
29 
38 @SuppressWarnings({"unused", "unchecked"})
39 public class SpringBasedHttpClient implements JHttpClient {
40 
47  DEFAULT_URI_VARIABLES("defaultUriVariables"),
48  ERROR_HANDLER("errorHandler"),
49  MESSAGE_CONVERTERS("messageConverters"),
50  URI_TEMPLATE_HANDLER("uriTemplateHandler"),
51  INTERCEPTORS("interceptors"),
52  REQUEST_FACTORY("requestFactory");
53 
54  private String value;
55 
57  this.value = value;
58  }
59 
60  public String getValue() {
61  return value;
62  }
63  }
64 
77  private Map<String, Object> clientParams;
78 
79  private RestTemplate restTemplate;
80 
82  clientParams = new HashMap<>();
83  restTemplate = new RestTemplate();
84  restTemplate.setRequestFactory(getSslAllTrustRequestFactory());
85  }
86 
87  public SpringBasedHttpClient(Map<String, Object> clientParams) {
88  this();
89  this.clientParams.putAll(clientParams);
90  setRestTemplateParams(this.clientParams);
91  }
92 
93  @Override
94  public JHttpResponse execute(JHttpEndpoint endpoint, JHttpQuery query) {
95  URI endpointURI = endpoint.getURI(query.getPath(), query.getQueryParams());
96  RequestEntity requestEntity = mapToRequestEntity(query, endpointURI);
97  ResponseEntity responseEntity;
98  if (query.getResponseBodyType() != null) {
99  responseEntity = restTemplate.exchange(endpointURI, query.getMethod(), requestEntity, query.getResponseBodyType());
100  } else {
101  responseEntity = restTemplate.exchange(endpointURI, query.getMethod(), requestEntity, byte[].class);
102  }
103  return mapToJHttpResponse(responseEntity);
104  }
105 
106  private void setRestTemplateParams(Map<String, Object> clientParams) {
107  clientParams.forEach((parameterKey, parameterVal) -> {
108  if (parameterKey.equals(DEFAULT_URI_VARIABLES.value)) {
109  restTemplate.setDefaultUriVariables((Map<String, ?>) parameterVal);
110  } else if (parameterKey.equals(ERROR_HANDLER.value)) {
111  restTemplate.setErrorHandler((ResponseErrorHandler) parameterVal);
112  } else if (parameterKey.equals(MESSAGE_CONVERTERS.value)) {
113  restTemplate.setMessageConverters((List<HttpMessageConverter<?>>) parameterVal);
114  } else if (parameterKey.equals(URI_TEMPLATE_HANDLER.value)) {
115  restTemplate.setUriTemplateHandler((UriTemplateHandler) parameterVal);
116  } else if (parameterKey.equals(INTERCEPTORS.value)) {
117  restTemplate.setInterceptors((List<ClientHttpRequestInterceptor>) parameterVal);
118  } else if (parameterKey.equals(REQUEST_FACTORY.value)) {
119  restTemplate.setRequestFactory((ClientHttpRequestFactory) parameterVal);
120  } else {
121  throw new IllegalArgumentException(format("Unknown parameter name '%s'!", parameterKey));
122  }
123  });
124  }
125 
126  private HttpComponentsClientHttpRequestFactory getSslAllTrustRequestFactory() {
127  HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
128  CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
129  requestFactory.setHttpClient(httpClient);
130  return requestFactory;
131  }
132 
133  private <T> RequestEntity<T> mapToRequestEntity(JHttpQuery<T> query, URI endpointURI) {
134  return new RequestEntity<>(query.getBody(), query.getHeaders(), query.getMethod(), endpointURI);
135  }
136 
137  private <T> JHttpResponse<T> mapToJHttpResponse(ResponseEntity<T> responseEntity) {
138  return new JHttpResponse<>(responseEntity.getStatusCode(), responseEntity.getBody(), responseEntity.getHeaders());
139  }
140 
141  public Map<String, Object> getClientParams() {
142  return clientParams;
143  }
144 
145  public void setClientParams(Map<String, Object> clientParams) {
146  this.clientParams = clientParams;
147  }
148 }