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.