Package jade

Source Code of jade.Boot

/**
* ***************************************************************
* JADE - Java Agent DEvelopment Framework is a framework to develop
* multi-agent systems in compliance with the FIPA specifications.
* Copyright (C) 2000 CSELT S.p.A.
*
* GNU Lesser General Public License
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation,
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA  02111-1307, USA.
* **************************************************************
*/
package jade;

//#MIDP_EXCLUDE_FILE

import jade.core.Runtime;
import jade.core.Profile;
import jade.core.ProfileImpl;
import jade.core.ProfileException;

import jade.util.leap.Properties;
import jade.util.ExtendedProperties;
import jade.util.Logger;

/**
* Boots the <B><em>JADE</em></b> system, parsing command line arguments.
*
* @author Giovanni Rimassa - Universita' di Parma
* @author Giovanni Caire - TILAB
* @author Nicolas Lhuillier - Motorola
* @author Jerome Picault - Motorola
* @version $Date: 2010-04-19 16:16:41 +0200 (lun, 19 apr 2010) $ $Revision: 6320 $
*
*/
public class Boot {
  public static final String DEFAULT_FILENAME = "leap.properties";
  private static Logger logger = Logger.getMyLogger("jade.Boot");

  /**
   * Fires up the <b><em>JADE</em></b> system.
   * This method initializes the Profile Manager and then starts the
   * bootstrap process for the <B><em>JADE</em></b>
   * agent platform.
   */
  public static void main(String args[]) {
    try {
      // Create the Profile
      ProfileImpl p = null;
      if (args.length > 0) {
        if (args[0].startsWith("-")) {
          // Settings specified as command line arguments
          Properties pp = parseCmdLineArgs(args);
          if (pp != null) {
            p = new ProfileImpl(pp);
          }
          else {
            // One of the "exit-immediately" options was specified!
            return;
          }
        }
        else {
          // Settings specified in a property file
          p = new ProfileImpl(args[0]);
        }
      }
      else {
        // Settings specified in the default property file
        p = new ProfileImpl(DEFAULT_FILENAME);
      }

      // Start a new JADE runtime system
      Runtime.instance().setCloseVM(true);
      //#PJAVA_EXCLUDE_BEGIN
      // Check whether this is the Main Container or a peripheral container
      if (p.getBooleanProperty(Profile.MAIN, true)) {
        Runtime.instance().createMainContainer(p);
      } else {
        Runtime.instance().createAgentContainer(p);
      }
      //#PJAVA_EXCLUDE_END
      /*#PJAVA_INCLUDE_BEGIN
      // Starts the container in SINGLE_MODE (Only one per JVM)
      Runtime.instance().startUp(p);
      #PJAVA_INCLUDE_END*/
    }
    catch (ProfileException pe) {
      System.err.println("Error creating the Profile ["+pe.getMessage()+"]");
      pe.printStackTrace();
      printUsage();
      //System.err.println("Usage: java jade.Boot <filename>");
      System.exit(-1);
    }
    catch (IllegalArgumentException iae) {
      System.err.println("Command line arguments format error. "+iae.getMessage());
      iae.printStackTrace();
      printUsage();
      //System.err.println("Usage: java jade.Boot <filename>");
      System.exit(-1);
    }
  }

  /**
     Default constructor.
   */
  public Boot() {
  }


