001    // Copyright 2005-2006 Ferdinand Prantl <prantl@users.sourceforge.net>
002    // Copyright 2001-2004 The Apache Software Foundation
003    // All rights reserved.
004    //
005    // Licensed under the Apache License, Version 2.0 (the "License");
006    // you may not use this file except in compliance with the License.
007    // You may obtain a copy of the License at
008    //
009    // http://www.apache.org/licenses/LICENSE-2.0
010    //
011    // Unless required by applicable law or agreed to in writing, software
012    // distributed under the License is distributed on an "AS IS" BASIS,
013    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014    // See the License for the specific language governing permissions and
015    // limitations under the License.
016    //
017    // See http://ant-eclipse.sourceforge.net for the most recent version
018    // and more information.
019    
020    package prantl.ant.eclipse;
021    
022    import java.io.File;
023    
024    import org.apache.tools.ant.BuildException;
025    import org.apache.tools.ant.Task;
026    
027    /**
028     * Generates project configuration files for Eclipse. Writes files .project and .classpath
029     * for the Eclipse IDE using the settings from the Ant script. The configuration for the
030     * task is stored in an object of the class EclipseElement and the actual output is
031     * delegated into an implementation of the interface EclipseOutput.
032     * 
033     * @see EclipseElement
034     * @since Ant-Eclipse 1.0
035     * @author Ferdinand Prantl &lt;prantl@users.sourceforge.net&gt;
036     */
037    public class EclipseTask extends Task {
038    
039        private EclipseElement eclipse;
040    
041        private EclipseOutput output;
042    
043        /**
044         * Creates a new instance of the task. Default constructor, to be called by ant in the
045         * productive environment.
046         * 
047         * @since Ant-Eclipse 1.0
048         */
049        public EclipseTask() {
050            eclipse = new EclipseElement();
051            output = null;
052        }
053    
054        /**
055         * Creates a new instance of the task. Testing constructor, to be called in unit tests
056         * only.
057         * 
058         * @param object
059         *        An object that the output is delegated into.
060         * @throws NullPointerException
061         *         If the parameter <tt>object</tt> is null.
062         * @since Ant-Eclipse 1.0
063         */
064        protected EclipseTask(EclipseOutput object) {
065            eclipse = object.getEclipse();
066            output = object;
067        }
068    
069        /**
070         * Returns the internal object containing the configuration. The method is supposed to
071         * be used in unit tests only.
072         * 
073         * @return The internal object containing the configuration.
074         * @since Ant-Eclipse 1.0
075         */
076        EclipseElement getEclipse() {
077            return eclipse;
078        }
079    
080        /**
081         * Returns the internal object performing the output. The method is supposed to be
082         * used in unit tests only.
083         * 
084         * @return The internal object performing the output.
085         * @since Ant-Eclipse 1.0
086         */
087        EclipseOutput getOutput() {
088            return output;
089        }
090    
091        /**
092         * If true, stop the build process if the generation of the project files fails.
093         * 
094         * @param value
095         *        <tt>True</tt> if it should halt, otherwise <tt>false</tt>.
096         * @since Ant-Eclipse 1.0
097         */
098        public void setFailOnError(boolean value) {
099            eclipse.setFailOnError(value);
100        }
101    
102        /**
103         * Property to set to "true" if there is an error in the generation of the project
104         * files.
105         * 
106         * @param name
107         *        A name of the property to set in case of an error.
108         * @since Ant-Eclipse 1.0
109         */
110        public void setErrorProperty(String name) {
111            eclipse.setErrorProperty(name);
112        }
113    
114        /**
115         * High-level project creation mode controlling defaults for the generated files and
116         * changing behavior according to the specified project type, which usually responds
117         * to the chosen development toolkit.
118         * 
119         * @param value
120         *        A project creation mode.
121         * @since Ant-Eclipse 1.0
122         */
123        public void setMode(EclipseElement.Mode value) {
124            eclipse.setMode(value);
125        }
126    
127        /**
128         * Sets if the generated files are to be written always or only if the Ant build
129         * script has been changed. The latter is default.
130         * 
131         * @param flag
132         *        <tt>True</tt> if the files should always be overwritten, otherwise
133         *        <tt>false</tt>.
134         * @since Ant-Eclipse 1.0
135         */
136        public void setUpdateAlways(boolean flag) {
137            eclipse.setUpdateAlways(flag);
138        }
139    
140        /**
141         * Sets the destination directory to place generated files into.
142         * 
143         * @param dir
144         *        A directory to place output files into.
145         * @since Ant-Eclipse 1.0
146         */
147        public void setDestDir(File dir) {
148            eclipse.setDestDir(dir);
149        }
150    
151        /**
152         * Adds a definition of the settings element. Files in the directory
153         * <tt>.settings</tt> will be generated according to settings in this object. Only
154         * one settings element is allowed.
155         * 
156         * @return A definition of the settings element.
157         * @throws BuildException
158         *         If another settings element has been defined.
159         * @since Ant-Eclipse 1.0
160         */
161        public SettingsElement createSettings() {
162            eclipse.setSettings(new SettingsElement());
163            return eclipse.getSettings();
164        }
165    
166        /**
167         * Adds a definition of the project element. The file .project will be generated
168         * according to settings in this object. Only one project element is allowed.
169         * 
170         * @return A definition of the project element.
171         * @throws BuildException
172         *         If another project element has been defined.
173         * @since Ant-Eclipse 1.0
174         */
175        public ProjectElement createProject() {
176            eclipse.setProject(new ProjectElement());
177            return eclipse.getProject();
178        }
179    
180        /**
181         * Adds a definition of the classpath element. The file .classpath will be generated
182         * according to settings in this object. Only one classpath element is allowed.
183         * 
184         * @return A definition of the classpath element.
185         * @throws BuildException
186         *         If another classpath element has been defined.
187         * @since Ant-Eclipse 1.0
188         */
189        public ClassPathElement createClassPath() {
190            eclipse.setClassPath(new ClassPathElement());
191            return eclipse.getClassPath();
192        }
193    
194        /**
195         * Generates the output files. Eventually existing files will be overwritten only if
196         * the timestamp of the ant project file is newer as the timestamp of a particular
197         * file.
198         * 
199         * @throws BuildException
200         *         In case of misconfiguration or errors.
201         * @since Ant-Eclipse 1.0
202         */
203        public void execute() throws BuildException {
204            if (output == null)
205                output = new FileEclipseOutput(this);
206            new SettingsGenerator(this).generate();
207            new ProjectGenerator(this).generate();
208            new ClassPathGenerator(this).generate();
209        }
210    
211    }