Introduce Freemarker template support

Change-Id: I69c58e9829995402df263c1eda036081b67e20bf
diff --git a/plugin/pom.xml b/plugin/pom.xml
index fb561f5..d332116 100644
--- a/plugin/pom.xml
+++ b/plugin/pom.xml
@@ -83,6 +83,14 @@
       <version>3.10.2</version>
 	    <scope>test</scope>
     </dependency>
+
+    <!-- Template engine -->
+    <!-- I wasn't able to get this working with jersey-mvc-freemarker ... -->
+    <dependency>
+      <groupId>org.freemarker</groupId>
+      <artifactId>freemarker</artifactId>
+      <version>2.3.30</version>
+    </dependency>
   </dependencies>
   
   <build>
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/IdsExportService.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/IdsExportService.java
index c0ecfef..f670c1a 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/IdsExportService.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/IdsExportService.java
@@ -1,9 +1,11 @@
 package de.ids_mannheim.korap.plkexport;
 
 import java.io.IOException;
+import java.io.StringWriter;
 import java.lang.Thread;
 import java.io.InputStream;
 import java.net.URLEncoder;
+import java.util.HashMap;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -40,19 +42,20 @@
 
 import static de.ids_mannheim.korap.plkexport.Util.*;
 
+// Template engine
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+
 
 @Path("/")
 public class IdsExportService {
 
     Properties properties = ExWSConf.properties(null);
 
-    // Load export string
-    ClassLoader cl = Thread.currentThread().getContextClassLoader();
-    InputStream is1 = cl.getResourceAsStream("assets/export.html");
-    private final String exportStr = streamToString(is1);
-
-    InputStream is2 = cl.getResourceAsStream("assets/export.js");
-    private final String exportJsStr = streamToString(is2);
+    private final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+   
+    InputStream is = cl.getResourceAsStream("assets/export.js");
+    private final String exportJsStr = streamToString(is);
     
     /**
      * WebService calls Kustvakt Search Webservices and returns
@@ -102,7 +105,6 @@
         String port = properties.getProperty("api.port", "8089");
         String host = properties.getProperty("api.host", "localhost");
 
-        // URIBuildernew UriBuilder();
         UriBuilder uri = UriBuilder.fromPath("/api/v1.0/search")
             .host(host)
             .port(Integer.parseInt(port))
@@ -180,8 +182,41 @@
     @Path("export")
     @Produces(MediaType.TEXT_HTML)
     public Response exportHTML () {
+        
+        Configuration cfg = new Configuration();
+        cfg.setClassForTemplateLoading(IdsExportService.class, "/assets/templates");
+        cfg.setDefaultEncoding("UTF-8");
+
+        StringWriter out = new StringWriter();
+        HashMap<String, Object> templateData = new HashMap<String, Object>();
+
+        String scheme = properties.getProperty("asset.scheme", "https");
+        String port = properties.getProperty("asset.port", "");
+        String host = properties.getProperty("asset.host", "korap.ids-mannheim.de");
+
+        UriBuilder uri = UriBuilder.fromPath("")
+            .host(host)
+            .scheme(scheme)
+            ;
+
+        if (port != "") {
+            uri = uri.port(Integer.parseInt(port));
+        }
+
+        templateData.put("assetPath", uri.build());
+
+        try {
+            Template template = cfg.getTemplate("export.ftl");
+            template.process(templateData, out);
+        }
+        catch (Exception e) {
+            return Response
+                .ok(new String("Template not found"))
+                .status(Status.INTERNAL_SERVER_ERROR)
+                .build();
+        }
         return Response
-            .ok(exportStr, MediaType.TEXT_HTML)
+            .ok(out.toString(), "text/html")
             .build();
     };
 
@@ -192,8 +227,8 @@
         return Response
             .ok(exportJsStr, "application/javascript")
             .build();
-    };
-    
+    };    
+
     public String writeRTF (LinkedList list) {
         LinkedList matchlist = list;
         RtfTextPara par = p((" "));
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/PluginServer.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/PluginServer.java
index 27fa634..cb5a71c 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/PluginServer.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/PluginServer.java
@@ -12,11 +12,14 @@
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
 
+import org.glassfish.jersey.servlet.ServletContainer;
+
 public class PluginServer {
     public static void main (String[] args) throws Exception {
 
         ServletContextHandler contextHandler = new ServletContextHandler(
-            ServletContextHandler.NO_SESSIONS);
+            ServletContextHandler.NO_SESSIONS
+            );
         contextHandler.setContextPath("/");
 
         Properties properties = ExWSConf.properties(null);
@@ -36,9 +39,12 @@
         HandlerList handlers = new HandlerList();
         handlers.setHandlers(new Handler[] { contextHandler, new DefaultHandler()});
         jettyServer.setHandler(handlers);
+
+
+        ServletContainer servletContainer = new ServletContainer();        
+        ServletHolder servletHolder = new ServletHolder(servletContainer);
+        contextHandler.addServlet(servletHolder, "/*");
         
-        ServletHolder servletHolder = contextHandler.addServlet(
-                org.glassfish.jersey.servlet.ServletContainer.class, "/*");
         servletHolder.setInitOrder(0);
 
         // Tells the Jersey Servlet which REST service/class to load.
@@ -49,7 +55,13 @@
         try {
             jettyServer.start();
             System.out.println("PluginServer available under: http://" + host+ ":" + portStr);
-            System.out.println("ApiServer expected under: " + properties.getProperty("api.scheme") + "://" + properties.getProperty("api.host")+ ":" + properties.getProperty("api.port"));
+            System.out.println(
+                "ApiServer expected under: " +
+                properties.getProperty("api.scheme") +
+                "://" +
+                properties.getProperty("api.host")+ ":" +
+                properties.getProperty("api.port")
+                );
             jettyServer.join();
         }
         finally {
diff --git a/plugin/src/main/resources/assets/export.html b/plugin/src/main/resources/assets/templates/export.ftl
similarity index 85%
rename from plugin/src/main/resources/assets/export.html
rename to plugin/src/main/resources/assets/templates/export.ftl
index 11adb85..d7efd56 100644
--- a/plugin/src/main/resources/assets/export.html
+++ b/plugin/src/main/resources/assets/templates/export.ftl
@@ -4,10 +4,8 @@
   <head>
     <meta charset="UTF-8">
     <title>Export</title>
-
-    <!-- This is only for testing purposes -->
-    <script src="http://localhost:64543/js/korap-plugin-0.2.1.js"></script>
-    <link type="text/css" rel="stylesheet" href="http://localhost:64543/css/kalamar-plugin-0.2.1.css" />
+    <script src="${assetPath}/js/korap-plugin-0.2.1.js"></script>
+    <link href="${assetPath}/css/kalamar-plugin-0.2.1.css" type="text/css" rel="stylesheet" />
   </head>
   <body>
     <div class="banner" data-note="Experimental"></div>
diff --git a/plugin/src/main/resources/exportPlugin.conf b/plugin/src/main/resources/exportPlugin.conf
index 4e8ecbc..3dd58d9 100644
--- a/plugin/src/main/resources/exportPlugin.conf
+++ b/plugin/src/main/resources/exportPlugin.conf
@@ -1,10 +1,13 @@
-#Configuration file for 
-
-#Server Configuration
+# Server Configuration
 server.port=7777
 server.host=localhost
 server.scheme=https
 
+# API Configuration
 api.port=80
 api.host=korap.ids-mannheim.de
-api.scheme=https
\ No newline at end of file
+api.scheme=https
+
+# Asset Configuration
+asset.host=korap.ids-mannheim.de
+asset.scheme=https
\ No newline at end of file
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/IdsExportServiceTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/IdsExportServiceTest.java
index cc9a96b..f0a89be 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/IdsExportServiceTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/IdsExportServiceTest.java
@@ -149,8 +149,10 @@
                 Status.OK.getStatusCode(), responsehtml.getStatus());
         String str = responsehtml.readEntity(String.class);
         assertTrue("HTTP Body", str.contains("<title>Export</title>"));
+        assertTrue("Assets", str.contains("<script src=\"https://korap.ids-mannheim.de/js"));
+        assertTrue("Assets", str.contains("<link href=\"https://korap.ids-mannheim.de/css"));
     }
-
+    
     @Test
     public void testJS () {
         Response responsejs = target("/export.js").request()