Skip to content

Commit 1f9cf75

Browse files
namedgraphclaude
andauthored
Derive server-side acl:mode() from Link response headers (#299)
* Derive server-side acl:mode() from Link response headers via $ldh:httpHeaders Java pushes outgoing response headers to XSLT as a $ldh:httpHeaders XdmMap (map(xs:string, xs:string*)) and the server-side acl:mode() parses Link entries with rel=acl#mode out of it, replacing the pre-aggregated $acl:mode param push. Drops the now-dead $acl:mode XSLT param default (and its ldh:listSuperClasses supertype-closure helper), the empty layout.xsl declaration, and converts the lone direct $acl:mode reference in admin/layout.xsl to acl:mode(). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Removed dead code --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 0d4cea0 commit 1f9cf75

6 files changed

Lines changed: 19 additions & 74 deletions

File tree

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ public static String getURI()
9494

9595
/** Request URI property */
9696
public static final ObjectProperty requestUri = m_model.createObjectProperty(NS + "requestUri");
97+
98+
/** HTTP headers property */
99+
public static final ObjectProperty httpHeaders = m_model.createObjectProperty(NS + "httpHeaders");
97100

98101
/** Service property */
99102
public static final ObjectProperty service = m_model.createObjectProperty( NS + "service" );

src/main/java/com/atomgraph/linkeddatahub/writer/XSLTWriterBase.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import net.sf.saxon.s9api.QName;
5555
import net.sf.saxon.s9api.SaxonApiException;
5656
import net.sf.saxon.s9api.XdmAtomicValue;
57+
import net.sf.saxon.s9api.XdmMap;
5758
import net.sf.saxon.s9api.XdmValue;
5859
import net.sf.saxon.s9api.XsltExecutable;
5960
import org.apache.http.HttpHeaders;
@@ -144,9 +145,15 @@ public <T extends XdmValue> Map<QName, XdmValue> getParameters(MultivaluedMap<St
144145
params.put(new QName("foaf", FOAF.Agent.getNameSpace(), FOAF.Agent.getLocalName()),
145146
getXsltExecutable().getProcessor().newDocumentBuilder().build(source));
146147
}
147-
if (getAuthorizationContext().get().isPresent())
148-
params.put(new QName("acl", ACL.mode.getNameSpace(), ACL.mode.getLocalName()),
149-
XdmValue.makeSequence(getAuthorizationContext().get().get().getModeURIs()));
148+
XdmMap responseHeaders = new XdmMap();
149+
for (Map.Entry<String, List<Object>> entry : headerMap.entrySet())
150+
{
151+
List<XdmAtomicValue> values = entry.getValue().stream().
152+
map(v -> new XdmAtomicValue(v.toString())).
153+
collect(Collectors.toList());
154+
responseHeaders = responseHeaders.put(new XdmAtomicValue(entry.getKey()), XdmValue.makeSequence(values));
155+
}
156+
params.put(new QName("ldh", LDH.httpHeaders.getNameSpace(), LDH.httpHeaders.getLocalName()), responseHeaders);
150157

151158
if (getHttpHeaders().getRequestHeader(HttpHeaders.REFERER) != null)
152159
{

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ exclude-result-prefixes="#all">
7171

7272
<!-- ADD DATA -->
7373

74-
<xsl:template match="rdf:RDF[$acl:mode = '&acl;Append']" mode="bs2:AddData" priority="1">
74+
<xsl:template match="rdf:RDF[acl:mode() = '&acl;Append']" mode="bs2:AddData" priority="1">
7575
<div class="btn-group pull-left">
7676
<button type="button" class="btn btn-primary dropdown-toggle" title="{ac:label(key('resources', 'add', document('../translations.rdf')))}">
7777
<xsl:value-of>

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ extension-element-prefixes="ixsl"
6868

6969
<xsl:param name="main-doc" select="/" as="document-node()"/>
7070
<xsl:param name="acl:Agent" as="document-node()?"/>
71-
<xsl:param name="acl:mode" select="$foaf:Agent//*[acl:accessToClass/@rdf:resource = (key('resources', ac:absolute-path(ldh:base-uri(.)), $main-doc)/rdf:type/@rdf:resource, key('resources', ac:absolute-path(ldh:base-uri(.)), $main-doc)/rdf:type/@rdf:resource/ldh:listSuperClasses(.))]/acl:mode/@rdf:resource" as="xs:anyURI*"/>
72-
71+
7372
<!-- schema.org BREADCRUMBS -->
7473

7574
<xsl:template match="rdf:RDF" mode="schema:BreadCrumbList">

src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/imports/default.xsl

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ exclude-result-prefixes="#all"
116116
</xsl:template>
117117

118118
<xsl:function name="acl:mode" as="xs:anyURI*" use-when="system-property('xsl:product-name') = 'SAXON'">
119-
<xsl:sequence select="$acl:mode"/>
119+
<xsl:variable name="entries" select="for $line in $ldh:httpHeaders('Link') return tokenize($line, ',\s*(?=&lt;)')" as="xs:string*"/>
120+
<xsl:sequence select="for $entry in $entries return if (matches($entry, '^&lt;[^&gt;]+&gt;\s*;.*\brel\s*=\s*&quot;?[^&quot;\s,;]*acl#mode&quot;?')) then xs:anyURI(replace($entry, '^&lt;([^&gt;]+)&gt;.*$', '$1')) else ()"/>
120121
</xsl:function>
121122

122123
<xsl:function name="ac:uri" as="xs:anyURI?">
@@ -290,57 +291,6 @@ exclude-result-prefixes="#all"
290291
<xsl:apply-templates select="@* | node()" mode="#current"/>
291292
</xsl:copy>
292293
</xsl:template>
293-
294-
<xsl:function name="ldh:listSuperClasses" as="attribute()*" cache="yes">
295-
<xsl:param name="class" as="xs:anyURI"/>
296-
297-
<xsl:sequence select="ldh:listSuperClasses($class, false())"/>
298-
</xsl:function>
299-
300-
<xsl:function name="ldh:listSuperClasses" as="attribute()*" cache="yes">
301-
<xsl:param name="class" as="xs:anyURI"/>
302-
<xsl:param name="direct" as="xs:boolean"/>
303-
304-
<xsl:if test="doc-available(ac:document-uri($class))">
305-
<xsl:variable name="document" select="document(ac:document-uri($class))" as="document-node()"/>
306-
307-
<xsl:for-each select="$document">
308-
<xsl:variable name="superclasses" select="key('resources', $class)/rdfs:subClassOf/@rdf:resource[not(. = $class)]" as="attribute()*"/>
309-
<xsl:sequence select="$superclasses"/>
310-
311-
<xsl:if test="not($direct)">
312-
<xsl:for-each select="$superclasses">
313-
<xsl:sequence select="ldh:listSuperClasses(., $direct)"/>
314-
</xsl:for-each>
315-
</xsl:if>
316-
</xsl:for-each>
317-
</xsl:if>
318-
</xsl:function>
319-
320-
<xsl:function name="ldh:ontologyImports" as="attribute()*" cache="yes">
321-
<xsl:param name="ontology" as="xs:anyURI"/>
322-
323-
<xsl:sequence select="ldh:ontologyImports($ontology, false())"/>
324-
</xsl:function>
325-
326-
<xsl:function name="ldh:ontologyImports" as="attribute()*" cache="yes">
327-
<xsl:param name="ontology" as="xs:anyURI"/>
328-
<xsl:param name="direct" as="xs:boolean"/>
329-
330-
<xsl:if test="doc-available(ac:document-uri($ontology))">
331-
<xsl:variable name="document" select="document(ac:document-uri($ontology))" as="document-node()"/>
332-
<xsl:for-each select="$document">
333-
<xsl:variable name="imports" select="key('resources', $ontology)/owl:imports/@rdf:resource[not(. = $ontology)]" as="attribute()*"/>
334-
<xsl:sequence select="$imports"/>
335-
336-
<xsl:if test="not($direct)">
337-
<xsl:for-each select="$imports">
338-
<xsl:sequence select="ldh:ontologyImports(., $direct)"/>
339-
</xsl:for-each>
340-
</xsl:if>
341-
</xsl:for-each>
342-
</xsl:if>
343-
</xsl:function>
344294

345295
<xsl:function name="ac:value-intersect" as="xs:anyAtomicType*">
346296
<xsl:param name="arg1" as="xs:anyAtomicType*"/>

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

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ exclude-result-prefixes="#all">
105105
<xsl:param name="acl:agent" as="xs:anyURI?"/>
106106
<xsl:param name="lapp:Context" as="document-node()"/>
107107
<xsl:param name="foaf:Agent" select="if ($acl:agent) then document(ac:document-uri($acl:agent)) else ()" as="document-node()?"/>
108-
<xsl:param name="ac:httpHeaders" as="xs:string"/>
108+
<xsl:param name="ac:httpHeaders" as="xs:string"/>
109109
<xsl:param name="ac:method" as="xs:string"/>
110-
<xsl:param name="acl:mode" as="xs:anyURI*"/>
110+
<xsl:param name="ldh:httpHeaders" select="map{}" as="map(xs:string, xs:string*)"/>
111111
<xsl:param name="ldh:ajaxRendering" select="true()" as="xs:boolean"/>
112112
<xsl:param name="ldhc:enableWebIDSignUp" as="xs:boolean"/>
113113
<xsl:param name="ldh:renderSystemResources" select="false()" as="xs:boolean"/>
@@ -409,20 +409,6 @@ exclude-result-prefixes="#all">
409409
<xsl:text>,&#xa;</xsl:text>
410410
</xsl:if>
411411
</xsl:for-each>
412-
<!--<xsl:variable name="ontology-imports" select="for $value in distinct-values(ldh:ontologyImports($ldt:ontology)) return xs:anyURI($value)" as="xs:anyURI*"/>
413-
<xsl:if test="exists($ontology-imports)">
414-
<xsl:text>,</xsl:text>
415-
<xsl:for-each select="$ontology-imports">
416-
<xsl:text>{ name: "</xsl:text>
417-
<xsl:value-of select="ac:document-uri(.)"/>
418-
<xsl:text>", altName: baseUri + "?uri=" + encodeURIComponent("</xsl:text>
419-
<xsl:value-of select="ac:document-uri(.)"/>
420-
<xsl:text>") + "&amp;accept=" + encodeURIComponent("application/rdf+xml") }</xsl:text>
421-
<xsl:if test="position() != last()">
422-
<xsl:text>,&#xa;</xsl:text>
423-
</xsl:if>
424-
</xsl:for-each>
425-
</xsl:if> -->
426412
<xsl:text disable-output-escaping="yes">
427413
<![CDATA[
428414
];

0 commit comments

Comments
 (0)