commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Santiago Basulto <santiago.basu...@gmail.com>
Subject [chain]
Date Fri, 16 Jul 2010 22:57:58 GMT
Hello everybody.

First of all, let me apologize if i'm doing something wrong. I've been
reading the Contributors Guide and the Volunteering note
(http://commons.apache.org/volunteering.html) wrote by Mr. Craig, then
i decided to use this way.

My name is Santiago Basulto, i'm from Argentina. I've been using
Commons Chain for a while, and has been really useful to me. It helped
to organize my code, and make it a lot more scalable.

But, time to time, i came with some problems that Chain did not
address. Some situations when i needed more specialization and
robustness.

That's why i decided to extend this project, and build some other
classes to help me out. I'm helping a teacher at my University, in an
OOP Course, and after talking a little about it, he told me that it
was a good idea. After that i propose 	these changes to some friends,
and tell them to try to use it. It appears like they did like it and
started using it.

After getting some courage, i decided to write this mail. Please,
sorry if i'm wrong. I understand that a lot of really smart people are
working on Apache Projects, and maybe what i'm doing is a little
stupid. So, if this is the case, please let me know.

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.

Thanks for this great project, and all your disinterested work.

Best Regards.

SourceCode at: http://www.santiagobasulto.com.ar/projects/Actions/actions-src.rar

PS: Sorry for my english! I'm trying to improve it.
-- 
Santiago Basulto.-

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


Mime
View raw message