New Features for the project.
-----------------------------

                 Key: CHAIN-51
                 URL: https://issues.apache.org/jira/browse/CHAIN-51
             Project: Commons Chain
          Issue Type: New Feature
            Reporter: Santiago Basulto


I'm proposing a change to the project. Did not know how to do it, so asked in 
the mailing list and told me to make the proposal here.

I'll comment a little about my changes. It needs a lot of refactoring and 
documenting, but i'd like to comment the main idea behind it, so you can give 
your opinion. I have faced some problems with names. I did not want to rename 
commons.chain classes, as a matter of respect, so some names can seem weird, it 
can change.

First of all, i needed more "control" over my commands. I like to have 
everything logged, and several commands were used in GUI apps, so i needed more 
User interaction. Then, i decide to provide the main Interface (Command) some 
other methods, just to can track what is it doing. I made a new interface 
called Action (i use the other name given to this pattern). I extend it from 
Command, just becouse i didn't want to change everything, and can keep using my 
old Commands.

This new Interface, Action, has two new methods:

        void registerHandler(ActionHandler c);

        boolean removeHandler(ActionHandler c); //true if the handler was 
present, false otherwise

The main idea behind this was to have a Handler object that can track the 
"moves and states" of the Action (or Command) class. It's something similar to 
the Observer Pattern. An action "can" (optionally, if doesn't want to register 
a handler, it's a simple Command) register a Handler, and comunicate things 
about itself. So, i have an Interface called ActionHandler. It has three 
methods: 
        
        void start(Action a);

        void done(Action a);

        void fail(Action a,Exception e);

Then, for example, the action "can" invoke start method from its handler, to 
comunicate it that has started executing. It's really simple, but helped me big 
time.

Something great about the Action Interface, is that it only sais that you can 
register a handler, not the number of handlers. So, a Class implementing Action 
can register a number of handlers (file logger handler, GUI tool for 
comunicating the user, console logger, etc) and inform about the progress to 
all of them. If it's not needed to comunicate, this class can just execute 
silently.

So, this is the main change, but with this little change i needed to do 
something with the chain. So i just made the Chain interface extend the Action 
interface. Of course, can be another class, something like ActionChain that 
implements the Action Interface, and let Chain untouched.

I've attached a simpler version of my source code. With just the basic classes 
and a package for test it. I've developed some other classes, for example, 
Action implementations that register several ActionHandlers. I'm currently 
working on a "BlockingQueueChain", it's a chain that can execute all its 
Commands (or Actions) in parallel. Obviusly, there are not so many cases when 
this Chain can be used. If someone is interested i will can send the source 
code.

Ok, i think that's all. Hope you can tell me if this is a good idea, or not. Or 
simply, whether i should start a new "branch" of the project to no interfere 
with Commons Chain.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to