From 888d35de39a07f39a3e4df57f5dc725d43fb1ec7 Mon Sep 17 00:00:00 2001 From: Ken Wenzel Date: Tue, 5 Nov 2024 16:04:06 +0100 Subject: [PATCH] Allow to directly fetch specific shells. --- .../linkedfactory/core/rdf4j/aas/AAS.java | 1 + .../linkedfactory/core/rdf4j/aas/AasClient.java | 5 +++++ .../rdf4j/aas/query/AasEvaluationStrategy.java | 17 ++++++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/AAS.java b/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/AAS.java index 612862d9..7234d6bc 100644 --- a/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/AAS.java +++ b/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/AAS.java @@ -22,6 +22,7 @@ public interface AAS { IRI API_SHELLS = SimpleValueFactory.getInstance().createIRI("aas-api:shells"); IRI API_SUBMODELS = SimpleValueFactory.getInstance().createIRI("aas-api:submodels"); + String ASSETADMINISTRATIONSHELL_PREFIX = "urn:aas:AssetAdministrationShell:"; String SUBMODEL_PREFIX = "urn:aas:Submodel:"; static Value toRdfValue(Object value, ValueFactory vf) { diff --git a/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/AasClient.java b/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/AasClient.java index 44d5ac2b..3e124e3b 100644 --- a/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/AasClient.java +++ b/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/AasClient.java @@ -50,6 +50,11 @@ public IExtendedIterator shells() throws URISyntaxException, IOException return query(endpoint, "shells", null, null); } + public IExtendedIterator shell(String id, boolean encodeBase64) throws URISyntaxException, IOException { + return query(endpoint, "shells/" + (encodeBase64 ? + Base64.getEncoder().encodeToString(id.getBytes(StandardCharsets.UTF_8)) : id), null, null); + } + public IExtendedIterator submodels() throws URISyntaxException, IOException { return query(endpoint, "submodels", null, null); } diff --git a/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/query/AasEvaluationStrategy.java b/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/query/AasEvaluationStrategy.java index 0bcdd484..fcfb5c37 100644 --- a/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/query/AasEvaluationStrategy.java +++ b/bundles/io.github.linkedfactory.core/src/main/java/io/github/linkedfactory/core/rdf4j/aas/query/AasEvaluationStrategy.java @@ -5,7 +5,6 @@ import io.github.linkedfactory.core.rdf4j.aas.AasClient; import io.github.linkedfactory.core.rdf4j.common.HasValue; import io.github.linkedfactory.core.rdf4j.common.query.CompositeBindingSet; -import io.github.linkedfactory.core.rdf4j.common.query.InnerJoinIterator; import io.github.linkedfactory.core.rdf4j.common.query.InnerJoinIteratorEvaluationStep; import io.github.linkedfactory.core.rdf4j.kvin.query.KvinFetch; import net.enilink.commons.iterator.IExtendedIterator; @@ -187,6 +186,22 @@ public void remove() throws QueryEvaluationException { return new SingletonIteration<>(bs); } + // retrieve shell if IRI starts with urn:aas:AssetAdministrationShell: + if (subjectValue.isIRI() && subjectValue.stringValue().startsWith(AAS.ASSETADMINISTRATIONSHELL_PREFIX)) { + String shellId = subjectValue.stringValue().substring(AAS.ASSETADMINISTRATIONSHELL_PREFIX.length()); + try (IExtendedIterator it = client.shell(shellId, false)) { + Record shell = it.next(); + QueryBindingSet newBs = new QueryBindingSet(bs); + newBs.removeBinding(subjectVar.getName()); + newBs.addBinding(subjectVar.getName(), toRdfValue(shell)); + return evaluate(stmt, newBs); + } catch (URISyntaxException e) { + throw new QueryEvaluationException(e); + } catch (IOException e) { + throw new QueryEvaluationException(e); + } + } + // retrieve submodel if IRI starts with urn:aas:Submodel: if (subjectValue.isIRI() && subjectValue.stringValue().startsWith(AAS.SUBMODEL_PREFIX)) { String submodelId = subjectValue.stringValue().substring(AAS.SUBMODEL_PREFIX.length());