Skip to content

Commit 967e0f0

Browse files
author
Miel Vander Sande
committed
Merged master
2 parents ca04b19 + 09e861e commit 967e0f0

27 files changed

+1170
-553
lines changed

WebContent/WEB-INF/web.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<servlet>
55
<display-name>BasicLdfServlet</display-name>
66
<servlet-name>BasicLdfServlet</servlet-name>
7-
<servlet-class>org.linkeddatafragments.servlet.TriplePatternFragmentServlet</servlet-class>
7+
<servlet-class>org.linkeddatafragments.servlet.LinkedDataFragmentServlet</servlet-class>
88
</servlet>
99
<servlet-mapping>
1010
<servlet-name>BasicLdfServlet</servlet-name>
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package org.linkeddatafragments.datasource;
2+
3+
import org.apache.jena.rdf.model.Model;
4+
import org.apache.jena.rdf.model.Property;
5+
import org.apache.jena.rdf.model.RDFNode;
6+
import org.apache.jena.rdf.model.Resource;
7+
import org.linkeddatafragments.fragments.LinkedDataFragment;
8+
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
9+
import org.linkeddatafragments.fragments.tpf.TriplePatternFragment;
10+
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentImpl;
11+
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
12+
13+
14+
/**
15+
* Base class for implementations of {@link IFragmentRequestProcessor} that
16+
* process triple pattern based requests.
17+
*
18+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
19+
*/
20+
public abstract class AbstractRequestProcessorForTriplePatterns
21+
implements IFragmentRequestProcessor
22+
{
23+
public final TriplePatternFragmentRequest request;
24+
public final long pageNumber;
25+
26+
public AbstractRequestProcessorForTriplePatterns(
27+
final TriplePatternFragmentRequest request )
28+
{
29+
this.request = request;
30+
if ( request.isPageRequest() )
31+
this.pageNumber = request.getPageNumber();
32+
else
33+
this.pageNumber = 1L;
34+
}
35+
36+
@Override
37+
public void close() {}
38+
39+
@Override
40+
public LinkedDataFragment createRequestedFragment()
41+
{
42+
final long limit = LinkedDataFragmentRequest.TRIPLESPERPAGE;
43+
final long offset = limit * ( pageNumber - 1L );
44+
45+
return createFragment( request.getSubject(),
46+
request.getPredicate(),
47+
request.getObject(),
48+
offset, limit );
49+
50+
}
51+
52+
protected LinkedDataFragment createFragment( final String subj,
53+
final String pred,
54+
final String obj,
55+
final long offset,
56+
final long limit )
57+
{
58+
final Resource s = FragmentRequestProcessorUtils.parseAsResource(subj);
59+
final Property p = FragmentRequestProcessorUtils.parseAsProperty(pred);
60+
final RDFNode o = FragmentRequestProcessorUtils.parseAsNode(obj);
61+
62+
return createFragment( s, p, o, offset, limit );
63+
}
64+
65+
abstract protected LinkedDataFragment createFragment( final Resource subject,
66+
final Property predicate,
67+
final RDFNode object,
68+
final long offset,
69+
final long limit );
70+
71+
protected TriplePatternFragment createEmptyTriplePatternFragment()
72+
{
73+
return new TriplePatternFragmentImpl( request.getFragmentURL(),
74+
request.getDatasetURL() );
75+
}
76+
77+
protected TriplePatternFragment createTriplePatternFragment(
78+
Model triples, long totalSize, final boolean isLastPage )
79+
{
80+
return new TriplePatternFragmentImpl( triples,
81+
totalSize,
82+
request.getFragmentURL(),
83+
request.getDatasetURL(),
84+
pageNumber,
85+
isLastPage );
86+
}
87+
88+
}
Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package org.linkeddatafragments.datasource;
22

3+
import javax.servlet.http.HttpServletRequest;
4+
5+
import org.linkeddatafragments.config.ConfigReader;
6+
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
7+
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
8+
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequestImpl;
9+
310
/**
411
*
512
* @author mielvandersande
@@ -8,20 +15,6 @@
815
public abstract class DataSource implements IDataSource {
916
protected String title;
1017
protected String description;
11-
12-
/**
13-
*
14-
* @param offset
15-
* @param limit
16-
*/
17-
protected void checkBoundaries(long offset, long limit) {
18-
if (offset < 0) {
19-
throw new IndexOutOfBoundsException("offset");
20-
}
21-
if (limit < 1) {
22-
throw new IllegalArgumentException("limit");
23-
}
24-
}
2518

