<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 30 Sep 2010, at 23:48, Israel Lacerra wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><br><div class="gmail_quote">On Wed, Sep 29, 2010 at 4:06 PM, Manik Surtani <span dir="ltr">&lt;<a href="mailto:manik@jboss.org" target="_blank">manik@jboss.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">




So this is an extension to the discussion around a GenericCommand that has been going around. &nbsp;IMO a GenericCommand is a big -1 from me for various reasons - the whole purpose of the command pattern is so we have strongly typed and unit testable commands. &nbsp;This will help the ongoing work by Mircea, Sanne and Israel on various modules that need to define custom commands.<br>





<br>
I proposed the following solution to Mircea earlier today, I'll repeat here for you guys to discuss. &nbsp;Note that this is a *half baked* solution and needs more thought! &nbsp;:-)<br>
<br>
* If a module needs to define custom commands, it should define its own ReplicableCommand implementations in its' own module.<br>
* It should define a sub-interface to Visitor (MyModuleVisitor) with additional methods to handle the new commands<br>
* Interceptors defined in this module should extend CommandInterceptor AND implement MyModuleVisitor<br>
* These new commands can be created directly, or via a new CommandFactory specially for these commands.<br>
<br></blockquote><div>Just to make clear what is my problem... The ReplicableCommand does not need to be necessarily a VisitableCommand, right?</div></div></blockquote><div><br></div><div>Yes, if your custom command is not visitable then you won't need to extend Visitor, etc.</div><br><blockquote type="cite"><div class="gmail_quote"><div> In my case it's a CacheRpcCommand and I have to initialize this on CommandsFactoryImpl.initializeReplicableCommand(ReplicableCommand, boolean):<br>

<br>case ClusteredQueryFacade.COMMAND_ID:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ClusteredQueryFacade csc = (ClusteredQueryFacade) c;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; csc.initialize(cache);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br><br>The problem is each ReplicableCommand may have a different way to initialize. Maybe we can create a big initialize method, that receives a lot of arguments, and the command uses just some of them. Or this problem will de solved with the solution that you proposed?<br></div></div></blockquote><div><br></div><div>This is in the RemoteCommandsFactory right? &nbsp;This is why I suggested RemoteCommandsFactory.fromStream() has a Map which contains IDs mapped to a command creator instance. &nbsp;A command creator could be an interface that looks like:</div><div><br></div><div>interface CommandCreator&lt;C extends ReplicableCommand&gt; {</div><div>&nbsp;&nbsp; C createAndInitialize();</div><div>}</div><div><br></div><div>So when you register a new command ID you also create and register a new CommandCreator instance which knows how to create and initialize the command.</div><div><br></div><div>I'll try and find some time tomorrow to hack up a hypothetical example. &nbsp;Should make it clearer for everyone.</div><div><br></div><div>More comments? &nbsp;Mircea, Sanne? &nbsp;</div></div><div><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div>--</div><div>Manik Surtani</div><div><a href="mailto:manik@jboss.org">manik@jboss.org</a></div><div>Lead, Infinispan</div><div>Lead, JBoss Cache</div><div><a href="http://www.infinispan.org">http://www.infinispan.org</a></div><div><a href="http://www.jbosscache.org">http://www.jbosscache.org</a></div><div><br></div></div></span><br class="Apple-interchange-newline"></span><br class="Apple-interchange-newline">
</div>
<br></body></html>