001    package toolbus.adapter.java;
002    
003    import java.net.InetAddress;
004    
005    import toolbus.ToolBus;
006    import toolbus.adapter.AbstractTool;
007    
008    /**
009     * This class facilitates the functions a tool needs to be able to functions.
010     * 
011     * @author Arnold Lankamp
012     */
013    public abstract class AbstractJavaTool extends AbstractTool{
014            
015            /**
016             * Default constructor.
017             */
018            public AbstractJavaTool(){
019                    super();
020            }
021    
022            /**
023             * Connects to the ToolBus.
024             * NOTE: For thread-safety reasons this method must NOT be called before the constructor of the
025             * AbstractJavaTool completes. This means that implementing classes should not put the connect
026             * call in their constructor.
027             * 
028             * @param args
029             *            The arguments that contain the required information for running a tool (name + id
030             *            and additionally the host + port of the ToolBus, depending on how this tool is
031             *            connected to the ToolBus).
032             * @throws Exception
033             *             Thrown when something goes wrong during the parsing of the arguments or the
034             *             establishing of the connection.
035             */
036            public void connect(String[] args) throws Exception{
037                    if(toolBridge != null) throw new RuntimeException("ToolBridge has already been connected.");
038                    
039                    String toolName = null;
040                    int toolID = -1;
041    
042                    InetAddress host = null;
043                    int port = -1;
044    
045                    for(int i = 0; i < args.length; i++){
046                            String arg = args[i];
047                            if(arg.equals("-TB_TOOL_NAME")){
048                                    toolName = args[++i];
049                            }else if(arg.equals("-TB_TOOL_ID")){
050                                    toolID = Integer.parseInt(args[++i]);
051                            }else if(arg.equals("-TB_HOST")){
052                                    host = InetAddress.getByName(args[++i]);
053                            }else if(arg.equals("-TB_PORT")){
054                                    port = Integer.parseInt(args[++i]);
055                            }
056                    }
057    
058                    if(toolName == null) throw new RuntimeException("Missing tool identification.");
059    
060                    toolBridge = new JavaToolBridge(termFactory, this, toolName, toolID, host, port);
061                    toolBridge.run();
062            }
063            
064            /**
065             * Connects to the ToolBus directly (instead of through TCP/IP).
066             * 
067             * @param toolbus
068             *            The toolbus to connect to.
069             * @param toolName
070             *            The name of the tool.
071             * @param toolID
072             *            The ID of the tool.
073             * @throws Exception
074             *            When connecting to the toolbus directly failed.
075             */
076            public void connectDirectly(ToolBus toolbus, String toolName, int toolID) throws Exception{
077                    if(toolName == null) throw new RuntimeException("Missing tool identification.");
078                    
079                    if(toolBridge != null) throw new RuntimeException("ToolBridge has already been connected.");
080                    
081                    toolBridge = new JavaToolBridge(termFactory, this, toolName, toolID, toolbus);
082                    toolBridge.run();
083            }
084    }