changeset 1667:254167aef851

Changed IIIF info.json generation to JsonGenerator. Should fix missing comma bug in sizes list. Updated javax.json implementation to 1.0.4.
author Robert Casties <r0bcas7@gmail.com>
date Thu, 23 Nov 2017 13:12:35 +0100
parents 57fef2cd6540
children 0a8070be7900
files iiif-presentation/pom.xml servlet/pom.xml servlet/src/main/java/digilib/servlet/ServletOps.java
diffstat 3 files changed, 91 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/iiif-presentation/pom.xml	Tue Nov 21 20:48:54 2017 +0100
+++ b/iiif-presentation/pom.xml	Thu Nov 23 13:12:35 2017 +0100
@@ -35,7 +35,7 @@
 		<dependency>
 			<groupId>org.glassfish</groupId>
 			<artifactId>javax.json</artifactId>
-			<version>1.0</version>
+			<version>1.0.4</version>
 		</dependency>
 	</dependencies>
 </project>
--- a/servlet/pom.xml	Tue Nov 21 20:48:54 2017 +0100
+++ b/servlet/pom.xml	Thu Nov 23 13:12:35 2017 +0100
@@ -27,9 +27,20 @@
   		<scope>provided</scope>
   	</dependency>
   	<dependency>
+  	    <!-- implementation of JWT JOSE specification -->
   		<groupId>org.bitbucket.b_c</groupId>
   		<artifactId>jose4j</artifactId>
   		<version>0.5.0</version>
   	</dependency>
+  	<dependency>
+  		<groupId>javax.json</groupId>
+  		<artifactId>javax.json-api</artifactId>
+  		<version>1.0</version>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.glassfish</groupId>
+  		<artifactId>javax.json</artifactId>
+  		<version>1.0.4</version>
+  	</dependency>
   </dependencies>
 </project>
--- a/servlet/src/main/java/digilib/servlet/ServletOps.java	Tue Nov 21 20:48:54 2017 +0100
+++ b/servlet/src/main/java/digilib/servlet/ServletOps.java	Thu Nov 23 13:12:35 2017 +0100
@@ -34,8 +34,11 @@
 import java.util.Enumeration;
 import java.util.StringTokenizer;
 
+import javax.json.Json;
+import javax.json.stream.JsonGenerator;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -482,7 +485,6 @@
                 }
             }
             
-            PrintWriter writer;
             if (dlConfig.getAsString("iiif-api-version").startsWith("2.")) {
                 /*
                  * IIIF Image API version 2 image information
@@ -498,54 +500,97 @@
                             +"; type=\"application/ld+json\"");
                 }
                 // write info.json
-                writer = response.getWriter();
-                writer.println("{");
-                writer.println("\"@context\" : \"http://iiif.io/api/image/2/context.json\",");
-                writer.println("\"@id\" : \"" + url + "\",");
-                writer.println("\"protocol\" : \"http://iiif.io/api/image\",");
-                writer.println("\"width\" : " + size.width + ",");
-                writer.println("\"height\" : " + size.height + ",");
-                writer.println("\"profile\" : [");
-                writer.println("  \"http://iiif.io/api/image/2/level2.json\",");
-                writer.println("  {");
-                writer.println("    \"formats\" : [\"jpg\", \"png\"],");
-                writer.println("    \"qualities\" : [\"color\", \"gray\"],");
+                ServletOutputStream out = response.getOutputStream();
+                JsonGenerator info = Json.createGenerator(out);
+                // top level object
+                info.writeStartObject()
+                .write("@context", "http://iiif.io/api/image/2/context.json")
+                .write("@id", url)
+                .write("protocol", "http://iiif.io/api/image")
+                .write("width", size.width)
+                .write("height", size.height);
+                // profile[ array
+                info.writeStartArray("profile")
+                // profile[ level
+                .write("http://iiif.io/api/image/2/level2.json");
+                // profile[{ object
+                info.writeStartObject();
+                // profile[{formats[
+                info.writeStartArray("formats")
+                .write("jpg")
+                .write("png")
+                .writeEnd();
+                // profile[{qualities[
+                info.writeStartArray("qualities")
+                .write("color")
+                .write("gray")
+                .writeEnd();
+                // profile[{maxArea
                 if (dlConfig.getAsInt("max-image-size") > 0) {
-                	writer.println("    \"maxArea\" : " + dlConfig.getAsInt("max-image-size") + ",");
+                    info.write("maxArea", dlConfig.getAsInt("max-image-size"));
                 }
-                writer.println("    \"supports\" : ["
-                		+ "\"mirroring\", \"rotationArbitrary\", \"sizeAboveFull\", \"regionSquare\""
-                		+ "]");
-                writer.println("  }]");
+                // profile[{supports[
+                info.writeStartArray("supports")
+                .write("mirroring")
+                .write("rotationArbitrary")
+                .write("sizeAboveFull")
+                .write("regionSquare")
+                .writeEnd();
+                // profile[{}
+                info.writeEnd();
+                // profile[]
+                info.writeEnd();
                 // add size of original and prescaled images
                 int numImgs = imageSet.size();
                 if (numImgs > 0) {
-                    writer.println(", \"sizes\" : [");
+                    // sizes[
+                    info.writeStartArray("sizes");
                     for (int i = numImgs - 1; i >= 0; --i) {
                         ImageInput ii = imageSet.get(i);
                         ImageSize is = ii.getSize();
-                        writer.println("  {\"width\" : "+is.getWidth()+", \"height\" : "+is.getHeight()+"}"
-                                +((i > 1)?",":""));
+                        // sizes[{
+                        info.writeStartObject()
+                        .write("width", is.getWidth())
+                        .write("height", is.getHeight())
+                        .writeEnd();
                     }
-                    writer.println("]");
+                    // sizes[]
+                    info.writeEnd();
                 }
-                writer.println("}");
-                
+                // end info.json
+                info.writeEnd();
+                info.close();
+
             } else {
                 /*
                  * IIIF Image API version 1 image information
                  */
                 response.setContentType("application/json,application/ld+json");
-                writer = response.getWriter();
-                writer.println("{");
-                writer.println("\"@context\" : \"http://library.stanford.edu/iiif/image-api/1.1/context.json\",");
-                writer.println("\"@id\" : \"" + url + "\",");
-                writer.println("\"width\" : " + size.width + ",");
-                writer.println("\"height\" : " + size.height + ",");
-                writer.println("\"formats\" : [\"jpg\", \"png\"],");
-                writer.println("\"qualities\" : [\"native\", \"color\", \"grey\"],");
-                writer.println("\"profile\" : \"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2\"");
-                writer.println("}");
+                // write info.json
+                ServletOutputStream out = response.getOutputStream();
+                JsonGenerator info = Json.createGenerator(out);
+                // top level object
+                info.writeStartObject()
+                .write("@context", "http://library.stanford.edu/iiif/image-api/1.1/context.json")
+                .write("@id", url)
+                .write("width", size.width)
+                .write("height", size.height);
+                // formats[
+                info.writeStartArray("formats")
+                .write("jpg")
+                .write("png")
+                .writeEnd();
+                // qualities[
+                info.writeStartArray("qualities")
+                .write("native")
+                .write("color")
+                .write("gray")
+                .writeEnd();
+                // profile
+                info.write("profile", "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level2");
+                // end info.json
+                info.writeEnd();
+                info.close();
             }
         } catch (IOException e) {
             throw new ServletException("Unable to write response!", e);