001    package toolbus;
002    
003    import toolbus.adapter.ToolBridge;
004    import toolbus.communication.DirectIOHandler;
005    import toolbus.exceptions.ToolBusError;
006    import toolbus.logging.ILogger;
007    import toolbus.logging.IToolBusLoggerConstants;
008    import toolbus.logging.LoggerFactory;
009    import toolbus.tool.ToolDefinition;
010    import toolbus.tool.ToolInstance;
011    import aterm.AFun;
012    import aterm.ATerm;
013    
014    public class DirectConnectionHandler{
015            private final ToolBus toolbus;
016            
017            public DirectConnectionHandler(ToolBus toolbus){
018                    super();
019                    
020                    this.toolbus = toolbus;
021            }
022            
023            public void dock(ToolBridge toolBridge) throws ToolBusError{
024                    String toolName = toolBridge.getToolName();
025                    
026                    ToolDefinition toolDef = toolbus.getToolDefinition(toolName);
027                    if(toolDef == null){
028                            String error = "No tool definition found for tool with name: " + toolName;
029                            LoggerFactory.log(error, ILogger.WARNING, IToolBusLoggerConstants.COMMUNICATION);
030                            throw new RuntimeException(error);
031                    }
032                    
033                    if(!toolBridge.checkSignature(toolDef.getSignature())){
034                            String error = "The tool, with name: "+toolName+", did not provide the expected interface.";
035                            LoggerFactory.log(error, ILogger.WARNING, IToolBusLoggerConstants.COMMUNICATION);
036                            throw new RuntimeException(error);
037                    }
038                    
039                    ToolInstanceManager toolInstanceManager = toolbus.getToolInstanceManager();
040                    
041                    TBTermFactory tbfactory = toolbus.getTBTermFactory();
042                    AFun afun = tbfactory.makeAFun(toolDef.getName(), 1, false);
043                    ATerm toolKey = tbfactory.makeAppl(afun, tbfactory.makeInt(toolBridge.getToolID()));
044    
045                    ToolInstance toolInstance = toolInstanceManager.getPendingTool(toolKey);
046                    
047                    // If we didn't request the tool with the given id to execute, it's connecting on it's own
048                    // initiative.
049                    if(toolInstance == null){
050                            toolInstance = new ToolInstance(toolDef, toolbus);
051                            toolInstanceManager.addDynamiclyConnectedTool(toolInstance);
052    
053                            LoggerFactory.log("Tool: " + toolInstance.getToolKey() + ", connected at its own initiative.", ILogger.INFO, IToolBusLoggerConstants.COMMUNICATION);
054                    }
055                    
056                    // Connect the tool bridge with the tool instance.
057                    DirectIOHandler toolDirectIOHandler = new DirectIOHandler(toolBridge);
058                    toolBridge.setIOHandler(toolDirectIOHandler);
059                    
060                    DirectIOHandler toolBusDirectIOHandler = new DirectIOHandler(toolInstance);
061                    toolInstance.setIOHandler(toolBusDirectIOHandler);
062                    
063                    toolDirectIOHandler.setDirectIOHandler(toolBusDirectIOHandler);
064                    toolBusDirectIOHandler.setDirectIOHandler(toolDirectIOHandler);
065            }
066    }