ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Wolfgang Häfelinger <whaefelin...@epo.org>
Subject ComponentHelper replacement
Date Tue, 23 May 2006 10:26:25 GMT
Hi,

I'm heavily using <presetdef> to override/customize tasks. It annoys me 
and users
of my framework to see messages like

        Trying to override old definition of task junit

and so I had the idea to write my "own" ComponentHelper and to hook it in 
via
reference "ant.ComponentHelper".

The idea is - theoretically - simple, just inherit from ComponentHelper 
and override
method 

        updateDataTypeDefinition()

and  get  rid of this project.log() statement (which should be a verbose 
message
after all).

In practice however I run into serious problems and I have no real clue 
how to do
it:
 - updateDataType() is private, so I need to change addTaskDefinition() as 
well (
   I really wonder why updateDataTypeDefinition() is private and not 
protected).

-  updateDataType() uses lot's of private variables and methods like 
     rebuildTaskClassDefinitions
     antTypeTable
     sameDefinition
     project
     invalidateCreatedTasks
   and it appears that most of this private staff does not even have a 
"read"
   method.

Therfore customization by inheritance appears not to work.

In a second approach I copied ComponentHelper.java  in my own package 
structure,
added a couple of import statements, and finally got stuck because of 

        Task t = (Task) ref.get();
            //being a weak ref, it may be null by this point
            if (t != null) {
                t.markInvalid();            // <= package access only 
            }

Ok, so do I need to put ComponentHelper.java  in org.apache.tools.ant to 
make javac
happy? This was then my third approach. I  saved  a copy of 
ComponentHelper.java  as
MyComponentHelper.java  in "your" namespace and now I'm stuck because of 

 for (Iterator i = helper.checkedNamespaces.iterator(); i.hasNext();) 
 {
    // ..
 }

Here checkedNamespaces is private (again) and there's no way to access it.

Now for my final question (thanks for reading so far):

How do I ever have a chance to replace ComponentHelper with my own version 
if
basically everything is "private" ? 

And here's my proposal for Ant 1.6.6:

        1. $ perl -pi -e 's,\sprivate\s, protected ,g' `find -name 
\*.java`
        2. provide at least a "getter" for each "non-public" attribute

Cheers,
Wolfgang.


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


Mime
View raw message