package com.easemob.server.example.jersey.utils; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.http.NameValuePair; import org.glassfish.jersey.client.JerseyClient; import org.glassfish.jersey.client.JerseyClientBuilder; import org.glassfish.jersey.client.JerseyWebTarget; import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.easemob.server.example.comm.HTTPMethod; import com.easemob.server.example.jersey.vo.Credential; import com.easemob.server.example.jersey.vo.Token; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; /** * Jersey2.9 Utils * * @author Lynch 2014-09-15 * */ @SuppressWarnings("all") public class JerseyUtils { private static final Logger LOGGER = LoggerFactory.getLogger(JerseyUtils.class); private static final JsonNodeFactory factory = new JsonNodeFactory(false); /** * Send HTTPS request with Jersey * * @return */ public static ObjectNode sendRequest(JerseyWebTarget jerseyWebTarget, Object body, Credential credential, String method, List<NameValuePair> headers) throws RuntimeException { ObjectNode objectNode = factory.objectNode(); if (!match("http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?", jerseyWebTarget.getUri().toString())) { LOGGER.error("The URL to request is illegal"); objectNode.put("message", "The URL to request is illegal"); return objectNode; } try { Invocation.Builder inBuilder = jerseyWebTarget.request(); if (credential != null) { Token.applyAuthentication(inBuilder, credential); } if (null != headers && !headers.isEmpty()) { for (NameValuePair nameValuePair : headers) { inBuilder.header(nameValuePair.getName(), nameValuePair.getValue()); } } Response response = null; if (HTTPMethod.METHOD_GET.equals(method)) { response = inBuilder.get(Response.class); } else if (HTTPMethod.METHOD_POST.equals(method)) { response = inBuilder.post(Entity.entity(body, MediaType.APPLICATION_JSON), Response.class); } else if (HTTPMethod.METHOD_PUT.equals(method)) { response = inBuilder.put(Entity.entity(body, MediaType.APPLICATION_JSON), Response.class); } else if (HTTPMethod.METHOD_DELETE.equals(method)) { response = inBuilder.delete(Response.class); } objectNode = response.readEntity(ObjectNode.class); objectNode.put("statusCode", response.getStatus()); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * DownLoadFile whit Jersey * * @return * @throws NoSuchAlgorithmException * @throws KeyManagementException * @throws IOException */ public static File downLoadFile(JerseyWebTarget jerseyWebTarget, Credential credential, List<NameValuePair> headers, File localPath) throws IOException { Invocation.Builder inBuilder = jerseyWebTarget.request(); if (credential != null) { Token.applyAuthentication(inBuilder, credential); } if (null != headers && !headers.isEmpty()) { for (NameValuePair nameValuePair : headers) { inBuilder.header(nameValuePair.getName(), nameValuePair.getValue()); } } File file = inBuilder.get(File.class); file.renameTo(localPath); FileWriter fr = new FileWriter(file); fr.flush(); return file; } /** * UploadFile whit Jersey * * @return */ public static ObjectNode uploadFile(JerseyWebTarget jerseyWebTarget, File file, Credential credential, List<NameValuePair> headers) throws RuntimeException { ObjectNode objectNode = factory.objectNode(); try { Invocation.Builder inBuilder = jerseyWebTarget.request(); if (credential != null) { Token.applyAuthentication(inBuilder, credential); } if (null != headers && !headers.isEmpty()) { for (NameValuePair nameValuePair : headers) { inBuilder.header(nameValuePair.getName(), nameValuePair.getValue()); } } FormDataMultiPart multiPart = new FormDataMultiPart(); multiPart.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); objectNode = inBuilder.post(Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA), ObjectNode.class); } catch (Exception e) { e.printStackTrace(); } return objectNode; } /** * Check illegal String * * @param regex * @param str * @return */ public static boolean match(String regex, String str) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); return matcher.lookingAt(); } /** * Obtain a JerseyClient whit SSL * * @return * @throws NoSuchAlgorithmException * @throws KeyManagementException */ public static JerseyClient getJerseyClient(boolean isSSL) { ClientBuilder clientBuilder = JerseyClientBuilder.newBuilder().register(MultiPartFeature.class); // Create a secure JerseyClient if (isSSL) { try { HostnameVerifier verifier = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; TrustManager[] tm = new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } } }; SSLContext sslContext = sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, tm, new SecureRandom()); clientBuilder.sslContext(sslContext).hostnameVerifier(verifier); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } } return (JerseyClient) clientBuilder.build().register(JacksonJsonProvider.class); } }