Skip to content

Commit a714460

Browse files
author
Miel Vander Sande
committed
Refactored LinkedDataFragmentWriters
1 parent 2f06bda commit a714460

File tree

7 files changed

+154
-120
lines changed

7 files changed

+154
-120
lines changed

src/org/linkeddatafragments/datasource/index/IndexDataSource.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,16 @@
1515
public class IndexDataSource extends DataSource {
1616

1717
protected final IndexRequestProcessorForTPFs requestProcessor;
18-
private final HashMap<String, IDataSource> datasources;
1918

2019
public IndexDataSource(String baseUrl, HashMap<String, IDataSource> datasources) {
2120
super("Index", "List of all datasources");
2221
requestProcessor = new IndexRequestProcessorForTPFs( baseUrl, datasources );
23-
this.datasources = datasources;
2422
}
2523

2624
@Override
2725
public IFragmentRequestProcessor getRequestProcessor()
2826
{
2927
return requestProcessor;
3028
}
31-
32-
public HashMap<String, IDataSource> getDatasources() {
33-
return datasources;
34-
}
3529

3630
}

src/org/linkeddatafragments/servlet/LinkedDataFragmentServlet.java

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package org.linkeddatafragments.servlet;
22

33
import com.google.gson.JsonObject;
4-
import com.hp.hpl.jena.rdf.model.Model;
5-
import com.hp.hpl.jena.rdf.model.ModelFactory;
6-
import freemarker.template.TemplateException;
74
import java.io.File;
85
import java.io.FileReader;
96
import java.io.IOException;
@@ -17,8 +14,6 @@
1714
import javax.servlet.http.HttpServletRequest;
1815
import javax.servlet.http.HttpServletResponse;
1916
import org.apache.jena.riot.Lang;
20-
import org.apache.jena.riot.RDFDataMgr;
21-
import org.apache.jena.riot.RDFLanguages;
2217
import org.linkeddatafragments.config.ConfigReader;
2318
import org.linkeddatafragments.datasource.DataSourceFactory;
2419
import org.linkeddatafragments.datasource.IDataSource;
@@ -27,12 +22,12 @@
2722
import org.linkeddatafragments.datasource.tdb.JenaTDBDataSourceType;
2823
import org.linkeddatafragments.exceptions.DataSourceException;
2924
import org.linkeddatafragments.exceptions.DataSourceNotFoundException;
30-
import org.linkeddatafragments.exceptions.NoRegisteredMimeTypesException;
3125
import org.linkeddatafragments.fragments.FragmentRequestParserBase;
3226
import org.linkeddatafragments.fragments.LinkedDataFragment;
3327
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
3428
import org.linkeddatafragments.util.MIMEParse;
35-
import org.linkeddatafragments.views.HtmlWriter;
29+
import org.linkeddatafragments.views.LinkedDataFragmentWriter;
30+
import org.linkeddatafragments.views.LinkedDataFragmentWriterFactory;
3631

