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 <prantl@users.sourceforge.net>
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 }