/**
 * Copyright (c) 1998 by Cornell University.
 * All rights reserved.
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the
 * above copyright notice and the following two paragraphs appear in
 * all copies of this software.
 *
 * IN NO EVENT SHALL CORNELL UNIVERSITY BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF CORNELL UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * CORNELL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND CORNELL UNIVERSITY HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 */
package cornell.slk.jkernel.std;

import java.lang.reflect.*;
import java.io.*;
import java.util.*;
import cornell.slk.jkernel.core.*;
import cornell.slk.jkernel.util.*;
import cornell.slk.compiler.util.*;

/**
 *  Main is the class that starts the J-Kernel.  If run
 *  with no arguments, it prints a list of legal
 *  command-line arguments.
 *
 *  @internal
 *  See RootTask.
 */
public class Main
{
    public static void main(String[] args)
        throws Exception
    {
        // Start the J-Kernel:
        JKernel jKernel = new JKernel();

        // Start the root task.
        // This root task will be based mostly on the system resolver.
        // The root task will then set up some better resolvers and
        // use these to start a child task, which will run the
        // program specified in args.

        // Some classes in jkernel.std are loaded from a FileResolver:
        String javaClassPath = System.getProperty("java.class.path");
        String pathSeparator = System.getProperty("path.separator");
        Resolver jkstdResolver = new FilterResolver(
            new FileResolver(javaClassPath, pathSeparator),
            new String[0],
            new String[]
            {
                "cornell.slk.jkernel.std.RootTask",
                "cornell.slk.jkernel.std.StartInterface",
                "cornell.slk.jkernel.std.StartData"
            });

        Resolver systemResolver = jKernel.getSystemResolver();
        jKernel.createRootTask(new CompoundResolver(
            new Resolver[] {jkstdResolver, systemResolver}));

        Class rootTaskClass = jKernel.getRootTaskClass("cornell.slk.jkernel.std.RootTask");
        Runnable rootTask = (Runnable) rootTaskClass.getConstructors()[0].newInstance(
            new Object[]
            {
                args, jKernel
            });

        jKernel.runRootTask(rootTask);
    }
}

