Skip to content

Commit 19dfaf9

Browse files
author
Miel Vander Sande
committed
Added HTML writer with Freemarker
1 parent f9d50e3 commit 19dfaf9

File tree

7 files changed

+164
-13
lines changed

7 files changed

+164
-13
lines changed

pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
<artifactId>httpclient</artifactId>
3131
<version>4.3.5</version>
3232
</dependency>
33-
<dependency>
33+
<dependency>
3434
<groupId>com.google.code.gson</groupId>
3535
<artifactId>gson</artifactId>
3636
<version>2.5</version>
@@ -73,6 +73,11 @@
7373
<artifactId>jena-tdb</artifactId>
7474
<version>1.1.2</version>
7575
</dependency>
76+
<dependency>
77+
<groupId>org.freemarker</groupId>
78+
<artifactId>freemarker</artifactId>
79+
<version>2.3.23</version>
80+
</dependency>
7681
</dependencies>
7782
<build>
7883
<sourceDirectory>src</sourceDirectory>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.linkeddatafragments.exceptions;
2+
3+
/**
4+
*
5+
* @author mielvandersande
6+
*/
7+
public class NoRegisteredMimeTypesException extends Exception {
8+
9+
public NoRegisteredMimeTypesException() {
10+
super("List of supported mimeTypes is empty.");
11+
}
12+
13+
}

src/org/linkeddatafragments/servlet/TriplePatternFragmentServlet.java

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,20 @@
33
import com.google.gson.JsonObject;
44
import com.hp.hpl.jena.rdf.model.Model;
55
import com.hp.hpl.jena.rdf.model.ModelFactory;
6+
import com.hp.hpl.jena.rdf.model.Statement;
7+
import com.hp.hpl.jena.rdf.model.StmtIterator;
8+
import freemarker.template.TemplateException;
69
import java.io.File;
710
import java.io.FileReader;
811
import java.io.IOException;
912
import java.util.ArrayList;
1013
import java.util.Collection;
1114
import java.util.HashMap;
1215
import java.util.Map.Entry;
16+
import java.util.function.Consumer;
17+
import java.util.logging.Level;
18+
import java.util.logging.Logger;
19+
import javax.servlet.RequestDispatcher;
1320
import javax.servlet.ServletConfig;
1421
import javax.servlet.ServletException;
1522
import javax.servlet.http.HttpServlet;
@@ -33,6 +40,7 @@
3340
import org.linkeddatafragments.fragments.LinkedDataFragmentRequestBase;
3441
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequestImpl;
3542
import org.linkeddatafragments.util.MIMEParse;
43+
import org.linkeddatafragments.views.HtmlWriter;
3644

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

9098
// register content types
99+
MIMEParse.register("text/html");
91100
MIMEParse.register(Lang.TTL.getHeaderString());
92101
MIMEParse.register(Lang.JSONLD.getHeaderString());
93102
MIMEParse.register(Lang.NTRIPLES.getHeaderString());
@@ -145,24 +154,30 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro
145154
final LinkedDataFragmentRequest ldfRequest = new TriplePatternFragmentRequestImpl( request, config );
146155
final IFragmentRequestProcessor processor = dataSource.getRequestProcessor( ldfRequest );
147156
final LinkedDataFragment fragment = processor.createRequestedFragment();
148-
149-
final Model output = ModelFactory.createDefaultModel();
150-
output.setNsPrefixes(config.getPrefixes());
151-
output.add( fragment.getMetadata() );
152-
output.add( fragment.getTriples() );
153-
output.add( fragment.getControls() );
154-
157+
155158
// do conneg
156159
String bestMatch = MIMEParse.bestMatch(request.getHeader("Accept"));
157-
Lang contentType = RDFLanguages.contentTypeToLang(bestMatch);
158160

159161
// serialize the output
160162
response.setHeader("Server", "Linked Data Fragments Server");
161163
response.setContentType(bestMatch);
162164
response.setCharacterEncoding("utf-8");
165+
166+
if (bestMatch.equals("text/html")) {
167+
new HtmlWriter().write(response.getOutputStream(), dataSources, dataSource, fragment);
168+
return;
169+
}
170+
171+
final Model output = ModelFactory.createDefaultModel();
172+
output.setNsPrefixes(config.getPrefixes());
173+
output.add( fragment.getMetadata() );
174+
output.add( fragment.getTriples() );
175+
output.add( fragment.getControls() );
176+
177+
Lang contentType = RDFLanguages.contentTypeToLang(bestMatch);
178+
RDFDataMgr.write(response.getOutputStream(), output, contentType);
163179

