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    }