Skip to content

Commit

Permalink
Added HTML writer with Freemarker
Browse files Browse the repository at this point in the history
  • Loading branch information
Miel Vander Sande committed Dec 16, 2015
1 parent f9d50e3 commit 19dfaf9
Show file tree
Hide file tree
Showing 7 changed files with 164 additions and 13 deletions.
7 changes: 6 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
<artifactId>httpclient</artifactId>
<version>4.3.5</version>
</dependency>
<dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.5</version>
Expand Down Expand Up @@ -73,6 +73,11 @@
<artifactId>jena-tdb</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.linkeddatafragments.exceptions;

/**
*
* @author mielvandersande
*/
public class NoRegisteredMimeTypesException extends Exception {

public NoRegisteredMimeTypesException() {
super("List of supported mimeTypes is empty.");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,20 @@
import com.google.gson.JsonObject;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import freemarker.template.TemplateException;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
Expand All @@ -33,6 +40,7 @@
import org.linkeddatafragments.fragments.LinkedDataFragmentRequestBase;
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequestImpl;
import org.linkeddatafragments.util.MIMEParse;
import org.linkeddatafragments.views.HtmlWriter;

/**
* Servlet that responds with a Linked Data Fragment.
Expand Down Expand Up @@ -88,6 +96,7 @@ public void init(ServletConfig servletConfig) throws ServletException {
}

// register content types
MIMEParse.register("text/html");
MIMEParse.register(Lang.TTL.getHeaderString());
MIMEParse.register(Lang.JSONLD.getHeaderString());
MIMEParse.register(Lang.NTRIPLES.getHeaderString());
Expand Down Expand Up @@ -145,24 +154,30 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro
final LinkedDataFragmentRequest ldfRequest = new TriplePatternFragmentRequestImpl( request, config );
final IFragmentRequestProcessor processor = dataSource.getRequestProcessor( ldfRequest );
final LinkedDataFragment fragment = processor.createRequestedFragment();

final Model output = ModelFactory.createDefaultModel();
output.setNsPrefixes(config.getPrefixes());
output.add( fragment.getMetadata() );
output.add( fragment.getTriples() );
output.add( fragment.getControls() );


// do conneg
String bestMatch = MIMEParse.bestMatch(request.getHeader("Accept"));
Lang contentType = RDFLanguages.contentTypeToLang(bestMatch);

// serialize the output
response.setHeader("Server", "Linked Data Fragments Server");
response.setContentType(bestMatch);
response.setCharacterEncoding("utf-8");

if (bestMatch.equals("text/html")) {
new HtmlWriter().write(response.getOutputStream(), dataSources, dataSource, fragment);
return;
}

final Model output = ModelFactory.createDefaultModel();
output.setNsPrefixes(config.getPrefixes());
output.add( fragment.getMetadata() );
output.add( fragment.getTriples() );
output.add( fragment.getControls() );

Lang contentType = RDFLanguages.contentTypeToLang(bestMatch);
RDFDataMgr.write(response.getOutputStream(), output, contentType);

RDFDataMgr.write(response.getOutputStream(), output, contentType);
} catch (IOException | NoRegisteredMimeTypesException e) {
} catch (IOException | NoRegisteredMimeTypesException | TemplateException e) {
throw new ServletException(e);
} catch (DataSourceNotFoundException ex) {
try {
Expand Down
13 changes: 11 additions & 2 deletions src/org/linkeddatafragments/standalone/JettyServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;

import org.linkeddatafragments.servlet.TriplePatternFragmentServlet;

/**
Expand Down Expand Up @@ -67,6 +67,15 @@ public static void main(String[] args) throws Exception {
ServletHolder tpfServletHolder = new ServletHolder(new TriplePatternFragmentServlet());
tpfServletHolder.setInitParameter(TriplePatternFragmentServlet.CFGFILE, config);
handler.addServletWithMapping(tpfServletHolder, "/*");

// TODO: create a servlet to serve assets
//String assetsPath = System.getProperty("user.dir") + "/assets";
//ServletHolder assetsHolder = new ServletHolder(new DefaultServlet());
//assetsHolder.setInitParameter("resourceBase", assetsPath);
//assetsHolder.setInitParameter("dirAllowed","true");
//assetsHolder.setInitParameter("pathInfoOnly","true");
//handler.addServletWithMapping(assetsHolder,"/assets/*");


// start the server
server.start();
Expand Down
56 changes: 56 additions & 0 deletions src/org/linkeddatafragments/views/HtmlWriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package org.linkeddatafragments.views;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import org.linkeddatafragments.datasource.IDataSource;
import org.linkeddatafragments.fragments.LinkedDataFragment;

/**
*
* @author mielvandersande
*/
public class HtmlWriter {
private final Configuration cfg;

public HtmlWriter() throws IOException {
cfg = new Configuration(Configuration.VERSION_2_3_22);
cfg.setDirectoryForTemplateLoading(new File(System.getProperty("user.dir") + "/views"));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
}

public void write(OutputStream outputStream, HashMap<String, IDataSource> dataSources, IDataSource datasource, LinkedDataFragment fragment) throws IOException, TemplateException{
/* Get the template (uses cache internally) */
Template temp = cfg.getTemplate("index.ftl.html");

Map data = new HashMap();
data.put("assetsPath", "css/");
data.put("header", datasource.getTitle());
data.put("datasources", dataSources);
data.put("content", "");

data.put("controls", fragment.getControls());
data.put("metadata", fragment.getMetadata());
data.put("triples", fragment.getTriples());


/* Merge data-model with template */
Writer out = new OutputStreamWriter(outputStream);
temp.process(data, out);
}
}
40 changes: 40 additions & 0 deletions views/base.ftl.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<#-- @license ©2015 Miel Vander Sande - Multimedia Lab / iMinds / Ghent University -->
<!DOCTYPE html>
<html lang="en" prefix="hydra: http://www.w3.org/ns/hydra/core# void: http://rdfs.org/ns/void#">
<head>
<meta charset="utf-8">
<title>
<#attempt>
${ title || header }
<#recover>
'Linked Data Fragments Server'
</#attempt>
</title>
<link rel="stylesheet" href="${ assetsPath }style" />
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Open+Sans:700italic,400,700|Droid+Sans+Mono" type="text/css" />
<meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1">
</head>
<body>
<header>
<h1><a href="/">
<#attempt>
${ header }
<#recover>
'Linked Data Fragments Server'
</#attempt>
</a></h1>
<figure class="logo">
<a href="http://linkeddatafragments.org/"><img src="/logo" alt="Linked Data Fragments" /></a>
</figure>
</header>
<main>
${ content }
</main>
<footer>
<p>
Powered by a <a href="https://github.com/LinkedDataFragments/Server.java" target="_blank">Linked Data Fragments Server</a>
©2013–2015 Multimedia Lab – iMinds – Ghent University
</p>
</footer>
</body>
</html>
13 changes: 13 additions & 0 deletions views/index.ftl.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<#-- @license ©2015 Miel Vander Sande - Multimedia Lab / iMinds / Ghent University -->
<#include "base.ftl.html">
<div class="index">
<h2>Available datasets</h2>
<p>Browse the following datasets as <a href="http://linkeddatafragments.org/in-depth/#tpf">Triple Pattern Fragments</a>:</p>
<dl class="datasets">
<#list datasources?keys as datasourceName>
<dt><a href="/${datasourceName}">${datasources[datasourceName].getTitle() }</a></dt>
<dd>${ datasources[datasourceName].getDescription() }</dd>
</#list>
</dl>
<p>The current dataset <em class="dataset">index</em> contains metadata about these datasets.</p>
</div>

0 comments on commit 19dfaf9

Please # to comment.