private static final Logger LOG = LoggerFactory.getLogger(AbstractModule.class);
- private final M oldModule;
- private final AutoCloseable oldInstance;
+ protected final DependencyResolver dependencyResolver;
protected final ModuleIdentifier identifier;
+
+ private AutoCloseable oldInstance;
+ private M oldModule;
private AutoCloseable instance;
- protected final DependencyResolver dependencyResolver;
/**
* Called when module is configured.
* @param identifier id of current instance.
* @param dependencyResolver resolver used in dependency injection and validation.
*/
- public AbstractModule(ModuleIdentifier identifier, DependencyResolver dependencyResolver) {
+ public AbstractModule(final ModuleIdentifier identifier, final DependencyResolver dependencyResolver) {
this(identifier, dependencyResolver, null, null);
}
* @param oldModule old instance of module that is being reconfigred(replaced) by current instance. The old instance can be examined for reuse.
* @param oldInstance old instance wrapped by the old module. This is the resource that is actually being reused if possible or closed otherwise.
*/
- public AbstractModule(ModuleIdentifier identifier, DependencyResolver dependencyResolver, M oldModule, AutoCloseable oldInstance) {
+ public AbstractModule(final ModuleIdentifier identifier, final DependencyResolver dependencyResolver, final M oldModule, final AutoCloseable oldInstance) {
this.identifier = identifier;
this.dependencyResolver = dependencyResolver;
this.oldModule = oldModule;
*/
@Override
public final AutoCloseable getInstance() {
- if(instance==null) {
- if(oldInstance!=null && canReuseInstance(oldModule)) {
+ if (instance == null) {
+ if (oldInstance != null && canReuseInstance(oldModule)) {
resolveDependencies();
instance = reuseInstance(oldInstance);
} else {
- if(oldInstance!=null) {
+ if (oldInstance != null) {
try {
oldInstance.close();
- } catch(Exception e) {
+ } catch (Exception e) {
LOG.error("An error occurred while closing old instance {} for module {}", oldInstance, getIdentifier(), e);
}
}
throw new IllegalStateException("Error in createInstance - null is not allowed as return value. Module: " + getIdentifier());
}
}
+
+ // Prevent serial memory leak: clear these references as we will not use them again.
+ oldInstance = null;
+ oldModule = null;
}
+
return instance;
}
protected abstract AutoCloseable createInstance();
@Override
- public final boolean canReuse(Module oldModule) {
+ public final boolean canReuse(final Module oldModule) {
// Just cast into a specific instance
// TODO unify this method with canReuseInstance (required Module interface to be generic which requires quite a lot of changes)
return getClass().isInstance(oldModule) ? canReuseInstance((M) oldModule) : false;
* @param oldInstance old instance of a class wrapped by the module
* @return reused instance
*/
- protected AutoCloseable reuseInstance(AutoCloseable oldInstance) {
+ protected AutoCloseable reuseInstance(final AutoCloseable oldInstance) {
// implement if instance reuse should be supported. Override canReuseInstance to change the criteria.
return oldInstance;
}