package com.bitmonlab.osiris.restsender; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import javax.ws.rs.core.MediaType; import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPatch; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.AbstractHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.codehaus.jackson.map.ObjectMapper; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.GenericType; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.WebResource.Builder; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.core.header.InBoundHeaders; import com.sun.jersey.multipart.FormDataMultiPart; import com.sun.jersey.multipart.file.FileDataBodyPart; import com.sun.jersey.multipart.impl.MultiPartWriter; public class RestRequestSender { private static String MEDIA = "application/json"; private static String MULTIPART_MEDIA = "multipart/form-data"; private String host; private String contextRoot; private String acceptMediaType = MediaType.APPLICATION_JSON; private String applicationType = MediaType.APPLICATION_JSON; private ClientConfig config = new DefaultClientConfig(); public RestRequestSender(String host, String contextRoot) { this.host = host; this.contextRoot = contextRoot; } public <T> ClientResponse<T> invoke(RestMethod method, String url, Class<T> expectedResponse, Headers... headers) { return invoke(method, url, expectedResponse, (BasicAuth) null, headers); } public <T> ClientResponse<T> invoke(RestMethod method, String url, Class<T> expectedResponse, BasicAuth basicAuth, Headers... headers) { Builder builder = createBuilder(url, headers, basicAuth); com.sun.jersey.api.client.ClientResponse clienteResponse = null; switch (method) { case GET: clienteResponse = builder.get(com.sun.jersey.api.client.ClientResponse.class); break; case DELETE: clienteResponse = builder.delete(com.sun.jersey.api.client.ClientResponse.class); break; case HEAD: clienteResponse = builder.head(); break; default: throw new UnsupportedOperationException(); } return new ClientResponse<T>(clienteResponse, expectedResponse); } public <T> ClientResponse<T> invoke(RestMethod method, String url, GenericType<T> genericType, Headers... headers) { return invoke(method, url, genericType, (BasicAuth) null, headers); } public <T> ClientResponse<T> invoke(RestMethod method, String url, GenericType<T> genericType, BasicAuth basicAuth, Headers... headers) { Builder builder = createBuilder(url, headers, basicAuth); com.sun.jersey.api.client.ClientResponse clienteResponse = null; switch (method) { case GET: clienteResponse = builder.get(com.sun.jersey.api.client.ClientResponse.class); break; case DELETE: clienteResponse = builder.delete(com.sun.jersey.api.client.ClientResponse.class); break; default: throw new UnsupportedOperationException(); } return new ClientResponse<T>(clienteResponse, genericType); } public <T> ClientResponse<T> invoke(RestMethod method, String url, Object requestEntity, Class<T> expectedResponse, Headers... headers) { return invoke(method, url, requestEntity, expectedResponse, null, headers); } public <T> ClientResponse<T> invoke(RestMethod method, String url, Object requestEntity, Class<T> expectedResponse, BasicAuth basicAuth, Headers... headers) { Builder builder = createBuilder(url, headers, basicAuth); com.sun.jersey.api.client.ClientResponse clienteResponse = null; switch (method) { case POST: clienteResponse = builder.post(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; case PUT: clienteResponse = builder.put(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; case DELETE: clienteResponse = builder.delete(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; default: throw new UnsupportedOperationException(); } return new ClientResponse<T>(clienteResponse, expectedResponse); } public <T> ClientResponse<T> invoke(RestMethod method, String url, Object requestEntity, GenericType<T> genericType, Headers... headers) { return invoke(method, url, requestEntity, genericType, (BasicAuth) null, headers); } public <T> ClientResponse<T> invoke(RestMethod method, String url, Object requestEntity, GenericType<T> genericType, BasicAuth basicAuth, Headers... headers) { Builder builder = createBuilder(url, headers, basicAuth); com.sun.jersey.api.client.ClientResponse clienteResponse = null; switch (method) { case POST: clienteResponse = builder.post(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; case PUT: clienteResponse = builder.put(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; case DELETE: clienteResponse = builder.delete(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; default: throw new UnsupportedOperationException(); } return new ClientResponse<T>(clienteResponse, genericType); } public SimpleClientResponse invoke(RestMethod method, String url, Object requestEntity, Headers... headers) { return invoke(method, url, requestEntity, (BasicAuth) null, headers); } public SimpleClientResponse invoke(RestMethod method, String url, Object requestEntity, BasicAuth basicAuth, Headers... headers) { Builder builder = createBuilder(url, headers, basicAuth); com.sun.jersey.api.client.ClientResponse clienteResponse = null; switch (method) { case POST: clienteResponse = builder.post(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; case PUT: clienteResponse = builder.put(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; case PATCH: try { AbstractHttpClient httpclient = new DefaultHttpClient(); HttpPatch patch = new HttpPatch(createURI(url)); for (Headers header : headers) { patch.addHeader(header.getKey(), header.getValue()); } ObjectMapper mapper = new ObjectMapper(); StringEntity entity = new StringEntity(mapper.writeValueAsString(requestEntity)); entity.setContentType("application/json"); patch.setEntity(entity); HttpResponse response = httpclient.execute(patch); Header[] headerList = response.getAllHeaders(); InBoundHeaders i = new InBoundHeaders(); for (Header header : headerList) { i.add(header.getName(), header.getValue()); } clienteResponse = new com.sun.jersey.api.client.ClientResponse( response.getStatusLine().getStatusCode(), i, response.getEntity().getContent(), null); } catch (Exception e) { throw new ClientHandlerException(e.getMessage()); } break; case DELETE: clienteResponse = builder.delete(com.sun.jersey.api.client.ClientResponse.class, requestEntity); break; default: throw new UnsupportedOperationException(); } return new SimpleClientResponse(clienteResponse); } public SimpleClientResponse invoke(RestMethod method, String url, Headers... headers) { return invoke(method, url, (BasicAuth) null, headers); } public SimpleClientResponse invoke(RestMethod method, String url, BasicAuth basicAuth, Headers... headers) { Builder builder = createBuilder(url, headers, basicAuth); com.sun.jersey.api.client.ClientResponse clienteResponse = null; switch (method) { case GET: clienteResponse = builder.get(com.sun.jersey.api.client.ClientResponse.class); break; case DELETE: clienteResponse = builder.delete(com.sun.jersey.api.client.ClientResponse.class); break; case POST: clienteResponse = builder.post(com.sun.jersey.api.client.ClientResponse.class); break; case PUT: clienteResponse = builder.put(com.sun.jersey.api.client.ClientResponse.class); break; case HEAD: clienteResponse = builder.head(); break; default: throw new UnsupportedOperationException(); } return new SimpleClientResponse(clienteResponse); } private Builder createBuilder(String url, Headers[] headers, BasicAuth auth) { WebResource resource; if (null != auth) { resource = Client.create(config).resource(createURI(url)); resource.addFilter(new com.sun.jersey.api.client.filter.HTTPBasicAuthFilter(auth.getName(), auth .getPassword())); } else { resource = Client.create(config).resource(createURI(url)); } Builder builder = resource.accept(acceptMediaType).type(applicationType); for (Headers h : headers) { builder.header(h.getKey(), h.getValue()); } return builder; } protected String createURI(String resourceUri) { String result = null; if (resourceUri.startsWith("http")) return resourceUri; if (resourceUri.startsWith("/")) resourceUri = resourceUri.substring(1); if (StringUtils.isBlank(contextRoot)) { result = host + "/" + resourceUri; } else { result = host + "/" + contextRoot + "/" + resourceUri; } System.out.println("TEST URI:" + result); return result; } public void uploadVoid(String url, File f, String formName) { FormDataMultiPart form = new FormDataMultiPart().field(formName, f, MediaType.MULTIPART_FORM_DATA_TYPE); String urlCreated = createURI(url); ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(MultiPartWriter.class); WebResource webResource = Client.create(cc).resource(urlCreated); webResource.type(MULTIPART_MEDIA).accept(MEDIA).post(form); } public void uploadVoid(String url, File f, String formName, Headers... headers) { FormDataMultiPart form = new FormDataMultiPart().field(formName, f, MediaType.MULTIPART_FORM_DATA_TYPE); String urlCreated = createURI(url); ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(MultiPartWriter.class); WebResource webResource = Client.create(cc).resource(urlCreated); Builder builder = webResource.type(MULTIPART_MEDIA).accept(MEDIA); for (Headers h : headers) { builder.header(h.getKey(), h.getValue()); } builder.post(form); } public SimpleClientResponse upload(String url, File f, String formName) { @SuppressWarnings("resource") FormDataMultiPart form = new FormDataMultiPart().field(formName, f, MediaType.MULTIPART_FORM_DATA_TYPE); String urlCreated = createURI(url); ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(MultiPartWriter.class); WebResource webResource = Client.create(cc).resource(urlCreated); webResource.type(MULTIPART_MEDIA).accept(MEDIA).post(form); return new SimpleClientResponse(com.sun.jersey.api.client.ClientResponse.Status.NO_CONTENT); } public ClientResponse<File> upload(String url, File f, Headers... headers) { @SuppressWarnings("resource") FormDataMultiPart form = new FormDataMultiPart(); form.bodyPart(new FileDataBodyPart("file", f, MediaType.APPLICATION_OCTET_STREAM_TYPE)); String urlCreated = createURI(url); ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(MultiPartWriter.class); WebResource webResource = Client.create(cc).resource(urlCreated); Builder builder = webResource.type(MULTIPART_MEDIA).accept(MEDIA).accept("text/plain"); for (Headers h : headers) { builder.header(h.getKey(), h.getValue()); } com.sun.jersey.api.client.ClientResponse clienteResponse = null; clienteResponse = builder.post(com.sun.jersey.api.client.ClientResponse.class, form); return new ClientResponse<File>(clienteResponse, File.class); } public <T> ClientResponse<T> upload(String url, File f, Class<T> expectedResponse, Headers... headers) { @SuppressWarnings("resource") FormDataMultiPart form = new FormDataMultiPart(); form.bodyPart(new FileDataBodyPart("file", f, MediaType.APPLICATION_OCTET_STREAM_TYPE)); String urlCreated = createURI(url); ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(MultiPartWriter.class); WebResource webResource = Client.create(cc).resource(urlCreated); Builder builder = webResource.type(MULTIPART_MEDIA).accept(MEDIA).accept("text/plain"); for (Headers h : headers) { builder.header(h.getKey(), h.getValue()); } com.sun.jersey.api.client.ClientResponse clienteResponse = null; clienteResponse = builder.post(com.sun.jersey.api.client.ClientResponse.class, form); return new ClientResponse<T>(clienteResponse, expectedResponse); } public ClientResponse<File> uploadNoMultipart(String url, File f, Headers... headers) throws FileNotFoundException { InputStream is = new FileInputStream(f); String urlCreated = createURI(url); ClientConfig cc = new DefaultClientConfig(); cc.getClasses().add(MultiPartWriter.class); WebResource webResource = Client.create(cc).resource(urlCreated); Builder builder = webResource.type(MediaType.APPLICATION_OCTET_STREAM).accept(MEDIA).accept("text/plain"); String sContentDisposition = "attachment; filename=\"" + f.getName() + "\""; builder.header("Content-Disposition", sContentDisposition); for (Headers h : headers) { builder.header(h.getKey(), h.getValue()); } com.sun.jersey.api.client.ClientResponse clienteResponse = null; clienteResponse = builder.post(com.sun.jersey.api.client.ClientResponse.class, is); return new ClientResponse<File>(clienteResponse, File.class); } public ClientResponse<InputStream> download(String url,String type, String accept, Headers... headers) { WebResource resource = Client.create(config).resource(createURI(url)); Builder builder = resource.accept(accept,MEDIA).type(type); for (Headers h : headers) { builder.header(h.getKey(), h.getValue()); } com.sun.jersey.api.client.ClientResponse clienteResponse = null; clienteResponse = builder.get(com.sun.jersey.api.client.ClientResponse.class); return new ClientResponse<InputStream>(clienteResponse, InputStream.class); } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public void setContextRoot(String contextRoot) { this.contextRoot = contextRoot; } public String getContextRoot() { return contextRoot; } }