[ 
https://issues.apache.org/jira/browse/CHAIN-51?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Santiago Basulto updated CHAIN-51:
----------------------------------

    Attachment: actions-src.rar

This is the source code for the new ideas exposed.

> 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
>         Attachments: actions-src.rar
>
>   Original Estimate: 240h
>  Remaining Estimate: 240h
>
> 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