package org.jboss.deployment.scanner;
import javax.management.ObjectName;
import org.jboss.deployment.Deployer;
import org.jboss.deployment.MainDeployerMBean;
import org.jboss.logging.Logger;
import org.jboss.system.MissingAttributeException;
import org.jboss.system.ServiceMBeanSupport;
import org.jboss.util.MuBoolean;
import org.jboss.util.MuLong;
import org.jboss.util.NullArgumentException;
import org.jboss.mx.util.MBeanProxyExt;
import org.jboss.mx.util.MBeanProxyInstance;
public abstract class AbstractDeploymentScanner
extends ServiceMBeanSupport
implements DeploymentScanner, DeploymentScannerMBean
{
protected MuLong scanPeriod = new MuLong(5000);
protected MuBoolean scanEnabled = new MuBoolean(true);
protected Deployer deployer;
protected MainDeployerMBean mainDeployer;
protected ScannerThread scannerThread;
private Thread shutdownHook;
public void setDeployer(final ObjectName deployerName)
{
if (deployerName == null)
throw new NullArgumentException("deployerName");
deployer = (Deployer)
MBeanProxyExt.create(Deployer.class, deployerName, server);
}
public ObjectName getDeployer()
{
return ((MBeanProxyInstance)deployer).getMBeanProxyObjectName();
}
public void setScanPeriod(final long period)
{
if (period < 0)
throw new IllegalArgumentException("ScanPeriod must be >= 0; have: " + period);
this.scanPeriod.set(period);
}
public long getScanPeriod()
{
return scanPeriod.longValue();
}
public void setScanEnabled(final boolean flag)
{
this.scanEnabled.set(flag);
}
public boolean isScanEnabled()
{
return scanEnabled.get();
}
public abstract void scan() throws Exception;
public class ScannerThread
extends Thread
{
protected Logger log = Logger.getLogger(ScannerThread.class);
protected boolean enabled;
protected boolean shuttingDown;
protected Object lock = new Object();
public ScannerThread(boolean enabled)
{
super("ScannerThread");
this.enabled = enabled;
}
public void setEnabled(boolean enabled)
{
this.enabled = enabled;
synchronized (lock)
{
lock.notifyAll();
}
if (log.isDebugEnabled())
{
log.debug("Notified that enabled: " + enabled);
}
}
public void shutdown()
{
enabled = false;
shuttingDown = true;
synchronized (lock)
{
lock.notifyAll();
}
if (log.isDebugEnabled())
{
log.debug("Notified to shutdown");
}
}
public void run()
{
log.debug("Running");
while (!shuttingDown)
{
if (!enabled)
{
try
{
log.debug("Disabled, waiting for notification");
synchronized (lock)
{
lock.wait();
}
}
catch (InterruptedException ignore) {}
}
loop();
}
log.debug("Shutdown");
}
public void doScan()
{
try {
scan();
}
catch (Exception e) {
log.error("Scanning failed; continuing", e);
}
}
protected void loop()
{
while (enabled)
{
doScan();
try
{
log.trace("Sleeping...");
Thread.sleep(scanPeriod.longValue());
}
catch (InterruptedException ignore) {}
}
}
}
protected void createService() throws Exception
{
if (deployer == null)
throw new MissingAttributeException("Deployer");
mainDeployer = (MainDeployerMBean)MBeanProxyExt.create(MainDeployerMBean.class, MainDeployerMBean.OBJECT_NAME, server);
scannerThread = new ScannerThread(false);
scannerThread.setDaemon(true);
scannerThread.start();
log.debug("Scanner thread started");
final ScannerThread _scannerThread = scannerThread;
shutdownHook = new Thread("DeploymentScanner Shutdown Hook")
{
ScannerThread scannerThread = _scannerThread;
public void run()
{
scannerThread.shutdown();
}
};
try
{
Runtime.getRuntime().addShutdownHook(shutdownHook);
}
catch (Exception e)
{
log.warn("Failed to add shutdown hook", e);
}
}
protected void startService() throws Exception
{
synchronized( scannerThread )
{
scannerThread.doScan();
scannerThread.setEnabled(scanEnabled.get());
}
}
protected void stopService() throws Exception
{
if( scannerThread != null )
scannerThread.setEnabled(false);
}
protected void destroyService() throws Exception
{
deployer = null;
if( scannerThread != null )
{
synchronized( scannerThread )
{
scannerThread.shutdown();
}
}
try
{
Runtime.getRuntime().removeShutdownHook(shutdownHook);
}
catch (Exception ignore)
{
}
shutdownHook = null;
scannerThread = null;
}
}