Skip to content

Commit 09e861e

Browse files
author
Miel Vander Sande
committed
Merge branch 'master' of github.com:LinkedDataFragments/Server.Java
2 parents 9dfa830 + c36ee58 commit 09e861e

27 files changed

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