Skip to content

Commit

Permalink
add installers ordering support
Browse files Browse the repository at this point in the history
  • Loading branch information
xvik committed Apr 17, 2015
1 parent cea3268 commit 5e64912
Show file tree
Hide file tree
Showing 20 changed files with 151 additions and 14 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
### 2.2.0 (2015-04-17)
* Fix ExceptionMapper registration
* Add installers ordering support with @Order annotation. Default installers are ordered now with indexes from 10 to 100 with gap 10
(to simplify custom installers injection between them)

### 2.1.2 (2015-03-03)
* Spock 1.0 compatibility

Expand Down
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ Maven:
<dependency>
<groupId>ru.vyarus</groupId>
<artifactId>dropwizard-guicey</artifactId>
<version>2.1.2</version>
<version>2.2.0</version>
</dependency>
```

Gradle:

```groovy
compile 'ru.vyarus:dropwizard-guicey:2.1.2'
compile 'ru.vyarus:dropwizard-guicey:2.2.0'
```

for dropwizard 0.7 use version 1.1.0 (see [old docs](https://github.com/xvik/dropwizard-guicey/tree/dw-0.7))
Expand Down Expand Up @@ -187,6 +187,9 @@ by default, guice production stage will instantiate all registered beans.
On run phase (after injector created) all found or manually provided extensions are installed by type or instantiated (`injector.getInstance(foundClass)`) and passed to installer
to register extension within dropwizard (installation type is defined by installer).

Installers order is defined by `@Order` annotation. Default installers are ordered with indexes from 10 to 100 with gap 10.
If you need to run your installer before/after some installer simply annotate it with `@Order`. Installers without annotation goes last.

##### Resource
[ResourceInstaller](https://github.com/xvik/dropwizard-guicey/blob/master/src/main/java/ru/vyarus/dropwizard/guice/module/installer/feature/jersey/ResourceInstaller.java)
finds classes annotated with `@Path` and register their instance as resources. Resources registered as singletons, even if guice bean scope isn't set. If extension annotated as
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
version=2.1.3-SNAPSHOT
version=2.2.0-SNAPSHOT
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@
import ru.vyarus.dropwizard.guice.module.installer.internal.FeatureInstallerExecutor;
import ru.vyarus.dropwizard.guice.module.installer.internal.FeaturesHolder;
import ru.vyarus.dropwizard.guice.module.installer.internal.InstallerConfig;
import ru.vyarus.dropwizard.guice.module.installer.order.OrderComparator;
import ru.vyarus.dropwizard.guice.module.installer.scanner.ClassVisitor;
import ru.vyarus.dropwizard.guice.module.installer.scanner.ClasspathScanner;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;

import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;
import java.util.Set;

Expand All @@ -30,6 +32,7 @@
* as much as possible.
*/
public class InstallerModule extends AbstractModule {
private static final OrderComparator COMPARATOR = new OrderComparator();
private final Logger logger = LoggerFactory.getLogger(InstallerModule.class);
private final ClasspathScanner scanner;
private final InstallerConfig installerConfig;
Expand All @@ -46,7 +49,7 @@ protected void configure() {
// called just after injector creation to process instance installers
bind(FeatureInstallerExecutor.class).asEagerSingleton();

final Set<Class<? extends FeatureInstaller>> installerClasses = findInstallers();
final List<Class<? extends FeatureInstaller>> installerClasses = findInstallers();
final List<FeatureInstaller> installers = prepareInstallers(installerClasses);

final FeaturesHolder holder = new FeaturesHolder(installers);
Expand All @@ -58,10 +61,10 @@ protected void configure() {
* Performs classpath scan to find all classes implementing or use only manually configured installers.
* {@link FeatureInstaller}.
*
* @return set of found installers or empty list
* @return list of found installers or empty list
*/
@SuppressWarnings("unchecked")
private Set<Class<? extends FeatureInstaller>> findInstallers() {
private List<Class<? extends FeatureInstaller>> findInstallers() {
final List<Class<? extends FeatureInstaller>> installers = Lists.newArrayList();
if (scanner != null) {
scanner.scan(new ClassVisitor() {
Expand All @@ -83,9 +86,11 @@ public boolean apply(@Nullable final Class<? extends FeatureInstaller> input) {
return !installerConfig.getDisabledFeatures().contains(input);
}
}));

logger.debug("Found {} feature installers", validInstallers.size());
return validInstallers;
installers.clear();
installers.addAll(validInstallers);
Collections.sort(installers, COMPARATOR);
logger.debug("Found {} feature installers", installers.size());
return installers;
}

/**
Expand All @@ -95,7 +100,7 @@ public boolean apply(@Nullable final Class<? extends FeatureInstaller> input) {
* @return list of installer instances
*/
private List<FeatureInstaller> prepareInstallers(
final Set<Class<? extends FeatureInstaller>> installerClasses) {
final List<Class<? extends FeatureInstaller>> installerClasses) {
final List<FeatureInstaller> installers = Lists.newArrayList();
for (Class<? extends FeatureInstaller> installerClass : installerClasses) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.eclipse.jetty.util.component.LifeCycle;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.InstanceInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.order.Ordered;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;
import ru.vyarus.dropwizard.guice.module.installer.util.Reporter;
Expand All @@ -15,6 +16,7 @@
* @author Vyacheslav Rusakov
* @since 01.09.2014
*/
@Order(10)
public class LifeCycleInstaller implements
FeatureInstaller<LifeCycle>, InstanceInstaller<LifeCycle>, Ordered {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.dropwizard.setup.Environment;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.InstanceInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.order.Ordered;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;
import ru.vyarus.dropwizard.guice.module.installer.util.Reporter;
Expand All @@ -15,6 +16,7 @@
* @author Vyacheslav Rusakov
* @since 01.09.2014
*/
@Order(20)
public class ManagedInstaller implements
FeatureInstaller<Managed>, InstanceInstaller<Managed>, Ordered {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.dropwizard.setup.Environment;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.InstanceInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;

/**
Expand All @@ -13,6 +14,7 @@
* @author Vyacheslav Rusakov
* @since 01.09.2014
*/
@Order(70)
public class TaskInstaller implements FeatureInstaller<Task>, InstanceInstaller<Task> {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import io.dropwizard.setup.Environment;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.InstanceInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.order.Ordered;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;
import ru.vyarus.dropwizard.guice.module.installer.util.Reporter;
Expand All @@ -19,6 +20,7 @@
* @author Vyacheslav Rusakov
* @since 13.10.2014
*/
@Order(90)
public class AdminFilterInstaller implements FeatureInstaller<Filter>,
InstanceInstaller<Filter>, Ordered {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import io.dropwizard.setup.Environment;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.InstanceInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.order.Ordered;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;
import ru.vyarus.dropwizard.guice.module.installer.util.Reporter;
Expand All @@ -18,6 +19,7 @@
* @author Vyacheslav Rusakov
* @since 13.10.2014
*/
@Order(100)
public class AdminServletInstaller implements FeatureInstaller<HttpServlet>,
InstanceInstaller<HttpServlet>, Ordered {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.google.inject.Binder;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.binding.BindingInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;
import ru.vyarus.dropwizard.guice.module.installer.util.Reporter;

Expand All @@ -19,6 +20,7 @@
* @author Vyacheslav Rusakov
* @since 01.09.2014
*/
@Order(50)
public class EagerSingletonInstaller implements FeatureInstaller<Object>, BindingInstaller {
private final Reporter reporter = new Reporter(EagerSingletonInstaller.class, "eager singletons =");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.dropwizard.setup.Environment;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.InstanceInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;
import ru.vyarus.dropwizard.guice.module.installer.util.Reporter;

Expand All @@ -16,6 +17,7 @@
* @author Vyacheslav Rusakov
* @since 01.09.2014
*/
@Order(60)
public class HealthCheckInstaller implements FeatureInstaller<NamedHealthCheck>,
InstanceInstaller<NamedHealthCheck> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import ru.vyarus.dropwizard.guice.module.installer.install.JerseyInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.TypeInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.binding.BindingInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;
import ru.vyarus.dropwizard.guice.module.installer.util.JerseyBinding;

Expand All @@ -26,6 +27,7 @@
* @author Vyacheslav Rusakov
* @since 01.09.2014
*/
@Order(40)
public class ResourceInstaller implements FeatureInstaller<Object>, BindingInstaller, TypeInstaller<Object>,
JerseyInstaller<Object> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.JerseyInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.binding.BindingInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;

import javax.inject.Singleton;
Expand All @@ -32,6 +33,7 @@
* @see ru.vyarus.dropwizard.guice.module.installer.install.binding.LazyBinding
* @since 10.10.2014
*/
@Order(30)
public class JerseyProviderInstaller implements FeatureInstaller<Object>,
BindingInstaller, JerseyInstaller<Object> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.google.inject.multibindings.Multibinder;
import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller;
import ru.vyarus.dropwizard.guice.module.installer.install.binding.BindingInstaller;
import ru.vyarus.dropwizard.guice.module.installer.order.Order;
import ru.vyarus.dropwizard.guice.module.installer.util.FeatureUtils;

import java.lang.annotation.Annotation;
Expand All @@ -23,6 +24,7 @@
* @author Vyacheslav Rusakov
* @since 08.10.2014
*/
@Order(80)
public class PluginInstaller implements FeatureInstaller<Object>, BindingInstaller {

private final PluginReporter reporter = new PluginReporter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
/**
* May be applied to extension in order to order extensions.
* <p>NOTE: Extension installer must implement {@link Ordered} otherwise annotation will not make any effect.</p>
* <p>Also, may be applied to installer to order installers. Installers ordering may be useful if you have some
* edge case, which is normally handled by core installer. Without ordering you will have to manually register
* all installers to place your installer before. With ordered you could simply annotate your installer and it
* will be executed before default installers. Also, may be used to order your own installers order.
* Core installers are ordered from 10 to 100 with gap 10 (to simplify injection of custom installers between them).</p>
*
* @author Vyacheslav Rusakov
* @since 12.10.2014
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,7 @@ import javax.servlet.ServletRegistration
*/
abstract class AbstractTest extends Specification {

void setup() {
}

void cleanup() {
void cleanupSpec() {
GuiceBundle.getDeclaredField("injector").setAccessible(true)
GuiceBundle.injector = null
}
Expand Down
5 changes: 5 additions & 0 deletions src/test/groovy/ru/vyarus/dropwizard/guice/CommandTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ import ru.vyarus.dropwizard.guice.support.feature.NonInjactableCommand
*/
class CommandTest extends AbstractTest {

void cleanup() {
GuiceBundle.getDeclaredField("injector").setAccessible(true)
GuiceBundle.injector = null
}

def "Check command start"() {

when: "run guice powered command"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package ru.vyarus.dropwizard.guice.order

import com.google.inject.Inject
import ru.vyarus.dropwizard.guice.AbstractTest
import ru.vyarus.dropwizard.guice.module.installer.feature.ManagedInstaller
import ru.vyarus.dropwizard.guice.module.installer.feature.jersey.provider.JerseyProviderInstaller
import ru.vyarus.dropwizard.guice.module.installer.internal.FeaturesHolder
import ru.vyarus.dropwizard.guice.module.installer.order.Order
import ru.vyarus.dropwizard.guice.support.installerorder.DummyInstaller
import ru.vyarus.dropwizard.guice.support.installerorder.OrderedInstallersApplication
import ru.vyarus.dropwizard.guice.test.spock.UseGuiceyApp

/**
* @author Vyacheslav Rusakov
* @since 17.04.2015
*/
@UseGuiceyApp(OrderedInstallersApplication)
class InstallersOrderTest extends AbstractTest {

@Inject
FeaturesHolder holder

def "Check default installers order"() {

def pos = 0;
holder.getInstallers().each {
int instPos = it.class.getAnnotation(Order).value()
assert instPos > pos
pos = instPos
}
expect:
pos == 100
}

def "Check custom installer position correct"() {

expect:
holder.getInstallers()[1] instanceof ManagedInstaller
holder.getInstallers()[2] instanceof DummyInstaller
holder.getInstallers()[3] instanceof JerseyProviderInstaller

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.vyarus.dropwizard.guice.support.installerorder

import ru.vyarus.dropwizard.guice.module.installer.FeatureInstaller
import ru.vyarus.dropwizard.guice.module.installer.order.Order

/**
* Installer should run after ManagedInstaller(20) and before JerseyProviderInstaller(30)
*
* @author Vyacheslav Rusakov
* @since 17.04.2015
*/
@Order(25)
class DummyInstaller implements FeatureInstaller<DummyInstaller>{

@Override
boolean matches(Class<?> type) {
return false
}

@Override
void report() {
}
}
Loading

0 comments on commit 5e64912

Please sign in to comment.