|
|
@@ -1,283 +0,0 @@ |
|
|
|
/* |
|
|
|
* The Apache Software License, Version 1.1 |
|
|
|
* |
|
|
|
* Copyright (c) 1999, 2000 The Apache Software Foundation. All rights |
|
|
|
* reserved. |
|
|
|
* |
|
|
|
* Redistribution and use in source and binary forms, with or without |
|
|
|
* modification, are permitted provided that the following conditions |
|
|
|
* are met: |
|
|
|
* |
|
|
|
* 1. Redistributions of source code must retain the above copyright |
|
|
|
* notice, this list of conditions and the following disclaimer. |
|
|
|
* |
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
|
|
|
* notice, this list of conditions and the following disclaimer in |
|
|
|
* the documentation and/or other materials provided with the |
|
|
|
* distribution. |
|
|
|
* |
|
|
|
* 3. The end-user documentation included with the redistribution, if |
|
|
|
* any, must include the following acknowlegement: |
|
|
|
* "This product includes software developed by the |
|
|
|
* Apache Software Foundation (http://www.apache.org/)." |
|
|
|
* Alternately, this acknowlegement may appear in the software itself, |
|
|
|
* if and wherever such third-party acknowlegements normally appear. |
|
|
|
* |
|
|
|
* 4. The names "The Jakarta Project", "Ant", and "Apache Software |
|
|
|
* Foundation" must not be used to endorse or promote products derived |
|
|
|
* from this software without prior written permission. For written |
|
|
|
* permission, please contact apache@apache.org. |
|
|
|
* |
|
|
|
* 5. Products derived from this software may not be called "Apache" |
|
|
|
* nor may "Apache" appear in their names without prior written |
|
|
|
* permission of the Apache Group. |
|
|
|
* |
|
|
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
|
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|
|
|
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR |
|
|
|
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
|
|
|
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
|
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
|
|
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
|
|
* SUCH DAMAGE. |
|
|
|
* ==================================================================== |
|
|
|
* |
|
|
|
* This software consists of voluntary contributions made by many |
|
|
|
* individuals on behalf of the Apache Software Foundation. For more |
|
|
|
* information on the Apache Software Foundation, please see |
|
|
|
* <http://www.apache.org/>. |
|
|
|
*/ |
|
|
|
package org.apache.tools.ant.gui.core; |
|
|
|
|
|
|
|
import org.apache.tools.ant.*; |
|
|
|
import org.apache.tools.ant.gui.*; |
|
|
|
import org.apache.tools.ant.gui.event.*; |
|
|
|
import org.apache.tools.ant.gui.acs.ElementTreeSelectionModel; |
|
|
|
import org.apache.tools.ant.gui.acs.*; |
|
|
|
import java.io.File; |
|
|
|
import java.io.Writer; |
|
|
|
import java.io.IOException; |
|
|
|
import javax.swing.tree.TreeModel; |
|
|
|
import javax.swing.text.Document; |
|
|
|
import javax.swing.tree.TreeSelectionModel; |
|
|
|
import javax.swing.event.TreeSelectionEvent; |
|
|
|
import javax.swing.event.TreeSelectionListener; |
|
|
|
import java.util.*; |
|
|
|
import org.xml.sax.SAXException; |
|
|
|
|
|
|
|
/** |
|
|
|
* This class provides the gateway interface to the data model for |
|
|
|
* the application. The translation between the Ant datamodel, |
|
|
|
* (or other external datamodel) occurs. This class also provides various |
|
|
|
* views into the data model, such as TreeModel, Documenet, etc. |
|
|
|
* |
|
|
|
* @version $Revision$ |
|
|
|
* @author Simeon Fitch |
|
|
|
*/ |
|
|
|
public class ProjectProxy { |
|
|
|
|
|
|
|
/** Application context */ |
|
|
|
private AppContext _context = null; |
|
|
|
/** The file where the project was last saved. */ |
|
|
|
private File _file = null; |
|
|
|
/** The real Ant Project instance. */ |
|
|
|
private ACSProjectElement _project = null; |
|
|
|
/** The current thread executing a build. */ |
|
|
|
private Thread _buildThread = null; |
|
|
|
/** The selection model for selected targets. */ |
|
|
|
private ElementTreeSelectionModel _selections = null; |
|
|
|
|
|
|
|
/** |
|
|
|
* File loading ctor. |
|
|
|
* |
|
|
|
* @param file File containing build file to load. |
|
|
|
*/ |
|
|
|
public ProjectProxy(AppContext context, File file) |
|
|
|
throws IOException, SAXException { |
|
|
|
_file = file; |
|
|
|
_context = context; |
|
|
|
loadProject(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Load the project from the build file. |
|
|
|
* |
|
|
|
*/ |
|
|
|
private void loadProject() throws IOException, SAXException { |
|
|
|
_project = ACSFactory.getInstance().load(_file); |
|
|
|
_selections = new ElementTreeSelectionModel(); |
|
|
|
_selections.addTreeSelectionListener(new SelectionForwarder()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Write the project in XML format to the given output. |
|
|
|
* |
|
|
|
* @param out Output to write to. |
|
|
|
*/ |
|
|
|
public void write(Writer out) throws IOException { |
|
|
|
if(_project == null) return; |
|
|
|
|
|
|
|
_project.write(out); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Build the project with the current target (or the default target |
|
|
|
* if none is selected. Build occurs on a separate thread, so method |
|
|
|
* returns immediately. |
|
|
|
* |
|
|
|
*/ |
|
|
|
public void build() throws BuildException { |
|
|
|
Project project = new Project(); |
|
|
|
project.init(); |
|
|
|
// XXX there is a bunch of stuff in the class |
|
|
|
// org.apache.tools.ant.Main that needs to be |
|
|
|
// refactored out so that it doesn't have to be |
|
|
|
// replicated here. |
|
|
|
|
|
|
|
// XXX need to provide a way to pass in externally |
|
|
|
// defined properties. Perhaps define an external |
|
|
|
// Antidote properties file. JAVA_HOME may have to be set, |
|
|
|
// as well as checking the .ant.properties |
|
|
|
project.setUserProperty("ant.file" , _file.getAbsolutePath()); |
|
|
|
ProjectHelper.configureProject(project, _file); |
|
|
|
|
|
|
|
|
|
|
|
_buildThread = new Thread(new BuildRunner(project)); |
|
|
|
_buildThread.start(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Get the file where the project is saved to. If the project |
|
|
|
* is a new one that has never been saved the this will return null. |
|
|
|
* |
|
|
|
* @return Project file, or null if not save yet. |
|
|
|
*/ |
|
|
|
public File getFile() { |
|
|
|
return _file; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Set the file that this is to be saved to. |
|
|
|
* |
|
|
|
* @param file File to save to. |
|
|
|
*/ |
|
|
|
public void setFile(File file) { |
|
|
|
_file = file; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Get the TreeModel perspective on the data. |
|
|
|
* |
|
|
|
* @return TreeModel view on project. |
|
|
|
*/ |
|
|
|
public TreeModel getTreeModel() { |
|
|
|
if(_project != null) { |
|
|
|
return new ElementTreeModel(_project); |
|
|
|
} |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Get the tree selection model for selected targets. |
|
|
|
* |
|
|
|
* @return Selection model. |
|
|
|
*/ |
|
|
|
public ElementTreeSelectionModel getTreeSelectionModel() { |
|
|
|
return _selections; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** Class for executing the build in a separate thread. */ |
|
|
|
private class BuildRunner implements Runnable { |
|
|
|
/** The project to execute build on. */ |
|
|
|
private Project _project = null; |
|
|
|
|
|
|
|
/** |
|
|
|
* Standard ctor. |
|
|
|
* |
|
|
|
* @param project Project to execute build on. |
|
|
|
*/ |
|
|
|
public BuildRunner(Project project) { |
|
|
|
_project = project; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Convenience method for causeing the project to fire a build event. |
|
|
|
* Implemented because the corresponding method in the Project class |
|
|
|
* is not publically accessible. |
|
|
|
* |
|
|
|
* @param event Event to fire. |
|
|
|
*/ |
|
|
|
private void fireBuildEvent(BuildEvent event, BuildEventType type) { |
|
|
|
Enumeration enum = _project.getBuildListeners().elements(); |
|
|
|
while(enum.hasMoreElements()) { |
|
|
|
BuildListener l = (BuildListener) enum.nextElement(); |
|
|
|
type.fireEvent(event, l); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Run the build. |
|
|
|
* |
|
|
|
*/ |
|
|
|
public void run() { |
|
|
|
// Add the build listeners |
|
|
|
BuildListener[] listeners = _context.getBuildListeners(); |
|
|
|
for(int i = 0; i < listeners.length; i++) { |
|
|
|
_project.addBuildListener(listeners[i]); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
fireBuildEvent(new BuildEvent( |
|
|
|
_project), BuildEventType.BUILD_STARTED); |
|
|
|
|
|
|
|
// Generate list of targets to execute. |
|
|
|
ACSTargetElement[] targets = _selections.getSelectedTargets(); |
|
|
|
Vector targetNames = new Vector(); |
|
|
|
if(targets.length == 0) { |
|
|
|
targetNames.add(_project.getDefaultTarget()); |
|
|
|
} |
|
|
|
else { |
|
|
|
for(int i = 0; i < targets.length; i++) { |
|
|
|
targetNames.add(targets[i].getName()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Execute build on selected targets. XXX It would be |
|
|
|
// nice if the Project API supported passing in target |
|
|
|
// objects rather than String names. |
|
|
|
_project.executeTargets(targetNames); |
|
|
|
} |
|
|
|
catch(BuildException ex) { |
|
|
|
BuildEvent errorEvent = new BuildEvent(_project); |
|
|
|
errorEvent.setException(ex); |
|
|
|
errorEvent.setMessage(ex.getMessage(), Project.MSG_ERR); |
|
|
|
fireBuildEvent(errorEvent, BuildEventType.MESSAGE_LOGGED); |
|
|
|
} |
|
|
|
finally { |
|
|
|
fireBuildEvent(new BuildEvent( |
|
|
|
_project), BuildEventType.BUILD_FINISHED); |
|
|
|
|
|
|
|
// Remove the build listeners. |
|
|
|
for(int i = 0; i < listeners.length; i++) { |
|
|
|
_project.removeBuildListener(listeners[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** Forwards selection events to the event bus. */ |
|
|
|
private class SelectionForwarder implements TreeSelectionListener { |
|
|
|
public void valueChanged(TreeSelectionEvent e) { |
|
|
|
_context.getEventBus().postEvent(ElementSelectionEvent.createEvent( |
|
|
|
_context, _selections.getSelectedElements())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |