Skip to content

Commit 669c3c7

Browse files
committedMay 6, 2022
Added $ldh:localGraph and $ldh:originalGraph as XSLT param documents, when are set by ProxyResourceBase (when ?uri query param is provided).
They allow distinguishing between triples coming from the local graph store and the remote document.
1 parent b6fa312 commit 669c3c7

File tree

6 files changed

+102
-11
lines changed

6 files changed

+102
-11
lines changed
 

‎.dockerignore

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
.git
2+
.github
13
.env
24
config
3-
hooks
4-
ssl
55
data
6+
hooks
67
http-tests
78
node
89
node_modules
10+
scripts
11+
ssl
912
target
1013
uploads

‎src/main/java/com/atomgraph/linkeddatahub/server/filter/response/ProvenanceFilter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
/**
4242
* Records each HTTP interaction in a timestamped meta named graph.
43-
* The same logic can be found in Docker container's <code>split-default-graph.rq.template</code>.
43+
* Currently unused.
4444
*
4545
* @author {@literal Martynas Jusevičius <martynas@atomgraph.com>}
4646
*/

‎src/main/java/com/atomgraph/linkeddatahub/server/model/impl/ProxyResourceBase.java

+63-4
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@
1919
import com.atomgraph.client.MediaTypes;
2020
import com.atomgraph.client.util.DataManager;
2121
import com.atomgraph.client.vocabulary.AC;
22+
import com.atomgraph.core.exception.BadGatewayException;
2223
import com.atomgraph.core.io.ModelProvider;
2324
import com.atomgraph.linkeddatahub.apps.model.Dataset;
2425
import com.atomgraph.linkeddatahub.client.filter.auth.IDTokenDelegationFilter;
2526
import com.atomgraph.linkeddatahub.client.filter.auth.WebIDDelegationFilter;
2627
import com.atomgraph.linkeddatahub.model.Agent;
28+
import com.atomgraph.linkeddatahub.model.Service;
2729
import com.atomgraph.linkeddatahub.server.security.AgentContext;
2830
import com.atomgraph.linkeddatahub.server.security.IDTokenSecurityContext;
31+
import com.atomgraph.linkeddatahub.vocabulary.LDH;
2932
import java.net.URI;
3033
import java.net.URISyntaxException;
3134
import java.util.ArrayList;
@@ -42,6 +45,7 @@
4245
import javax.ws.rs.QueryParam;
4346
import javax.ws.rs.client.Entity;
4447
import javax.ws.rs.client.WebTarget;
48+
import javax.ws.rs.container.ContainerRequestContext;
4549
import javax.ws.rs.core.Context;
4650
import javax.ws.rs.core.HttpHeaders;
4751
import javax.ws.rs.core.MediaType;
@@ -50,6 +54,8 @@
5054
import javax.ws.rs.core.SecurityContext;
5155
import javax.ws.rs.core.UriInfo;
5256
import javax.ws.rs.ext.Providers;
57+
import org.apache.jena.query.Query;
58+
import org.apache.jena.query.QueryFactory;
5359
import org.apache.jena.query.ResultSet;
5460
import org.apache.jena.rdf.model.Model;
5561
import org.apache.jena.rdf.model.ModelFactory;
@@ -70,6 +76,8 @@ public class ProxyResourceBase extends com.atomgraph.client.model.impl.ProxyReso
7076
private static final Logger log = LoggerFactory.getLogger(ProxyResourceBase.class);
7177

7278
private final UriInfo uriInfo;
79+
private final ContainerRequestContext crc;
80+
private final Service service;
7381
private final DataManager dataManager;
7482
private final MediaType[] readableMediaTypes;
7583
private final Providers providers;
@@ -82,7 +90,9 @@ public class ProxyResourceBase extends com.atomgraph.client.model.impl.ProxyReso
8290
* @param request current request
8391
* @param httpHeaders HTTP header info
8492
* @param mediaTypes registry of readable/writable media types
93+
* @param service application's SPARQL service
8594
* @param securityContext JAX-RS security context
95+
* @param crc request context
8696
* @param system system application
8797
* @param httpServletRequest servlet request
8898
* @param dataManager RDFdata manager
@@ -91,11 +101,13 @@ public class ProxyResourceBase extends com.atomgraph.client.model.impl.ProxyReso
91101
* @param dataset optional dataset
92102
*/
93103
@Inject
94-
public ProxyResourceBase(@Context UriInfo uriInfo, @Context Request request, @Context HttpHeaders httpHeaders, MediaTypes mediaTypes, @Context SecurityContext securityContext,
104+
public ProxyResourceBase(@Context UriInfo uriInfo, @Context Request request, @Context HttpHeaders httpHeaders, MediaTypes mediaTypes,
105+
Optional<Service> service,
106+
@Context SecurityContext securityContext, @Context ContainerRequestContext crc,
95107
com.atomgraph.linkeddatahub.Application system, @Context HttpServletRequest httpServletRequest, DataManager dataManager, Optional<AgentContext> agentContext,
96108
@Context Providers providers, Optional<Dataset> dataset)
97109
{
98-
this(uriInfo, request, httpHeaders, mediaTypes, securityContext,
110+
this(uriInfo, request, httpHeaders, mediaTypes, service, securityContext, crc,
99111
uriInfo.getQueryParameters().getFirst(AC.uri.getLocalName()) == null ?
100112
dataset.isEmpty() ? null : dataset.get().getProxied(uriInfo.getAbsolutePath())
101113
:
@@ -113,7 +125,9 @@ public ProxyResourceBase(@Context UriInfo uriInfo, @Context Request request, @Co
113125
* @param request current request
114126
* @param httpHeaders HTTP header info
115127
* @param mediaTypes registry of readable/writable media types
128+
* @param service application's SPARQL service
116129
* @param securityContext JAX-RS security context
130+
* @param crc request context
117131
* @param uri <code>uri</code> URL param
118132
* @param endpoint <code>endpoint</code> URL param
119133
* @param accept <code>accept</code> URL param
@@ -124,13 +138,17 @@ public ProxyResourceBase(@Context UriInfo uriInfo, @Context Request request, @Co
124138
* @param agentContext authenticated agent's context
125139
* @param providers registry of JAX-RS providers
126140
*/
127-
protected ProxyResourceBase(@Context UriInfo uriInfo, @Context Request request, @Context HttpHeaders httpHeaders, MediaTypes mediaTypes, @Context SecurityContext securityContext,
141+
protected ProxyResourceBase(@Context UriInfo uriInfo, @Context Request request, @Context HttpHeaders httpHeaders, MediaTypes mediaTypes,
142+
Optional<Service> service,
143+
@Context SecurityContext securityContext, @Context ContainerRequestContext crc,
128144
@QueryParam("uri") URI uri, @QueryParam("endpoint") URI endpoint, @QueryParam("accept") MediaType accept, @QueryParam("mode") URI mode,
129145
com.atomgraph.linkeddatahub.Application system, @Context HttpServletRequest httpServletRequest, DataManager dataManager, Optional<AgentContext> agentContext,
130146
@Context Providers providers)
131147
{
132148
super(uriInfo, request, httpHeaders, mediaTypes, uri, endpoint, accept, mode, system.getClient(), httpServletRequest);
133149
this.uriInfo = uriInfo;
150+
this.service = service.get();
151+
this.crc = crc;
134152
this.dataManager = dataManager;
135153
this.providers = providers;
136154
this.system = system;
@@ -186,7 +204,28 @@ public Response get(WebTarget target)
186204
throw new BadRequestException(ex);
187205
}
188206

189-
return super.get(target);
207+
Query query = QueryFactory.create("DESCRIBE <" + target.getUri() + ">");
208+
Model localModel = getService().getSPARQLClient().loadModel(query);
209+
getContainerRequestContext().setProperty(LDH.localGraph.getURI(), localModel);
210+
211+
try
212+
{
213+
Response response = super.get(target);
214+
215+
if (response.getEntity() instanceof Model model)
216+
{
217+
getContainerRequestContext().setProperty(LDH.originalGraph.getURI(), ModelFactory.createDefaultModel().add(model)); // local model without the remote model
218+
model.add(localModel); // append the local model to the remote model
219+
}
220+
221+
return response;
222+
}
223+
catch (BadGatewayException ex) // fallback to the local model in case of error
224+
{
225+
getContainerRequestContext().setProperty(LDH.originalGraph.getURI(), ModelFactory.createDefaultModel());
226+
if (!localModel.isEmpty()) return getResponse(localModel);
227+
else throw ex;
228+
}
190229
}
191230

192231
/**
@@ -242,6 +281,26 @@ public List<Locale> getLanguages()
242281
return getSystem().getSupportedLanguages();
243282
}
244283

284+
/**
285+
* Returns the SPARQL service of the current application.
286+
*
287+
* @return service resource
288+
*/
289+
public Service getService()
290+
{
291+
return service;
292+
}
293+
294+
/**
295+
* Returns request context.
296+
*
297+
* @return request context
298+
*/
299+
public ContainerRequestContext getContainerRequestContext()
300+
{
301+
return crc;
302+
}
303+
245304
/**
246305
* Returns request URI information.
247306
*

‎src/main/java/com/atomgraph/linkeddatahub/vocabulary/LDH.java

+6
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,11 @@ public static String getURI()
106106

107107
/** Create graph property */
108108
public static final DatatypeProperty createGraph = m_model.createDatatypeProperty( NS + "createGraph" );
109+
110+
/** Local graph property */
111+
public static final DatatypeProperty localGraph = m_model.createDatatypeProperty( NS + "localGraph" );
112+
113+
/** Original graph property */
114+
public static final DatatypeProperty originalGraph = m_model.createDatatypeProperty( NS + "originalGraph" );
109115

110116
}

‎src/main/java/com/atomgraph/linkeddatahub/writer/ModelXSLTWriterBase.java

+21
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import java.util.Set;
5050
import java.util.stream.Collectors;
5151
import javax.inject.Inject;
52+
import javax.ws.rs.container.ContainerRequestContext;
5253
import javax.ws.rs.core.Context;
5354
import javax.ws.rs.core.EntityTag;
5455
import javax.ws.rs.core.MediaType;
@@ -97,6 +98,7 @@ public abstract class ModelXSLTWriterBase extends com.atomgraph.client.writer.Mo
9798
@Inject javax.inject.Provider<DataManager> dataManager;
9899
@Inject javax.inject.Provider<XsltExecutableSupplier> xsltExecSupplier;
99100
@Inject javax.inject.Provider<List<Mode>> modes;
101+
@Inject javax.inject.Provider<ContainerRequestContext> crc;
100102

101103
private final MessageDigest messageDigest;
102104

@@ -184,6 +186,15 @@ public <T extends XdmValue> Map<QName, XdmValue> getParameters(MultivaluedMap<St
184186
params.put(new QName("", "", "Referer"), new XdmAtomicValue(referer)); // TO-DO: move to ac: namespace
185187
}
186188

189+
Object localModel = getContainerRequestContext().getProperty(LDH.localGraph.getURI());
190+
if (localModel instanceof Model model)
191+
params.put(new QName("ldh", LDH.localGraph.getNameSpace(), LDH.localGraph.getLocalName()),
192+
getXsltExecutable().getProcessor().newDocumentBuilder().build(getSource(model)));
193+
Object originalModel = getContainerRequestContext().getProperty(LDH.originalGraph.getURI());
194+
if (originalModel instanceof Model model)
195+
params.put(new QName("ldh", LDH.originalGraph.getNameSpace(), LDH.originalGraph.getLocalName()),
196+
getXsltExecutable().getProcessor().newDocumentBuilder().build(getSource(model)));
197+
187198
params.put(new QName("ldhc", LDHC.webIDSignUp.getNameSpace(), LDHC.webIDSignUp.getLocalName()), new XdmAtomicValue(getSystem().isWebIDSignUp()));
188199
if (getSystem().getProperty(Google.clientID.getURI()) != null)
189200
params.put(new QName("google", Google.clientID.getNameSpace(), Google.clientID.getLocalName()), new XdmAtomicValue((String)getSystem().getProperty(Google.clientID.getURI())));
@@ -364,4 +375,14 @@ public MessageDigest getMessageDigest()
364375
return messageDigest;
365376
}
366377

378+
/**
379+
* Returns request context.
380+
*
381+
* @return request context
382+
*/
383+
public ContainerRequestContext getContainerRequestContext()
384+
{
385+
return crc.get();
386+
}
387+
367388
}

‎src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/layout.xsl

+6-4
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ exclude-result-prefixes="#all">
112112
<xsl:param name="acl:agent" as="xs:anyURI?"/>
113113
<xsl:param name="acl:mode" select="$foaf:Agent[doc-available($ldh:absolutePath)]//*[acl:accessToClass/@rdf:resource = (key('resources', $ldh:absolutePath, document($ldh:absolutePath))/rdf:type/@rdf:resource, key('resources', $ldh:absolutePath, document($ldh:absolutePath))/rdf:type/@rdf:resource/ldh:listSuperClasses(.))]/acl:mode/@rdf:resource" as="xs:anyURI*"/>
114114
<xsl:param name="ldh:createGraph" select="false()" as="xs:boolean"/>
115+
<xsl:param name="ldh:localGraph" as="document-node()?"/>
116+
<xsl:param name="ldh:originalGraph" as="document-node()?"/>
115117
<xsl:param name="ldh:ajaxRendering" select="true()" as="xs:boolean"/> <!-- TO-DO: rename to ldhc:ajaxRendering? -->
116118
<xsl:param name="ldhc:webIDSignUp" as="xs:boolean"/>
117119
<xsl:param name="google:clientID" as="xs:string?"/>
@@ -803,13 +805,13 @@ exclude-result-prefixes="#all">
803805
<!-- don't show document-level tabs if the response returned an error or if we're in EditMode -->
804806
<xsl:template match="rdf:RDF[key('resources-by-type', '&http;Response')] | rdf:RDF[$ac:forClass or $ac:mode = '&ac;EditMode']" mode="bs2:ModeTabs" priority="1"/>
805807

806-
<xsl:template match="*[*][@rdf:about = ac:uri()]" mode="bs2:PropertyList">
807-
<xsl:variable name="query-string" select="'DESCRIBE &lt;' || ac:uri() || '&gt;'" as="xs:string"/>
808-
<xsl:variable name="local-doc" select="document(ac:build-uri($ac:endpoint, map{ 'query': $query-string }))"/>
808+
<xsl:template match="*[*][@rdf:about = ac:uri()][$ldh:originalGraph][$ldh:localGraph]" mode="bs2:PropertyList">
809+
<xsl:variable name="original-doc" select="$ldh:originalGraph"/>
810+
<xsl:variable name="local-doc" select="$ldh:localGraph"/>
809811

810812
<xsl:variable name="triples-original" as="map(xs:string, element())">
811813
<xsl:map>
812-
<xsl:for-each select="*">
814+
<xsl:for-each select="$original-doc/rdf:RDF/rdf:Description/*">
813815
<xsl:map-entry key="concat(../@rdf:about, '|', namespace-uri(), local-name(), '|', @rdf:resource, @rdf:nodeID, if (text() castable as xs:float) then xs:float(text()) else text(), '|', @rdf:datatype, @xml:lang)" select="."/>
814816
</xsl:for-each>
815817
</xsl:map>

0 commit comments

Comments
 (0)
Please sign in to comment.