You are viewing a plain text version of this content. The canonical link for it is here.
Posted to svn@forrest.apache.org by rg...@apache.org on 2005/01/18 14:00:38 UTC

svn commit: r125498 - forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job

Author: rgardler
Date: Tue Jan 18 05:00:36 2005
New Revision: 125498

URL: http://svn.apache.org/viewcvs?view=rev&rev=125498
Log:
refactor server start technique, now able to shutdown server from GUI
Added:
   forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/AntBuildListener.java   (contents, props changed)
Modified:
   forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestJob.java
   forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestManager.java
   forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestRunner.java
   forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestStopper.java

Added: forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/AntBuildListener.java
Url: http://svn.apache.org/viewcvs/forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/AntBuildListener.java?view=auto&rev=125498
==============================================================================
--- (empty file)
+++ forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/AntBuildListener.java	Tue Jan 18 05:00:36 2005
@@ -0,0 +1,74 @@
+package org.apache.forrest.eclipse.job;
+
+import org.apache.log4j.Logger;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+
+/**
+ * A listener for Ant Builds, all events are logged to the standard logger.
+ */
+public class AntBuildListener implements BuildListener{
+	/**
+	 * Logger for this class
+	 */
+	private static final Logger logger = Logger
+			.getLogger(AntBuildListener.class);
+
+	/**
+	 * 
+	 */
+	public AntBuildListener() {
+		super();
+		// TODO Auto-generated constructor stub
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.tools.ant.BuildListener#buildFinished(org.apache.tools.ant.BuildEvent)
+	 */
+	public void buildFinished(BuildEvent event) {
+		logger.debug("Ant Finished Build: " + event.getMessage());
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.apache.tools.ant.BuildListener#buildStarted(org.apache.tools.ant.BuildEvent)
+	 */
+	public void buildStarted(BuildEvent event) {
+		logger.debug("Ant Started Build: " + event.getMessage());
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.apache.tools.ant.BuildListener#messageLogged(org.apache.tools.ant.BuildEvent)
+	 */
+	public void messageLogged(BuildEvent event) {
+		logger.debug("Anr Message: " + event.getMessage());
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.apache.tools.ant.BuildListener#targetFinished(org.apache.tools.ant.BuildEvent)
+	 */
+	public void targetFinished(BuildEvent event) {
+		logger.debug("Ant Target Finished: " + event.getMessage());
+	}
+	/* (non-Javadoc)
+	 * @see org.apache.tools.ant.BuildListener#targetStarted(org.apache.tools.ant.BuildEvent)
+	 */
+	public void targetStarted(BuildEvent event) {
+		logger.debug("Ant Target Started: " + event.getMessage());
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
+	 */
+	public void taskFinished(BuildEvent event) {
+		logger.debug("Ant Task Finished: " + event.getMessage());
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.apache.tools.ant.BuildListener#taskStarted(org.apache.tools.ant.BuildEvent)
+	 */
+	public void taskStarted(BuildEvent event) {
+		logger.debug("Ant Task Started: " + event.getMessage());
+
+	}
+}

Modified: forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestJob.java
Url: http://svn.apache.org/viewcvs/forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestJob.java?view=diff&rev=125498&p1=forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestJob.java&r1=125497&p2=forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestJob.java&r2=125498
==============================================================================
--- forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestJob.java	(original)
+++ forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestJob.java	Tue Jan 18 05:00:36 2005
@@ -7,7 +7,14 @@
 package org.apache.forrest.eclipse.job;
 
 import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.ListIterator;
+import java.util.Vector;
 
 import org.apache.forrest.eclipse.ForrestPlugin;
 import org.apache.forrest.eclipse.preference.ForrestPreferences;
@@ -17,60 +24,72 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.Job;
 
 /**
  * @author Ross Gardler
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
+ * 
+ * TODO To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Style - Code Templates
  */
 public abstract class ForrestJob extends Job {
 	private static final String CONCURRENT_ANT_BUILDS = "Concurrent Ant builds are possible if you specify to build in a separate JRE.";
+
 	private static final String VALIDATION_ERROR_MESSAGE = "Could not validate document";
+
 	/**
 	 * Logger for this class
 	 */
 	protected static final Logger logger = Logger.getLogger(ForrestJob.class);
 
 	public static final int EXCEPTION_UNIDENTIFIED = 1001;
+
 	public static final int EXCEPTION_VALIDATION = 1010;
+
 	public static final int EXCEPTION_ANT_RUNNING = 1020;
 
 	protected String workingDir;
-	
+
 	/**
 	 * @param name
 	 */
 	public ForrestJob(String name) {
 		super(name);
-		
+
 		ForrestPlugin plugin = ForrestPlugin.getDefault();
 		URL urlPluginDir = plugin.getBundle().getEntry("/");
+		// FIXME: Make this path relative to the project 
 		String strLog4jConf = "D:\\projects\\burrokeet\\forrestplugin\\conf\\log4j.xml";
 		DOMConfigurator.configure(strLog4jConf);
 	}
 
 	/**
-	 * Run ant as a normal executable, that is wait for completion and
-	 * retuen a status.
-	 * @param monitor - the monitor to report execution progress
-	 * @param cmdString  - the command string to pass to ant
+	 * Run ant as a normal executable, that is wait for completion and retuen a
+	 * status.
+	 * 
+	 * @param monitor -
+	 *            the monitor to report execution progress
+	 * @param cmdString -
+	 *            the command string to pass to ant
 	 * @return Status of the execution.
 	 */
 	protected IStatus runAnt(IProgressMonitor monitor, String cmdString) {
 		if (logger.isDebugEnabled()) {
 			logger.debug("runAnt(IProgressMonitor, String) - start");
 		}
-		
+
 		IStatus status = Status.OK_STATUS;
-		
+
 		if (cmdString != null) {
 			String fhome = ForrestPlugin.getDefault().getPluginPreferences()
-			  .getString(ForrestPreferences.FORREST_HOME);
-			String antFile = fhome + File.separatorChar + "main" + File.separatorChar + "forrest.build.xml";
+					.getString(ForrestPreferences.FORREST_HOME);
+			String antFile = fhome + File.separatorChar + "main"
+					+ File.separatorChar + "forrest.build.xml";
 			AntRunner runner = new AntRunner();
+			runner.setCustomClasspath(getAntClasspath());
+			runner.addBuildListener(AntBuildListener.class.getName());
 			try {
 				runner.setBuildFileLocation(antFile);
 				runner.setArguments(cmdString);
@@ -80,24 +99,89 @@
 				String userMsg;
 				String errMsg = e.getMessage();
 				if (errMsg.indexOf(VALIDATION_ERROR_MESSAGE) > 0) {
-					String file = errMsg.substring(errMsg.indexOf(VALIDATION_ERROR_MESSAGE));
+					String file = errMsg.substring(errMsg
+							.indexOf(VALIDATION_ERROR_MESSAGE));
 					userMsg = "Invalid XML Document: " + file;
-					status = new Status(Status.ERROR, ForrestPlugin.ID, ForrestRunner.EXCEPTION_VALIDATION, userMsg, e);
+					status = new Status(Status.ERROR, ForrestPlugin.ID,
+							ForrestRunner.EXCEPTION_VALIDATION, userMsg, e);
 				} else if (errMsg.endsWith(CONCURRENT_ANT_BUILDS)) {
 					userMsg = "Can only run one Site operation at a time";
-					status = new Status(Status.ERROR, ForrestPlugin.ID, EXCEPTION_ANT_RUNNING, userMsg, e);
+					status = new Status(Status.ERROR, ForrestPlugin.ID,
+							EXCEPTION_ANT_RUNNING, userMsg, e);
 				} else {
 					userMsg = "Forrest Server Exception";
-					status = new Status(Status.ERROR, ForrestPlugin.ID, ForrestRunner.EXCEPTION_UNIDENTIFIED, userMsg, e);
+					status = new Status(Status.ERROR, ForrestPlugin.ID,
+							ForrestRunner.EXCEPTION_UNIDENTIFIED, userMsg, e);
 				}
 				logger.error("run(IProgressMonitor) - " + userMsg, e);
 			}
 		}
-	
+
 		if (logger.isDebugEnabled()) {
 			logger.debug("runAnt(IProgressMonitor, String) - end");
 		}
 		return status;
 	}
+	
+	private URL[] getAntClasspath() {
+		Vector vctURLs = new Vector();
+		String forrestHome = ForrestManager.FORREST_HOME;
+
+		try {
+			// FIXME: cache the classpath
+            // add Forrest ANT jars
+			vctURLs.add(new File(ForrestManager.FORREST_ANTTASK_CLASSES).toURL());
+			ArrayList fileList = ForrestManager.getLibFiles(ForrestManager.FORREST_ANT);
+			ListIterator itr = fileList.listIterator();
+			while (itr.hasNext()) {
+				vctURLs.add(((File)itr.next()).toURL());
+			}
+			
+			// Add the path to the Plugin classes
+			String className = this.getClass().getName();
+			if (!className.startsWith("/")) {
+				className = "/" + className;
+			}
+			className = className.replace('.', '/');			
+			String classLocation = this.getClass().getClassLoader().getResource(className + ".class").toExternalForm();
+			URL classURL = Platform.resolve(new URL(classLocation.substring(0, classLocation.indexOf(className))));
+			vctURLs.add(classURL);
+			
+			// Add Plugin jars
+			URL installURL = Platform.getBundle(ForrestPlugin.ID).getEntry("/");
+			String location = Platform.resolve(installURL).getFile();
+			fileList = ForrestManager.getLibFiles(location);
+			itr = fileList.listIterator();
+			while (itr.hasNext()) {
+				vctURLs.add(((File)itr.next()).toURL());
+			}
+			
+			// add Forrest jars
+			File[] files = ForrestManager.getClasspathFiles();
+			URL[] urls = new URL[files.length];
+			for (int i = 0; i < files.length; i++) {
+				urls[i] = files[i].toURL();
+			}
+			vctURLs.addAll(Arrays.asList(urls));
+		} catch (FileNotFoundException e) {
+			logger.error("getClasspathURLS()", e);
+
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (MalformedURLException e) {
+			logger.error("getClasspathURLS()", e);
+
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			logger.error("getClasspathURLS(), cannot resolve URL", e);
+			
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 
-}
+		URL[] urls = new URL[vctURLs.size()];
+		URL[] returnURLArray = (URL[]) vctURLs.toArray(urls);
+		return returnURLArray;
+	}
+}
\ No newline at end of file

Modified: forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestManager.java
Url: http://svn.apache.org/viewcvs/forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestManager.java?view=diff&rev=125498&p1=forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestManager.java&r1=125497&p2=forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestManager.java&r2=125498
==============================================================================
--- forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestManager.java	(original)
+++ forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestManager.java	Tue Jan 18 05:00:36 2005
@@ -15,8 +15,24 @@
  */
 package org.apache.forrest.eclipse.job;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.forrest.eclipse.ForrestPlugin;
+import org.apache.forrest.eclipse.preference.ForrestPreferences;
 import org.apache.log4j.Logger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.LoadProperties;
 import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.ILaunch;
 
 /**
  * Manages instances of Forrest that are running on the local server.
@@ -28,40 +44,119 @@
 	private static final Logger logger = Logger.getLogger(ForrestManager.class);
 
 	public static final String COMMAND_BUILD = "site";
+
 	public static final String COMMAND_START = "run";
+
 	public static final String COMMAND_STOP = "stop";
-	
+
 	private static final int UNKOWN_COMMAND = 0;
+
 	private static final int BUILD = 1;
+
 	private static final int START = 2;
+
 	private static final int STOP = 3;
-	
+
 	private static final ForrestManager INSTANCE = new ForrestManager();
+
+	// FIXME: dir configuration should be in preferences and should be set by
+	// reading forrest.properties
+
+	public static final String FORREST_HOME = ForrestPlugin.getDefault()
+			.getPluginPreferences().getString(ForrestPreferences.FORREST_HOME);
+	
+	public static final String FORREST_CORE_LIB = FORREST_HOME
+			+ File.separator + "lib" + File.separator + "core" + File.separator;
+
+	public static final String FORREST_ENDORSED_LIB = FORREST_HOME
+			+ File.separator + "lib" + File.separator + "endorsed"
+			+ File.separator;
+
+	public static final String FORREST_OPTIONAL_LIB = FORREST_HOME
+			+ File.separator + "lib" + File.separator + "optional"
+			+ File.separator;
+
+	public static final String JETTY_LIB = FORREST_HOME
+			+ File.separator + "tools" + File.separator + "jetty"
+			+ File.separator;
+	
+	public static final String FORREST_CORE_WEBAPP = FORREST_HOME
+			+ File.separatorChar + "main" + File.separatorChar + "webapp";
+	
+	public static final String FORREST_JAR = FORREST_HOME
+	+ File.separatorChar + "build" + File.separatorChar + "xml-forrest.jar";
+
+	public static final String FORREST_CLASSES = FORREST_CORE_WEBAPP
+			+ File.separator + "WEB-INF" + File.separator + "classes" + File.separator;
+
+	public static final String FORREST_LIB = FORREST_HOME
+			+ File.separator + "build" + File.separator + "xml-forrest.jar";
+
+	public static final String FORREST_ANT = FORREST_HOME
+			+ File.separator + "tools" + File.separator + "ant" + File.separator;
+	
+	public static final String FORREST_ANTTASK_CLASSES = FORREST_HOME
+			+ File.separator + "tools" + File.separator + "anttasks" + File.separator;
+
+	private static final String FORREST_DEFAULT_PROPERTIES_FILE = FORREST_CORE_WEBAPP
+	+ File.separatorChar + "default-forrest.properties";
+	
+	private static ILaunch serverLaunch;
 	
 	/**
-	 * Create a manager, this is not intended to be called from your code.
-	 * Use Manager.getInstance() instead. 
+	 * Create a manager, this is not intended to be called from your code. Use
+	 * Manager.getInstance() instead.
 	 */
 	private ForrestManager() {
 		super();
-		// TODO Auto-generated constructor stub
+	}
+
+	/**
+	 * Get the properties for a working directory
+	 * @param workingDir the working dir of the project
+	 * @return the properties for this project
+	 * @throws IOException if unable to read either the defaults file or the project file
+	 * @TODO Cache the project properties file
+	 * @refactor Move project creation code to own method
+	 */
+	public Hashtable getProperties(String workingDir) throws IOException {
+		// TODO: keep a record of the projects created, this is how we will cache the properties
+		Project project = new Project();
+		project.setName(workingDir);
+		
+		LoadProperties props = new LoadProperties();
+		props.setProject(project);
+		
+		project.setProperty("project.home", workingDir);
+		
+		props.setSrcFile(new File(workingDir + File.separatorChar + "forrest.properties"));
+		props.execute();
+		
+		props.setSrcFile(new File(FORREST_DEFAULT_PROPERTIES_FILE));
+		props.execute();
+		
+		return project.getProperties();
 	}
 	
+
 	public static ForrestManager getInstance() {
 		return ForrestManager.INSTANCE;
 	}
-	
+
 	/**
-	 * Create a Forrest Job. 
-	 * @param workingDir - the directory on which the job is to work
-	 * @param cmd - the command the job is to carry out
+	 * Create a Forrest Job.
+	 * 
+	 * @param workingDir -
+	 *            the directory on which the job is to work
+	 * @param cmd -
+	 *            the command the job is to carry out
 	 * @return
 	 */
 	public Job getForrestJob(String workingDir, String cmd) {
 		Job theJob;
 		if (cmd.equals(COMMAND_STOP)) {
 			theJob = new ForrestStopper(workingDir);
-		} else if (cmd.equals(COMMAND_START)){
+		} else if (cmd.equals(COMMAND_START)) {
 			theJob = new ForrestRunner(workingDir);
 		} else if (cmd.equals(COMMAND_BUILD)) {
 			theJob = new ForrestBuilder(workingDir);
@@ -71,4 +166,89 @@
 		return theJob;
 	}
 
-}
+	/**
+	 * Get an array of Files to be placed in the
+	 * classpath for Forrest.
+	 * 
+	 * @return an array of Files
+	 */
+	protected static File[] getClasspathFiles() {
+		Vector vctFiles = new Vector();
+
+		try {
+			// FIXME: cache the classpath
+			// add Forrest classes
+			vctFiles.add(new File(FORREST_CLASSES));
+			vctFiles.add(new File(FORREST_JAR));
+			// add core libs
+			vctFiles.addAll(getLibFiles(FORREST_CORE_LIB));
+			//			 add endorsed libs
+			vctFiles.addAll(getLibFiles(FORREST_ENDORSED_LIB));
+			//			 add optional libs
+			vctFiles.addAll(getLibFiles(FORREST_OPTIONAL_LIB));
+			//			 add jetty libs
+			vctFiles.addAll(getLibFiles(JETTY_LIB));
+		} catch (FileNotFoundException e) {
+			logger.error("getClasspathFiles()", e);
+
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		File[] files = new File[vctFiles.size()];
+		File[] returnFileArray = (File[]) vctFiles.toArray(files);
+		return returnFileArray;
+	}
+
+	/**
+	 * Return an array of URLs that point to lib files.
+	 * 
+	 * @param dir -
+	 *            directory in which to look for libs
+	 * @return ArrayList of URLs
+	 * @throws FileNotFoundException -
+	 *             if the directory doesn't exist
+	 */
+	static public ArrayList getLibFiles(String dir) throws FileNotFoundException {
+		File directory = new File(dir);
+		ArrayList result = new ArrayList();
+		List dirs = Arrays.asList(directory.listFiles());
+		Iterator filesIter = dirs.iterator();
+		File file = null;
+
+		while (filesIter.hasNext()) {
+			file = (File) filesIter.next();
+
+			if (file.isDirectory()) {
+				List deeperList = getLibFiles(file.toString());
+				result.addAll(deeperList);
+			} else if (file.toString().endsWith(".jar")
+					|| file.toString().endsWith(".zip")) {
+				result.add(file);
+			}
+		}
+		
+		return result;
+	}
+
+	/**
+	 * Stop the server for the given project
+	 * 
+	 * @param projectDir
+	 * @throws InterruptedException
+	 * @throws DebugException
+	 */
+	public static void stopServer(String projectDir)
+			throws DebugException {
+		serverLaunch.terminate();
+	}
+
+	/**
+	 * Set the server launch.
+	 * @param launch - the launch
+	 */
+	public static void setServerLaunch(ILaunch launch) {
+		serverLaunch = launch;
+	}
+	
+}
\ No newline at end of file

Modified: forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestRunner.java
Url: http://svn.apache.org/viewcvs/forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestRunner.java?view=diff&rev=125498&p1=forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestRunner.java&r1=125497&p2=forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestRunner.java&r2=125498
==============================================================================
--- forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestRunner.java	(original)
+++ forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestRunner.java	Tue Jan 18 05:00:36 2005
@@ -16,28 +16,44 @@
 package org.apache.forrest.eclipse.job;
 
 import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
 
 import org.apache.forrest.eclipse.ForrestPlugin;
 import org.apache.forrest.eclipse.preference.ForrestPreferences;
 import org.apache.log4j.Logger;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
+import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
+import org.eclipse.jdt.launching.JavaRuntime;
 
 
 /**
- * Run a version of FOrrest
+ * Run a version of Forrest
  */
-public class ForrestRunner extends ForrestJob  {
+public class ForrestRunner extends ForrestJob implements IJavaLaunchConfigurationConstants{
 	/**
 	 * Logger for this class
 	 */
 	protected static final Logger logger = Logger.getLogger(ForrestRunner.class);
 	
 	private static final int EXCEPTION_UNABLE_TO_START = 2010;
-	private static final int EXCEPTION_UNABLE_TO_STOP = 2020;
 	
 	/**
-	 * Create a Forrest runner that will run a JEtty server on a given directory
+	 * Create a Forrest runner that will run a Jetty server on a given directory
 	 * @param workingDir - the working directory for the command
 	 */
 	protected ForrestRunner(String workingDir) {
@@ -46,7 +62,7 @@
 		this.workingDir = workingDir;
 	}
 	
-	/* (non-Javadoc)
+	/* Run the Forrest server in a separate thread and return that thread to the Forrest manager.
 	 * @see java.lang.Runnable#run()
 	 */
 	public IStatus run(IProgressMonitor monitor) {
@@ -54,7 +70,8 @@
 			logger.debug("run(IProgressMonitor) - start");
 		}
 		
-		IStatus status = null;
+		monitor.subTask("Initialising project");
+		IStatus status = Status.OK_STATUS;
 		String fhome = ForrestPlugin.getDefault().getPluginPreferences()
 		  .getString(ForrestPreferences.FORREST_HOME);
 		StringBuffer sb = new StringBuffer("-Dproject.home=");
@@ -62,9 +79,87 @@
 		sb.append(" -Dbasedir=");
 		sb.append(fhome + File.separatorChar + "main");
 		sb.append(" ");
-		sb.append("run");
-		
-		status = runAnt(monitor, sb.toString());    
+		sb.append("init");		
+		status = runAnt(monitor, sb.toString());
+			
+		monitor.subTask("Starting Server");
+		if(status.isOK()) {
+			ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
+			ILaunchConfigurationType type =
+			      manager.getLaunchConfigurationType(ID_JAVA_APPLICATION);
+			ILaunchConfiguration[] configurations;
+			ILaunchConfigurationWorkingCopy workingCopy;
+			try {
+				configurations = manager.getLaunchConfigurations(type);
+				for (int i = 0; i < configurations.length; i++) {
+			      ILaunchConfiguration configuration = configurations[i];
+			      if (configuration.getName().equals("Start Jetty")) {
+			         configuration.delete();
+			         break;
+			      }
+			   }
+			   workingCopy = type.newInstance(null, "Start Jetty");
+			   workingCopy.setAttribute(ATTR_MAIN_TYPE_NAME,
+	              "org.mortbay.jetty.Server");
+			   // TODO: allow project specific jettyconf.xml
+			   String args = ForrestManager.FORREST_CORE_WEBAPP + File.separatorChar + "jettyconf.xml";
+			   workingCopy.setAttribute(ATTR_PROGRAM_ARGUMENTS, args);
+			   
+			   List classpath = new ArrayList();
+			   
+			   File[] files = ForrestManager.getClasspathFiles();
+			   IPath classpathEntryPath;
+			   IRuntimeClasspathEntry classpathEntry;
+			   for (int i = 0; i < files.length; i++) {
+				   classpathEntryPath = new Path(files[i].getAbsolutePath());
+				   classpathEntry = JavaRuntime.newArchiveRuntimeClasspathEntry(classpathEntryPath);
+				   classpathEntry.setClasspathProperty(IRuntimeClasspathEntry.USER_CLASSES);
+				   classpath.add(classpathEntry.getMemento());
+			   }
+			   
+			   IPath systemLibsPath = new Path(JavaRuntime.JRE_CONTAINER);
+			   IRuntimeClasspathEntry systemLibsEntry =
+			      JavaRuntime.newRuntimeContainerClasspathEntry(systemLibsPath,
+			         IRuntimeClasspathEntry.STANDARD_CLASSES);
+			   classpath.add(systemLibsEntry.getMemento());
+			   
+			   workingCopy.setAttribute(ATTR_CLASSPATH, classpath);
+			   workingCopy.setAttribute(ATTR_DEFAULT_CLASSPATH, false);
+			   
+			   ForrestManager forrestManager = ForrestManager.getInstance();
+			   Hashtable props = forrestManager.getProperties(workingDir);
+			   
+			   String propName;
+			   String propValue;
+			   StringBuffer sbVars = new StringBuffer();
+			   for (Enumeration e = props.keys() ; e.hasMoreElements() ;) {
+		         propName = (String)e.nextElement();
+		         propValue = (String)props.get(propName);
+			   	 sbVars.append("-D");
+			   	 sbVars.append(propName);
+			   	 sbVars.append("=");
+			   	 sbVars.append(propValue);
+			   	 sbVars.append(" ");
+		         if (logger.isInfoEnabled()) {
+					logger.info("Project property  : " + propName + " = " + propValue);
+				 } 
+		       }
+			   
+			   String strEndorsedLibs = "-Djava.endorsed.dirs=\"" + ForrestManager.FORREST_ENDORSED_LIB + "\"";
+			   workingCopy.setAttribute(ATTR_VM_ARGUMENTS,
+			        sbVars.toString() + strEndorsedLibs);
+			   
+			   workingCopy.setAttribute(ATTR_WORKING_DIRECTORY, ForrestManager.FORREST_CORE_WEBAPP);
+			   
+			   ILaunchConfiguration jettyConfig = workingCopy.doSave();
+			   //DebugUITools.launch(configuration, ILaunchManager.RUN_MODE);
+			   ForrestManager.setServerLaunch( jettyConfig.launch(ILaunchManager.RUN_MODE, monitor));
+			} catch (CoreException e) {
+				logger.error("run(IProgressMonitor)", e);
+			} catch (IOException e) {
+				logger.error("run(IProgressMonitor)", e);
+			}
+		}
 		
 		if (logger.isDebugEnabled()) {
 			logger.debug("run(IProgressMonitor) - end");

Modified: forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestStopper.java
Url: http://svn.apache.org/viewcvs/forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestStopper.java?view=diff&rev=125498&p1=forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestStopper.java&r1=125497&p2=forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestStopper.java&r2=125498
==============================================================================
--- forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestStopper.java	(original)
+++ forrest/trunk/tools/eclipse/src/org/apache/forrest/eclipse/job/ForrestStopper.java	Tue Jan 18 05:00:36 2005
@@ -15,9 +15,12 @@
  */
 package org.apache.forrest.eclipse.job;
 
+import org.apache.forrest.eclipse.ForrestPlugin;
 import org.apache.log4j.Logger;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugException;
 
 
 /**
@@ -29,6 +32,8 @@
 	 */
 	protected static final Logger logger = Logger.getLogger(ForrestStopper.class);
 	
+	private static final int EXCEPTION_UNABLE_TO_STOP = 3010;
+	
 	/**
 	 * Create a Forrest runner that will run a JEtty server on a given directory
 	 * @param workingDir - the working directory for the command
@@ -49,8 +54,15 @@
 		
 		IStatus status = null;
 
-		logger.warn("run() - Forrest server not stopped", null);
-	
+		try {
+			ForrestManager.stopServer(workingDir);
+			logger.info("run() - Forrest server stopped");
+			status = Status.OK_STATUS;
+		} catch (DebugException e) {
+			logger.error("run(IProgressMonitor)", e);
+			status = new Status(Status.ERROR, ForrestPlugin.ID, ForrestStopper.EXCEPTION_UNABLE_TO_STOP, "Unable to stop Forrest Server", e);
+		}
+		
 		if (logger.isDebugEnabled()) {
 			logger.debug("run(IProgressMonitor) - end");
 		}