diff --git a/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/html/Main.java b/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/html/Main.java index e90ef368092907e86e1b5f5f8c3abfe8568a0a09..0257e6783da17cb285d7663e521ec57f99572b10 100644 --- a/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/html/Main.java +++ b/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/html/Main.java @@ -18,6 +18,7 @@ public class Main { get("/queries", Routes.queries, new FreeMarkerEngine()); get("/explore", Routes.explore, new FreeMarkerEngine()); get("/explore/contributor/:contributor", Routes.exploreContributor, new FreeMarkerEngine()); + get("/explore/node/:base64uri", Routes.exploreNode, new FreeMarkerEngine()); internalServerError(Errors.internalServerError); notFound(Errors.notFound); diff --git a/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/html/Routes.java b/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/html/Routes.java index 1ff7c5ad00d645f9fc59e7480921a12bc82ad8a8..a4fa55fe53094b4aed9ccee33eee75e5cb0eb4ae 100644 --- a/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/html/Routes.java +++ b/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/html/Routes.java @@ -76,6 +76,21 @@ public class Routes { return new ModelAndView(withGlobals(model), "explore_contributor.flt"); }; + public static final TemplateViewRoute exploreNode = (Request request, Response response) -> { + final Query query = Query.getSingleton(); + + final String base64uri = request.params("base64uri"); + final String uri = Base64.decode(base64uri); + + final List<IRI> uses = query.getUses(uri); + + final Map<String, Object> model = new HashMap<>(); + model.put("uri", uri); + model.put("uses", uses); + + return new ModelAndView(withGlobals(model), "explore_node.flt"); + }; + /** * Add some global values we always need to argument {@code model}. * diff --git a/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/query/IRIs.java b/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/query/IRIs.java new file mode 100644 index 0000000000000000000000000000000000000000..8d7f6a69606e23c0cdde060d74fd020771434a9a --- /dev/null +++ b/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/query/IRIs.java @@ -0,0 +1,24 @@ +package info.mathhub.uloapi.query; + +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; + +public class IRIs { + private IRIs() {} + + /** + * Create an {@link IRI} from argument {@code value}. + * + * @param value The argument to turn into an {@link IRI}. + * @return An {@link IRI} that contains argument {@code value}. + */ + public static IRI fromString(String value) { + if (value == null) { + throw new NullPointerException("argument value must not be null"); + } + + final ValueFactory valueFactory = SimpleValueFactory.getInstance(); + return valueFactory.createIRI(value); + } +} diff --git a/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/query/Query.java b/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/query/Query.java index 127246c480aa0c9ffad0a8bdea621a343a7bafa2..3b694472af0f8422ae274664e6c569088d3545d9 100644 --- a/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/query/Query.java +++ b/src/ulo-storage-applications/src/main/java/info/mathhub/uloapi/query/Query.java @@ -167,4 +167,34 @@ public class Query { return GraphDB.execute(this.serverUrl, this.repository, operation); } + + /** + * Return a list of works used by another given node. + * + * @param nodeuri The URI of the node. + */ + public List<IRI> getUses(String nodeuri) { + final GraphDB.Operation<List<IRI>> operation = (manager, repository, connection) -> { + final Set<IRI> uses = new HashSet<>(); + final IRI subject = IRIs.fromString(nodeuri); + + final RepositoryResult<Statement> result = connection.getStatements(subject, ULO.uses, null); + + for (final Statement statement : result) { + final Value object = statement.getObject(); + + if (!(object instanceof IRI)) { + log.warn("found object that is not an IRI"); + continue; + } + + final IRI asIri = (IRI) object; + uses.add(asIri); + } + + return new ArrayList<>(uses); + }; + + return GraphDB.execute(this.serverUrl, this.repository, operation); + } } diff --git a/src/ulo-storage-applications/src/main/resources/spark/template/freemarker/explore_node.flt b/src/ulo-storage-applications/src/main/resources/spark/template/freemarker/explore_node.flt new file mode 100644 index 0000000000000000000000000000000000000000..61beef28689ea2d95e72a8c34cc19a497c051e48 --- /dev/null +++ b/src/ulo-storage-applications/src/main/resources/spark/template/freemarker/explore_node.flt @@ -0,0 +1,33 @@ +<#ftl output_format="HTML" auto_esc=false> +<#setting url_escaping_charset='UTF-8'> + +<#include "base.flt"> + +<#macro page_title> + Explore Node +</#macro> + +<#macro page_main> + + <h2>Explore Node</h2> + + <h3>URI</h3> + + <ul> + <li> + <code>${uri}</code> + </li> + </ul> + + <h3>Node uses...</h3> + + <ul> + <#list uses as use> + <li> + <code>${use}</code> + </li> + </#list> + </ul> +</#macro> + +<@display_page/>