/*************************************************************************** * * * Main.java * * ------------------- * * date : 09.09.2004, 15:58 * * copyright : (C) 2004-2008 Distributed and * * Mobile Systems Group * * Lehrstuhl fuer Praktische Informatik * * Universitaet Bamberg * * http://www.uni-bamberg.de/pi/ * * email : sven.kaffille@uni-bamberg.de * * karsten.loesing@uni-bamberg.de * * * * * ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * A copy of the license can be found in the license.txt file supplied * * with this software or at: http://www.gnu.org/copyleft/gpl.html * * * ***************************************************************************/ package de.uniba.wiai.lspi.chord.console; import java.util.Hashtable; import de.uniba.wiai.lspi.util.console.CommandFactory; import de.uniba.wiai.lspi.util.console.ConsoleThread; import de.uniba.wiai.lspi.util.console.ExecuteMacro; import de.uniba.wiai.lspi.util.console.MemoryOutputStream; import de.uniba.wiai.lspi.util.console.ShowOutputCommand; import de.uniba.wiai.lspi.chord.com.local.Registry; import de.uniba.wiai.lspi.chord.console.command.*; import de.uniba.wiai.lspi.chord.data.URL; import de.uniba.wiai.lspi.chord.service.Chord; import de.uniba.wiai.lspi.chord.service.PropertiesLoader; /** * Main class to start a console, that allows manual testing of chord. There are * two possibilities to create a chord network. * <ul> * <li> Create a chord network that completely runs within the local VM. The * console provides commmands to access all nodes and to retrieve/insert entries * from/to nodes. * <li> Create a single chord node, that connects to a remote chord network * {@link Chord#join(URL, URL)} or creates a new chord network ({@link Chord#create(URL)}), * which can be entered by other remote nodes. * </ul> * * @author sven * @version 1.0.5 */ public class Main { /** Creates a new instance of Console */ private Main() { /* * No instances of Main allowed. */ } /** * @param args * the command line arguments * @throws Throwable */ public static void main(String[] args) throws Throwable { // read property file by invoking static method on ChordImpl PropertiesLoader.loadPropertyFile(); System.out .println("This program is free software; you can redistribute " + "\n" + "it and/or modify it under the terms of the GNU General " + "\n" + "Public License as published by the Free Software " + "\n" + "Foundation; either version 2 of the License, or (at " + "\n" + "your option) any later version."); System.out.println(); System.out .println("A copy of the license can be found in the license.txt " + "\n" + "file supplied with this software or at: " + "\n" + "http://www.gnu.org/copyleft/gpl.html"); System.out.println(); /* * Create mapping from command name to command class */ Hashtable<String, String> commandMapping = new Hashtable<String, String>(); commandMapping.put(ExecuteMacro.COMMAND_NAME, ExecuteMacro.class .getName()); commandMapping.put(Exit.COMMAND_NAME, Exit.class.getName()); commandMapping.put(Help.COMMAND_NAME, Help.class.getName()); commandMapping.put(ShowOutputCommand.COMMAND_NAME, ShowOutputCommand.class.getName()); commandMapping.put(Wait.COMMAND_NAME, Wait.class.getName()); /* * Commands to create a local chord network */ commandMapping.put(CrashNodes.COMMAND_NAME, CrashNodes.class.getName()); commandMapping.put(CreateNodes.COMMAND_NAME, CreateNodes.class .getName()); commandMapping.put(Insert.COMMAND_NAME, Insert.class.getName()); commandMapping.put(Remove.COMMAND_NAME, Remove.class.getName()); commandMapping.put(Retrieve.COMMAND_NAME, Retrieve.class.getName()); commandMapping.put(ShowFingerTable.COMMAND_NAME, ShowFingerTable.class .getName()); commandMapping.put(ShowNodes.COMMAND_NAME, ShowNodes.class.getName()); commandMapping.put(ShowSuccessorList.COMMAND_NAME, ShowSuccessorList.class.getName()); commandMapping.put(ShutdownNodes.COMMAND_NAME, ShutdownNodes.class .getName()); commandMapping.put(ShowEntries.COMMAND_NAME, ShowEntries.class .getName()); commandMapping.put(ShowEntriesNetworkLocalNode.COMMAND_NAME, ShowEntriesNetworkLocalNode.class .getName()); /* * Commands to create a node that connects to a remote chord network. */ commandMapping.put(JoinNetwork.COMMAND_NAME, JoinNetwork.class .getName()); commandMapping.put(LeaveNetwork.COMMAND_NAME, LeaveNetwork.class .getName()); commandMapping.put(InsertNetwork.COMMAND_NAME, InsertNetwork.class .getName()); commandMapping.put(RetrieveNetwork.COMMAND_NAME, RetrieveNetwork.class .getName()); commandMapping.put(RemoveNetwork.COMMAND_NAME, RemoveNetwork.class .getName()); commandMapping.put(ShowEntriesNetwork.COMMAND_NAME, ShowEntriesNetwork.class.getName()); commandMapping.put(ShowFingerTableNetwork.COMMAND_NAME, ShowFingerTableNetwork.class.getName()); commandMapping.put(ChangeProtocol.COMMAND_NAME, ChangeProtocol.class .getName()); /* * Get the registry for thread communication as this is the object * commands need to be executed */ Object toCommand = Registry.getRegistryInstance(); CommandFactory factory = new CommandFactory(new Object[] { toCommand, RemoteChordNetworkAccess.getUniqueInstance() }, System.out, commandMapping); ConsoleThread t = ConsoleThread.getConsole("oc", factory, new MemoryOutputStream()); t.setWelcomeText("Welcome to Open Chord test environment." + "\n" + "(C) 2004-2008 Distributed and Mobile Systems Group" + "\n" + "University of Bamberg" + "\n" + "\n" + "Type 'help' for a list of available commands"); t.setExitCommand(Exit.COMMAND_NAME); t.start(); // execute commands from args list for (int i = 0; i < args.length; i++) { factory.createCommand(args[i]).exec(); } } }