diff --git a/src/main/java/org/gcube/smartgears/configuration/application/ApplicationHandlers.java b/src/main/java/org/gcube/smartgears/configuration/application/ApplicationHandlers.java index 3834e38..a0c553c 100644 --- a/src/main/java/org/gcube/smartgears/configuration/application/ApplicationHandlers.java +++ b/src/main/java/org/gcube/smartgears/configuration/application/ApplicationHandlers.java @@ -136,6 +136,17 @@ public class ApplicationHandlers { } } - + public void mergeWith(ApplicationHandlers other){ + List lifecycles = other.lifecycleHandlers(); + for (ApplicationLifecycleHandler handler : lifecycles) + if (!this.lifecycleHandlers().contains(handler)) + this.lifecycleHandlers().add(handler); + + List requests = other.requestHandlers(); + for (RequestHandler handler : requests) + if (!this.requestHandlers().contains(handler)) + this.requestHandlers().add(handler); + + } } \ No newline at end of file diff --git a/src/main/java/org/gcube/smartgears/handlers/AbstractHandler.java b/src/main/java/org/gcube/smartgears/handlers/AbstractHandler.java index ce128bc..9f260c1 100644 --- a/src/main/java/org/gcube/smartgears/handlers/AbstractHandler.java +++ b/src/main/java/org/gcube/smartgears/handlers/AbstractHandler.java @@ -14,6 +14,12 @@ public abstract class AbstractHandler { public String toString() { return getClass().getSimpleName(); } + + @Override + public final boolean equals(Object obj) { + AbstractHandler handler = (AbstractHandler) obj; + return this.getClass().getCanonicalName().equals(handler.getClass().getCanonicalName()); + } //so far, largely a placeholder for future cross-handler behaviour diff --git a/src/main/java/org/gcube/smartgears/handlers/application/ApplicationLifecycleHandler.java b/src/main/java/org/gcube/smartgears/handlers/application/ApplicationLifecycleHandler.java index 4db4b49..9e6486b 100644 --- a/src/main/java/org/gcube/smartgears/handlers/application/ApplicationLifecycleHandler.java +++ b/src/main/java/org/gcube/smartgears/handlers/application/ApplicationLifecycleHandler.java @@ -44,4 +44,6 @@ public abstract class ApplicationLifecycleHandler extends AbstractHandler implem if (e instanceof ApplicationLifecycleEvent.Stop) onStop(ApplicationLifecycleEvent.Stop.class.cast(e)); } + + } diff --git a/src/main/java/org/gcube/smartgears/provider/DefaultProvider.java b/src/main/java/org/gcube/smartgears/provider/DefaultProvider.java index 6f91dcf..b75d5a2 100644 --- a/src/main/java/org/gcube/smartgears/provider/DefaultProvider.java +++ b/src/main/java/org/gcube/smartgears/provider/DefaultProvider.java @@ -204,24 +204,26 @@ public class DefaultProvider implements Provider { try { - InputStream config = context.application().getResourceAsStream(handlers_file_path); - - if (config == null) { + // it's in a library, using + InputStream defaultHandlersStream = getClass().getResourceAsStream(default_handlers_file_path); + if (defaultHandlersStream == null) + throw new IllegalStateException("invalid distribution: cannot find " + default_handlers_file_path); + + InputStream appSpecificHandlersStream = context.application().getResourceAsStream(handlers_file_path); + + ApplicationConfigurationBinder binder = new ApplicationConfigurationBinder(); + + ApplicationHandlers defaultHandlers = binder.bindHandlers(defaultHandlersStream); + + if (appSpecificHandlersStream !=null ){ + defaultHandlers.mergeWith(binder.bindHandlers(appSpecificHandlersStream)); + log.trace("{} uses default lifecycle with app spceific handler as it includes {}", context.name(), handlers_file_path); + } else log.trace("{} uses the default lifecycle as it does not include {}", context.name(), handlers_file_path); - // it's in a library, using - config = getClass().getResourceAsStream(default_handlers_file_path); - - if (config == null) - throw new IllegalStateException("invalid distribution: cannot find " + default_handlers_file_path); - - } else - log.info("{} uses a custom lifecycle @ {}", context.name(), handlers_file_path); - - ApplicationConfigurationBinder binder = new ApplicationConfigurationBinder(); - - return binder.bindHandlers(config); + return defaultHandlers; + } catch (RuntimeException e) { @@ -230,6 +232,7 @@ public class DefaultProvider implements Provider { } } + @Override public ApplicationExtensions extensionsFor(ApplicationContext context) {