Florian Thiery M.Sc.
Römisch-Germanisches Zentralmuseum (RGZM)
i3mainz - Institut für Raumbezogene Informations- und Messtechnik
| package restconfig; | |
| import com.sun.jersey.spi.container.ContainerRequest; | |
| import com.sun.jersey.spi.container.ContainerResponse; | |
| import com.sun.jersey.spi.container.ContainerResponseFilter; | |
| public class CORSFilter implements ContainerResponseFilter { | |
| @Override | |
| public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { | |
| response.getHttpHeaders().add("Access-Control-Allow-Origin", "*"); | |
| response.getHttpHeaders().add("Access-Control-Allow-Methods", "GET"); | |
| response.getHttpHeaders().add("Access-Control-Allow-Headers", "Content-Type, Accept, Accept-Encoding"); | |
| response.getHttpHeaders().add("Access-Control-Allow-Credentials", "false"); | |
| return response; | |
| } | |
| } |
| package rest; | |
| import errorlog.Logging; | |
| import restconfig.ResponseGZIP; | |
| import javax.ws.rs.Produces; | |
| import javax.ws.rs.GET; | |
| import javax.ws.rs.HeaderParam; | |
| import javax.ws.rs.Path; | |
| import javax.ws.rs.core.MediaType; | |
| import javax.ws.rs.core.Response; | |
| import org.json.simple.JSONObject; | |
| @Path("/") | |
| public class GenericResource { | |
| @GET | |
| @Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8") | |
| public Response getEmptyJSON(@HeaderParam("Accept-Encoding") String acceptEncoding, @HeaderParam("Accept") String acceptHeader) { | |
| try { | |
| return ResponseGZIP.setResponse(acceptEncoding, new JSONObject().toJSONString(), Response.Status.OK); | |
| } catch (Exception e) { | |
| return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(Logging.getMessageJSON(e, "rest.GenericResource")) | |
| .header("Content-Type", "application/json;charset=UTF-8").build(); | |
| } | |
| } | |
| } |
| package restconfig; | |
| import java.lang.annotation.Retention; | |
| import java.lang.annotation.RetentionPolicy; | |
| import javax.ws.rs.NameBinding; | |
| @NameBinding | |
| @Retention(RetentionPolicy.RUNTIME) | |
| public @interface Gzip {} |
| package restconfig; | |
| import java.io.IOException; | |
| import java.io.OutputStream; | |
| import java.util.zip.GZIPOutputStream; | |
| import javax.ws.rs.WebApplicationException; | |
| import javax.ws.rs.ext.Provider; | |
| import javax.ws.rs.ext.WriterInterceptor; | |
| import javax.ws.rs.ext.WriterInterceptorContext; | |
| @Provider | |
| @Gzip | |
| public class GZIPWriterInterceptor implements WriterInterceptor { | |
| @Override | |
| public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { | |
| final OutputStream outputStream = context.getOutputStream(); | |
| context.setOutputStream(new GZIPOutputStream(outputStream)); | |
| context.proceed(); | |
| } | |
| } |
| package errorlog; | |
| import com.google.gson.Gson; | |
| import com.google.gson.GsonBuilder; | |
| import org.json.simple.JSONArray; | |
| import org.json.simple.JSONObject; | |
| public class Logging { | |
| public static String getMessageJSON(Exception exception, String endClass) { | |
| // START BUILD JSON | |
| Gson gson = new GsonBuilder().setPrettyPrinting().create(); | |
| JSONObject jsonobj_error = new JSONObject(); // {} | |
| JSONObject jsonobj_error_data = new JSONObject(); // {} | |
| JSONArray jsonarray_element = new JSONArray(); | |
| for (StackTraceElement element : exception.getStackTrace()) { | |
| JSONObject errMessage = new JSONObject(); | |
| errMessage.put("class", element.getClassName()); | |
| errMessage.put("method", element.getMethodName()); | |
| errMessage.put("line", element.getLineNumber()); | |
| jsonarray_element.add(errMessage); | |
| if (element.getClassName().equals(endClass)) { | |
| break; | |
| } | |
| } | |
| // get error code | |
| String code = ""; | |
| String userMessage = ""; | |
| if (exception.toString().contains("NullPointerException")) { | |
| code = "1"; | |
| userMessage = "some value is not available"; | |
| } else if (exception.toString().contains("ValidateJSONObjectException")) { | |
| code = "2"; | |
| String[] ex = exception.toString().split(": "); | |
| userMessage = "validate JSON object exception: " + ex[1]; | |
| } | |
| // output | |
| jsonobj_error.put("errors", jsonobj_error_data); | |
| jsonobj_error_data.put("internalMessage", exception.toString()); | |
| jsonobj_error_data.put("userMessage", userMessage); | |
| jsonobj_error_data.put("code", code); | |
| jsonobj_error_data.put("developerInfo", jsonarray_element); | |
| // OUTPUT AS pretty print JSON | |
| return gson.toJson(jsonobj_error); | |
| } | |
| } |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
| <properties> | |
| <jersey.version>1.19.1</jersey.version> | |
| </properties> | |
| <dependencies> | |
| <!-- Tests --> | |
| <dependency> | |
| <groupId>junit</groupId> | |
| <artifactId>junit</artifactId> | |
| <version>4.12</version> | |
| <scope>test</scope> | |
| </dependency> | |
| <!-- json --> | |
| <dependency> | |
| <groupId>com.googlecode.json-simple</groupId> | |
| <artifactId>json-simple</artifactId> | |
| <version>1.1</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>com.google.code.gson</groupId> | |
| <artifactId>gson</artifactId> | |
| <version>1.7.1</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>com.fasterxml.jackson.jaxrs</groupId> | |
| <artifactId>jackson-jaxrs-json-provider</artifactId> | |
| <version>2.3.0</version> | |
| </dependency> | |
| <!-- Jersey 1.19.1 --> | |
| <dependency> | |
| <groupId>com.sun.jersey</groupId> | |
| <artifactId>jersey-servlet</artifactId> | |
| <version>${jersey.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>com.sun.jersey</groupId> | |
| <artifactId>jersey-json</artifactId> | |
| <version>${jersey.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>com.sun.jersey</groupId> | |
| <artifactId>jersey-client</artifactId> | |
| <version>${jersey.version}</version> | |
| <scope>test</scope> | |
| </dependency> | |
| <dependency> | |
| <groupId>com.sun.jersey</groupId> | |
| <artifactId>jersey-bundle</artifactId> | |
| <version>${jersey.version}</version> | |
| </dependency> | |
| <dependency> | |
| <groupId>com.sun.jersey.contribs</groupId> | |
| <artifactId>jersey-multipart</artifactId> | |
| <version>${jersey.version}</version> | |
| </dependency> | |
| </dependencies> | |
| </project> |
| package restconfig; | |
| import java.io.IOException; | |
| import java.io.OutputStream; | |
| import java.util.zip.GZIPOutputStream; | |
| import javax.ws.rs.WebApplicationException; | |
| import javax.ws.rs.core.Response; | |
| import javax.ws.rs.core.StreamingOutput; | |
| public class ResponseGZIP { | |
| public static Response setResponse(String acceptEncoding, String output, Response.Status ResponseCode) { | |
| if (acceptEncoding.contains("gzip")) { | |
| // set outputstream | |
| final String OUTSTRING_FINAL = output; | |
| StreamingOutput stream = new StreamingOutput() { | |
| @Override | |
| public void write(OutputStream output) throws IOException, WebApplicationException { | |
| try { | |
| output = GZIP(OUTSTRING_FINAL, output); | |
| } catch (Exception e) { | |
| System.out.println(e.toString()); | |
| } | |
| } | |
| }; | |
| return Response.status(ResponseCode).entity(stream) | |
| .header("Content-Type", "application/json;charset=UTF-8").header("Content-Encoding", "gzip").build(); | |
| } else { | |
| return Response.status(ResponseCode).entity(output) | |
| .header("Content-Type", "application/json;charset=UTF-8").build(); | |
| } | |
| } | |
| private static OutputStream GZIP(String input, OutputStream baos) throws IOException { | |
| try (GZIPOutputStream gzos = new GZIPOutputStream(baos)) { | |
| gzos.write(input.getBytes("UTF-8")); | |
| } catch (Exception e) { | |
| System.out.println(e.toString()); | |
| } | |
| return baos; | |
| } | |
| } |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> | |
| <servlet> | |
| <servlet-name>API</servlet-name> | |
| <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> | |
| <init-param> | |
| <param-name>com.sun.jersey.config.property.packages</param-name> | |
| <param-value>rest</param-value> | |
| </init-param> | |
| <init-param> | |
| <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> | |
| <param-value>restconfig.CORSFilter</param-value> | |
| </init-param> | |
| <!-- http://javaevangelist.blogspot.de/2012/01/jersey-tip-of-day-use-gzip-compression.html--> | |
| <init-param> | |
| <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> | |
| <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value> | |
| </init-param> | |
| <init-param> | |
| <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> | |
| <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value> | |
| </init-param> | |
| <load-on-startup>1</load-on-startup> | |
| </servlet> | |
| <servlet-mapping> | |
| <servlet-name>API</servlet-name> | |
| <url-pattern>/*</url-pattern> | |
| </servlet-mapping> | |
| </web-app> |