- introduce a <projecthelper> task to install project helpers dynamically, especially usefull for unit testing git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@980536 13f79535-47bb-0310-9956-ffa450edef68master
@@ -92,7 +92,7 @@ Fixed bugs: | |||
Bugzilla Report 49041. | |||
* The <restrict> resource collection was checking every resource even if | |||
we actually just want the first one, like in the exemple of use of | |||
we actually just want the first one, like in the example of use of | |||
resourcelist in the documentation (getting the first available resource | |||
from a mirror list). | |||
@@ -142,6 +142,13 @@ Other changes: | |||
timestamps in various tasks. | |||
Bugzilla Report 49485. | |||
* ProjectHelpers can now be installed dynamically via the <projecthelper> | |||
Ant task. | |||
* <import> is now able to switch to the proper ProjectHelper to parse | |||
the imported resource. This means that several kinds of different build | |||
files can import each other. | |||
Changes from Ant 1.8.0 TO Ant 1.8.1 | |||
=================================== | |||
@@ -29,20 +29,28 @@ | |||
</p> | |||
<p> | |||
<b>Note</b> this task heavily relies on the ProjectHelper | |||
On execution it will select the proper ProjectHelper to parse the imported | |||
file, using the same algorithm as the one executed at | |||
<a href="../projecthelper.html">startup</a>. The selected ProjectHelper | |||
instance will then be responsible to actually parse the imported file. | |||
</p> | |||
<p> | |||
<b>Note</b> as seen above, this task heavily relies on the ProjectHelper | |||
implementation and doesn't really perform any work of its own. If | |||
you have configured Ant to use a ProjectHelper other than Ant's | |||
default, this task may or may not work. | |||
</p> | |||
<p> | |||
On execution it will read another Ant file into | |||
the same Project. This means that it basically works like the | |||
In the common use case where only Ant's default project helper is | |||
used, it basically works like the | |||
<a href="http://ant.apache.org/faq.html#xml-entity-include">Entity | |||
Includes as explained in the Ant FAQ</a>, as if the imported file was | |||
contained in the importing file, minus the top <code><project></code> | |||
tag. | |||
</p> | |||
<p> | |||
The import task may only be used as a top-level task. This means that | |||
it may not be used in a target. | |||
@@ -0,0 +1,59 @@ | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Language" content="en-us"> | |||
<link rel="stylesheet" type="text/css" href="../stylesheets/style.css"> | |||
<title>ProjectHelper Task</title> | |||
</head> | |||
<body> | |||
<h2>ProjectHelper</h2> | |||
<h3>Description</h3> | |||
<p>This task is provided for the purpose of allowing the user to install a different | |||
ProjectHelper at runtime. | |||
</p> | |||
<p>The helpers will be added after all the already registered helpers, but before | |||
the default one (ProjectHelper2) | |||
</p> | |||
<p>See the description of Ant's | |||
<a href="../projecthelper.html">Project Helper</a> for more information. | |||
</p> | |||
<p><b>Since Ant 1.8.2</b></p> | |||
<h3>Parameters specified as nested elements</h3> | |||
You may specify many configured <code>org.apache.tools.ant.ProjectHelper</code> instances. | |||
<h3>Example</h3> | |||
<p>Install a custom ProjectHelper implementation | |||
(assuming <code>MyProjectHelper extends ProjectHelper</code>):</p> | |||
<pre> | |||
<typedef classname="org.example.MyProjectHelper" | |||
name="myprojecthelper"/> | |||
<projecthelper> | |||
<myprojecthelper/> | |||
</projecthelper> | |||
</pre> | |||
</body> | |||
</html> | |||
@@ -47,6 +47,12 @@ been done around a pure java frontend, and a groovy one too (ask the dev mailing | |||
list for further info about these). | |||
</p> | |||
<p>Since Ant 1.8.2, the <a href="Tasks/import.html">import</a> task will also | |||
try to use the proper helper to parse the imported file. So it is possible to | |||
write different build files in different languages and have them import each | |||
other. | |||
</p> | |||
<h2><a name="repository">How is Ant is selecting the proper ProjectHelper</a></h2> | |||
<p> | |||
@@ -122,7 +128,7 @@ capable of and what is is expecting: | |||
</p> | |||
<p> | |||
Now that you have your implementation ready, you have to declare it to Ant. Two | |||
Now that you have your implementation ready, you have to declare it to Ant. Three | |||
solutions here: | |||
<ul> | |||
<li>use the system property <code>org.apache.tools.ant.ProjectHelper</code> | |||
@@ -132,6 +138,10 @@ solutions here: | |||
<code>META-INF/services/org.apache.tools.ant.ProjectHelper</code>. | |||
And then in this file just put the fully qualified name of your | |||
implementation</li> | |||
<li>use the <a href="Tasks/projecthelper.html">projecthelper</a> task (since | |||
Ant 1.8.2) which will install dynamically an helper in the internal helper | |||
'repository'. Then your helper can be used on the next call to the | |||
<a href="Tasks/import.html">import</a> task.</li> | |||
</ul> | |||
</p> | |||
@@ -133,6 +133,7 @@ | |||
<li><a href="Tasks/pathconvert.html">PathConvert</a></li> | |||
<li><a href="Tasks/perforce.html">Perforce Tasks</a></li> | |||
<li><a href="Tasks/presetdef.html">PreSetDef</a></li> | |||
<li><a href="Tasks/projecthelper.html">ProjectHelper</a></li> | |||
<li><a href="Tasks/property.html">Property</a></li> | |||
<li><a href="Tasks/propertyfile.html">PropertyFile</a></li> | |||
<li><a href="Tasks/propertyhelper.html">PropertyHelper</a></li> | |||
@@ -34,7 +34,7 @@ import org.apache.tools.ant.util.LoaderUtils; | |||
/** | |||
* Repository of {@link ProjectHelper} found in the classpath or via | |||
* some System properties. | |||
* | |||
* <p>See the ProjectHelper documentation in the manual.</p> | |||
* | |||
* @since Ant 1.8.0 | |||
@@ -57,6 +57,18 @@ public class ProjectHelperRepository { | |||
private static final Class[] NO_CLASS = new Class[0]; | |||
private static final Object[] NO_OBJECT = new Object[0]; | |||
private static Constructor PROJECTHELPER2_CONSTRUCTOR; | |||
static { | |||
try { | |||
PROJECTHELPER2_CONSTRUCTOR = ProjectHelper2.class | |||
.getConstructor(NO_CLASS); | |||
} catch (Exception e) { | |||
// ProjectHelper2 must be available | |||
throw new RuntimeException(e); | |||
} | |||
} | |||
public static ProjectHelperRepository getInstance() { | |||
return instance; | |||
} | |||
@@ -67,7 +79,7 @@ public class ProjectHelperRepository { | |||
private void collectProjectHelpers() { | |||
// First, try the system property | |||
ProjectHelper projectHelper = getProjectHelperBySystemProperty(); | |||
Constructor projectHelper = getProjectHelperBySystemProperty(); | |||
registerProjectHelper(projectHelper); | |||
// A JDK1.3 'service' ( like in JAXP ). That will plug a helper | |||
@@ -100,35 +112,63 @@ public class ProjectHelperRepository { | |||
e.printStackTrace(System.err); | |||
} | |||
} | |||
} | |||
// last but not least, ant default project helper | |||
projectHelper = new ProjectHelper2(); | |||
registerProjectHelper(projectHelper); | |||
/** | |||
* Register the specified project helper into the repository. | |||
* <p> | |||
* The helper will be added after all the already registered helpers, but | |||
* before the default one (ProjectHelper2) | |||
* | |||
* @param helperClassName | |||
* the fully qualified name of the helper | |||
* @throws BuildException | |||
* if the class cannot be loaded or if there is no constructor | |||
* with no argument | |||
* @since Ant 1.8.2 | |||
*/ | |||
public void registerProjectHelper(String helperClassName) | |||
throws BuildException { | |||
registerProjectHelper(getHelperConstructor(helperClassName)); | |||
} | |||
private void registerProjectHelper(ProjectHelper projectHelper) { | |||
if (projectHelper == null) { | |||
/** | |||
* Register the specified project helper into the repository. | |||
* <p> | |||
* The helper will be added after all the already registered helpers, but | |||
* before the default one (ProjectHelper2) | |||
* | |||
* @param helperClass | |||
* the class of the helper | |||
* @throws BuildException | |||
* if there is no constructor with no argument | |||
* @since Ant 1.8.2 | |||
*/ | |||
public void registerProjectHelper(Class helperClass) throws BuildException { | |||
try { | |||
registerProjectHelper(helperClass.getConstructor(NO_CLASS)); | |||
} catch (NoSuchMethodException e) { | |||
throw new BuildException("Couldn't find no-arg constructor in " | |||
+ helperClass.getName()); | |||
} | |||
} | |||
private void registerProjectHelper(Constructor helperConstructor) { | |||
if (helperConstructor == null) { | |||
return; | |||
} | |||
if (DEBUG) { | |||
System.out.println("ProjectHelper " + | |||
projectHelper.getClass().getName() | |||
+ " registered."); | |||
} | |||
try { | |||
helpers.add(projectHelper.getClass().getConstructor(NO_CLASS)); | |||
} catch (NoSuchMethodException nse) { | |||
// impossible to get here | |||
throw new BuildException("Couldn't find no-arg constructor in " | |||
+ projectHelper.getClass().getName()); | |||
System.out.println("ProjectHelper " | |||
+ helperConstructor.getClass().getName() + " registered."); | |||
} | |||
helpers.add(helperConstructor); | |||
} | |||
private ProjectHelper getProjectHelperBySystemProperty() { | |||
private Constructor getProjectHelperBySystemProperty() { | |||
String helperClass = System.getProperty(ProjectHelper.HELPER_PROPERTY); | |||
try { | |||
if (helperClass != null) { | |||
return newHelper(helperClass); | |||
return getHelperConstructor(helperClass); | |||
} | |||
} catch (SecurityException e) { | |||
System.err.println("Unable to load ProjectHelper class \"" | |||
@@ -142,7 +182,7 @@ public class ProjectHelperRepository { | |||
return null; | |||
} | |||
private ProjectHelper getProjectHelperByService(InputStream is) { | |||
private Constructor getProjectHelperByService(InputStream is) { | |||
try { | |||
// This code is needed by EBCDIC and other strange systems. | |||
// It's a fix for bugs reported in xerces | |||
@@ -158,7 +198,7 @@ public class ProjectHelperRepository { | |||
rd.close(); | |||
if (helperClassName != null && !"".equals(helperClassName)) { | |||
return newHelper(helperClassName); | |||
return getHelperConstructor(helperClassName); | |||
} | |||
} catch (Exception e) { | |||
System.out.println("Unable to load ProjectHelper from service " | |||
@@ -171,21 +211,21 @@ public class ProjectHelperRepository { | |||
} | |||
/** | |||
* Creates a new helper instance from the name of the class. It'll | |||
* first try the thread class loader, then Class.forName() will | |||
* load from the same loader that loaded this class. | |||
* Get the constructor with not argument of an helper from its class name. | |||
* It'll first try the thread class loader, then Class.forName() will load | |||
* from the same loader that loaded this class. | |||
* | |||
* @param helperClass | |||
* The name of the class to create an instance of. Must not be | |||
* <code>null</code>. | |||
* | |||
* @return a new instance of the specified class. | |||
* @return the constructor of the specified class. | |||
* | |||
* @exception BuildException | |||
* if the class cannot be found or cannot be appropriate | |||
* instantiated. | |||
* if the class cannot be found or if a constructor with no | |||
* argument cannot be found. | |||
*/ | |||
private ProjectHelper newHelper(String helperClass) throws BuildException { | |||
private Constructor getHelperConstructor(String helperClass) throws BuildException { | |||
ClassLoader classLoader = LoaderUtils.getContextClassLoader(); | |||
try { | |||
Class clazz = null; | |||
@@ -199,7 +239,7 @@ public class ProjectHelperRepository { | |||
if (clazz == null) { | |||
clazz = Class.forName(helperClass); | |||
} | |||
return ((ProjectHelper) clazz.newInstance()); | |||
return clazz.getConstructor(NO_CLASS); | |||
} catch (Exception e) { | |||
throw new BuildException(e); | |||
} | |||
@@ -266,17 +306,25 @@ public class ProjectHelperRepository { | |||
private static class ConstructingIterator implements Iterator { | |||
private final Iterator nested; | |||
private boolean empty = false; | |||
ConstructingIterator(Iterator nested) { | |||
this.nested = nested; | |||
} | |||
public boolean hasNext() { | |||
return nested.hasNext(); | |||
return nested.hasNext() || !empty; | |||
} | |||
public Object next() { | |||
Constructor c = (Constructor) nested.next(); | |||
Constructor c; | |||
if (nested.hasNext()) { | |||
c = (Constructor) nested.next(); | |||
} else { | |||
// last but not least, ant default project helper | |||
empty = true; | |||
c = PROJECTHELPER2_CONSTRUCTOR; | |||
} | |||
try { | |||
return c.newInstance(NO_OBJECT); | |||
} catch (Exception e) { | |||
@@ -21,6 +21,7 @@ package org.apache.tools.ant.taskdefs; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.ProjectHelper; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.ProjectHelperRepository; | |||
import org.apache.tools.ant.Task; | |||
import org.apache.tools.ant.types.Resource; | |||
import org.apache.tools.ant.types.ResourceCollection; | |||
@@ -213,7 +214,22 @@ public class ImportTask extends Task { | |||
setProjectHelperProps(prefix, prefixSeparator, | |||
isInIncludeMode()); | |||
helper.parse(getProject(), importedResource); | |||
ProjectHelper subHelper = ProjectHelperRepository.getInstance().getProjectHelperForBuildFile( | |||
importedResource); | |||
// push current stacks into the sub helper | |||
subHelper.getImportStack().addAll(helper.getImportStack()); | |||
subHelper.getExtensionStack().addAll(helper.getExtensionStack()); | |||
getProject().addReference(ProjectHelper.PROJECTHELPER_REFERENCE, subHelper); | |||
subHelper.parse(getProject(), importedResource); | |||
// push back the stack from the sub helper to the main one | |||
getProject().addReference(ProjectHelper.PROJECTHELPER_REFERENCE, helper); | |||
helper.getImportStack().clear(); | |||
helper.getImportStack().addAll(subHelper.getImportStack()); | |||
helper.getExtensionStack().clear(); | |||
helper.getExtensionStack().addAll(subHelper.getExtensionStack()); | |||
} catch (BuildException ex) { | |||
throw ProjectHelper.addLocationToBuildException( | |||
ex, getLocation()); | |||
@@ -0,0 +1,49 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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.taskdefs; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.ProjectHelper; | |||
import org.apache.tools.ant.ProjectHelperRepository; | |||
import org.apache.tools.ant.Task; | |||
/** | |||
* Task to install project helper into Ant's runtime | |||
* | |||
* @since Ant 1.8.2 | |||
*/ | |||
public class ProjectHelperTask extends Task { | |||
private List projectHelpers = new ArrayList(); | |||
public synchronized void addConfigured(ProjectHelper projectHelper) { | |||
this.projectHelpers.add(projectHelper); | |||
} | |||
public void execute() throws BuildException { | |||
ProjectHelperRepository repo = ProjectHelperRepository.getInstance(); | |||
for (Iterator it = projectHelpers.iterator(); it.hasNext();) { | |||
ProjectHelper helper = (ProjectHelper) it.next(); | |||
repo.registerProjectHelper(helper.getClass()); | |||
} | |||
} | |||
} |
@@ -81,6 +81,7 @@ parallel=org.apache.tools.ant.taskdefs.Parallel | |||
patch=org.apache.tools.ant.taskdefs.Patch | |||
pathconvert=org.apache.tools.ant.taskdefs.PathConvert | |||
presetdef=org.apache.tools.ant.taskdefs.PreSetDef | |||
projecthelper=org.apache.tools.ant.taskdefs.ProjectHelperTask | |||
property=org.apache.tools.ant.taskdefs.Property | |||
propertyhelper=org.apache.tools.ant.taskdefs.PropertyHelperTask | |||
record=org.apache.tools.ant.taskdefs.Recorder | |||
@@ -0,0 +1,90 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit"> | |||
<import file="../antunit-base.xml"/> | |||
<property name="projecthelperin" location="${java.io.tmpdir}/projecthelperinput"/> | |||
<property name="projecthelperout" location="${java.io.tmpdir}/projecthelperoutput"/> | |||
<target name="compileHelpers"> | |||
<mkdir dir="${projecthelperin}/org/apache/tools/ant"/> | |||
<mkdir dir="${projecthelperout}/org/apache/tools/ant"/> | |||
<echo file="${projecthelperin}/org/apache/tools/ant/ReferencerProjectHelper.java"> | |||
<!-- helper that just delegate the parsing to the xml build with the proper name --> | |||
<![CDATA[ | |||
package org.apache.tools.ant; | |||
import org.apache.tools.ant.helper.ProjectHelper2; | |||
import org.apache.tools.ant.types.Resource; | |||
import org.apache.tools.ant.types.resources.FileResource; | |||
public class ReferencerProjectHelper extends ProjectHelper2 { | |||
public boolean canParseBuildFile(Resource buildFile) { | |||
return buildFile instanceof FileResource && buildFile.getName().endsWith(".xmlref"); | |||
} | |||
public String getDefaultBuildFile() { | |||
return "build.xmlref"; | |||
} | |||
public boolean canParseAntlibDescriptor(Resource resource) { | |||
return resource instanceof FileResource && resource.getName().endsWith(".xmlref"); | |||
} | |||
public void parse(Project project, Object source, RootHandler handler) | |||
throws BuildException { | |||
FileResource file = (FileResource) source; | |||
String name = file.getName(); | |||
Resource actual = new FileResource(file.getFile().getParentFile(), name.substring(0, name.length() - 3)); | |||
// switch to the parsing of the xml build file | |||
super.parse(project, actual, handler); | |||
} | |||
} | |||
]]></echo> | |||
<javac srcdir="${projecthelperin}" destdir="${projecthelperout}"/> | |||
</target> | |||
<target name="defineHelpers" depends="compileHelpers"> | |||
<typedef name="referencerhelper" classname="org.apache.tools.ant.ReferencerProjectHelper"> | |||
<classpath location="${projecthelperout}"/> | |||
</typedef> | |||
<projecthelper> | |||
<referencerhelper/> | |||
</projecthelper> | |||
</target> | |||
<target name="testCrossTargets" depends="defineHelpers"> | |||
<ant antfile="projecthelpers/build-cross-targets.xml" /> | |||
</target> | |||
<target name="testManyImport" depends="defineHelpers"> | |||
<ant antfile="projecthelpers/build-many-import.xml" /> | |||
</target> | |||
<target name="testCrossExtension" depends="defineHelpers"> | |||
<ant antfile="projecthelpers/build-cross-extension.xml" /> | |||
</target> | |||
<target name="tearDown" depends="antunit-base.tearDown"> | |||
<delete dir="${projecthelperin}"/> | |||
<delete dir="${projecthelperout}"/> | |||
</target> | |||
</project> |
@@ -0,0 +1,26 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project> | |||
<extension-point name="extension-ref" /> | |||
<target name="setbar" extensionOf="extension"> | |||
<property name="bar" value="hello" /> | |||
</target> | |||
<target name="setfoo" depends="init,extension-ref"> | |||
<property name="foo" value="hello" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,14 @@ | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. |
@@ -0,0 +1,36 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project default="end" xmlns:au="antlib:org.apache.ant.antunit"> | |||
<import file="build-cross-extension-ref.xmlref" /> | |||
<target name="init"> | |||
<property name="start" value="true" /> | |||
</target> | |||
<target name="setprop" extensionOf="extension-ref"> | |||
<property name="prop" value="ok" /> | |||
</target> | |||
<extension-point name="extension" /> | |||
<target name="end" depends="setfoo,extension"> | |||
<au:assertPropertyEquals name="start" value="true" /> | |||
<au:assertPropertyEquals name="foo" value="hello" /> | |||
<au:assertPropertyEquals name="bar" value="hello" /> | |||
<au:assertPropertyEquals name="prop" value="ok" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,22 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project> | |||
<target name="setfoo" depends="init"> | |||
<property name="foo" value="hello" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,14 @@ | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. |
@@ -0,0 +1,27 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project default="end" xmlns:au="antlib:org.apache.ant.antunit"> | |||
<import file="build-cross-targets-ref.xmlref" /> | |||
<target name="init"> | |||
<property name="start" value="true" /> | |||
</target> | |||
<target name="end" depends="setfoo"> | |||
<au:assertPropertyEquals name="start" value="true" /> | |||
<au:assertPropertyEquals name="foo" value="hello" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,23 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project> | |||
<!-- build file imported by every other build --> | |||
<target name="common" depends="init"> | |||
<property name="common" value="ok" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,23 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project> | |||
<!-- build file imported by bot referenced build --> | |||
<target name="commonref" depends="init"> | |||
<property name="commonref" value="ok" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,24 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project> | |||
<import file="build-many-import-common.xml" /> | |||
<import file="build-many-import-commonref.xml" /> | |||
<target name="setfoo" depends="init"> | |||
<property name="foo" value="hello" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,14 @@ | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. |
@@ -0,0 +1,32 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project default="end" xmlns:au="antlib:org.apache.ant.antunit"> | |||
<import file="build-many-import-ref.xmlref" /> | |||
<import file="build-many-import2-ref.xmlref" /> | |||
<import file="build-many-import-common.xml" /> | |||
<target name="init"> | |||
<property name="start" value="true" /> | |||
</target> | |||
<target name="end" depends="setfoo,setbar,common,commonref"> | |||
<au:assertPropertyEquals name="start" value="true" /> | |||
<au:assertPropertyEquals name="foo" value="hello" /> | |||
<au:assertPropertyEquals name="bar" value="hello" /> | |||
<au:assertPropertyEquals name="common" value="ok" /> | |||
<au:assertPropertyEquals name="commonref" value="ok" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,25 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. | |||
--> | |||
<project> | |||
<import file="build-many-import-ref.xmlref" /> | |||
<import file="build-many-import-common.xml" /> | |||
<import file="build-many-import-commonref.xml" /> | |||
<target name="setbar" depends="init,common"> | |||
<property name="bar" value="hello" /> | |||
</target> | |||
</project> |
@@ -0,0 +1,14 @@ | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You 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. |
@@ -0,0 +1,97 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You 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; | |||
import java.io.File; | |||
import junit.framework.TestCase; | |||
import org.apache.tools.ant.helper.ProjectHelper2; | |||
import org.apache.tools.ant.types.Resource; | |||
import org.apache.tools.ant.types.resources.FileResource; | |||
import org.apache.tools.ant.types.resources.StringResource; | |||
/** | |||
* Testing around the management of the project helpers | |||
*/ | |||
public class ProjectHelperRepositoryTest extends TestCase { | |||
public static class SomeHelper extends ProjectHelper { | |||
public boolean canParseBuildFile(Resource buildFile) { | |||
return buildFile instanceof FileResource | |||
&& buildFile.getName().endsWith(".myext"); | |||
} | |||
public boolean canParseAntlibDescriptor(Resource r) { | |||
return r instanceof FileResource && r.getName().endsWith(".myext"); | |||
} | |||
} | |||
public void testFind() throws Exception { | |||
ProjectHelperRepository repo = ProjectHelperRepository.getInstance(); | |||
repo.registerProjectHelper(SomeHelper.class); | |||
Resource r = new FileResource(new File("test.xml")); | |||
ProjectHelper helper = repo.getProjectHelperForBuildFile(r); | |||
assertTrue(helper instanceof ProjectHelper2); | |||
helper = repo.getProjectHelperForAntlib(r); | |||
assertTrue(helper instanceof ProjectHelper2); | |||
r = new FileResource(new File("test.myext")); | |||
helper = repo.getProjectHelperForBuildFile(r); | |||
assertTrue(helper instanceof SomeHelper); | |||
helper = repo.getProjectHelperForAntlib(r); | |||
assertTrue(helper instanceof SomeHelper); | |||
r = new StringResource("test.myext"); | |||
helper = repo.getProjectHelperForBuildFile(r); | |||
assertTrue(helper instanceof ProjectHelper2); | |||
helper = repo.getProjectHelperForAntlib(r); | |||
assertTrue(helper instanceof ProjectHelper2); | |||
r = new StringResource("test.other"); | |||
helper = repo.getProjectHelperForBuildFile(r); | |||
assertTrue(helper instanceof ProjectHelper2); | |||
helper = repo.getProjectHelperForAntlib(r); | |||
assertTrue(helper instanceof ProjectHelper2); | |||
} | |||
public void testNoDefaultContructor() throws Exception { | |||
class IncrrectHelper extends ProjectHelper { | |||
// the default constructor is not visible to ant here | |||
} | |||
ProjectHelperRepository repo = ProjectHelperRepository.getInstance(); | |||
try { | |||
repo.registerProjectHelper(IncrrectHelper.class); | |||
fail("Registring an helper with no default constructor should fail"); | |||
} catch (BuildException e) { | |||
// ok | |||
} | |||
} | |||
public void testUnkwnowHelper() throws Exception { | |||
ProjectHelperRepository repo = ProjectHelperRepository.getInstance(); | |||
try { | |||
repo.registerProjectHelper("xxx.yyy.zzz.UnknownHelper"); | |||
fail("Registring an unknwon helper should fail"); | |||
} catch (BuildException e) { | |||
// ok | |||
} | |||
} | |||
} |