  public static Properties parseCmdLineArgs(String[] args) throws IllegalArgumentException {
    Properties props = new ExtendedProperties();

    int i = 0;
    while (i < args.length) {
      if (args[i].startsWith("-")) {
        // Parse next option

        // Switch options require special handling
        if (args[i].equalsIgnoreCase("-version")) {
          logger.log(Logger.INFO, "----------------------------------\n"+Runtime.getCopyrightNotice()+"----------------------------------------");
          return null;
        }
        if (args[i].equalsIgnoreCase("-help")) {
          printUsage();
          return null;
        }
        if (args[i].equalsIgnoreCase("-container")) {
          props.setProperty(Profile.MAIN, "false");
        }
        else if(args[i].equalsIgnoreCase("-"+Profile.LOCAL_SERVICE_MANAGER)) {
          props.setProperty(Profile.LOCAL_SERVICE_MANAGER, "true");
        }
        else if (args[i].equalsIgnoreCase("-"+Profile.GUI)) {
          props.setProperty(Profile.GUI, "true");
        }
        else if (args[i].equalsIgnoreCase("-"+Profile.NO_MTP)) {
          props.setProperty(Profile.NO_MTP, "true");
        }       
        // Options that can be specified in different ways require special handling
        else if (args[i].equalsIgnoreCase("-name")) {
          if (++i < args.length) {
            props.setProperty(Profile.PLATFORM_ID, args[i]);
          }
          else {
            throw new IllegalArgumentException("No platform name specified after \"-name\" option");
          }
        }
        else if (args[i].equalsIgnoreCase("-mtp")) {
          if (++i < args.length) {
            props.setProperty(Profile.MTPS, args[i]);
          }
          else {
            throw new IllegalArgumentException("No mtps specified after \"-mtp\" option");
          }
        }
        // The -conf option requires special handling
        else if (args[i].equalsIgnoreCase("-conf")) {
          if (++i < args.length) {
            // Some parameters are specified in a properties file
            try {
              props.load(args[i]);
            }
            catch (Exception e) {
              if(logger.isLoggable(Logger.SEVERE))
                logger.log(Logger.SEVERE, "WARNING: error loading properties from file "+args[i]+". "+e);
           
          }
          else {
            throw new IllegalArgumentException("No configuration file name specified after \"-conf\" option");
          }
        }
        // Default handling for all other properties
        else {
          String name = args[i].substring(1);
          if (++i < args.length) {
            props.setProperty(name, args[i]);
          }
          else {
            throw new IllegalArgumentException("No value specified for property \""+name+"\"");
          }
        }
        ++i;
      }
      else {
        // Get agents at the end of command line
        if (props.getProperty(Profile.AGENTS) != null) {
          if(logger.isLoggable(Logger.WARNING))
            logger.log(Logger.WARNING,"WARNING: overriding agents specification set with the \"-agents\" option");
        }
        String agents = args[i];
        props.setProperty(Profile.AGENTS, args[i]);
        if (++i < args.length) {
          if(logger.isLoggable(Logger.WARNING))
            logger.log(Logger.WARNING,"WARNING: ignoring command line argument "+args[i]+" occurring after agents specification");
          if (agents != null && agents.indexOf('(') != -1 && !agents.endsWith(")")) {
            if(logger.isLoggable(Logger.WARNING))
              logger.log(Logger.WARNING,"Note that agent arguments specifications must not contain spaces");
          }
          if (args[i].indexOf(':') != -1) {
            if(logger.isLoggable(Logger.WARNING))
              logger.log(Logger.WARNING,"Note that agent specifications must be separated by a semicolon character \";\" without spaces");
          }
        }
        break;
      }
    }

    // Consistency check
    if ("true".equals(props.getProperty(Profile.NO_MTP)) && props.getProperty(Profile.MTPS) != null) {
      if(logger.isLoggable(Logger.WARNING))
        logger.log(Logger.WARNING,"WARNING: both \"-mtps\" and \"-nomtp\" options specified. The latter will be ignored");
      props.remove(Profile.NO_MTP);
    }

    return props;
  }

  public static void printUsage() {
    System.out.println("Usage:");
    System.out.println("java -cp <classpath> jade.Boot [options] [agents]");
    System.out.println("Main options:");
    System.out.println("    -container");
    System.out.println("    -gui");
    System.out.println("    -name <platform name>");
    System.out.println("    -host <main container host>");
    System.out.println("    -port <main container port>");
    System.out.println("    -local-host <host where to bind the local server socket on>");
    System.out.println("    -local-port <port where to bind the local server socket on>");
    System.out.println("    -conf <property file to load configuration properties from>");
    System.out.println("    -services <semicolon separated list of service classes>");
    System.out.println("    -mtps <semicolon separated list of mtp-specifiers>");
    System.out.println("     where mtp-specifier = [in-address:]<mtp-class>[(comma-separated args)]");    
    System.out.println("    -<property-name> <property-value>");
    System.out.println("Agents: [-agents] <semicolon separated list of agent-specifiers>");
    System.out.println("     where agent-specifier = <agent-name>:<agent-class>[(comma separated args)]");
    System.out.println();
    System.out.println("Look at the JADE Administrator's Guide for more details");
  }
}

TOP

Related Classes of jade.Boot

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.