| <html> |
| <head> |
| <title>Ant Proposal - Frantic</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> |
| <style type="text/css"> |
| <!-- |
| .quote { font-family: "Times New Roman", Times, serif; font-size: 24pt} |
| p { font-family: Verdana, Arial, Helvetica, sans-serif} |
| h1 { font-family: "Times New Roman", Times, serif; color: #330099; font-weight: bold} |
| h2 { font-family: Verdana, Arial, Helvetica, sans-serif; color: #3300CC} |
| h3 { font-family: Arial, Helvetica, sans-serif; font-weight: bold; color: #3300CC} |
| a { text-decoration: none; color: #9900FF} |
| a:hover { text-decoration: underline} |
| h5 { font-family: Verdana, Arial, Helvetica, sans-serif} |
| --> |
| </style> |
| </head> |
| |
| <body bgcolor="#FFFFFF"> |
| <h1 align="center"><img src="images/frantic_logo.gif" width="250" height="264" align="left">Ant |
| 2.0 Proposal</h1> |
| <h2 align="center">Code Name - Frantic</h2> |
| <p>Frantic hardly describes the proposal process...more like my coding and design |
| efforts! I am relatively new to Ant and the mail list, and I have posted several |
| emails recently regarding the use of DOM in the future of Ant. Once I discovered |
| the mail archive (thanks Simeon), I had a chance to notice that many of my questions |
| were asked before. My extemporaneous emails were not without consequence it |
| seems. After writing one of them it set some wheels in motion for what I hope |
| is a useful addition to the current (and growing) number of proposals for Ant |
| 2.0.</p> |
| <center> |
| <table width="50%" border="0" bgcolor="#9933FF" cellpadding="1" cellspacing="0"> |
| <tr> |
| <td> |
| <table width="100%" border="0" cellpadding="4"> |
| <tr bgcolor="#CCCCFF" align="center"> |
| <td> |
| <p>I think the concept behind Ant should be changed to be a "Task |
| Execution Engine", and the concept of Project and Target can be |
| generalized into a specific form of a Task.</p> |
| </td> |
| </tr> |
| </table> |
| </td> |
| </tr> |
| </table> |
| </center> |
| <p> </p> |
| <p>The email list has received some requests from developers to extend Ant to |
| support different problem domains. Peter Donald has latched onto this issue |
| and I understand that he has incorporated some of these ideas into his Ant proposal. |
| I also have seen some very impressive DOM support integrated into Antidote, |
| an elegant basis for a GUI editor crafted by Simeon Fitch. Sim achieves a great |
| deal of flexibility by using the W3C DOM as a superclass to his Project/Target/Task |
| objects. He has, in effect, abstracted each of these "core" Ant objects |
| until they are simply DOM nodes.</p> |
| <p>Peter's and Sim's ideas struck a chord and I thought that Peter's desire to |
| allow Ant to break free from the Build domain and into Install domains by extending |
| Ant, could be achieved by looking at the problem from a different point of view. |
| As I stated in my email, we can achieve a much higher degree of flexibility |
| in Ant by generalizing more.</p> |
| <h3>Design Proposal</h3> |
| <p>I believe that Ant 2.0 should be re-termed a <b><i>Task Execution Engine</i></b>, |
| and the core of Ant becomes the Engine and the Task. This seems a little radical |
| considering that the Project/Target/Task object model has served us so well |
| in Ant 1.x, however it is very clear that Project and Target are simple another |
| type of Task.</p> |
| <p>An enormous amount of code has been added to maintain Project and Target as |
| separate classes with distinct, hard-coded behaviors. From the proof-of-concept |
| code that I have been developing, I am inspired by how much more elegant the |
| code becomes when this simplified model is realized. </p> |
| |
| <p>Having a base Task interface that all Tasks implement will also offer a generalized |
| approach that benefits GUI's in much the same manner that the DOM has helped |
| Antidote. Also, by making Task an interface instead of a class, we can finally |
| free ourselves of implementation specifics.</p> |
| <p>As I was writing the concept code, it struck me that I was too worried about |
| the XML. Simeon Fitch mentioned in an email in early December, the possibility |
| of storing build scripts in a database. I think this, along with various comments |
| about DOM dependencies from Peter Donald, Jose Alberto Fernandez, and Stefan |
| Bodewig made me realize that Core Ant shouldn't care where the build script |
| lives or in which format it is stored. It is the object model that is primarily |
| important.</p> |
| <h3>The Task</h3> |
| <p>The cornerstone of this proposal hinges on the <a href="Task.html" target="new">Task</a> |
| Interface. It is the only type of external object that the Execution Engine |
| knows how to handle. It is in this simplicity that the most powerful Ant can |
| be realized.</p> |
| <p>The Task is an object that is aware of it's place in ahierarchy. To this end |
| it is aware of its parent and its children. Please note that this is a runtime |
| dependency and a scripting language (or the Task itself) can dynamically change |
| the relationship of Tasks.</p> |
| <table border="0" align="left"> |
| <tr> |
| <td><img src="images/task_hierarchy.gif" width="200" height="140"></td> |
| </tr> |
| <tr align="center"> |
| <td> |
| <h5><i>Figure 1</i></h5> |
| </td> |
| </tr> |
| </table> |
| <p>Key to being able to manipulate Tasks at runtime is some sort of naming conventions. |
| Currently in the Frantic design is the concept of a Task name. Tasks, being |
| hierarchical, can be thought of as a directory structure (see figure 1). If |
| each Task is assigned a name that is unique among its siblings, we can then |
| have a powerful means of locating and referencing a particular Task anywhere |
| in the hierarchy. </p> |
| <p>For example, the Property Task below the Target named "build" has |
| a name of "prop3", however its "fully-qualified" name is |
| /root/build/prop3. The root of a Task execution list is "/" and the |
| tag name, in our example /root. In the concept source code I use this principal |
| of hierarchical naming to support dependencies. Currently, I am treating these |
| Task names as directories and not as files. This should perhaps change slightly |
| to the filename approach. In the directory-based approach, a sibling is named |
| "../sibling". It would be more convenient to not require the "../". |
| In fact, I think I have convinced myself of this.</p> |
| <h3> Task Discovery</h3> |
| <p>I haven't coded this portion, however I plan on basing it on Duncan's idea |
| of using the Jar manifests to locate and identify tasks on the classpath. I |
| was first exposed to this technique in the OpenTools API of Borland's JBuilder |
| IDE, and I have since used it on a large project for a consulting customer.</p> |
| <p>The classpath is scanned at runtime to locate all directories and jar files. |
| These directories and jar files will have a manifest file that will contain |
| manifest entries that serve to tie a string token to the Task implementation |
| class responsible for that token. Directories cannot have manifests per se, |
| but we will utilize a file, one-level up from the directory, with a name "directory-name.mf". |
| This file will be in the format of a manifest file. This will allow developers |
| to create and test new Tasks without the burden of having to make a Jar archive |
| every time.</p> |
| <h3>Attribute Validation</h3> |
| <p>Brett McLaughlin introduced a very interesting techique to perform object validation |
| using XML Schema in a series of <a href="http://www.javaworld.com/javaworld/jw-09-2000/jw-0908-validation.html">JavaWorld |
| articles</a>. I can see this technique applied to Tasks as well. The user could |
| include a schema with a special name in the jar file that accompanies the Tasks. |
| This schema could be used at runtime to validate a Task's attributes.</p> |
| <p>I would imagine that this feature would be outside of what is considered "core" |
| Ant.</p> |
| <h3>The Execution Engine</h3> |
| <p>The engine only knows how to process Task objects, and that is what makes it |
| extremely efficient. It is modeled after how I believe a compiler, or command |
| interpreter would function. It contains a call stack which I call a <i><b>task |
| stack</b></i>, and this task stack is under complete control of the engine. |
| This is not to say that Tasks cannot manipulate the task stack at runtime, because |
| they do. However, all of this access takes place under the watchful eye of the |
| execution engine. </p> |
| <h3>Properties</h3> |
| <p>Keeping track of properties is closely tied to the execution engine, and I |
| modeled it in a manner consistent with how I believe compilers must work. I |
| use the concept of a hierarchical series of hashtables that support the concept |
| of scope in property lists.</p> |
| <p>I had originally put the concept of a property into a Task and completely implemented |
| the bugger. It turned out during testing that my logic was flawed. It seemed |
| to work well at first...a property defined in a Task would be available to all |
| child Tasks, but unavailable to any ancestors. When a Task requested the latest |
| data on a property, it would look in its property list. If it wasn't found there, |
| it would look in its parent's list, and so on. Instant scope.</p> |
| <p>However, it became quickly apparent that properties are a "runtime" |
| consideration. This is something that Jose Alberto Fernandez will not let any |
| of us forget for long. :-) What I needed was to move this hierarchical chain |
| of property lists into the engine. For each new Task executed, a new property |
| list is created and also pushed onto the stack. It seems to work like a champ.</p> |
| <p>I also coded up key substitution into the getParameterValue() events. They |
| seem to work fine, although I haven't worked up enough test cases to be sure.</p> |
| <p>One additional cool feature is that parameters need not only hold Strings. |
| I thought that there would be occasions where properties will hold Tasks as |
| well. I believe this will turn out to be a prime mechanism for creating reference |
| id Tasks like the current FileSet objects and referring to them in other Tasks |
| just as you would any property value.</p> |
| <h3>Attributes</h3> |
| <p>I haven't spent any time addresing what is currently referred to a Task's attributes |
| in Ant 1.x. I still need to think about this concept some more, but as I dwell |
| on what an attribute is, I keep coming back to the properties. Just like a property |
| functions as a scoped variable, an attribute is the same thing. Albeit, its |
| scope is limited to the Task that uses it, but so what.</p> |
| <h3>Execution Events</h3> |
| <p>The execution engine also supports a few key events that can occur during the |
| execution lifecycle. Currently events exist for execution start/finish, task |
| start/execute/finish, exceptions, and simple messaging. The messaging event |
| allows Tasks to communicate in a standard way that will leverage the engine's |
| event system to allow various front-ends to intelligently and appropriately |
| process the output.</p> |
| <h3>Scripting</h3> |
| <p>I have no experience with incorporating a scripting engine into an engine, |
| but I do know that this proposal should address the primary issues that surround |
| such an integration. I think that two features which are absolutely essential |
| are:</p> |
| <p> Provide some sort of naming convention such that a particular Task can be |
| found given an absolute name or a name relative to another Task. This is complete |
| and working in the concept code.</p> |
| <p>Leave all decisions regarding property evaluation and Task's knowledge of these |
| properties until the last possible moment.</p> |
| <h3>Recursive Tasks</h3> |
| <p>I realize that Ant 1.x spent some clock cycles dedicated to resolving circular |
| references in the Task definitions. I didn't spend any time on that intentionally. |
| I am not so sure that the elimination of circular references is a good idea. |
| Especially moving forward, with the incorporation of a scripting language, I |
| can envision Tasks the assembler wants to execute repeatedly, perhaps even recursively. |
| I think we should treat this the same way that any modern computer language |
| would — <i>caveat emptor</i>.</p> |
| <h3>Summary</h3> |
| <p>There is a lot more to do with this proposal and the concept code. It has been |
| an exciting weekend getting these thoughts down and trying to back them up. |
| I look forward to collaborating with others on the list if they wish to help |
| me, even though I am in proposal phase. I certainly don't know much about XML |
| parsing and I could use some ideas on how to further my starting model. I would |
| love to show the Ant core model built in a Builder agnostic manner. Basically, |
| I want XML to be an option, not a requirement.</p> |
| <p>I would also be interested in perhaps building an adapter task that will allow |
| Ant 1.x tasks to be reused unchanged in the Frantic proposal. The concept of |
| a Task hasn't changed much, so perhaps this is a possibility.</p> |
| <p>As always, your feedback is welcome. I expect that I have missed some major |
| holes and I would like the opportunity to work with others to plug them up!</p> |
| <p><a href="mailto:jimcook@visualxs.com">Jim Cook</a><br> |
| <a href="http://www.visualxs.com/">Visual XS</a></p> |
| </body> |
| </html> |