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");
                }

Reply via email to