yep that will work for 2 previously named routines
routine
common_routine

what about a user supplied number of iterations for routine1, 
routine2...routineEnd

Good Job on Abstracting ComponentHelper with scriptdef!

Martin
  


> Date: Fri, 27 Sep 2013 16:15:10 -0400
> Subject: "Cloning" macrodef
> From: cyril.sa...@gmail.com
> To: user@ant.apache.org
> 
> I had previously posted a question asking about macro scoping, I thought
> the community might be interested in my solution, perhaps the Ant experts
> can tell me how dangerous of a hack it may be? (I'm on Ant 1.7.0, and
> cannot up-rev)
> 
> First, restating my question:
> Subject: "scoping" for macro definitions?
> Is there a way to override a macro defined from a library I cannot
> control, my goal is to provide a local implementation, but not have to
> change all the callers.
> 
> I got close with <presetdef/> but I couldn't find the way to call "super"
> on the macro, until I used org.apache.tools.ant.ComponentHelper to add a
> new macro definition with a second name. The complete working example
> follows should anyone wish to comment:
> 
> <?xml version="1.0" encoding="utf-8"?>
> <project name="solution" default="testcase">
> <!-- would be in separate file and imported: <import
> file="library.xml" /> -->
> <macrodef name="routine">
> <attribute name="arg" />
> <sequential>
> <echo>Arg is @{arg}</echo>
> </sequential>
> </macrodef>
> 
> <!-- utility to duplicate macro definition -->
> <scriptdef name="duplicateMacroDefinition" language="groovy">
> <attribute name="existingName" />
> <attribute name="newName" /><![CDATA[
> import org.apache.tools.ant.ComponentHelper;
> import org.apache.tools.ant.AntTypeDefinition;
> 
> String existing = attributes.get("existingname");
> String newName = attributes.get("newname");
> 
> ComponentHelper helper =
> ComponentHelper.getComponentHelper(project);
> AntTypeDefinition m = null;
> 
> m = helper.getDefinition(existing);
> if ( m == null ) {
> log("Cannot get definition of ${existing}");
> }
> else {
> m.setName(newName);
> helper.addDataTypeDefinition(m);
> }
> ]]>
> </scriptdef>
> 
> 
> <macrodef name="local_routine">
> <attribute name="arg" default="" />
> 
> <sequential>
> <echo>Run local logic first, maybe change param and call common
> routine...</echo>
> <common_routine arg="OVERRIDE" />
> </sequential>
> </macrodef>
> 
> 
> <target name="setup">
> <!-- make second name of common routine to avoid infinite loop -->
> <duplicateMacroDefinition existingName="routine"
> newName="common_routine" />
> 
> <!-- permits "override" of library routine so we can add logic -->
> <presetdef name="routine">
> <local_routine />
> </presetdef>
> </target>
> 
> <target name="testcase" depends="setup">
> <!-- all existing calls are "fixed", make sample call -->
> <routine arg="old" />
> 
> <!-- If we need original one... -->
> <common_routine arg="use this"/>
> </target>
> </project>
> 
> --Cyril
                                          

Reply via email to