Skip to content

Commit 05e6a1b

Browse files
author
Olaf Hartig
committed
code to parse HTTP request parameters into triple pattern elements is now partially generic (API-independent) and has been moved to separate parser classes
1 parent e328519 commit 05e6a1b

File tree

3 files changed

+202
-0
lines changed

3 files changed

+202
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package org.linkeddatafragments.util;
2+
3+
import java.util.regex.Matcher;
4+
import java.util.regex.Pattern;
5+
6+
/**
7+
* Parses strings (as obtained from HTTP request parameters) into RDF terms.
8+
*
9+
* @param <TermType> type for representing RDF terms
10+
*
11+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
12+
*/
13+
abstract public class RDFTermParser<TermType>
14+
{
15+
public static final Pattern STRINGPATTERN
16+
= Pattern.compile("^\"(.*)\"(?:@(.*)|\\^\\^<?([^<>]*)>?)?$");
17+
18+
public TermType parseIntoRDFNode( final String param )
19+
{
20+
if ( param == null || param.isEmpty() )
21+
return handleUnparsableParameter( param );
22+
23+
// identify the kind of RDF term based on the first character
24+
char firstChar = param.charAt(0);
25+
switch ( firstChar )
26+
{
27+
// blank node
28+
case '_':
29+
return createBlankNode( param );
30+
31+
// angular brackets indicate a URI
32+
case '<':
33+
return createURI( param.substring(1, param.length()-1) );
34+
35+
// quotes indicate a string
36+
case '"':
37+
Matcher matcher = STRINGPATTERN.matcher( param );
38+
if ( matcher.matches() ) {
39+
String label = matcher.group(1);
40+
String langTag = matcher.group(2);
41+
String typeURI = matcher.group(3);
42+
43+
if ( langTag != null )
44+
return createLanguageLiteral( label, langTag );
45+
46+
else if ( typeURI != null )
47+
return createTypedLiteral( label, typeURI );
48+
49+
else
50+
return createPlainLiteral( label );
51+
}
52+
else
53+
return handleUnparsableParameter( param );
54+
55+
// assume it is a URI without angular brackets
56+
default:
57+
return createURI( param );
58+
}
59+
}
60+
61+
abstract public TermType createBlankNode( final String label );
62+
63+
abstract public TermType createURI( final String uri );
64+
65+
abstract public TermType createTypedLiteral( final String label,
66+
final String typeURI );
67+
68+
abstract public TermType createLanguageLiteral( final String label,
69+
final String langTag );
70+
71+
abstract public TermType createPlainLiteral( final String label );
72+
73+
abstract public TermType handleUnparsableParameter( final String param );
74+
75+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.linkeddatafragments.util;
2+
3+
import org.linkeddatafragments.fragments.tpf.TriplePatternElement;
4+
import org.linkeddatafragments.fragments.tpf.TriplePatternElementFactory;
5+
6+
/**
7+
* Parses strings (as obtained from HTTP request parameters) into
8+
* {@link TriplePatternElement}s.
9+
*
10+
* @param <TermType> type for representing RDF terms
11+
* @param <VarType> type for representing specific variables
12+
*
13+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
14+
* @author Ruben Verborgh
15+
*/
16+
abstract public class TriplePatternElementParser<TermType,VarType>
17+
extends RDFTermParser<TermType>
18+
{
19+
public final TriplePatternElementFactory<TermType,VarType> factory =
20+
new TriplePatternElementFactory<TermType,VarType>();
21+
22+
public TriplePatternElement<TermType,VarType>
23+
parseIntoTriplePatternElement( final String param )
24+
{
25+
// nothing or empty indicates an unspecified variable
26+
if ( param == null || param.isEmpty() )
27+
return factory.createUnspecifiedVariable();
28+
29+
// identify the kind of RDF term based on the first character
30+
char firstChar = param.charAt(0);
31+
switch ( firstChar )
32+
{
33+
// specific variable
34+
case '?':
35+
{
36+
final String varName = param.substring(1);
37+
final VarType var = createSpecificVariable( varName );
38+
return factory.createSpecificVariable( var );
39+
}
40+
41+
// blank node indicates an unspecified variable
42+
case '_':
43+
{
44+
return factory.createUnspecifiedVariable();
45+
}
46+
47+
// assume it is an RDF term
48+
default:
49+
return factory.createRDFTerm( parseIntoRDFNode(param) );
50+
}
51+
}
52+
53+
abstract public VarType createSpecificVariable( final String varName );
54+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.linkeddatafragments.util;
2+
3+
import com.hp.hpl.jena.datatypes.RDFDatatype;
4+
import com.hp.hpl.jena.datatypes.TypeMapper;
5+
import com.hp.hpl.jena.rdf.model.RDFNode;
6+
import com.hp.hpl.jena.rdf.model.ResourceFactory;
7+
8+
/**
9+
* A {@link TriplePatternElementParser} for Jena-based backends.
10+
*
11+
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
12+
*/
13+
public class TriplePatternElementParserForJena
14+
extends TriplePatternElementParser<RDFNode,String>
15+
{
16+
private static TriplePatternElementParserForJena instance = null;
17+
18+
public static TriplePatternElementParserForJena getInstance()
19+
{
20+
if ( instance == null ) {
21+
instance = new TriplePatternElementParserForJena();
22+
}
23+
return instance;
24+
}
25+
26+
protected TriplePatternElementParserForJena() {}
27+
28+
@Override
29+
public String createSpecificVariable( final String varName )
30+
{
31+
return varName;
32+
}
33+
34+
@Override
35+
public RDFNode createBlankNode( final String label )
36+
{
37+
return ResourceFactory.createResource();
38+
}
39+
40+
@Override
41+
public RDFNode createURI( final String uri )
42+
{
43+
return ResourceFactory.createResource( uri );
44+
}
45+
46+
@Override
47+
public RDFNode createTypedLiteral( final String label,
48+
final String typeURI )
49+
{
50+
final RDFDatatype dt = TypeMapper.getInstance()
51+
.getSafeTypeByName( typeURI );
52+
return ResourceFactory.createTypedLiteral( label, dt );
53+
}
54+
55+
@Override
56+
public RDFNode createLanguageLiteral( final String label,
57+
final String languageTag )
58+
{
59+
return ResourceFactory.createLangLiteral( label, languageTag );
60+
}
61+
62+
@Override
63+
public RDFNode createPlainLiteral( final String label )
64+
{
65+
return ResourceFactory.createPlainLiteral( label );
66+
}
67+
68+
@Override
69+
public RDFNode handleUnparsableParameter( final String parameter )
70+
{
71+
return CommonResources.INVALID_URI;
72+
}
73+
}

0 commit comments

Comments
 (0)