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 }