package diskCacheV111.doors;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import dmg.cells.nucleus.Cell;
import dmg.cells.nucleus.CellEndpoint;
import dmg.cells.nucleus.CellPath;
import dmg.cells.services.login.StreamEngineLoginCellFactory;
import dmg.util.StreamEngine;
import org.dcache.cells.CellStub;
import org.dcache.poolmanager.PoolManagerHandlerSubscriber;
import org.dcache.util.Args;
import org.dcache.util.Option;
import org.dcache.util.OptionParser;
public class LineBasedDoorFactory extends StreamEngineLoginCellFactory
{
private final CellEndpoint parentEndpoint;
private final String parentCellName;
private final Args args;
private final LineBasedInterpreterFactory factory;
private ExecutorService executor;
private PoolManagerHandlerSubscriber poolManagerHandler;
@Option(name = "poolManager",
description = "Well known name of the pool manager",
defaultValue = "PoolManager")
protected CellPath poolManager;
@Option(name = "poolManagerTimeout",
defaultValue = "1500")
protected int poolManagerTimeout;
@Option(name = "poolManagerTimeoutUnit",
defaultValue = "SECONDS")
protected TimeUnit poolManagerTimeoutUnit;
@Option(name = "poolTimeout",
defaultValue = "300")
protected int poolTimeout;
@Option(name = "poolTimeoutUnit",
defaultValue = "SECONDS")
protected TimeUnit poolTimeoutUnit;
public LineBasedDoorFactory(LineBasedInterpreterFactory factory, Args args, CellEndpoint parentEndpoint, String parentCellName)
{
super(args, parentEndpoint);
this.factory = factory;
this.parentEndpoint = parentEndpoint;
this.parentCellName = parentCellName;
this.args = args;
new OptionParser(args).inject(this);
}
@Override
public String getName()
{
return factory.getClass().getSimpleName();
}
@Override
public Cell newCell(StreamEngine engine, String userName) throws InvocationTargetException
{
LineBasedDoor door = new LineBasedDoor(parentCellName + "*", args, factory, engine, executor, poolManagerHandler);
try {
door.start().get();
} catch (ExecutionException | InterruptedException e) {
throw new InvocationTargetException(e.getCause(), e.getMessage());
}
return door;
}
@Override
protected void doStart()
{
executor = Executors.newCachedThreadPool(
new ThreadFactoryBuilder().setNameFormat(parentCellName + "-io-%d").build());
poolManagerHandler = new PoolManagerHandlerSubscriber();
poolManagerHandler.setPoolManager(new CellStub(parentEndpoint, poolManager, poolManagerTimeout, poolManagerTimeoutUnit));
poolManagerHandler.start();
poolManagerHandler.afterStart();
notifyStarted();
}
@Override
protected void doStop()
{
poolManagerHandler.beforeStop();
executor.shutdown();
notifyStopped();
}
}