From: "James Strachan" <[EMAIL PROTECTED]>
> From: "Stephen Haberman" <[EMAIL PROTECTED]>
> > I've been working on a build.xml file and I was thinking of
> > incorporating exportAll/exportRef functionality. I could just do a
> > replace of all </?ant with </?maven-ant. But then I'd have to go in and
> > manually turn on the exportAll/exportRefs for each one.
> >
> > Instead of defaulting them to false, what if you default them to
> > maven.ant.exportAll and maven.ant.exportRefs respectively? That way I
> > could set the properties once and not worry about them from then on.
>
> +1. I think thats a great idea. Users can always use <ant> instead of
> <maven-ant> if they prefer.
I've attached a modified patch to the <maven-ant> task that does exactly
this; by default all references and properties are exported by <maven-ant>.
Its all documented in the javadoc. Will put some user documentation together
soon (once I know the change gets committed ;-)
James
Index: src/java/org/apache/maven/ant/Ant.java
===================================================================
RCS file: /home/cvs/jakarta-turbine-maven/src/java/org/apache/maven/ant/Ant.java,v
retrieving revision 1.2
diff -u -r1.2 Ant.java
--- src/java/org/apache/maven/ant/Ant.java 22 Apr 2002 00:15:04 -0000 1.2
+++ src/java/org/apache/maven/ant/Ant.java 24 May 2002 07:00:52 -0000
@@ -121,6 +121,12 @@
/** should we inherit references from the parent ? */
private boolean inheritRefs = false;
+ /** should we export all properties to the parent ? */
+ private boolean exportAll = true;
+
+ /** should we export references to the parent ? */
+ private boolean exportRefs = true;
+
/** the properties to pass to the new project */
private Vector properties = new Vector();
@@ -154,6 +160,33 @@
}
/**
+ * <p>If true, all properties defined in the child Project
+ * are exported to the parent Project so long as they are not
+ * already defined. No properties will ever be overwritten.
+ * If false, properties are not exported to the parent project
+ * </p>
+ *
+ * <p>This property defaults to true</p>
+ */
+ public void setExportAll(boolean value) {
+ exportAll = value;
+ }
+
+ /**
+ * <p>If true, all references will be exported from the child Project
+ * into the parent Project after the child project has been executed
+ * providing they don't already exist in the parent Project.
+ * No references will ever be overwritten.
+ * If false, references are not exported to the parent project
+ * </p>
+ *
+ * <p>This property defaults to true</p>
+ */
+ public void setExportRefs(boolean value) {
+ exportRefs = value;
+ }
+
+ /**
* Creates a Project instance for the project to call.
*/
public void init()
@@ -403,6 +436,9 @@
}
newProject.executeTarget(target);
+
+ exportProperties();
+ exportReferences();
}
finally
{
@@ -451,14 +487,13 @@
Hashtable thisReferences = (Hashtable) project.getReferences().clone();
Hashtable newReferences = newProject.getReferences();
Enumeration e;
- if (references.size() > 0)
+ if (references.size() > 0)
{
for (e = references.elements(); e.hasMoreElements(); )
{
Reference ref = (Reference) e.nextElement();
String refid = ref.getRefId();
- if (refid == null)
- {
+ if (refid == null) {
throw new BuildException("the refid attribute is required"
+ " for reference elements");
}
@@ -482,12 +517,12 @@
// Now add all references that are not defined in the
// subproject, if inheritRefs is true
- if (inheritRefs)
+ if (inheritRefs)
{
- for (e = thisReferences.keys(); e.hasMoreElements(); )
+ for (e = thisReferences.keys(); e.hasMoreElements(); )
{
String key = (String) e.nextElement();
- if (newReferences.containsKey(key))
+ if (newReferences.containsKey(key))
{
continue;
}
@@ -509,8 +544,25 @@
//Object orig = project.getReference(oldKey);
// Changed this to make it work with ant 1.4
Object orig = project.getReferences().get(oldKey);
- Class c = orig.getClass();
+
+ copyReference(orig, newKey, newProject);
+ }
+
+ /**
+ * Try to clone the given reference .
+ *
+ * <p>If we cannot clone it, lets reuse the existing
+ * reference and keep our fingers crossed.</p>
+ *
+ * @param orig is the reference to be cloned
+ * @param key is the key for the newly created reference
+ * @param aProject is the project to add the new reference to
+ * @return a new cloned reference, ready for adding to a different project
+ */
+ private void copyReference(Object orig, String key, Project aProject)
+ {
Object copy = orig;
+ Class c = orig.getClass();
try
{
Method cloneM = c.getMethod("clone", new Class[0]);
@@ -527,7 +579,7 @@
if (copy instanceof ProjectComponent)
{
- ((ProjectComponent) copy).setProject(newProject);
+ ((ProjectComponent) copy).setProject(aProject);
}
else
{
@@ -537,7 +589,7 @@
c.getMethod("setProject", new Class[] {Project.class});
if (setProjectM != null)
{
- setProjectM.invoke(copy, new Object[] {newProject});
+ setProjectM.invoke(copy, new Object[] {aProject});
}
}
catch (NoSuchMethodException e)
@@ -548,11 +600,68 @@
catch (Exception e2)
{
String msg = "Error setting new project instance for "
- + "reference with id " + oldKey;
+ + "reference with new id " + key;
throw new BuildException(msg, e2, location);
}
}
- newProject.addReference(newKey, copy);
+ aProject.addReference(key, copy);
+ }
+
+ /**
+ * Export any references defined in the child project to the parent
+ * Project providing that they don't already exist in the parent
+ * project.
+ */
+ private void exportReferences() throws BuildException {
+ if (exportRefs) {
+ Hashtable thisReferences = (Hashtable) project.getReferences().clone();
+ Hashtable newReferences = newProject.getReferences();
+
+ for (Enumeration e = newReferences.keys(); e.hasMoreElements(); )
+ {
+ String refid = (String) e.nextElement();
+ if (refid != null)
+ {
+ // do not overwrite any existing references
+ if (!thisReferences.containsKey(refid))
+ {
+ Object reference = newReferences.get(refid);
+
+ log("exporting reference for id: " + refid,
+Project.MSG_VERBOSE);
+
+ copyReference(reference, refid, project);
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Export any properties defined in the child project to the parent
+ * Project providing that they don't already exist in the parent
+ * project.
+ */
+ private void exportProperties() throws BuildException {
+ if (exportAll) {
+ Hashtable thisProperties = (Hashtable) project.getProperties().clone();
+ Hashtable newProperties = newProject.getProperties();
+
+ for (Enumeration e = newProperties.keys(); e.hasMoreElements(); )
+ {
+ String key = (String) e.nextElement();
+ if (key != null)
+ {
+ // do not overwrite any existing properties
+ if (!thisProperties.containsKey(key))
+ {
+ log("exporting property for key: " + key,
+Project.MSG_VERBOSE);
+
+ project.setProperty(key, newProject.getProperty(key));
+ }
+ }
+ }
+ }
}
/**
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>