3732
/**
3833
* Servlet that responds with a Linked Data Fragment.
@@ -142,16 +137,6 @@ private IDataSource getDataSource(HttpServletRequest request) throws DataSourceN
142137
@Override
143138
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
144139
try {
145-
final IDataSource dataSource = getDataSource( request );
146-
147-
final LinkedDataFragmentRequest ldfRequest =
148-
dataSource.getRequestParser()
149-
.parseIntoFragmentRequest( request, config );
150-
151-
final LinkedDataFragment fragment =
152-
dataSource.getRequestProcessor()
153-
.createRequestedFragment( ldfRequest );
154-
155140
// do conneg
156141
String bestMatch = MIMEParse.bestMatch(request.getHeader("Accept"));
157142

@@ -160,30 +145,36 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro
160145
response.setContentType(bestMatch);
161146
response.setCharacterEncoding("utf-8");
162147

163-
if (bestMatch.equals("text/html")) {
164-
new HtmlWriter().write(response.getOutputStream(), dataSource, fragment, ldfRequest);
165-
return;
166-
}
167-
168-
final Model output = ModelFactory.createDefaultModel();
169-
output.setNsPrefixes(config.getPrefixes());
170-
output.add( fragment.getMetadata() );
171-
output.add( fragment.getTriples() );
172-
output.add( fragment.getControls() );
148+
LinkedDataFragmentWriter writer = LinkedDataFragmentWriterFactory.create(config.getPrefixes(), dataSources, bestMatch);
173149

174-
Lang contentType = RDFLanguages.contentTypeToLang(bestMatch);
175-
RDFDataMgr.write(response.getOutputStream(), output, contentType);
176-
177-
} catch (IOException | NoRegisteredMimeTypesException | TemplateException e) {
178-
throw new ServletException(e);
179-
} catch (DataSourceNotFoundException ex) {
180150
try {
181-
response.setStatus(404);
182-
response.getOutputStream().println(ex.getMessage());
183-
response.getOutputStream().close();
184-
} catch (IOException ex1) {
185-
throw new ServletException(ex1);
151+
152+
final IDataSource dataSource = getDataSource( request );
153+
154+
final LinkedDataFragmentRequest ldfRequest =
155+
dataSource.getRequestParser()
156+
.parseIntoFragmentRequest( request, config );
157+
158+
final LinkedDataFragment fragment =
159+
dataSource.getRequestProcessor()
160+
.createRequestedFragment( ldfRequest );
161+
162+
writer.writeFragment(response.getOutputStream(), dataSource, fragment, ldfRequest);
163+
164+
} catch (DataSourceNotFoundException ex) {
165+
try {
166+
response.setStatus(404);
167+
writer.writeNotFound(response.getOutputStream(), request);
168+
} catch (Exception ex1) {
169+
throw new ServletException(ex1);
170+
}
171+
} catch (Exception e) {
172+
response.setStatus(500);
173+
writer.writeError(response.getOutputStream(), e);
186174
}
175+
176+
} catch (Exception e) {
177+
throw new ServletException(e);
187178
}
188179
}
189180

src/org/linkeddatafragments/views/HtmlWriter.java

Lines changed: 0 additions & 65 deletions
This file was deleted.
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package org.linkeddatafragments.views;
2+
3+
import freemarker.template.Configuration;
4+
import freemarker.template.Template;
5+
import freemarker.template.TemplateException;
6+
import freemarker.template.TemplateExceptionHandler;
7+
import java.io.File;
8+
import java.io.IOException;
9+
import java.io.OutputStreamWriter;
10+
import java.io.Writer;
11+
import java.util.Date;
12+
import java.util.HashMap;
13+
import java.util.Map;
14+
import javax.servlet.ServletOutputStream;
15+
import javax.servlet.http.HttpServletRequest;
16+
import org.linkeddatafragments.datasource.IDataSource;
17+
import org.linkeddatafragments.datasource.index.IndexDataSource;
18+
import org.linkeddatafragments.fragments.LinkedDataFragment;
19+
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
20+
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
21+
22+
/**
23+
*
24+
* @author mielvandersande
25+
*/
26+
public class HtmlWriterImpl extends LinkedDataFragmentWriterBase implements LinkedDataFragmentWriter {
27+
private final Configuration cfg;
28+
29+
private final Template indexTemplate;
30+
private final Template datasourceTemplate;
31+
private final Template notfoundTemplate;
32+
private final Template errorTemplate;
33+
34+
35+
public HtmlWriterImpl(Map<String, String> prefixes, HashMap<String, IDataSource> datasources) throws IOException {
36+
super(prefixes, datasources);
37+
38+
cfg = new Configuration(Configuration.VERSION_2_3_22);
39+
cfg.setDirectoryForTemplateLoading(new File(System.getProperty("user.dir") + "/views"));
40+
cfg.setDefaultEncoding("UTF-8");
41+
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
42+
43+
indexTemplate = cfg.getTemplate("index.ftl.html");
44+
datasourceTemplate = cfg.getTemplate("datasource.ftl.html");
45+
notfoundTemplate = cfg.getTemplate("notfound.ftl.html");
46+
errorTemplate = cfg.getTemplate("error.ftl.html");
47+
}
48+
49+
@Override
50+
public void writeFragment(ServletOutputStream outputStream, IDataSource datasource, LinkedDataFragment fragment, LinkedDataFragmentRequest ldfRequest) throws IOException, TemplateException{
51+
Map data = new HashMap();
52+
data.put("assetsPath", "assets/");
53+
data.put("header", datasource.getTitle());
54+
55+
data.put("date", new Date());
56+
57+
data.put("datasourceUrl", ldfRequest.getDatasetURL());
58+
data.put("datasource", datasource);
59+
data.put("controls", fragment.getControls());
60+
data.put("metadata", fragment.getMetadata());
61+
data.put("triples", fragment.getTriples());
62+
data.put("datasources", getDatasources());
63+
64+
Map query = new HashMap();
65+
TriplePatternFragmentRequest tpfRequest = (TriplePatternFragmentRequest) ldfRequest;
66+
query.put("subject", tpfRequest.getSubject());
67+
query.put("predicate", tpfRequest.getPredicate());
68+
query.put("object", tpfRequest.getObject());
69+
data.put("query", query);
70+
71+
/* Get the template (uses cache internally) */
72+
Template temp = datasource instanceof IndexDataSource ? indexTemplate : datasourceTemplate;
73+
74+
/* Merge data-model with template */
75+
Writer out = new OutputStreamWriter(outputStream);
76+
temp.process(data, out);
77+
}
78+
79+
@Override
80+
public void writeNotFound(ServletOutputStream outputStream, HttpServletRequest request) throws Exception {
81+
Map data = new HashMap();
82+
data.put("url", request.getRequestURL().toString());
83+
data.put("datasources", getDatasources());
84+
85+
Writer out = new OutputStreamWriter(outputStream);
86+
notfoundTemplate.process(data, out);
87+
}
88+
89+
@Override
90+
public void writeError(ServletOutputStream outputStream, Exception ex) throws Exception {
91+
Map data = new HashMap();
92+
data.put("error", ex);
93+
94+
Writer out = new OutputStreamWriter(outputStream);
95+
errorTemplate.process(data, out);
96+
}
97+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.linkeddatafragments.views;
2+
3+
import javax.servlet.ServletOutputStream;
4+
import javax.servlet.http.HttpServletRequest;
5+
import org.linkeddatafragments.datasource.IDataSource;
6+
import org.linkeddatafragments.fragments.LinkedDataFragment;
7+
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
8+
9+
/**
10+
*
11+
* @author mielvandersande
12+
*/
13+
public interface LinkedDataFragmentWriter {
14+
public void writeNotFound(ServletOutputStream outputStream, HttpServletRequest request) throws Exception;
15+
public void writeError(ServletOutputStream outputStream, Exception ex) throws Exception;
16+
public void writeFragment(ServletOutputStream outputStream, IDataSource datasource, LinkedDataFragment fragment, LinkedDataFragmentRequest ldfRequest) throws Exception;
17+
}

views/base.ftl.html

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
11
<#-- @license ©2015 Miel Vander Sande - Multimedia Lab / iMinds / Ghent University -->
2+
<#macro display_page>
23
<!DOCTYPE html>
34
<html lang="en" prefix="hydra: http://www.w3.org/ns/hydra/core# void: http://rdfs.org/ns/void#">
45
<head>
56
<meta charset="utf-8">
6-
<title>${ (title || header)!"Linked Data Fragments Server" }</title>
7+
<title>${ title!header!"Linked Data Fragments Server" }</title>
78
<link rel="stylesheet" href="${ assetsPath }style.css" />
89
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Open+Sans:700italic,400,700|Droid+Sans+Mono" type="text/css" />
910
<meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1">
1011
</head>
1112
<body>
1213
<header>
13-
<h1><a href="/">
14-
<#attempt>
15-
${ header }
16-
<#recover>
17-
'Linked Data Fragments Server'
18-
</#attempt>
19-
</a></h1>
14+
<h1><a href="/">${header!"Linked Data Fragments Server"}</a></h1>
2015
<figure class="logo">
2116
<a href="http://linkeddatafragments.org/"><img src="${ assetsPath }logo.svg" alt="Linked Data Fragments" /></a>
2217
</figure>
2318
</header>
2419
<main>
25-
${ content }
20+
<@contents/>
2621
</main>
2722
<footer>
2823
<p>
@@ -31,4 +26,5 @@ <h1><a href="/">
3126
</p>
3227
</footer>
3328
</body>
34-
</html>
29+
</html>
30+
</#macro>

views/index.ftl.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<#-- @license ©2015 Miel Vander Sande - Multimedia Lab / iMinds / Ghent University -->
22
<#include "base.ftl.html">
3+
<#macro contents>
34
<div class="index">
45
<h2>Available datasets</h2>
56
<p>Browse the following datasets as <a href="http://linkeddatafragments.org/in-depth/#tpf">Triple Pattern Fragments</a>:</p>
@@ -14,4 +15,7 @@ <h2>Available datasets</h2>
1415
<p>The current dataset <em class="dataset">index</em> contains metadata about these datasets.</p>
1516
</div>
1617

17-
<#include "fragment.ftl.html">
18+
<#include "fragment.ftl.html">
19+
</#macro>
20+
21+
<@display_page/>

0 commit comments

Comments
 (0)