I was looking at chain's implementation, instead of executing the commands
with the visitor pattern, wouldn't a more powerful/flexible method be to
implement it using a filter pattern?

See:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/InterceptingFilter.
html


Sample Chain:
CommandServletStart
CommandExceptionHandler
CommandStoreState
CommandExceptionThrower

--

CommandStart.execute(Context ctx, Chain chain) throws Exception
{
        ServletContext srvCtx = (ServletContext) ctx;
        String usrId = srvCtx.getRequestScope().getParameter("id"));
        String newName = srvCtx.getRequestScope().getParameter("name"));

        // get user and save state
        User user = SomeService.getUser(usrId);
        String oldName = user.getName();
        
        // set new state and execute
        try
        {
                user.setName(newName);
                ctx.setAttribute("user", user);
                chain.executeNext(ctx);
        }
        catch (Exception e)
        {
                // on error, rollback change
                user.setName(oldName);
                throw e;
        }
}

--

CommandExceptionHandler.execute(Context ctx, Chain chain) throws Exception
{
        try
        {
                chain.executeNext(ctx);
        }
        catch (SQLException e)
        {
                chain.executeNext(ctx);
        }
        // let unhandled exceptions go up
}

CommandExceptionThrower.execute(Context ctx, Chain chain) throws Exception
{
        throw new SQLException();
}

With this, you would not have to change your inheritance to add behavior
(going from a command to a filter).  The given command would already know
best on how to handle itself and since it calls the next item in the chain,
we can also wrap the context to take care of situations where we want to
have listener type behavior.

The chain could also allow for runtime manipulation by the commands, to
insert additional commands to handle errors.

chain.insert("SomeCommand").insert("AnotherCommand).executeNext(ctx);

--------
Jacob Hookom
Senior Programmer/Analyst
McKesson Medical-Surgical
Golden Valley, MN



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to