001 /*
002 * Created on Oct 6, 2005
003 */
004 package toolbus.atom.tool;
005
006 import toolbus.TBTermFactory;
007 import toolbus.TBTermVar;
008 import toolbus.atom.Atom;
009 import toolbus.atom.Ref;
010 import toolbus.exceptions.ToolBusException;
011 import toolbus.parsercup.PositionInformation;
012 import toolbus.process.ProcessExpression;
013 import toolbus.tool.ToolInstance;
014 import aterm.ATerm;
015
016 /**
017 * @author paulk
018 */
019 public class DisConnect extends Atom{
020 private final Ref toolId;
021 private ToolInstance toolInstance;
022
023 public DisConnect(ATerm toolId, TBTermFactory tbfactory, PositionInformation posInfo){
024 super(tbfactory, posInfo);
025
026 this.toolId = new Ref(toolId);
027 setAtomArgs(new Ref[]{this.toolId});
028
029 externalNameAsReceivedByTool = "snd-disconnect";
030 }
031
032 public ProcessExpression copy(){
033 Atom a = new DisConnect(toolId.value, tbfactory, getPosInfo());
034 a.copyAtomAttributes(this);
035
036 return a;
037 }
038
039 public void activate(){
040 toolInstance = null;
041 super.activate();
042 }
043
044 /**
045 * @see toolbus.StateElement#execute()
046 */
047 public boolean execute() throws ToolBusException{
048 if(!isEnabled()) return false;
049
050 if(toolInstance == null){
051 ATerm tid = getEnv().getValue((TBTermVar) toolId.value);
052 toolInstance = getToolBus().getToolInstanceManager().get(tid);
053 if(toolInstance == null) return false;
054 }
055
056 // If the connection is already lost don't try to terminate the connection, since it will fail.
057 if(toolInstance.isKilled() || toolInstance.isUnreachable()){
058 toolInstance.shutDown();
059 return true;
060 }
061
062 if(toolInstance.isDisconnected()){
063 toolInstance.shutDown();
064 toolInstance.terminate();
065 //LoggerFactory.log(this.getProcess().getProcessName(), "DisConnect " + toolId.value, IToolBusLoggerConstants.TOOLCOM);
066 return true;
067 }
068
069 return false;
070 }
071 }