ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jose Alberto Fernandez" <jalbe...@cellectivity.com>
Subject RE: new Task subclass
Date Tue, 27 Jul 2004 12:32:01 GMT
> From: Phil Weighill-Smith [mailto:phil.weighill-smith@volantis.com] 
> 
> XPath is a language that handles complex expressions that 
> *can* include document navigation and "query" paths but also 
> contains a lot of other capabilities (consider what you can 
> do with expressions in XSLT: these expressions use XPath with 
> extension functions).
> 

Xpath is not the only language that allows complex expressions,
you can do the same in Velocity and in many others. I am not talking
at all about inventing a new language, but aabout finding the best fit.

My problem with Xpath here, is that the extension functions are not the
reason for
Xpath and the central point of the design of Xpath, Xpath was design
to address queries on document structures. Now, do we really need to use
a language design for that, or shall we use a diferent one more that
more
closely reflects the kinds of expressions ANT programmers require.

> My suggestion is to have Ant register extension functions with the
> *XPath* context so that they are callable from XPath; 
> however, in my original message I suggested a single 
> (standardized) "call" method that can be used to call any 
> registered Ant task as a catch-all. I also suggested that you 
> *might* want to invoke a target (for some reason) within the 
> expression and that this could be achieved using the document 
> navigation features of the XPath "language" (though what a 
> return value is from a target I don't know other than 
> "success" or "BuildException thrown").
> 

At first sight, I am against allowing the execution of tasks or targets
from within the expression language. For the same reasons that in XSLT
you cannot (easily) apply a template in the condition (test attribute) 
of a <xsl:choose><xsl:when/></xsl:choose> statement.

It seem to me to be wrong and will unravel the whole of ANT into some
sort
of unmanageble mush. So we need to be very careful of what facilities
we provide, and what things we make not easy for users to try.

Notice that task evaluation is already available, if you really want.
You just need to define a PropertyHelper that uses BSF and then you can
write whatever you like I there. But, I doubt many people will follow
that route.

> Following your example we could register (again as I 
> suggested) special functions for the "standard" conditionals, 
> so the expression could look
> like:
> 
> ${cond: available("file", $myFile, "type", "file")}
> 
> (XPath variable reference syntax is a bit different from 
> Ant's property reference syntax: it simply uses a "$" to 
> prefix the QName of a registered variable: all Ant properties 
> would have to be registered as variables with the XPath 
> context/infrastructure in some way, with "illegal" characters 
> translated into legal ones).
> 

This is where the impedance of the languages will show up.
I think that with the addition of recursive property evaluation
this issue can be solved in a more elegant and organic way.

> Having thought about it a bit more, it strikes me that we 
> could have a means of automatically generating appropriate 
> functions, in the appropriate namespaces (if needed), for 
> *any* and *all* registered tasks. E.g. a task "myTask" in a 
> namespace defined for "http://example.org/namespace" with a 
> prefix of "x" could be automatically provided with an 
> expression function that would understand the possible 
> attributes just like Ant does. This would then be callable
> like:
> 
> ${cond: x:myTask("myAttr", $example)}
> 
> XPath allows function calls to be nested, so the following is 
> legal (and easy to implement):
> 
> ${cond: condition(and(available("file", $myFile), 
> available("file", $myDir, "type", "dir")))}
> 
> Finally, functions can also be defined that generate "data 
> types" other than booleans. That way it would even be 
> possible to handle nested elements (as implied by the above 
> example). Another example (this isn't really conditional, but 
> you should get the idea):
> 
> ${cond: copy("todir", $myDir, fileset("dir", $fromDir, 
> include("name", "**/*.java"), include("name", "**/*.jj")))}
> 
> Following this example it can be seen that the parameters to 
> the function are either a string (in which case it's an 
> attribute name and therefore followed by an attribute value - 
> which must also resolve to a string), or are a data type (in 
> which case it corresponds to a nested element and has no 
> following value).
> 
> (I assume that an expression that uses a task that doesn't 
> effectively return a boolean value would return true if the 
> task executed successfully and false if the task threw a 
> BuildException).
> 

As I said, I am against invoking tasks/targets on conditions,
this things have by definition side effects which means they
change the state of the build. An this will just produce spaggetti
code of the worst kind.

What I expect of such an expression language, if we deside to have one
(and I am not 100% sure we will), is to be able to do what we can do
with conditions today, hopefully including ANTLIB defined conditionals.

Now that may also involved expressing things like filesets, mappers,
and some other construct required to build conditions. But that,
in my opinion could be done by providing Helpers (EvaluationHelpers?)
simillar to our current InvocationHelper that provides the necessary
glue.