164-
RDFDataMgr.write(response.getOutputStream(), output, contentType);
165-
} catch (IOException | NoRegisteredMimeTypesException e) {
180+
} catch (IOException | NoRegisteredMimeTypesException | TemplateException e) {
166181
throw new ServletException(e);
167182
} catch (DataSourceNotFoundException ex) {
168183
try {

src/org/linkeddatafragments/standalone/JettyServer.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import org.apache.commons.cli.DefaultParser;
66
import org.apache.commons.cli.HelpFormatter;
77
import org.apache.commons.cli.Options;
8-
98
import org.eclipse.jetty.server.Server;
9+
import org.eclipse.jetty.servlet.DefaultServlet;
10+
import org.eclipse.jetty.servlet.ServletContextHandler;
1011
import org.eclipse.jetty.servlet.ServletHandler;
1112
import org.eclipse.jetty.servlet.ServletHolder;
12-
1313
import org.linkeddatafragments.servlet.TriplePatternFragmentServlet;
1414

1515
/**
@@ -67,6 +67,15 @@ public static void main(String[] args) throws Exception {
6767
ServletHolder tpfServletHolder = new ServletHolder(new TriplePatternFragmentServlet());
6868
tpfServletHolder.setInitParameter(TriplePatternFragmentServlet.CFGFILE, config);
6969
handler.addServletWithMapping(tpfServletHolder, "/*");
70+
71+
// TODO: create a servlet to serve assets
72+
//String assetsPath = System.getProperty("user.dir") + "/assets";
73+
//ServletHolder assetsHolder = new ServletHolder(new DefaultServlet());
74+
//assetsHolder.setInitParameter("resourceBase", assetsPath);
75+
//assetsHolder.setInitParameter("dirAllowed","true");
76+
//assetsHolder.setInitParameter("pathInfoOnly","true");
77+
//handler.addServletWithMapping(assetsHolder,"/assets/*");
78+
7079

7180
// start the server
7281
server.start();
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
7+
package org.linkeddatafragments.views;
8+
9+
import freemarker.template.Configuration;
10+
import freemarker.template.Template;
11+
import freemarker.template.TemplateException;
12+
import freemarker.template.TemplateExceptionHandler;
13+
import java.io.File;
14+
import java.io.IOException;
15+
import java.io.OutputStream;
16+
import java.io.OutputStreamWriter;
17+
import java.io.Writer;
18+
import java.util.HashMap;
19+
import java.util.Map;
20+
import org.linkeddatafragments.datasource.IDataSource;
21+
import org.linkeddatafragments.fragments.LinkedDataFragment;
22+
23+
/**
24+
*
25+
* @author mielvandersande
26+
*/
27+
public class HtmlWriter {
28+
private final Configuration cfg;
29+
30+
public HtmlWriter() throws IOException {
31+
cfg = new Configuration(Configuration.VERSION_2_3_22);
32+
cfg.setDirectoryForTemplateLoading(new File(System.getProperty("user.dir") + "/views"));
33+
cfg.setDefaultEncoding("UTF-8");
34+
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
35+
}
36+
37+
public void write(OutputStream outputStream, HashMap<String, IDataSource> dataSources, IDataSource datasource, LinkedDataFragment fragment) throws IOException, TemplateException{
38+
/* Get the template (uses cache internally) */
39+
Template temp = cfg.getTemplate("index.ftl.html");
40+
41+
Map data = new HashMap();
42+
data.put("assetsPath", "css/");
43+
data.put("header", datasource.getTitle());
44+
data.put("datasources", dataSources);
45+
data.put("content", "");
46+
47+
data.put("controls", fragment.getControls());
48+
data.put("metadata", fragment.getMetadata());
49+
data.put("triples", fragment.getTriples());
50+
51+
52+
/* Merge data-model with template */
53+
Writer out = new OutputStreamWriter(outputStream);
54+
temp.process(data, out);
55+
}
56+
}

views/base.ftl.html

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<#-- @license ©2015 Miel Vander Sande - Multimedia Lab / iMinds / Ghent University -->
2+
<!DOCTYPE html>
3+
<html lang="en" prefix="hydra: http://www.w3.org/ns/hydra/core# void: http://rdfs.org/ns/void#">
4+
<head>
5+
<meta charset="utf-8">
6+
<title>
7+
<#attempt>
8+
${ title || header }
9+
<#recover>
10+
'Linked Data Fragments Server'
11+
</#attempt>
12+
</title>
13+
<link rel="stylesheet" href="${ assetsPath }style" />
14+
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Open+Sans:700italic,400,700|Droid+Sans+Mono" type="text/css" />
15+
<meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1">
16+
</head>
17+
<body>
18+
<header>
19+
<h1><a href="/">
20+
<#attempt>
21+
${ header }
22+
<#recover>
23+
'Linked Data Fragments Server'
24+
</#attempt>
25+
</a></h1>
26+
<figure class="logo">
27+
<a href="http://linkeddatafragments.org/"><img src="/logo" alt="Linked Data Fragments" /></a>
28+
</figure>
29+
</header>
30+
<main>
31+
${ content }
32+
</main>
33+
<footer>
34+
<p>
35+
Powered by a <a href="https://github.com/LinkedDataFragments/Server.java" target="_blank">Linked Data Fragments Server</a>
36+
©2013–2015 Multimedia Lab – iMinds – Ghent University
37+
</p>
38+
</footer>
39+
</body>
40+
</html>

views/index.ftl.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<#-- @license ©2015 Miel Vander Sande - Multimedia Lab / iMinds / Ghent University -->
2+
<#include "base.ftl.html">
3+
<div class="index">
4+
<h2>Available datasets</h2>
5+
<p>Browse the following datasets as <a href="http://linkeddatafragments.org/in-depth/#tpf">Triple Pattern Fragments</a>:</p>
6+
<dl class="datasets">
7+
<#list datasources?keys as datasourceName>
8+
<dt><a href="/${datasourceName}">${datasources[datasourceName].getTitle() }</a></dt>
9+
<dd>${ datasources[datasourceName].getDescription() }</dd>
10+
</#list>
11+
</dl>
12+
<p>The current dataset <em class="dataset">index</em> contains metadata about these datasets.</p>
13+
</div>

0 commit comments

Comments
 (0)