diff --git a/pom.xml b/pom.xml index feec11a..3c7c338 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ eu.nampi backend - 0.5.0 + 0.5.1 nampi-backend The NAMPI backend diff --git a/src/main/java/eu/nampi/backend/configuration/ConfigProperties.java b/src/main/java/eu/nampi/backend/configuration/ConfigProperties.java index f5a79f5..f536ddd 100644 --- a/src/main/java/eu/nampi/backend/configuration/ConfigProperties.java +++ b/src/main/java/eu/nampi/backend/configuration/ConfigProperties.java @@ -20,6 +20,8 @@ public class ConfigProperties { int defaultLimit; + String crmPrefix; + String keycloakRdfIdAttribute; List otherOwlUrls; diff --git a/src/main/java/eu/nampi/backend/queryBuilder/AbstractHydraQueryBuilder.java b/src/main/java/eu/nampi/backend/queryBuilder/AbstractHydraQueryBuilder.java index 7be4699..11e4284 100644 --- a/src/main/java/eu/nampi/backend/queryBuilder/AbstractHydraQueryBuilder.java +++ b/src/main/java/eu/nampi/backend/queryBuilder/AbstractHydraQueryBuilder.java @@ -30,13 +30,14 @@ public abstract class AbstractHydraQueryBuilder extends AbstractHydraBuilder { public WhereBuilder coreData = new WhereBuilder(); protected AbstractHydraQueryBuilder(JenaService jenaService, Serializer serializer, - String baseUri, Resource mainType) { + String baseUri, Resource mainType, String crmPrefix) { super(jenaService, baseUri); this.mainType = mainType; this.ef = coreData.getExprFactory(); this.serializer = serializer; coreData.addWhere(VAR_MAIN, RDF.type, mainType); model + .setNsPrefix("crm", crmPrefix) .setNsPrefix("api", Api.getURI()) .setNsPrefix("core", Core.getURI()) .setNsPrefix("hydra", Hydra.getURI()) diff --git a/src/main/java/eu/nampi/backend/queryBuilder/HydraBuilderFactory.java b/src/main/java/eu/nampi/backend/queryBuilder/HydraBuilderFactory.java index 9177ebc..ebab925 100644 --- a/src/main/java/eu/nampi/backend/queryBuilder/HydraBuilderFactory.java +++ b/src/main/java/eu/nampi/backend/queryBuilder/HydraBuilderFactory.java @@ -8,6 +8,7 @@ import org.apache.jena.rdf.model.Resource; import org.apache.jena.riot.Lang; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import eu.nampi.backend.model.QueryParameters; import eu.nampi.backend.repository.HierarchyRepository; @@ -34,6 +35,10 @@ public class HydraBuilderFactory { @Autowired TypeRepository typeRepository; + @Value("${nampi.crm-prefix}") + private String crmPrefix; + + /** * Hydra Collection Builders */ @@ -42,7 +47,7 @@ public HydraCollectionBuilder collectionBuilder(String endpointName, Resource ma Resource orderByVar, QueryParameters params, boolean includeTextFilter, boolean includeTypeAndText) { return new HydraCollectionBuilder(jenaService, serializer, urlBuilder.endpointUri(endpointName), - mainType, orderByVar, params, includeTextFilter, includeTypeAndText); + mainType, orderByVar, params, includeTextFilter, includeTypeAndText, crmPrefix); } public HydraCollectionBuilder collectionBuilder(String endpointName, Resource mainType, @@ -62,7 +67,7 @@ public HydraCollectionBuilder collectionBuilder(String endpointName, Resource ma public HydraSingleBuilder singleBuilder(String endpointName, UUID id, Resource mainType, boolean filterBasic) { return new HydraSingleBuilder(jenaService, serializer, urlBuilder.endpointUri(endpointName, id), - mainType, filterBasic); + mainType, filterBasic, crmPrefix); } public HydraSingleBuilder singleBuilder(String endpointName, UUID id, Resource mainType) { @@ -72,11 +77,11 @@ public HydraSingleBuilder singleBuilder(String endpointName, UUID id, Resource m public HydraSingleBuilder singleBuilder(String endpointName, Resource mainType, boolean filterBasic) { return new HydraSingleBuilder(jenaService, serializer, urlBuilder.endpointUri(endpointName), - mainType, filterBasic); + mainType, filterBasic, crmPrefix); } public HydraSingleBuilder singleBuilder(Resource mainType, String iri, boolean filterBasic) { - return new HydraSingleBuilder(jenaService, serializer, iri, mainType, filterBasic); + return new HydraSingleBuilder(jenaService, serializer, iri, mainType, filterBasic, crmPrefix); } /** diff --git a/src/main/java/eu/nampi/backend/queryBuilder/HydraCollectionBuilder.java b/src/main/java/eu/nampi/backend/queryBuilder/HydraCollectionBuilder.java index 08dff09..cf6832c 100644 --- a/src/main/java/eu/nampi/backend/queryBuilder/HydraCollectionBuilder.java +++ b/src/main/java/eu/nampi/backend/queryBuilder/HydraCollectionBuilder.java @@ -28,10 +28,9 @@ public class HydraCollectionBuilder extends AbstractHydraQueryBuilder { public WhereBuilder extendedData = new WhereBuilder(); public HydraCollectionBuilder(JenaService jenaService, Serializer serializer, String baseUri, - Resource mainType, - Resource orderByVar, QueryParameters params, boolean includeTextFilter, - boolean includeTypeAndText) { - super(jenaService, serializer, baseUri, mainType); + Resource mainType, Resource orderByVar, QueryParameters params, boolean includeTextFilter, + boolean includeTypeAndText, String crmPrefix) { + super(jenaService, serializer, baseUri, mainType, crmPrefix); this.mapper = new ParameterMapper(baseUri, root, model); this.orderByVar = orderByVar; this.params = params; diff --git a/src/main/java/eu/nampi/backend/queryBuilder/HydraSingleBuilder.java b/src/main/java/eu/nampi/backend/queryBuilder/HydraSingleBuilder.java index a9c9b72..b15026b 100644 --- a/src/main/java/eu/nampi/backend/queryBuilder/HydraSingleBuilder.java +++ b/src/main/java/eu/nampi/backend/queryBuilder/HydraSingleBuilder.java @@ -15,9 +15,8 @@ public class HydraSingleBuilder extends AbstractHydraQueryBuilder { public HydraSingleBuilder(JenaService jenaService, Serializer serializer, String baseUri, - Resource mainType, - boolean filterBasic) { - super(jenaService, serializer, baseUri, mainType); + Resource mainType, boolean filterBasic, String crmPrefix) { + super(jenaService, serializer, baseUri, mainType, crmPrefix); coreData .addFilter(ef.sameTerm(VAR_MAIN, root)) .addWhere(VAR_MAIN, RDF.type, VAR_TYPE); diff --git a/src/main/java/eu/nampi/backend/repository/HierarchyRepository.java b/src/main/java/eu/nampi/backend/repository/HierarchyRepository.java index 1ce32d8..7c2d042 100644 --- a/src/main/java/eu/nampi/backend/repository/HierarchyRepository.java +++ b/src/main/java/eu/nampi/backend/repository/HierarchyRepository.java @@ -21,6 +21,7 @@ import org.apache.jena.vocabulary.RDF; import org.apache.jena.vocabulary.RDFS; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Repository; @@ -43,6 +44,9 @@ public class HierarchyRepository { @Autowired UrlBuilder urlBuilder; + @Value("${nampi.crm-prefix}") + String crmPrefix; + private static final Node VAR_CHILD = NodeFactory.createVariable("child"); private static final Node VAR_CHILD_LABEL = NodeFactory.createVariable("childLabel"); private static final Node VAR_CHILD_COMMENT = NodeFactory.createVariable("childComment"); @@ -76,37 +80,45 @@ private String findAncestors(Lang lang, String iri) { Expr childNotRdf = ef.not(ef.strstarts(ef.str(VAR_CHILD), RDF.getURI())); Expr childNotRdfs = ef.not(ef.strstarts(ef.str(VAR_CHILD), RDFS.getURI())); Expr childNotOwl = ef.not(ef.strstarts(ef.str(VAR_CHILD), OWL.getURI())); + Expr childNotCrm = ef.not(ef.strstarts(ef.str(VAR_CHILD), crmPrefix)); Expr parentNotRdf = ef.not(ef.strstarts(ef.str(VAR_PARENT), RDF.getURI())); Expr parentNotRdfs = ef.not(ef.strstarts(ef.str(VAR_PARENT), RDFS.getURI())); Expr parentNotOwl = ef.not(ef.strstarts(ef.str(VAR_PARENT), OWL.getURI())); + Expr parentNotCrm = ef.not(ef.strstarts(ef.str(VAR_PARENT), crmPrefix)); builder.coreData .addOptional(new WhereBuilder() .addWhere(VAR_MAIN, RDFS.subClassOf, VAR_CHILD) .addFilter(childNotRdf) .addFilter(childNotRdfs) .addFilter(childNotOwl) + .addFilter(childNotCrm) .addWhere(VAR_CHILD, RDFS.subClassOf, VAR_PARENT) .addFilter(parentNotRdf) .addFilter(parentNotRdfs) - .addFilter(parentNotOwl)) + .addFilter(parentNotOwl) + .addFilter(parentNotCrm)) .addOptional(new WhereBuilder() .addWhere(VAR_MAIN, RDFS.subPropertyOf, VAR_CHILD) .addFilter(childNotRdf) .addFilter(childNotRdfs) .addFilter(childNotOwl) + .addFilter(childNotCrm) .addWhere(VAR_CHILD, RDFS.subPropertyOf, VAR_PARENT) .addFilter(parentNotRdf) .addFilter(parentNotRdfs) - .addFilter(parentNotOwl)) + .addFilter(parentNotOwl) + .addFilter(parentNotCrm)) .addOptional(new WhereBuilder() .addWhere(VAR_MAIN, RDF.type, VAR_CHILD) .addFilter(childNotRdf) .addFilter(childNotRdfs) .addFilter(childNotOwl) + .addFilter(childNotCrm) .addWhere(VAR_CHILD, RDFS.subClassOf, VAR_PARENT) .addFilter(parentNotRdf) .addFilter(parentNotRdfs) - .addFilter(parentNotOwl)) + .addFilter(parentNotOwl) + .addFilter(parentNotCrm)) .addOptional(VAR_CHILD, RDFS.label, VAR_CHILD_LABEL) .addOptional(VAR_CHILD, RDFS.comment, VAR_CHILD_COMMENT) .addOptional(VAR_PARENT, RDFS.label, VAR_PARENT_LABEL) diff --git a/src/main/java/eu/nampi/backend/repository/TypeRepository.java b/src/main/java/eu/nampi/backend/repository/TypeRepository.java index 61a2790..c2b0ae7 100644 --- a/src/main/java/eu/nampi/backend/repository/TypeRepository.java +++ b/src/main/java/eu/nampi/backend/repository/TypeRepository.java @@ -16,6 +16,7 @@ import org.apache.jena.vocabulary.RDF; import org.apache.jena.vocabulary.RDFS; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Repository; @@ -40,6 +41,9 @@ public class TypeRepository { @Autowired JenaService jenaService; + @Value("${nampi.crm-prefix}") + String crmPrefix; + private static final String ENDPOINT_NAME = "types"; Pattern totalItemsRegex = Pattern.compile("\"totalItems\":\"(\\d*)\""); @@ -64,7 +68,10 @@ public String findAll(QueryParameters params, Lang lang) { // Try to get results as class HydraCollectionBuilder classesBuilder = hydraBuilderFactory.collectionBuilder(ENDPOINT_NAME, RDFS.Resource, Api.typeOrderByVar, params, false, false); - classesBuilder.coreData.addWhere(VAR_MAIN, RDFS.subClassOf, params.getType().orElseThrow()); + var ef = classesBuilder.ef; + classesBuilder.coreData + .addWhere(VAR_MAIN, RDFS.subClassOf, params.getType().orElseThrow()) + .addFilter(ef.not(ef.strstarts(ef.str(VAR_MAIN), crmPrefix))); classesBuilder.build(ROW_MAPPER); StmtIterator iterator = classesBuilder.model.listStatements(classesBuilder.root, Hydra.totalItems, (RDFNode) null); diff --git a/src/main/java/eu/nampi/backend/service/FusekiService.java b/src/main/java/eu/nampi/backend/service/FusekiService.java index b2e6b58..7d36609 100644 --- a/src/main/java/eu/nampi/backend/service/FusekiService.java +++ b/src/main/java/eu/nampi/backend/service/FusekiService.java @@ -50,6 +50,9 @@ public class FusekiService implements JenaService { @Value("${nampi.other-owl-urls}") private List otherOwlUrls; + @Value("${nampi.crm-prefix}") + private String crmPrefix; + public FusekiService(RDFConnectionRemoteBuilder dataBuilder, RDFConnectionRemoteBuilder infCacheBuilder) { this.dataBuilder = dataBuilder; @@ -109,10 +112,16 @@ public void initInfCache() { @Override public void select(SelectBuilder selectBuilder, Consumer rowAction) { try (RDFConnectionFuseki conn = (RDFConnectionFuseki) infCacheBuilder.build()) { - String query = selectBuilder.addPrefix("api", Api.getURI()).addPrefix("core", Core.getURI()) - .addPrefix("hydra", Hydra.getURI()).addPrefix("rdf", RDF.getURI()) - .addPrefix("rdfs", RDFS.getURI()) - .addPrefix("schema", SchemaOrg.getURI()).addPrefix("xsd", XSD.getURI()).buildString(); + String query = selectBuilder + .addPrefix("api", Api.getURI()) + .addPrefix("core", Core.getURI()) + .addPrefix("hydra", Hydra.getURI()) + .addPrefix("rdf", RDF.getURI()) + .addPrefix("rdfs", RDFS.getURI()) + .addPrefix("schema", SchemaOrg.getURI()) + .addPrefix("xsd", XSD.getURI()) + .addPrefix("crm", crmPrefix) + .buildString(); log.debug(query); conn.querySelect(query, rowAction); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2e8122b..4cc6d04 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -22,6 +22,7 @@ nampi: default-limit: ${DEFAULT_LIMIT:20} keycloak-rdf-id-attribute: ${KEYCLOAK-RDF-ID-ATTRIBUTE:rdf-id} other-owl-urls: ${OTHER_OWL_URLS:} + crm-prefix: http://erlangen-crm.org/211015/ server: port: ${APPLICATION_PORT:8080}