Commit 62f47cba authored by acoburn's avatar acoburn
Browse files

Merge branch 'entailment' into 'master'

Entailment service and endpoint

See merge request !94
parents 75e4e499 dc1aa320
......@@ -13,6 +13,7 @@ These modules extend the behavior of Fedora resources. Specifically, they connec
by making available a REST-based HTTP interface. The intention is that these extensions will be compatible with the
[Fedora API Extension](https://wiki.duraspace.org/display/FF/Design+-+API+Extension+Architecture) architecture.
* [`acrepo-exts-entailment`](acrepo-exts-entailment): This service will return RDFS entailment information associated with a Fedora Resource
* [`acrepo-exts-fits`](acrepo-exts-fits): This service will return FITS information associated with a Fedora Binary, in XML format
* [`acrepo-exts-image`](acrepo-exts-image): An image manipulation service
* [`acrepo-exts-ldpath`](acrepo-exts-ldpath): This module extends `fcrepo-ldpath` to support additional Linked Data endpoints (e.g. Getty)
......@@ -26,6 +27,7 @@ Services
These modules provide particular services, independent of Fedora Resources.
* [`acrepo-services-entailment`](acrepo-services-entailment): An OSGi-based service for getting RDFS entailment information about resource
* [`acrepo-services-inference`](acrepo-services-inference): An OSGi-based structural typing service using owl inference
* [`acrepo-services-mint`](acrepo-services-mint): This mints random (public) URIs for use with Fedora resources
* [`acrepo-services-ore`](acrepo-services-ore): This makes it easy to work with ORE aggregations
......@@ -78,6 +80,7 @@ command from its shell:
feature:install acrepo-connector-idiomatic-pgsql
feature:install acrepo-connector-triplestore
feature:install acrepo-exts-entailment
feature:install acrepo-exts-fits
feature:install acrepo-exts-image
feature:install acrepo-exts-ldpath
......@@ -86,6 +89,7 @@ command from its shell:
feature:install acrepo-exts-serialize-xml
feature:install acrepo-exts-template
feature:install acrepo-services-entailment
feature:install acrepo-services-inference
feature:install acrepo-services-mint
feature:install acrepo-services-ore
......
Repository RDFS entailment extension
================================
This extension operates on LDP resources, performing
RDFS entailment for the specified ontologies and returns
the entailed triples for the resource.
For example:
curl http://localhost:9109/entailment?context=http://localhost:8080/fcrepo/rest/a/b/c
Building
--------
To build this project use
gradle install
Deploying in OSGi
-----------------
This projects can be deployed in an OSGi container. For example using
[Apache Karaf](http://karaf.apache.org) version 4.x or better, you can run the following
command from its shell:
feature:repo-add mvn:edu.amherst.acdc/acrepo-karaf/LATEST/xml/features
feature:install acrepo-exts-entailment
feature:install acrepo-services-entailment
Configuration
-------------
The application can be configured by creating the following configuration
file `$KARAF_HOME/etc/edu.amherst.acdc.exts.entailment.cfg`. The following values
are available for configuration:
The base url of the fedora repository
fcrepo.baseUrl=localhost:8080/fcrepo/rest
If the fedora repository requires authentication, the following values can be set
fcrepo.authUsername=<username>
fcrepo.authPassword=<password>
The port on which the service is made available
rest.port=9109
The hostname for the service
rest.host=localhost
The REST prefix
rest.prefix=/entailment
By editing this file, any currently running routes will be immediately redeployed
with the new values.
For more help see the [Apache Camel](http://camel.apache.org) documentation
apply plugin: 'osgi'
description = 'Entailed Triple Builder'
dependencies {
compile group: 'org.apache.camel', name: 'camel-core', version: camelVersion
compile group: 'org.apache.camel', name: 'camel-blueprint', version: camelVersion
compile group: 'org.apache.camel', name: 'camel-jetty9', version: camelVersion
compile(group: 'org.fcrepo.camel', name: 'fcrepo-camel', version: fcrepoCamelVersion) {
exclude(module: 'slf4j-log4j12')
}
compile group: 'org.apache.jena', name: 'jena-osgi', version: jenaVersion
compile project(':acrepo-services-entailment')
}
jar {
manifest {
description project.description
docURL project.docURL
vendor project.vendor
license project.license
instruction 'Import-Package', "org.apache.camel,org.fcrepo.camel,edu.amherst.acdc.services.entailment,${defaultOsgiImports}"
instruction 'Export-Package', "edu.amherst.acdc.exts.entailment;version=${projectOsgiVersion}"
}
}
artifacts {
archives (file('build/cfg/main/edu.amherst.acdc.exts.entailment.cfg')) {
classifier 'configuration'
type 'cfg'
}
}
# HTTP Port
rest.host=localhost
rest.port=9109
rest.prefix=/entailment
# Repository Base URL (it MUST start with http:// or https://)
fcrepo.baseUrl=http://localhost:8080/fcrepo/rest
fcrepo.authUsername=
fcrepo.authPassword=
# API-X configuration
extension.load=false
extension.load.uri=http://apix/services//apix:load
extension.load.maximumRedeliveries=60
/*
* Copyright 2016 Amherst College
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.amherst.acdc.exts.entailment;
import static java.util.Optional.ofNullable;
import static org.apache.camel.Exchange.CONTENT_TYPE;
import static org.apache.camel.Exchange.HTTP_METHOD;
import static org.apache.camel.Exchange.HTTP_RESPONSE_CODE;
import static org.fcrepo.camel.FcrepoHeaders.FCREPO_BASE_URL;
import static org.fcrepo.camel.FcrepoHeaders.FCREPO_URI;
import java.util.Optional;
import org.apache.camel.builder.RouteBuilder;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFLanguages;
/**
* A content router for handling ORE extension requests
*
* @author Bethany Seeger
*/
public class EntailmentRouter extends RouteBuilder {
private final static String DEFAULT_CONTENT_TYPE = "text/turtle";
private final static String HTTP_QUERY_CONTEXT = "context";
private final static String ENTAILMENT_ACCEPT = "CamelEntailmentAccept";
/**
* Configure the message route workflow.
*/
public void configure() throws Exception {
from("jetty:http://{{rest.host}}:{{rest.port}}{{rest.prefix}}?" +
"sendServerVersion=false&httpMethodRestrict=GET,OPTIONS")
.routeId("EntailmentRouter")
.removeHeader("User-Agent")
.process(e -> e.getIn().setHeader(FCREPO_URI,
e.getIn().getHeader(HTTP_QUERY_CONTEXT,
e.getIn().getHeader("Apix-Ldp-Resource"))))
.setHeader(FCREPO_BASE_URL).simple("{{fcrepo.baseUrl}}")
.choice()
.when(header(HTTP_METHOD).isEqualTo("OPTIONS"))
.setHeader(CONTENT_TYPE).constant("text/turtle")
.setHeader("Allow").constant("GET,OPTIONS")
.to("language:simple:resource:classpath:options.ttl")
.when(header(HTTP_QUERY_CONTEXT).startsWith(header(FCREPO_BASE_URL)))
.process(exchange -> {
final String contentType = exchange.getIn().getHeader("Accept", String.class);
final Optional<String> rdfLang = ofNullable(contentType).map(RDFLanguages::contentTypeToLang)
.map(Lang::getName);
exchange.getIn().setHeader(ENTAILMENT_ACCEPT, rdfLang.isPresent() ? contentType : DEFAULT_CONTENT_TYPE);
})
.to("direct:get");
from("direct:get").routeId("EntailementGetTriples")
.log("Building RDFS Entailment Info")
.setHeader("Accept").constant(DEFAULT_CONTENT_TYPE)
.to("fcrepo:{{fcrepo.baseUrl}}?throwExceptionOnFailure=false")
.setHeader(HTTP_RESPONSE_CODE).constant(200)
.setHeader("Accept").header(ENTAILMENT_ACCEPT)
.to("direct:getTriples");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<!-- OSGI blueprint property placeholder -->
<cm:property-placeholder persistent-id="edu.amherst.acdc.exts.entailment" update-strategy="reload">
<cm:default-properties>
<cm:property name="rest.port" value="9109"/>
<cm:property name="rest.prefix" value="/entailment"/>
<cm:property name="rest.host" value="localhost"/>
<cm:property name="fcrepo.baseUrl" value="http://localhost:8080/fcrepo/rest"/>
<cm:property name="fcrepo.authUsername" value=""/>
<cm:property name="fcrepo.authPassword" value=""/>
<cm:property name="extension.load" value="false" />
<cm:property name="extension.load.uri" value="http://apix/services//apix:load" />
<cm:property name="extension.load.maximumRedeliveries" value="60" />
</cm:default-properties>
</cm:property-placeholder>
<reference id="entailmentService" interface="edu.amherst.acdc.services.entailment.EntailmentService" filter="(osgi.jndi.service.name=acrepo/Entailment)" />
<bean id="fcrepo" class="org.fcrepo.camel.FcrepoComponent">
<property name="authUsername" value="${fcrepo.authUsername}"/>
<property name="authPassword" value="${fcrepo.authPassword}"/>
<property name="baseUrl" value="${fcrepo.baseUrl}"/>
</bean>
<camelContext id="AcrepoExtEntailment" xmlns="http://camel.apache.org/schema/blueprint">
<package>edu.amherst.acdc.exts.entailment</package>
<route id="EntailmentTriples">
<from uri="direct:getTriples"/>
<setBody>
<method ref="entailmentService" method="getEntailedTriples(${header[CamelFcrepoUri]}, ${body}, ${header[Content-Type]}, ${header[Accept]})"/>
</setBody>
</route>
<!-- Self-register the loader service as an extension -->
<route id="load-extension">
<from uri="timer:register?repeatCount=1" />
<onException>
<exception>java.lang.Exception</exception>
<redeliveryPolicy maximumRedeliveries="{{extension.load.maximumRedeliveries}}"
logRetryAttempted="true" retryAttemptedLogLevel="INFO" />
</onException>
<setHeader headerName="Content-Type">
<constant>text/plain</constant>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>POST</constant>
</setHeader>
<setBody>
<simple>http://{{rest.host}}:{{rest.port}}{{rest.prefix}}</simple>
</setBody>
<choice>
<when>
<simple>{{extension.load}}</simple>
<to
uri="jetty:{{extension.load.uri}}?okStatusCodeRange=200-399" />
</when>
</choice>
</route>
</camelContext>
</blueprint>
@prefix rdfs:<http://www.w3.org/2000/01/rdf-schema#> .
@prefix registry:<http://acdc.amherst.edu/ns/registry#> .
@prefix apix:<http://fedora.info/definitions/v4/api-extension#> .
@prefix ldp: <http://www.w3.org/ns/ldp#> .
<> a apix:Extension;
rdfs:label "RDFS Entailment extension";
rdfs:comment "An extension that returns RDFS entailed triples for a resource";
apix:exposesService registry:EntailmentService
apix:exposesServiceAt "svc:entailment";
apix:bindsTo ldp:RDFSource .
......@@ -48,10 +48,12 @@ dependencies {
testCompile project(':acrepo-connector-broadcast')
testCompile project(':acrepo-connector-idiomatic')
testCompile project(':acrepo-connector-idiomatic-pgsql')
testCompile project(':acrepo-services-entailment')
testCompile project(':acrepo-services-inference')
testCompile project(':acrepo-services-mint')
testCompile project(':acrepo-services-ore')
testCompile project(':acrepo-services-pcdm')
testCompile project(':acrepo-exts-entailment')
testCompile project(':acrepo-exts-fits')
testCompile project(':acrepo-exts-image')
testCompile project(':acrepo-exts-ore')
......@@ -64,6 +66,8 @@ dependencies {
testCompile group: 'org.osgi', name: 'org.osgi.compendium', version: osgiVersion
testCompile group: 'org.apache.jena', name: 'jena-osgi', version: jenaVersion
testCompile group: 'org.glassfish.hk2.external', name: 'javax.inject', version: hk2Version
testCompile group: 'commons-io', name: 'commons-io', version: commonsIoVersion
testCompile group: 'org.apache.httpcomponents', name: 'httpclient-osgi', version: httpclientVersion
testCompile group: 'org.apache.httpcomponents', name: 'httpcore-osgi', version: httpcoreVersion
testCompile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: jacksonVersion
......@@ -133,6 +137,7 @@ task integrationTest(type: Test) {
test {
systemProperty 'karaf.version', karafVersion
systemProperty 'karaf.commonsIo.version', commonsIoVersion
systemProperty 'karaf.ssh.port', randomPort()
systemProperty 'karaf.rmiServer.port', randomPort()
......@@ -140,6 +145,7 @@ test {
systemProperty 'karaf.template.port', randomPort()
systemProperty 'karaf.metadata.port', randomPort()
systemProperty 'karaf.ore.port', randomPort()
systemProperty 'karaf.entailment.port', randomPort()
systemProperty 'karaf.pcdm.port', randomPort()
systemProperty 'karaf.image.port', randomPort()
systemProperty 'karaf.idiomatic.port', randomPort()
......
/*
* Copyright 2016 Amherst College
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.amherst.acdc.itests;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.ops4j.pax.exam.CoreOptions.maven;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.configureConsole;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.karafDistributionConfiguration;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.keepRuntimeFolder;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel;
import static org.slf4j.LoggerFactory.getLogger;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.apache.camel.CamelContext;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.ConfigurationManager;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerClass;
import org.slf4j.Logger;
/**
* @author Bethany Seeger
* @since April 3, 2017
*/
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
public class AcrepoEntailmentIT extends AbstractOSGiIT {
private static Logger LOGGER = getLogger(AcrepoEntailmentIT.class);
@Configuration
public Option[] config() {
final ConfigurationManager cm = new ConfigurationManager();
final String fcrepoPort = cm.getProperty("fcrepo.dynamic.test.port");
final String entExtPort = cm.getProperty("karaf.entailment.port");
final String rmiRegistryPort = cm.getProperty("karaf.rmiRegistry.port");
final String rmiServerPort = cm.getProperty("karaf.rmiServer.port");
final String fcrepoBaseUrl = "http://localhost:" + fcrepoPort + "/fcrepo/rest";
final String sshPort = cm.getProperty("karaf.ssh.port");
final String commonIoVersion = cm.getProperty("karaf.commonsIo.version");
final List<String> ontologies = Arrays.asList("http://purl.org/dc/terms/",
"http://purl.org/dc/elements/1.1/", "http://id.loc.gov/ontologies/bibframe/",
"http://www.w3.org/2004/02/skos/core#", "http://www.w3.org/2000/01/rdf-schema#");
return new Option[] {
karafDistributionConfiguration()
.frameworkUrl(maven().groupId("org.apache.karaf").artifactId("apache-karaf")
.version(cm.getProperty("karaf.version")).type("zip"))
.unpackDirectory(new File("build", "exam"))
.useDeployFolder(false),
logLevel(LogLevel.INFO),
keepRuntimeFolder(),
configureConsole().ignoreLocalConsole(),
features(maven().groupId("org.apache.karaf.features").artifactId("standard")
.versionAsInProject().classifier("features").type("xml"), "scr"),
features(maven().groupId("org.apache.camel.karaf").artifactId("apache-camel")
.type("xml").classifier("features").versionAsInProject()),
features(maven().groupId("org.fcrepo.camel").artifactId("fcrepo-camel")
.type("xml").classifier("features").versionAsInProject()),
features(maven().groupId("edu.amherst.acdc").artifactId("acrepo-karaf")
.type("xml").classifier("features").versionAsInProject(),
"acrepo-exts-entailment"),
mavenBundle().groupId("commons-io").artifactId("commons-io").version(commonIoVersion),
systemProperty("karaf.entailment.port").value(entExtPort),
systemProperty("fcrepo.port").value(fcrepoPort),
editConfigurationFilePut("etc/org.apache.karaf.management.cfg", "rmiRegistryPort", rmiRegistryPort),
editConfigurationFilePut("etc/org.apache.karaf.management.cfg", "rmiServerPort", rmiServerPort),
editConfigurationFilePut("etc/org.apache.karaf.shell.cfg", "sshPort", sshPort),
editConfigurationFilePut("etc/edu.amherst.acdc.exts.entailment.cfg", "fcrepo.baseUrl", fcrepoBaseUrl),
editConfigurationFilePut("etc/edu.amherst.acdc.exts.entailment.cfg", "rest.port", entExtPort),
editConfigurationFilePut("etc/edu.amherst.acdc.exts.entailment.cfg", "extension.load", "false"),
editConfigurationFilePut("etc/edu.amherst.acdc.services.entailment.cfg", "rdfs.ontologies",
String.join(",", ontologies))
};
}
@Test
public void testInstallation() throws Exception {
assertTrue(featuresService.isInstalled(featuresService.getFeature("camel-core")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("fcrepo-camel")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-services-entailment")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-exts-entailment")));
}
@Test
public void testEntailmentOptions() throws Exception {
// make sure that the camel context has started up.
final CamelContext ctx = getOsgiService(CamelContext.class, "(camel.context.name=AcrepoExtEntailment)",
10000);
assertNotNull(ctx);
final String baseUrl = "http://localhost:" + System.getProperty("fcrepo.port") + "/fcrepo/rest";
final String baseSvcUrl = "http://localhost:" + System.getProperty("karaf.entailment.port") + "/entailment";
assertTrue(options(baseSvcUrl).contains("apix:bindsTo ldp:RDFSource"));
}
@Test
public void testEntailmentTurtle() throws Exception {
// make sure that the camel context has started up.
final CamelContext ctx = getOsgiService(CamelContext.class, "(camel.context.name=AcrepoExtEntailment)",
10000);
assertNotNull(ctx);
final String baseUrl = "http://localhost:" + System.getProperty("fcrepo.port") + "/fcrepo/rest";
final String baseSvcUrl = "http://localhost:" + System.getProperty("karaf.entailment.port") + "/entailment";
final String obj = post(baseUrl, getClass().getResourceAsStream("/resource.ttl"), "text/turtle");
final String response = get(baseSvcUrl + "?context=" + obj);
final InputStream input = new ByteArrayInputStream(response.getBytes(UTF_8));
final StringWriter sw = new StringWriter();
IOUtils.copy(input, sw, UTF_8);
final String str = sw.toString();
assertTrue(str.contains("dc:rights"));
assertTrue(str.contains("rdfs:label"));
}
@Test
public void testEntailmentJsonLD() throws Exception {
// make sure that the camel context has started up.
final CamelContext ctx = getOsgiService(CamelContext.class, "(camel.context.name=AcrepoExtEntailment)",
10000);
assertNotNull(ctx);
final String baseUrl = "http://localhost:" + System.getProperty("fcrepo.port") + "/fcrepo/rest";
final String baseSvcUrl = "http://localhost:" + System.getProperty("karaf.entailment.port") + "/entailment";
final String obj = post(baseUrl, getClass().getResourceAsStream("/resource.ttl"), "text/turtle");
final String response = get(baseSvcUrl + "?context=" + obj, "application/ld+json");
final InputStream input = new ByteArrayInputStream(response.getBytes(UTF_8));
final ObjectMapper objectMapper = new ObjectMapper();
final TypeReference tr = new TypeReference<HashMap<String,Object>>() {};
final Map<String,Object> jsonMap = objectMapper.readValue(input, tr);
assertFalse(jsonMap.isEmpty());
}
}
......@@ -62,6 +62,7 @@ public class AcrepoServicesIT extends AbstractOSGiIT {
final String imagePort = cm.getProperty("karaf.image.port");
final String ldpathPort = cm.getProperty("karaf.ldpath.port");
final String fitsPort = cm.getProperty("karaf.fits.port");
final String entailmentPort = cm.getProperty("karaf.entailment.port");
return new Option[] {
karafDistributionConfiguration()
......@@ -89,6 +90,7 @@ public class AcrepoServicesIT extends AbstractOSGiIT {
"acrepo-connector-broadcast",
"acrepo-connector-triplestore",
"acrepo-exts-entailment",
"acrepo-exts-fits",
"acrepo-exts-image",
"acrepo-exts-ldpath",
......@@ -101,11 +103,14 @@ public class AcrepoServicesIT extends AbstractOSGiIT {
"acrepo-libs-jsonld",
"acrepo-libs-jackson",
"acrepo-services-entailment",
"acrepo-services-inference",
"acrepo-services-mint",
"acrepo-services-ore",
"acrepo-services-pcdm"),
editConfigurationFilePut("etc/edu.amherst.acdc.exts.entailment.cfg", "rest.port", entailmentPort),
editConfigurationFilePut("etc/edu.amherst.acdc.exts.entailment.cfg", "extension.load", "false"),
editConfigurationFilePut("etc/edu.amherst.acdc.exts.fits.cfg", "rest.port", fitsPort),
editConfigurationFilePut("etc/edu.amherst.acdc.exts.image.cfg", "rest.port", imagePort),
editConfigurationFilePut("etc/edu.amherst.acdc.exts.ldpath.cfg", "rest.port", ldpathPort),
......@@ -126,6 +131,7 @@ public class AcrepoServicesIT extends AbstractOSGiIT {
assertTrue(featuresService.isInstalled(featuresService.getFeature("fcrepo-service-activemq")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-connector-broadcast")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-connector-triplestore")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-exts-entailment")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-exts-fits")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-exts-image")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-exts-ldpath")));
......@@ -136,6 +142,7 @@ public class AcrepoServicesIT extends AbstractOSGiIT {
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-libs-jackson")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-libs-jena")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-libs-jsonld")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-services-entailment")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-services-inference")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-services-mint")));
assertTrue(featuresService.isInstalled(featuresService.getFeature("acrepo-services-ore")));
......
......@@ -46,6 +46,21 @@
<configfile finalname="/etc/org.ops4j.datasource-idiomatic.cfg">mvn:edu.amherst.acdc/acrepo-connector-idiomatic-pgsql/${project.version}/cfg/configuration</configfile>
</feature>
<feature name="acrepo-exts-entailment" version="${project.version}">