13
13
import javax .servlet .http .HttpServletRequest ;
14
14
import javax .servlet .http .HttpServletResponse ;
15
15
16
+ import org .apache .http .client .utils .URIBuilder ;
16
17
import org .linkeddatafragments .config .ConfigReader ;
17
18
import org .linkeddatafragments .datasource .BasicLinkedDataFragment ;
18
19
import org .linkeddatafragments .datasource .DataSource ;
@@ -37,6 +38,7 @@ public class BasicLdfServlet extends HttpServlet {
37
38
private final static long serialVersionUID = 1L ;
38
39
private final static Pattern STRINGPATTERN = Pattern .compile ("^\" (.*)\" (?:@(.*)|\\ ^\\ ^<(.*)>)?$" );
39
40
private final static TypeMapper types = TypeMapper .getInstance ();
41
+ private final static long TRIPLESPERPAGE = 100 ;
40
42
41
43
private ConfigReader config ;
42
44
private HashMap <String , DataSource > dataSources = new HashMap <String , DataSource >();
@@ -76,18 +78,21 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro
76
78
final Resource subject = parseAsResource (request .getParameter ("subject" ));
77
79
final Property predicate = parseAsProperty (request .getParameter ("predicate" ));
78
80
final RDFNode object = parseAsNode (request .getParameter ("object" ));
79
- final BasicLinkedDataFragment fragment = dataSource .getFragment (subject , predicate , object );
81
+ final long page = Math .max (1 , parseAsInteger (request .getParameter ("page" )));
82
+ final long limit = TRIPLESPERPAGE , offset = limit * (page - 1 );
83
+ final BasicLinkedDataFragment fragment = dataSource .getFragment (subject , predicate , object , offset , limit );
80
84
81
85
// fill the output model
82
86
final Model output = fragment .getTriples ();
87
+ final boolean isEmpty = output .size () == 0 ;
83
88
output .setNsPrefixes (config .getPrefixes ());
84
89
85
90
// add dataset metadata
86
91
final String hostName = request .getHeader ("Host" );
87
92
final String datasetUrl = request .getScheme () + "://" +
88
93
(hostName == null ? request .getServerName () : hostName ) + request .getRequestURI ();
89
94
final String fragmentUrl = query == null ? datasetUrl : (datasetUrl + "?" + query );
90
- final Resource datasetId = output .createResource (datasetUrl );
95
+ final Resource datasetId = output .createResource (datasetUrl + "#dataset" );
91
96
final Resource fragmentId = output .createResource (fragmentUrl );
92
97
output .add (datasetId , RDF_TYPE , VOID_DATASET );
93
98
output .add (datasetId , RDF_TYPE , HYDRA_COLLECTION );
@@ -99,6 +104,20 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro
99
104
final Literal total = output .createTypedLiteral (fragment .getTotalSize (), XSDDatatype .XSDinteger );
100
105
output .add (fragmentId , VOID_TRIPLES , total );
101
106
output .add (fragmentId , HYDRA_TOTALITEMS , total );
107
+ output .add (fragmentId , HYDRA_ITEMSPERPAGE , output .createTypedLiteral (limit , XSDDatatype .XSDinteger ));
108
+
109
+ // add pages
110
+ final URIBuilder pagedUrl = new URIBuilder (fragmentUrl );
111
+ pagedUrl .setParameter ("page" , "1" );
112
+ output .add (fragmentId , HYDRA_FIRSTPAGE , output .createResource (pagedUrl .toString ()));
113
+ if (offset > 0 ) {
114
+ pagedUrl .setParameter ("page" , Long .toString (page - 1 ));
115
+ output .add (fragmentId , HYDRA_PREVIOUSPAGE , output .createResource (pagedUrl .toString ()));
116
+ }
117
+ if (offset + limit < fragment .getTotalSize ()) {
118
+ pagedUrl .setParameter ("page" , Long .toString (page + 1 ));
119
+ output .add (fragmentId , HYDRA_NEXTPAGE , output .createResource (pagedUrl .toString ()));
120
+ }
102
121
103
122
// add controls
104
123
final Resource triplePattern = output .createResource ();
@@ -118,17 +137,27 @@ public void doGet(HttpServletRequest request, HttpServletResponse response) thro
118
137
output .add (objectMapping , HYDRA_PROPERTY , RDF_OBJECT );
119
138
120
139
// serialize the output as Turtle
121
- response .setStatus (fragment . getTotalSize () == 0 ? 404 : 200 );
140
+ response .setStatus (isEmpty ? 404 : 200 );
122
141
response .setHeader ("Server" , "Linked Data Fragments Server" );
123
142
response .setContentType ("text/turtle" );
124
143
response .setCharacterEncoding ("utf-8" );
125
- output .write (response .getWriter (), "Turtle" );
144
+ output .write (response .getWriter (), "Turtle" , fragmentUrl );
126
145
}
127
146
catch (Exception e ) {
128
147
throw new ServletException (e );
129
148
}
130
149
}
131
150
151
+ /**
152
+ * Parses the given value as an integer.
153
+ * @param value the value
154
+ * @return the parsed value
155
+ */
156
+ private int parseAsInteger (String value ) {
157
+ try { return Integer .parseInt (value ); }
158
+ catch (NumberFormatException ex ) { return 0 ; }
159
+ }
160
+
132
161
/**
133
162
* Parses the given value as an RDF resource.
134
163
* @param value the value
0 commit comments