package org.frameworkset.spi;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.log4j.Logger;
import org.frameworkset.spi.support.DefaultLifecycleProcessor;
public class LifeCycleProcessorExecutor {
public LifeCycleProcessorExecutor() {
// TODO Auto-generated constructor stub
}
private static Logger log = Logger.getLogger(LifeCycleProcessorExecutor.class);
protected LifecycleProcessor lifecycleProcessor;
protected BaseApplicationContext context;
protected LifecycleProcessor initLifecycleProcessor() {
if(lifecycleProcessor == null)
{
DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
defaultProcessor.setApplicationContext(context);
this.lifecycleProcessor = defaultProcessor;
return defaultProcessor;
}
return lifecycleProcessor;
// registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
}
public void setLifecycleProcessor(LifecycleProcessor lifecycleProcessor) {
this.lifecycleProcessor = lifecycleProcessor;
// return lifecycleProcessor;
}
/**
* Finish the refresh of this context, invoking the LifecycleProcessor's
* onRefresh() method and
*/
public void startProcessor() {
if(!this.active.compareAndSet(false, true))
return;
// Initialize lifecycle processor for this context.
initLifecycleProcessor();
// Propagate refresh to lifecycle processor first.
getLifecycleProcessor().onRefresh();
}
/** Flag that indicates whether this context is currently active */
private final AtomicBoolean active = new AtomicBoolean();
/** Flag that indicates whether this context has been closed already */
private final AtomicBoolean closed = new AtomicBoolean();
public void stopProcessor() {
if (this.active.get() && this.closed.compareAndSet(false, true)) {
if (log.isInfoEnabled()) {
log.info("Closing " + this);
}
// Stop all Lifecycle beans, to avoid delays during individual destruction.
try {
if(lifecycleProcessor != null)
{
lifecycleProcessor.onClose();
lifecycleProcessor = null;
}
}
catch (Throwable ex) {
log.warn("Exception thrown from LifecycleProcessor on context close", ex);
}
this.active.set(false);
}
}
public boolean isProcessorActive() {
return this.active.get();
}
/**
* Return the internal LifecycleProcessor used by the context.
* @return the internal LifecycleProcessor (never {@code null})
* @throws IllegalStateException if the context has not been initialized yet
*/
LifecycleProcessor getLifecycleProcessor() throws IllegalStateException {
if (this.lifecycleProcessor == null) {
throw new IllegalStateException("LifecycleProcessor not initialized - " +
"call 'refresh' before invoking lifecycle methods via the context: " + this);
}
return this.lifecycleProcessor;
}
public BaseApplicationContext getContext() {
return context;
}
public void setContext(BaseApplicationContext context) {
this.context = context;
}
}