Skip to content

Commit 29a2efe

Browse files
committed
Merge pull request #4 from LinkedDataFragments/master
merging in latest changes from origin
2 parents a524f1a + a904459 commit 29a2efe

22 files changed

+1065
-647
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package org.linkeddatafragments.datasource;
2+
3+
import java.util.regex.Matcher;
4+
import java.util.regex.Pattern;
5+
6+
import org.linkeddatafragments.fragments.LinkedDataFragment;
7+
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
8+
import org.linkeddatafragments.util.CommonResources;
9+
10+
import com.hp.hpl.jena.datatypes.TypeMapper;
11+
import com.hp.hpl.jena.rdf.model.Property;
12+
import com.hp.hpl.jena.rdf.model.RDFNode;
13+
import com.hp.hpl.jena.rdf.model.Resource;
14+
import com.hp.hpl.jena.rdf.model.ResourceFactory;
15+
16+
/**
17+
* Base class for implementations of {@link IFragmentRequestProcessor} that
18+
* process {@link TriplePatternFragmentRequest}s based on the Jena API.
19+
*
20+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
21+
* @author Ruben Verborgh
22+
*/
23+
abstract public class AbstractJenaBasedRequestProcessorForTriplePatterns
24+
extends AbstractRequestProcessorForTriplePatterns
25+
{
26+
abstract static protected class Worker
27+
extends AbstractRequestProcessorForTriplePatterns.Worker
28+
{
29+
public Worker( final TriplePatternFragmentRequest request )
30+
{
31+
super( request );
32+
}
33+
34+
@Override
35+
protected LinkedDataFragment createFragment( final String subject,
36+
final String predicate,
37+
final String object,
38+
final long offset,
39+
final long limit )
40+
throws IllegalArgumentException
41+
{
42+
final Resource s = parseAsResource( subject );
43+
final Property p = parseAsProperty( predicate );
44+
final RDFNode o = parseAsNode( object );
45+
46+
return createFragment( s, p, o, offset, limit );
47+
}
48+
49+
abstract protected LinkedDataFragment createFragment(
50+
final Resource subject,
51+
final Property predicate,
52+
final RDFNode object,
53+
final long offset,
54+
final long limit )
55+
throws IllegalArgumentException;
56+
57+
/**
58+
* Parses the given value as an RDF resource.
59+
*
60+
* @param value the value
61+
* @return the parsed value, or null if unspecified
62+
*/
63+
public Resource parseAsResource( String value )
64+
{
65+
RDFNode subject = parseAsNode( value );
66+
return subject == null || subject instanceof Resource
67+
? (Resource) subject
68+
: CommonResources.INVALID_URI;
69+
}
70+
71+
/**
72+
* Parses the given value as an RDF property.
73+
*
74+
* @param value the value
75+
* @return the parsed value, or null if unspecified
76+
*/
77+
public Property parseAsProperty( String value )
78+
{
79+
RDFNode predicateNode = parseAsNode( value );
80+
if ( predicateNode instanceof Resource ) {
81+
final String uri = ( (Resource) predicateNode ).getURI();
82+
return ResourceFactory.createProperty( uri );
83+
}
84+
else if ( predicateNode == null ) {
85+
return null;
86+
}
87+
else {
88+
return CommonResources.INVALID_URI;
89+
}
90+
}
91+
92+
public final static TypeMapper TYPES = TypeMapper.getInstance();
93+
public final static Pattern STRINGPATTERN
94+
= Pattern.compile("^\"(.*)\"(?:@(.*)|\\^\\^<?([^<>]*)>?)?$");
95+
96+
/**
97+
* Parses the given value as an RDF node.
98+
*
99+
* @param value the value
100+
* @return the parsed value, or null if unspecified
101+
*/
102+
public RDFNode parseAsNode( String value )
103+
{
104+
// nothing or empty indicates an unknown
105+
if ( value == null || value.isEmpty() ) {
106+
return null;
107+
}
108+
109+
// find the kind of entity based on the first character
110+
char firstChar = value.charAt(0);
111+
switch ( firstChar )
112+
{
113+
// variable or blank node indicates an unknown
114+
case '?':
115+
case '_':
116+
return null;
117+
118+
// angular brackets indicate a URI
119+
case '<':
120+
return ResourceFactory.createResource(
121+
value.substring(1, value.length() - 1) );
122+
123+
// quotes indicate a string
124+
case '"':
125+
Matcher matcher = STRINGPATTERN.matcher( value );
126+
if ( matcher.matches() ) {
127+
String body = matcher.group(1);
128+
String lang = matcher.group(2);
129+
String type = matcher.group(3);
130+
if ( lang != null ) {
131+
return ResourceFactory.createLangLiteral(
132+
body, lang );
133+
}
134+
else if ( type != null ) {
135+
return ResourceFactory.createTypedLiteral(
136+
body, TYPES.getSafeTypeByName(type) );
137+
}
138+
else {
139+
return ResourceFactory.createPlainLiteral( body );
140+
}
141+
}
142+
else {
143+
return CommonResources.INVALID_URI;
144+
}
145+
146+
// assume it's a URI without angular brackets
147+
default:
148+
return ResourceFactory.createResource( value );
149+
}
150+
}
151+
152+
} // end of class Worker
153+
154+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.linkeddatafragments.datasource;
2+
3+
import org.linkeddatafragments.fragments.LinkedDataFragment;
4+
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
5+
6+
/**
7+
* Base class for implementations of {@link IFragmentRequestProcessor}.
8+
*
9+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
10+
*/
11+
abstract public class AbstractRequestProcessor
12+
implements IFragmentRequestProcessor
13+
{
14+
@Override
15+
public void close() {}
16+
17+
@Override
18+
final public LinkedDataFragment createRequestedFragment(
19+
final LinkedDataFragmentRequest request )
20+
throws IllegalArgumentException
21+
{
22+
return getWorker( request ).createRequestedFragment();
23+
}
24+
25+
abstract protected Worker getWorker(
26+
final LinkedDataFragmentRequest request )
27+
throws IllegalArgumentException;
28+
29+
30+
abstract static protected class Worker
31+
{
32+
public final LinkedDataFragmentRequest request;
33+
34+
public Worker( final LinkedDataFragmentRequest request )
35+
{
36+
this.request = request;
37+
}
38+
39+
abstract public LinkedDataFragment createRequestedFragment()
40+
throws IllegalArgumentException;
41+
42+
} // end of class Worker
43+
44+
}

src/org/linkeddatafragments/datasource/AbstractRequestProcessorForTriplePatterns.java

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -7,82 +7,91 @@
77
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
88

99
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;
1310

1411
/**
1512
* Base class for implementations of {@link IFragmentRequestProcessor} that
16-
* process triple pattern based requests.
13+
* process {@link TriplePatternFragmentRequest}s.
1714
*
1815
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
1916
*/
2017
public abstract class AbstractRequestProcessorForTriplePatterns
21-
implements IFragmentRequestProcessor
18+
extends AbstractRequestProcessor
2219
{
23-
public final TriplePatternFragmentRequest request;
24-
public final long pageNumber;
25-
26-
public AbstractRequestProcessorForTriplePatterns(
27-
final TriplePatternFragmentRequest request )
20+
@Override
21+
protected Worker getWorker( final LinkedDataFragmentRequest request )
22+
throws IllegalArgumentException
2823
{
29-
this.request = request;
30-
if ( request.isPageRequest() )
31-
this.pageNumber = request.getPageNumber();
24+
if ( request instanceof TriplePatternFragmentRequest )
25+
return getWorker( (TriplePatternFragmentRequest) request );
3226
else
33-
this.pageNumber = 1L;
27+
throw new IllegalArgumentException( request.getClass().getName() );
3428
}
3529

36-
@Override
37-
public void close() {}
30+
abstract protected Worker getWorker(
31+
final TriplePatternFragmentRequest request )
32+
throws IllegalArgumentException;
3833

39-
@Override
40-
public LinkedDataFragment createRequestedFragment()
41-
{
42-
final long limit = LinkedDataFragmentRequest.TRIPLESPERPAGE;
43-
final long offset = limit * ( pageNumber - 1L );
4434

45-
return createFragment( request.getSubject(),
46-
request.getPredicate(),
47-
request.getObject(),
48-
offset, limit );
49-
50-
}
35+
abstract static protected class Worker
36+
extends AbstractRequestProcessor.Worker
37+
{
38+
public Worker( final TriplePatternFragmentRequest request )
39+
{
40+
super( request );
41+
}
5142

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);
43+
@Override
44+
public LinkedDataFragment createRequestedFragment()
45+
throws IllegalArgumentException
46+
{
47+
final long limit = LinkedDataFragmentRequest.TRIPLESPERPAGE;
48+
final long offset;
49+
if ( request.isPageRequest() )
50+
offset = limit * ( request.getPageNumber() - 1L );
51+
else
52+
offset = 0L;
6153

62-
return createFragment( s, p, o, offset, limit );
63-
}
54+
final TriplePatternFragmentRequest tpfRequest =
55+
(TriplePatternFragmentRequest) request;
6456

65-
abstract protected LinkedDataFragment createFragment( final Resource subject,
66-
final Property predicate,
67-
final RDFNode object,
68-
final long offset,
69-
final long limit );
57+
return createFragment( tpfRequest.getSubject(),
58+
tpfRequest.getPredicate(),
59+
tpfRequest.getObject(),
60+
offset, limit );
61+
}
7062

71-
protected TriplePatternFragment createEmptyTriplePatternFragment()
72-
{
73-
return new TriplePatternFragmentImpl( request.getFragmentURL(),
74-
request.getDatasetURL() );
75-
}
63+
abstract protected LinkedDataFragment createFragment( final String subj,
64+
final String pred,
65+
final String obj,
66+
final long offset,
67+
final long limit )
68+
throws IllegalArgumentException;
7669

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-
}
70+
protected TriplePatternFragment createEmptyTriplePatternFragment()
71+
{
72+
return new TriplePatternFragmentImpl( request.getFragmentURL(),
73+
request.getDatasetURL() );
74+
}
75+
76+
protected TriplePatternFragment createTriplePatternFragment(
77+
final Model triples,
78+
final long totalSize,
79+
final boolean isLastPage )
80+
{
81+
final long pageNumber;
82+
if ( request.isPageRequest() )
83+
pageNumber = request.getPageNumber();
84+
else
85+
pageNumber = 1L;
86+
87+
return new TriplePatternFragmentImpl( triples,
88+
totalSize,
89+
request.getFragmentURL(),
90+
request.getDatasetURL(),
91+
pageNumber,
92+
isLastPage );
93+
}
94+
95+
} // end of class Worker
8796

