/*
 * $Id$
 *
 * Copyright 1996-2008 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */
package com.sun.javatest.lib;

import java.io.File;
import java.io.PrintWriter;

import com.sun.javatest.Script;
import com.sun.javatest.Status;
import com.sun.javatest.TestEnvironment;
import com.sun.javatest.TestDescription;

/**
 * A Script designed to compile/execute a test.
 */
public class APIScript extends Script
{
    /// XXX this code really needs to be re-visited!
    
    /**
     * The method that interprets the tags provided in the test description and
     * performs actions accordingly.
     *
     * @param args Any arguments that the APIScript may use.  Currently
     *             there are none (value ignored).
     * @param td   The current TestDescription.
     * @param env  The test environment giving the details of how to run the
     *             test.
     * @return     The result of running the script on the given test
     *             description.
     */
    public Status run(String [] args, TestDescription td, TestEnvironment env) {

        PrintWriter trOut = getTestResult().getTestCommentWriter();

	Status status = decodeArgs(args);
	if (status != null)
	    return status;
	
	// XXX This isn't everything.  We need to make sure that this is a
	// XXX reasonable subset of JCKScript.  Do we want to handle all options 
	// XXX available there?  How about the keywords?

	// compile
	File [] srcs = td.getSourceFiles();
	Status compileStatus;
	if (precompileClassDir == null) {
	    trOut.println("Unconditionally compiling all sources");
	    compileStatus = compileTogether(TEST_COMPILE, srcs);
	} else {
	    trOut.println("Compiling sources only if necessary");
	    compileStatus = compileIfNecessary(TEST_COMPILE, srcs, precompileClassDir);
	}

	if (!compileStatus.isPassed())
	    return compileStatus;

	// execute
	String executeClass  = td.getParameter("executeClass");
	String executeArgs   = td.getParameter("executeArgs");
	Status executeStatus = execute(TEST_EXECUTE, executeClass, executeArgs);

	return executeStatus;
    } // run()

    //----------private methods-------------------------------------------------

    private Status decodeArgs(String [] args) {
	// decode args
	for (int i = 0; i < args.length; i++) {
	    if (args[i].equals("-precompileClassDir") && (i+1 < args.length))
		precompileClassDir = args[++i];
	    else
		return Status.failed(UNRECOGNIZED_ARG + args[i]);
	}

	return null;
    } // init()

    //----------member variables------------------------------------------------

    private static final String TEST_COMPILE = "testCompile";
    private static final String TEST_EXECUTE = "testExecute";

    // special option to use compileIfNecessary
    private String precompileClassDir;

    private static final String
	UNRECOGNIZED_ARG      = "Unrecognized argument for script: ";
}
