From 76f78fb9a99c5bddc7be989b6879a31eb8557d2c Mon Sep 17 00:00:00 2001 From: ajs6f Date: Tue, 20 Mar 2018 12:46:44 -0400 Subject: [PATCH 1/5] Factoring apart component builds for easier overriding --- .../trellisldp/app/TrellisApplication.java | 74 ++++++++++++++----- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java index d15377a39..219289106 100644 --- a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java +++ b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java @@ -22,6 +22,8 @@ import static org.trellisldp.app.TrellisUtils.getRDFConnection; import static org.trellisldp.app.TrellisUtils.getWebacConfiguration; +import javax.jms.JMSException; + import io.dropwizard.Application; import io.dropwizard.auth.chained.ChainedAuthFilter; import io.dropwizard.setup.Bootstrap; @@ -36,6 +38,7 @@ import org.trellisldp.api.IdentifierService; import org.trellisldp.api.MementoService; import org.trellisldp.api.NamespaceService; +import org.trellisldp.api.ResourceService; import org.trellisldp.app.config.TrellisConfiguration; import org.trellisldp.app.health.RDFConnectionHealthCheck; import org.trellisldp.file.FileBinaryService; @@ -56,6 +59,8 @@ */ public class TrellisApplication extends Application { + private Environment environment; + /** * The main entry point. * @param args the argument list @@ -79,31 +84,24 @@ public void initialize(final Bootstrap bootstrap) { public void run(final TrellisConfiguration config, final Environment environment) throws Exception { - final EventService notificationService = getNotificationService(config.getNotifications(), environment); + this.environment = environment; - final RDFConnection rdfConnection = getRDFConnection(config); + final EventService notificationService = buildNotificationService(config, environment); - final IdentifierService idService = new UUIDGenerator(); + final IdentifierService idService = buildIdService(); - final MementoService mementoService = new FileMementoService(config.getMementos()); + final MementoService mementoService = buildMementoService(config); - final TriplestoreResourceService resourceService = new TriplestoreResourceService(rdfConnection, idService, - mementoService, notificationService); + final TriplestoreResourceService resourceService = buildResourceService(config, idService, mementoService, + notificationService); - final NamespaceService namespaceService = new NamespacesJsonContext(config.getNamespaces()); + final NamespaceService namespaceService = buildNamespaceService(config); - final BinaryService binaryService = new FileBinaryService(idService, config.getBinaries(), - config.getBinaryHierarchyLevels(), config.getBinaryHierarchyLength()); + final BinaryService binaryService = buildBinaryService(config, idService); // IO Service - final CacheService profileCache = new TrellisCache<>(newBuilder() - .maximumSize(config.getJsonld().getCacheSize()) - .expireAfterAccess(config.getJsonld().getCacheExpireHours(), HOURS).build()); - final IOService ioService = new JenaIOService(namespaceService, profileCache, - TrellisUtils.getAssetConfiguration(config)); - - // Health checks - environment.healthChecks().register("rdfconnection", new RDFConnectionHealthCheck(rdfConnection)); + final CacheService profileCache = buildCacheService(config); + final IOService ioService = buildIoService(config, namespaceService, profileCache); getAuthFilters(config).ifPresent(filters -> environment.jersey().register(new ChainedAuthFilter<>(filters))); @@ -127,4 +125,46 @@ public void run(final TrellisConfiguration config, new CrossOriginResourceSharingFilter(cors.getAllowOrigin(), cors.getAllowMethods(), cors.getAllowHeaders(), cors.getExposeHeaders(), cors.getAllowCredentials(), cors.getMaxAge()))); } + + protected T buildResourceService(final TrellisConfiguration config, + final IdentifierService idService, final MementoService mementoService, + final EventService notificationService) { + final RDFConnection rdfConnection = getRDFConnection(config); + // Health checks + environment.healthChecks().register("rdfconnection", new RDFConnectionHealthCheck(rdfConnection)); + return (T) new TriplestoreResourceService(rdfConnection, idService, mementoService, notificationService); + } + + protected TrellisCache buildCacheService(final TrellisConfiguration config) { + return new TrellisCache<>(newBuilder().maximumSize(config.getJsonld().getCacheSize()) + .expireAfterAccess(config.getJsonld().getCacheExpireHours(), HOURS).build()); + } + + protected JenaIOService buildIoService(final TrellisConfiguration config, final NamespaceService namespaceService, + final CacheService profileCache) { + return new JenaIOService(namespaceService, profileCache, TrellisUtils.getAssetConfiguration(config)); + } + + protected FileBinaryService buildBinaryService(final TrellisConfiguration config, + final IdentifierService idService) { + return new FileBinaryService(idService, config.getBinaries(), config.getBinaryHierarchyLevels(), + config.getBinaryHierarchyLength()); + } + + protected NamespacesJsonContext buildNamespaceService(final TrellisConfiguration config) { + return new NamespacesJsonContext(config.getNamespaces()); + } + + protected FileMementoService buildMementoService(final TrellisConfiguration config) { + return new FileMementoService(config.getMementos()); + } + + protected UUIDGenerator buildIdService() { + return new UUIDGenerator(); + } + + protected EventService buildNotificationService(final TrellisConfiguration config, final Environment environment) + throws JMSException { + return getNotificationService(config.getNotifications(), environment); + } } From bc89fc2a0aaca148f5180ca7bd56eb5e522809a6 Mon Sep 17 00:00:00 2001 From: ajs6f Date: Tue, 20 Mar 2018 13:24:29 -0400 Subject: [PATCH 2/5] Ordering imports --- .../src/main/java/org/trellisldp/app/TrellisApplication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java index 219289106..0dbec9cc6 100644 --- a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java +++ b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java @@ -22,13 +22,13 @@ import static org.trellisldp.app.TrellisUtils.getRDFConnection; import static org.trellisldp.app.TrellisUtils.getWebacConfiguration; -import javax.jms.JMSException; - import io.dropwizard.Application; import io.dropwizard.auth.chained.ChainedAuthFilter; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; +import javax.jms.JMSException; + import org.apache.jena.rdfconnection.RDFConnection; import org.trellisldp.agent.SimpleAgent; import org.trellisldp.api.BinaryService; From ed84500cc7cd3b168eeb50d9f5b325aeca2c4d76 Mon Sep 17 00:00:00 2001 From: ajs6f Date: Tue, 20 Mar 2018 15:43:58 -0400 Subject: [PATCH 3/5] Using state in the TrellisApplication class to make initialization more flexible --- .../trellisldp/app/TrellisApplication.java | 98 ++++++++++++------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java index 0dbec9cc6..dcb4349a3 100644 --- a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java +++ b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java @@ -22,6 +22,8 @@ import static org.trellisldp.app.TrellisUtils.getRDFConnection; import static org.trellisldp.app.TrellisUtils.getWebacConfiguration; +import com.google.common.cache.Cache; + import io.dropwizard.Application; import io.dropwizard.auth.chained.ChainedAuthFilter; import io.dropwizard.setup.Bootstrap; @@ -31,6 +33,7 @@ import org.apache.jena.rdfconnection.RDFConnection; import org.trellisldp.agent.SimpleAgent; +import org.trellisldp.api.AuditService; import org.trellisldp.api.BinaryService; import org.trellisldp.api.CacheService; import org.trellisldp.api.EventService; @@ -39,8 +42,10 @@ import org.trellisldp.api.MementoService; import org.trellisldp.api.NamespaceService; import org.trellisldp.api.ResourceService; +import org.trellisldp.api.RuntimeTrellisException; import org.trellisldp.app.config.TrellisConfiguration; import org.trellisldp.app.health.RDFConnectionHealthCheck; +import org.trellisldp.audit.DefaultAuditService; import org.trellisldp.file.FileBinaryService; import org.trellisldp.file.FileMementoService; import org.trellisldp.http.AgentAuthorizationFilter; @@ -61,6 +66,26 @@ public class TrellisApplication extends Application { private Environment environment; + private TrellisConfiguration config; + + private EventService notificationService; + + private IdentifierService idService; + + private MementoService mementoService; + + private TriplestoreResourceService resourceService; + + private NamespaceService namespaceService; + + private BinaryService binaryService; + + private CacheService profileCache; + + private IOService ioService; + + private AuditService auditService; + /** * The main entry point. * @param args the argument list @@ -80,33 +105,29 @@ public void initialize(final Bootstrap bootstrap) { // Not currently used } + protected void init(final TrellisConfiguration config, final Environment environment) { + this.environment = environment; + this.config = config; + this.notificationService = buildNotificationService(environment); + this.idService = buildIdService(); + this.mementoService = buildMementoService(); + this.resourceService = buildResourceService(idService, mementoService, notificationService); + this.namespaceService = buildNamespaceService(); + this.binaryService = buildBinaryService(idService); + this.profileCache = buildCacheService(); + this.ioService = buildIoService(namespaceService, profileCache); + this.auditService = buildAuditService(); + } + @Override public void run(final TrellisConfiguration config, final Environment environment) throws Exception { - - this.environment = environment; - - final EventService notificationService = buildNotificationService(config, environment); - - final IdentifierService idService = buildIdService(); - - final MementoService mementoService = buildMementoService(config); - - final TriplestoreResourceService resourceService = buildResourceService(config, idService, mementoService, - notificationService); - - final NamespaceService namespaceService = buildNamespaceService(config); - - final BinaryService binaryService = buildBinaryService(config, idService); - - // IO Service - final CacheService profileCache = buildCacheService(config); - final IOService ioService = buildIoService(config, namespaceService, profileCache); + init(config, environment); getAuthFilters(config).ifPresent(filters -> environment.jersey().register(new ChainedAuthFilter<>(filters))); // Resource matchers - environment.jersey().register(new LdpResource(resourceService, ioService, binaryService, resourceService, + environment.jersey().register(new LdpResource(resourceService, ioService, binaryService, auditService, config.getBaseUrl())); // Filters @@ -126,36 +147,42 @@ public void run(final TrellisConfiguration config, cors.getAllowHeaders(), cors.getExposeHeaders(), cors.getAllowCredentials(), cors.getMaxAge()))); } - protected T buildResourceService(final TrellisConfiguration config, - final IdentifierService idService, final MementoService mementoService, - final EventService notificationService) { + protected T buildResourceService(final IdentifierService idService, + final MementoService mementoService, final EventService notificationService) { final RDFConnection rdfConnection = getRDFConnection(config); // Health checks environment.healthChecks().register("rdfconnection", new RDFConnectionHealthCheck(rdfConnection)); return (T) new TriplestoreResourceService(rdfConnection, idService, mementoService, notificationService); } - protected TrellisCache buildCacheService(final TrellisConfiguration config) { - return new TrellisCache<>(newBuilder().maximumSize(config.getJsonld().getCacheSize()) - .expireAfterAccess(config.getJsonld().getCacheExpireHours(), HOURS).build()); + protected AuditService buildAuditService() { + return resourceService != null && resourceService instanceof AuditService + ? resourceService + : new DefaultAuditService(); + } + + protected TrellisCache buildCacheService() { + final Long cacheSize = config.getJsonld().getCacheSize(); + final Long hours = config.getJsonld().getCacheExpireHours(); + final Cache cache = newBuilder().maximumSize(cacheSize).expireAfterAccess(hours, HOURS).build(); + return new TrellisCache<>(cache); } - protected JenaIOService buildIoService(final TrellisConfiguration config, final NamespaceService namespaceService, + protected JenaIOService buildIoService(final NamespaceService namespaceService, final CacheService profileCache) { return new JenaIOService(namespaceService, profileCache, TrellisUtils.getAssetConfiguration(config)); } - protected FileBinaryService buildBinaryService(final TrellisConfiguration config, - final IdentifierService idService) { + protected FileBinaryService buildBinaryService(final IdentifierService idService) { return new FileBinaryService(idService, config.getBinaries(), config.getBinaryHierarchyLevels(), config.getBinaryHierarchyLength()); } - protected NamespacesJsonContext buildNamespaceService(final TrellisConfiguration config) { + protected NamespacesJsonContext buildNamespaceService() { return new NamespacesJsonContext(config.getNamespaces()); } - protected FileMementoService buildMementoService(final TrellisConfiguration config) { + protected FileMementoService buildMementoService() { return new FileMementoService(config.getMementos()); } @@ -163,8 +190,11 @@ protected UUIDGenerator buildIdService() { return new UUIDGenerator(); } - protected EventService buildNotificationService(final TrellisConfiguration config, final Environment environment) - throws JMSException { - return getNotificationService(config.getNotifications(), environment); + protected EventService buildNotificationService(final Environment environment) { + try { + return getNotificationService(config.getNotifications(), environment); + } catch (JMSException e) { + throw new RuntimeTrellisException(e); + } } } From 37442498e0484f53600d77557be43d2b9feb1755 Mon Sep 17 00:00:00 2001 From: ajs6f Date: Tue, 20 Mar 2018 15:57:54 -0400 Subject: [PATCH 4/5] Correct type for resourceService --- .../src/main/java/org/trellisldp/app/TrellisApplication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java index dcb4349a3..fa47cf1f1 100644 --- a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java +++ b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java @@ -74,7 +74,7 @@ public class TrellisApplication extends Application { private MementoService mementoService; - private TriplestoreResourceService resourceService; + private ResourceService resourceService; private NamespaceService namespaceService; @@ -157,7 +157,7 @@ protected T buildResourceService(final IdentifierSer protected AuditService buildAuditService() { return resourceService != null && resourceService instanceof AuditService - ? resourceService + ? (AuditService) resourceService : new DefaultAuditService(); } From 46b216e9e2f38a8500220e22a519c48a7247ea29 Mon Sep 17 00:00:00 2001 From: ajs6f Date: Tue, 20 Mar 2018 16:28:41 -0400 Subject: [PATCH 5/5] Widening return types of build* methods --- .../java/org/trellisldp/app/TrellisApplication.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java index fa47cf1f1..6465a8a0d 100644 --- a/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java +++ b/trellis-app/src/main/java/org/trellisldp/app/TrellisApplication.java @@ -168,25 +168,25 @@ protected TrellisCache buildCacheService() { return new TrellisCache<>(cache); } - protected JenaIOService buildIoService(final NamespaceService namespaceService, + protected IOService buildIoService(final NamespaceService namespaceService, final CacheService profileCache) { return new JenaIOService(namespaceService, profileCache, TrellisUtils.getAssetConfiguration(config)); } - protected FileBinaryService buildBinaryService(final IdentifierService idService) { + protected BinaryService buildBinaryService(final IdentifierService idService) { return new FileBinaryService(idService, config.getBinaries(), config.getBinaryHierarchyLevels(), config.getBinaryHierarchyLength()); } - protected NamespacesJsonContext buildNamespaceService() { + protected NamespaceService buildNamespaceService() { return new NamespacesJsonContext(config.getNamespaces()); } - protected FileMementoService buildMementoService() { + protected MementoService buildMementoService() { return new FileMementoService(config.getMementos()); } - protected UUIDGenerator buildIdService() { + protected IdentifierService buildIdService() { return new UUIDGenerator(); }