And remember, the fact that I am pushing for Velocity or some other
simillar language, does not disallow having many others including Xpath.
That is the whole point of the PropertyHelper framework.


Jose Alberto

> Anyway, that's my tuppence worth.
> 
> Phil :n)
> 
>  On Mon, 2004-07-26 at 16:48, Jose Alberto Fernandez wrote:
> 
> > OK, I been giving some more background thinking on this issue.
> > 
> > And at this point, I cannot find any reason why to use Xpath as the 
> > language for condition evaluation. The reason being that on most 
> > builds (if not all) how the execution flow goes does not 
> depend on how 
> > the XML build file looks like but on external factors "Is 
> such class 
> > available?", "Are this files uptodate?", "Is this file bigger that 
> > that one", "Is the value of this property the same as this or that?"
> > 
> > So I fail to see what good does it do to use a language designed to 
> > simplify talking about the structure of a document (attributs and 
> > elements) where that is the least of our concerns.
> > 
> > With this in mind, I have been thinking on Velocity as a 
> better glue 
> > for this language. The idea being to provide access to the current 
> > conditionals via the Velocity context, for example, and hence allow 
> > callong them from
> > 
> > Velocity. The context will provide a bridge between the Velocity 
> > syntax and the most common conditionals by means of, for example, 
> > velocimacros.
> > 
> > I am also thinking on Conditionals providing a subinterface that 
> > allows simpler glueing into the evaluation engine. So we 
> would be able 
> > to say something like:
> > 
> > 	if="${cond: $available.att("file", 
> ${myFile}).att("type","file")}" or
> >       if="${cond: $available.file(myFile).type("file")}"
> > 
> > or something like that. This will require us going ahead with addig 
> > roles to the context know what conditionals are out there.
> > 
> > Comments, thrashing, refining, how to's?
> > 
> > Jose Alberto
> > 
> > > -----Original Message-----
> > > From: Phil Weighill-Smith 
> [mailto:phil.weighill-smith@volantis.com]
> > > Sent: 22 July 2004 12:22
> > > To: Ant Developers List
> > > Subject: Re: new Task subclass
> > > 
> > > 
> > > My vote for a "language" within if/unless elements is to use
> > > XPath (1 or 2). Pretty powerful and standard within the XML 
> > > domain! You could even think of supporting path expressions 
> > > that access the entities (targets, properties, types etc.) 
> > > within the current Ant build file and could provide some 
> > > supporting functions that allow tasks and/or targets (in the 
> > > current build) to be invoked or other ant-specific operations 
> > > to be performed.
> > > 
> > > To maintain backwards compatibility, all that is needed is a
> > > delimiter that indicates that an XPath expression is 
> being used. E.g.
> > > 
> > > ... if="debugmode" ...
> > > 
> > > for backwards compatibility or
> > > 
> > > ... if="@call("available", "file", ${file}) == true()" ...
> > > 
> > > to indicate that the "available" task should be called with
> > > the specified property set as the "file" attribute (XPath 
> > > supports "varargs" so having name/value pairs of parameters 
> > > to define the attributes of the invoked task is easy to 
> > > implement). Explicit functions could be made available for 
> > > the most common task invocations in conditions.
> > > 
> > > Finally, it would even be possible to drop the delimiter and
> > > evaluate the expression as an XPath instead of as a property 
> > > name if there are any "illegal" property name characters 
> > > (such as "(", "/" or whitespace) in the expression.
> > > 
> > > Phil :n)
> > > 
> > > On Thu, 2004-07-22 at 11:47, Stefan Bodewig wrote:
> > > 
> > > > On Thu, 22 Jul 2004, Jose Alberto Fernandez
> > > > <jalberto@cellectivity.com> wrote:
> > > > 
> > > > > As per if/unless itself, I really would like to explore more 
> > > > > what
> > > > > some people have suggested about having a richer language 
> > > than just
> > > > > set/unset.
> > > > 
> > > > PropertyHelper?
> > > > 
> > > > IOW, I think we already have the infrastructure needed to
> > > do that in
> > > > Ant's core.
> > > > 
> > > > Stefan
> > > > 
> > > > 
> > > 
> --------------------------------------------------------------------
> > > -
> > > > To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org For 
> > > > additional commands, e-mail: dev-help@ant.apache.org
> > > 
> > > --
> > > Phil Weighill-Smith <phil.weighill-smith@volantis.com>
> > > Volantis Systems
> > > 
> > 
> > 
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> > For additional commands, e-mail: dev-help@ant.apache.org
> 
> -- 
> Phil Weighill-Smith <phil.weighill-smith@volantis.com>
> Volantis Systems
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message