2619
public DataSource(String title, String description) {
2720
this.title = title;
@@ -37,4 +30,25 @@ public String getDescription() {
3730
public String getTitle() {
3831
return this.title;
3932
};
33+
34+
/**
35+
* This implementation assumes that the given request is a
36+
* {@link TriplePatternFragmentRequest}.
37+
*
38+
* Data sources for other types of {@link LinkedDataFragmentRequest}s must
39+
* override this method accordingly.
40+
*/
41+
@Override
42+
public IFragmentRequestProcessor getRequestProcessor(
43+
final HttpServletRequest request,
44+
final ConfigReader config )
45+
{
46+
final TriplePatternFragmentRequest r =
47+
new TriplePatternFragmentRequestImpl( request, config );
48+
49+
return getRequestProcessor( r );
50+
}
51+
52+
@Override
53+
public void close() {}
4054
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package org.linkeddatafragments.datasource;
2+
3+
import java.util.regex.Matcher;
4+
import java.util.regex.Pattern;
5+
import org.apache.jena.datatypes.TypeMapper;
6+
import org.apache.jena.rdf.model.Property;
7+
import org.apache.jena.rdf.model.RDFNode;
8+
import org.apache.jena.rdf.model.Resource;
9+
import org.apache.jena.rdf.model.ResourceFactory;
10+
import org.apache.jena.shared.InvalidPropertyURIException;
11+
12+
import org.linkeddatafragments.util.CommonResources;
13+
14+
15+
16+
/**
17+
* Utility functions for dealing with (fragment) requests.
18+
*
19+
* @author Ruben Verborgh
20+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
21+
*/
22+
public class FragmentRequestProcessorUtils
23+
{
24+
/**
25+
* Parses the given value as an RDF resource.
26+
*
27+
* @param value the value
28+
* @return the parsed value, or null if unspecified
29+
*/
30+
public static Resource parseAsResource(String value) {
31+
RDFNode subject = parseAsNode(value);
32+
return subject == null || subject instanceof Resource
33+
? (Resource) subject
34+
: CommonResources.INVALID_URI;
35+
}
36+
37+
/**
38+
* Parses the given value as an RDF property.
39+
*
40+
* @param value the value
41+
* @return the parsed value, or null if unspecified
42+
*/
43+
public static Property parseAsProperty(String value) {
44+
RDFNode predicateNode = parseAsNode(value);
45+
if (predicateNode instanceof Resource) {
46+
try {
47+
return ResourceFactory.createProperty(((Resource) predicateNode).getURI());
48+
} catch (InvalidPropertyURIException ex) {
49+
return CommonResources.INVALID_URI;
50+
}
51+
}
52+
return predicateNode == null ? null : CommonResources.INVALID_URI;
53+
}
54+
55+
public final static TypeMapper TYPES = TypeMapper.getInstance();
56+
public final static Pattern STRINGPATTERN
57+
= Pattern.compile("^\"(.*)\"(?:@(.*)|\\^\\^<?([^<>]*)>?)?$");
58+
59+
/**
60+
* Parses the given value as an RDF node.
61+
*
62+
* @param value the value
63+
* @return the parsed value, or null if unspecified
64+
*/
65+
public static RDFNode parseAsNode(String value) {
66+
// nothing or empty indicates an unknown
67+
if (value == null || value.isEmpty()) {
68+
return null;
69+
}
70+
// find the kind of entity based on the first character
71+
char firstChar = value.charAt(0);
72+
switch (firstChar) {
73+
// variable or blank node indicates an unknown
74+
case '?':
75+
case '_':
76+
return null;
77+
// angular brackets indicate a URI
78+
case '<':
79+
return ResourceFactory.createResource(value.substring(1, value.length() - 1));
80+
// quotes indicate a string
81+
case '"':
82+
Matcher matcher = STRINGPATTERN.matcher(value);
83+
if (matcher.matches()) {
84+
String body = matcher.group(1);
85+
String lang = matcher.group(2);
86+
String type = matcher.group(3);
87+
if (lang != null) {
88+
return ResourceFactory.createLangLiteral(body, lang);
89+
}
90+
if (type != null) {
91+
return ResourceFactory.createTypedLiteral(body, TYPES.getSafeTypeByName(type));
92+
}
93+
return ResourceFactory.createPlainLiteral(body);
94+
}
95+
return CommonResources.INVALID_URI;
96+
// assume it's a URI without angular brackets
97+
default:
98+
return ResourceFactory.createResource(value);
99+
}
100+
}
101+
102+
}
Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,36 @@
11
package org.linkeddatafragments.datasource;
22

3-
import org.apache.jena.rdf.model.Property;
4-
import org.apache.jena.rdf.model.RDFNode;
5-
import org.apache.jena.rdf.model.Resource;
3+
import java.io.Closeable;
4+
5+
import javax.servlet.http.HttpServletRequest;
6+
7+
import org.linkeddatafragments.config.ConfigReader;
8+
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
69

710
/**
8-
* A data source of Basic Linked Data Fragments.
11+
* A data source of Linked Data Fragments.
12+
*
913
* @author Ruben Verborgh
14+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
1015
*/
11-
public interface IDataSource {
12-
/**
13-
* Gets a page of the Basic Linked Data Fragment matching the specified triple pattern.
14-
* @param subject the subject (null to match any subject)
15-
* @param predicate the predicate (null to match any predicate)
16-
* @param object the object (null to match any object)
17-
* @param offset the triple index at which to start the page
18-
* @param limit the number of triples on the page
19-
* @return the first page of the fragment
20-
*/
21-
public TriplePatternFragment getFragment(Resource subject, Property predicate,
22-
RDFNode object, long offset, long limit);
16+
public interface IDataSource extends Closeable {
17+
2318
public String getTitle();
2419

2520
public String getDescription();
21+
22+
/**
23+
* Returns a data source specific processor for the given request of a
24+
* Linked Data Fragment.
25+
*/
26+
IFragmentRequestProcessor getRequestProcessor(
27+
final HttpServletRequest request,
28+
final ConfigReader config );
29+
30+
/**
31+
* Returns a data source specific processor for the given request of a
32+
* Linked Data Fragment.
33+
*/
34+
IFragmentRequestProcessor getRequestProcessor(
35+
final LinkedDataFragmentRequest request );
2636
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.linkeddatafragments.datasource;
2+
3+
import java.io.Closeable;
4+
5+
import org.linkeddatafragments.fragments.LinkedDataFragment;
6+
7+
/**
8+
* Processes a single request sent to a Linked Data Fragments interface.
9+
*
10+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
11+
*/
12+
public interface IFragmentRequestProcessor extends Closeable
13+
{
14+
LinkedDataFragment createRequestedFragment();
15+
}

src/org/linkeddatafragments/datasource/TriplePatternFragment.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/org/linkeddatafragments/datasource/TriplePatternFragmentBase.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)