implementations. PR: 21421, 29248 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276809 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -44,6 +44,9 @@ Other changes: | |||||
| Compilers can be selected using the compiler attribute, which defaults | Compilers can be selected using the compiler attribute, which defaults | ||||
| to "microsoft" on windows, and "mono" on everything else. | to "microsoft" on windows, and "mono" on everything else. | ||||
| * Refactored Target invocation into org.apache.tools.ant.Executor | |||||
| implementations. Bugzilla Reports 21421, 29248. | |||||
| Changes from Ant 1.6.2 to current Ant 1.6 CVS version | Changes from Ant 1.6.2 to current Ant 1.6 CVS version | ||||
| ===================================================== | ===================================================== | ||||
| @@ -229,6 +229,13 @@ And I filtered out the <i>getPropertyHelper</i> access.</p> | |||||
| <th>valid values /default value</th> | <th>valid values /default value</th> | ||||
| <th>description</th> | <th>description</th> | ||||
| </tr> | </tr> | ||||
| <tr> | |||||
| <td><code>ant.executor.class</code></td> | |||||
| <td>classname; default is org.apache.tools.ant.helper.DefaultExecutor</td> | |||||
| <td><b>Since Ant 1.6.3</b> Ant will delegate Target invocation to the | |||||
| org.apache.tools.ant.Executor implementation specified here. | |||||
| </td> | |||||
| </tr> | |||||
| <tr> | <tr> | ||||
| <td><code>ant.input.properties</code></td> | <td><code>ant.input.properties</code></td> | ||||
| <td>filename (required)</td> | <td>filename (required)</td> | ||||
| @@ -473,4 +480,4 @@ classpath possible, generally just the ant-launcher.jar. | |||||
| Reserved.</p> | Reserved.</p> | ||||
| </body> | </body> | ||||
| </html> | |||||
| </html> | |||||
| @@ -0,0 +1,34 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant; | |||||
| /** | |||||
| * Target executor abstraction. | |||||
| * @since Ant 1.6.3 | |||||
| */ | |||||
| public interface Executor { | |||||
| /** | |||||
| * Execute the specified Targets for the specified Project. | |||||
| * @param project the Ant Project. | |||||
| * @param targetNames String[] of Target names. | |||||
| * @throws BuildException. | |||||
| */ | |||||
| void executeTargets(Project project, String[] targetNames) | |||||
| throws BuildException; | |||||
| } | |||||
| @@ -33,6 +33,8 @@ import java.util.Set; | |||||
| import java.util.HashSet; | import java.util.HashSet; | ||||
| import org.apache.tools.ant.input.DefaultInputHandler; | import org.apache.tools.ant.input.DefaultInputHandler; | ||||
| import org.apache.tools.ant.input.InputHandler; | import org.apache.tools.ant.input.InputHandler; | ||||
| import org.apache.tools.ant.helper.DefaultExecutor; | |||||
| import org.apache.tools.ant.helper.KeepGoingExecutor; | |||||
| import org.apache.tools.ant.types.FilterSet; | import org.apache.tools.ant.types.FilterSet; | ||||
| import org.apache.tools.ant.types.FilterSetCollection; | import org.apache.tools.ant.types.FilterSetCollection; | ||||
| import org.apache.tools.ant.types.Description; | import org.apache.tools.ant.types.Description; | ||||
| @@ -764,7 +766,9 @@ public class Project { | |||||
| /** | /** | ||||
| * Sets "keep-going" mode. In this mode ANT will try to execute | * Sets "keep-going" mode. In this mode ANT will try to execute | ||||
| * as many targets as possible. All targets that do not depend | * as many targets as possible. All targets that do not depend | ||||
| * on failed target(s) will be executed. | |||||
| * on failed target(s) will be executed. If the keepGoing settor/getter | |||||
| * methods are used in conjunction with the <code>ant.executor.class</code> | |||||
| * property, they will have no effect. | |||||
| * @param keepGoingMode "keep-going" mode | * @param keepGoingMode "keep-going" mode | ||||
| * @since Ant 1.6 | * @since Ant 1.6 | ||||
| */ | */ | ||||
| @@ -773,7 +777,9 @@ public class Project { | |||||
| } | } | ||||
| /** | /** | ||||
| * Returns the keep-going mode. | |||||
| * Returns the keep-going mode. If the keepGoing settor/getter | |||||
| * methods are used in conjunction with the <code>ant.executor.class</code> | |||||
| * property, they will have no effect. | |||||
| * @return "keep-going" mode | * @return "keep-going" mode | ||||
| * @since Ant 1.6 | * @since Ant 1.6 | ||||
| */ | */ | ||||
| @@ -1054,19 +1060,38 @@ public class Project { | |||||
| */ | */ | ||||
| public void executeTargets(Vector targetNames) throws BuildException { | public void executeTargets(Vector targetNames) throws BuildException { | ||||
| BuildException thrownException = null; | |||||
| for (int i = 0; i < targetNames.size(); i++) { | |||||
| Object o = getReference("ant.executor"); | |||||
| if (o == null) { | |||||
| String classname = getProperty("ant.executor.class"); | |||||
| if (classname == null) { | |||||
| classname = (keepGoingMode) | |||||
| ? KeepGoingExecutor.class.getName() | |||||
| : DefaultExecutor.class.getName(); | |||||
| } | |||||
| log("Attempting to create object of type " + classname, MSG_DEBUG); | |||||
| try { | try { | ||||
| executeTarget((String) targetNames.elementAt(i)); | |||||
| } catch (BuildException ex) { | |||||
| if (!(keepGoingMode)) { | |||||
| throw ex; // Throw further | |||||
| o = Class.forName(classname, true, coreLoader).newInstance(); | |||||
| } catch (ClassNotFoundException seaEnEfEx) { | |||||
| //try the current classloader | |||||
| try { | |||||
| o = Class.forName(classname).newInstance(); | |||||
| } catch (Exception ex) { | |||||
| log(ex.toString(), MSG_ERR); | |||||
| } | } | ||||
| thrownException = ex; | |||||
| } catch (Exception ex) { | |||||
| log(ex.toString(), MSG_ERR); | |||||
| } | |||||
| if (o != null) { | |||||
| addReference("ant.executor", o); | |||||
| } | } | ||||
| } | } | ||||
| if (thrownException != null) { | |||||
| throw thrownException; | |||||
| if (o == null) { | |||||
| throw new BuildException("Unable to obtain a Target Executor instance."); | |||||
| } else { | |||||
| String[] targetNameArray = (String[])(targetNames.toArray( | |||||
| new String[targetNames.size()])); | |||||
| ((Executor)o).executeTargets(this, targetNameArray); | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,40 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.helper; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Executor; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| /** | |||||
| * Default Target executor implementation. | |||||
| * @since Ant 1.6.3 | |||||
| */ | |||||
| public class DefaultExecutor implements Executor { | |||||
| //inherit doc | |||||
| public void executeTargets(Project project, String[] targetNames) | |||||
| throws BuildException { | |||||
| for (int i = 0; i < targetNames.length; i++) { | |||||
| project.executeTarget(targetNames[i]); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,48 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.helper; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Executor; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| /** | |||||
| * "Keep-going" Target executor implementation. | |||||
| * @since Ant 1.6.3 | |||||
| */ | |||||
| public class KeepGoingExecutor implements Executor { | |||||
| //inherit doc | |||||
| public void executeTargets(Project project, String[] targetNames) | |||||
| throws BuildException { | |||||
| BuildException thrownException = null; | |||||
| for (int i = 0; i < targetNames.length; i++) { | |||||
| try { | |||||
| project.executeTarget(targetNames[i]); | |||||
| } catch (BuildException ex) { | |||||
| thrownException = ex; | |||||
| } | |||||
| } | |||||
| if (thrownException != null) { | |||||
| throw thrownException; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,41 @@ | |||||
| /* | |||||
| * Copyright 2004 The Apache Software Foundation | |||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| * you may not use this file except in compliance with the License. | |||||
| * You may obtain a copy of the License at | |||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | |||||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| * See the License for the specific language governing permissions and | |||||
| * limitations under the License. | |||||
| * | |||||
| */ | |||||
| package org.apache.tools.ant.helper; | |||||
| import java.util.Vector; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Executor; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| /** | |||||
| * "Single-check" Target executor implementation. | |||||
| * @since Ant 1.6.3 | |||||
| */ | |||||
| public class SingleCheckExecutor implements Executor { | |||||
| //inherit doc | |||||
| public void executeTargets(Project project, String[] targetNames) | |||||
| throws BuildException { | |||||
| project.executeSortedTargets( | |||||
| project.topoSort(targetNames, project.getTargets(), false)); | |||||
| } | |||||
| } | |||||
| @@ -36,6 +36,7 @@ import org.apache.tools.ant.ProjectComponent; | |||||
| import org.apache.tools.ant.ProjectHelper; | import org.apache.tools.ant.ProjectHelper; | ||||
| import org.apache.tools.ant.Target; | import org.apache.tools.ant.Target; | ||||
| import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
| import org.apache.tools.ant.helper.SingleCheckExecutor; | |||||
| import org.apache.tools.ant.types.PropertySet; | import org.apache.tools.ant.types.PropertySet; | ||||
| import org.apache.tools.ant.util.FileUtils; | import org.apache.tools.ant.util.FileUtils; | ||||
| @@ -62,6 +63,9 @@ import org.apache.tools.ant.util.FileUtils; | |||||
| */ | */ | ||||
| public class Ant extends Task { | public class Ant extends Task { | ||||
| /** Target Executor */ | |||||
| private static SingleCheckExecutor executor = new SingleCheckExecutor(); | |||||
| /** the basedir where is executed the build file */ | /** the basedir where is executed the build file */ | ||||
| private File dir = null; | private File dir = null; | ||||
| @@ -394,11 +398,8 @@ public class Ant extends Task { | |||||
| try { | try { | ||||
| log("Entering " + antFile + "...", Project.MSG_VERBOSE); | log("Entering " + antFile + "...", Project.MSG_VERBOSE); | ||||
| newProject.fireSubBuildStarted(); | newProject.fireSubBuildStarted(); | ||||
| String[] nameArray = | |||||
| (String[])(locals.toArray(new String[locals.size()])); | |||||
| newProject.executeSortedTargets(newProject.topoSort( | |||||
| nameArray, newProject.getTargets(), false)); | |||||
| executor.executeTargets(newProject, | |||||
| (String[])(locals.toArray(new String[locals.size()]))); | |||||
| } catch (BuildException ex) { | } catch (BuildException ex) { | ||||
| t = ProjectHelper | t = ProjectHelper | ||||