8897
}

src/org/linkeddatafragments/datasource/DataSource.java

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

3-
import javax.servlet.http.HttpServletRequest;
4-
5-
import org.linkeddatafragments.config.ConfigReader;
3+
import org.linkeddatafragments.fragments.IFragmentRequestParser;
64
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
5+
import org.linkeddatafragments.fragments.tpf.TPFRequestParser;
76
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
8-
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequestImpl;
97

108
/**
119
*
@@ -32,21 +30,16 @@ public String getTitle() {
3230
};
3331

3432
/**
35-
* This implementation assumes that the given request is a
36-
* {@link TriplePatternFragmentRequest}.
33+
* This implementation assumes that requests are
34+
* {@link TriplePatternFragmentRequest}s.
3735
*
3836
* Data sources for other types of {@link LinkedDataFragmentRequest}s must
3937
* override this method accordingly.
4038
*/
4139
@Override
42-
public IFragmentRequestProcessor getRequestProcessor(
43-
final HttpServletRequest request,
44-
final ConfigReader config )
40+
public IFragmentRequestParser getRequestParser()
4541
{
46-
final TriplePatternFragmentRequest r =
47-
new TriplePatternFragmentRequestImpl( request, config );
48-
49-
return getRequestProcessor( r );
42+
return new TPFRequestParser();
5043
}
5144

5245
@Override

0 commit comments

Comments
 (0)