-1

Can i set an variable in available tag like this?

<available file="${inf.root}/schema_params/@{componame}-schema.sql" 
   type="file" 
   variable="schema.file" />

because when i use property instead of variable in available tag, Its value is immutable. But i want to change it at run time.Below is my code.i want to copy 1 file checking through my component list. if the file exists, i have to copy and move it. else i have to skip the logic. But whats happening is, if i dont use this code,

<var name="schema.params.file" unset="true"/>
<property name="schema.params.file" value="false"/>
<var name="scripts.dir" unset="true"/>
<property name="scripts.dir" value="false"/>

in the first iteration if schema.params.file,scripts.dir is set to true if files exist, it is not overided in the next iteration even though if file doenot exist. so i have added above code.but now always the values are set to false again by above code. how can i overcome the issue of overiding these 2 schema.params.file,scripts.dir in every iteration?

<for list="${t1.@{componentname}}" param="installableid" delimiter="${line.separator}">
    <sequential>
        <available file="${infinys.root}/schema_params/@{componentname}-schema_params.sql" 
             type="file" 
             property="schema.params.file" />
        <available file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" 
             type="dir" property="scripts.dir"/>
        <if>
            <and>
                <equals arg1="true" arg2="${schema.params.file}" />
                <equals arg1="true" arg2="${scripts.dir}" />  
            </and>                      
            <then>
                <copy file="${infinys.root}/schema_params/@{componentname}-schema_params.sql"
                   todir="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts"
                   failonerror="false" />
                <move file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/@{componentname}-schema_params.sql" 
                      tofile="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/schema_params.sql"
                      failonerror="false"/>
                <chmod file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts/schema_params.sql" perm="775"/>
                <var name="schema.params.file" unset="true"/>
                <property name="schema.params.file" value="false"/>
                <var name="scripts.dir" unset="true"/>
                <property name="scripts.dir" value="false"/>  
            </then>
        </if>
    </sequential>
</for>
David W.
  • 105,218
  • 39
  • 216
  • 337
user1885159
  • 45
  • 1
  • 6

2 Answers2

0

Can i set an variable in available tag like this?

Yes, you can.

Macro names are changed with each iteration. The <var/> task is simply a way to unset and reset a property in Ant. It's part of the Ant-Contrib project. You don't need to unset and reset the property:

<var name="schema.params.file" unset="true"/>
<property name="schema.params.file" value="false"/>

You could do this in a single statement:

<var name="schema.params.file" value="false"/>

Their use is highly discouraged since it breaks Ant's immutable property idea. However, I've find that I too use <var/> a lot when going through <for/> loops and sometimes <macrodef>. Newer versions of Ant allow you to localize properties, so I suspect the <var/> task will soon no longer be needed.

Another thing which may make things a bit easier is that you can use <if/> tests with <available/>

<if>
    <then>
        <and>
            <available file="${infinys.root}/schema_params/@{componentname}-schema_params.sql" 
                type="file"/>
            <available file="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" 
                type="dir"/>
        </and>
        <sequencial>
            ....
        </sequential/>
    </then>
</if>

Doing this may make your code a bit cleaner and easier to understand. It will also eliminate the need to unset properties in the first place.

David W.
  • 105,218
  • 39
  • 216
  • 337
-1

Ant doesn't allow overwriting properties. You still can use macrodef but that's another story (see How to over-write the property in Ant?).
What you can do is move the internals of your cycle to the separate target like (can't see why you copy a file to another location and immediately move it to another another location, so I just replaced this copy-move with one copy)

<target name="cycle-body">
    <available file="${schema.params.file.name}" type="file" property="schema.params.file" />
    <available file="${scripts.dir.name}" type="dir" property="scripts.dir"/>

    <if>
        <and>
            <equals arg1="true" arg2="${schema.params.file}" />
            <equals arg1="true" arg2="${scripts.dir}" />  
        </and>                     
        <then>
            <copy file="${schema.params.file.name}" 
                tofile="${scripts.dir.name}/schema_params.sql" failonerror="false"/>

            <chmod file="${scripts.dir.name}/schema_params.sql" perm="775"/>
        </then>
    </if>
</target>

and call it like

<for list="${t1.@{componentname}}" param="installableid" delimiter="${line.separator}">
    <antcall target="cycle-body">
        <param name="schema.params.file.name" value="${infinys.root}/schema_params/@{componentname}-schema_params.sql" />
        <param name="scripts.dir.name" value="${stage.dir}/@{componentname}/@{installableid}/schema/install/scripts" />
    </acntcall>
</for>
Community
  • 1
  • 1
FlasH from Ru
  • 1,165
  • 2
  • 13
  • 19