James,

I am sure things are far from perfect. But before getting completely
overwhelmed by other ways to solve this I had to dump my current
understanding of it out of my brain by committing a working solution
;-) I think it should at least be a step in the direction which we all
seem to agree on. But please take a look and see if you find better
ways to solve this.

I also thought about a
RegistryBuilder#addModuleProvider(ModuleProvider). But doesn't that
beg for a removeModuleProvider(ModuleProvider) or at least a
getModuleProviders()? Another solution is of course to add a
constructRegistry(List, Locale) processing a List of ModuleProviders.
Btw I support renaming ModuleProvider to ModuleDescriptorProvider.

Regardless of what the final solution looks like I think trying to
keep things simple for client code should be the paramount goal.

--knut

On Fri, 10 Sep 2004 01:00:43 -0400, James Carman
<[EMAIL PROTECTED]> wrote:
> What if we added a method to RegistryBuilder like this...
> 
> class RegistryBuilder
> {
>   public void addModuleProvider( ModuleProvider provider );
>   public void constructRegistry( Locale locale );
>   public static void constructDefaultRegistry();
> }
> 
> This would avoid having to come up with an AggregateModuleProvider class
> (although one could be provided too).  I would also recommend changing the
> name of ModuleProvider to ModuleDescriptorProvider, since that's what it
> really provides and there IS actually a Module class.
> 
> As for the YAGNI of this parser/provider framework, I don't know how I feel
> about that one.  I don't know if it'll ever be NEEDED, but it isn't too
> tough to implement (you'll love how I cram my naming convention suggestion
> down your throats here too)...
> 
> public class BaseModuleDescriptorProvider implements
> ModuleDescriptorProvider
> {
>   private List moduleDescriptors = new LinkedList();
> 
>   public void addModuleDescriptor( ModuleDescriptor moduleDescriptor )
>   {
>     moduleDescriptors.add( moduleDescriptor );
>   }
> 
>   public final List getModuleDescriptors()
>   {
>     return moduleDescriptors;
>   }
> }
> 
> public class ClasspathModuleDescriptorProvider extends
> BaseModuleDescriptorProvider
> {
>   private final ModuleDescriptorParser parser;
> 
>   public ClasspathModuleDescriptorProvider()
>   {
>     this( new XmlModuleDescriptorParser() );
>   }
> 
>   public ClasspathModuleDescriptorProvider( ModuleDescriptorParser parser )
>   {
>     this.parser = parser;
>   }
> 
>   public void addDescriptor( String resourceName )
>   {
>     addModuleDescriptor( parser.parse(
> Thread.currentThread().getContextClassLoader().getResourceAsStream(
> resourceName ) ) );
>   }
> }
> 
> public interface ModuleDescriptorParser
> {
>   ModuleDescriptor parse( InputStream in );
> }
> 
> This code is off the top of my head here, so please forgive any compiler
> errors (my brain compiler doesn't work well after midnight).  I would doubt
> that you would use the same provider to parse different file types.  A
> single provider would most likely be parsing all XML files (or SDL, may it
> rest in peace).  You could even extract a superclass here...
> 
> public class ParserBasedModuleDescriptorProvider extends
> BaseModuleDescriptorProvider
> {
>   private final ModuleDescriptorParser parser;
> 
>   public ParserBasedModuleDescriptorProvider(ModuleDescriptorParser parser)
>   {
>     this.parser = parser;
>   }
> 
>   protected void addModuleDescriptor( InputStream in )
>   {
>     addModuleDescriptor( parser.parse( in ) );
>   }
> }
> 
> Sorry for the code-heavy message!
> 
> 
> 
> 
> -----Original Message-----
> From: Knut Wannheden [mailto:[EMAIL PROTECTED]
> Sent: Tuesday, September 07, 2004 6:39 PM
> To: [email protected]
> Subject: Re: [HiveMind] implementing module dependencies
> 
> On Tue, 07 Sep 2004 13:38:51 +0200, Achim Huegen <[EMAIL PROTECTED]>
> wrote:
> > Maybe a case, where composition is better than inheritance.
> > Although SDL is resting in peace, the support of both XML and SDL would
> > result in :
> > XmlModuleProvider, SdlModuleProvider, ClasspathXmlModuleProvider and
> > ClasspathSdlModuleProvider.
> >
> > I would suggest a common ancestor that deals with resources and
> > which expects a parser for resource processing. the parser parameter
> > is optional and the XML Parser is used as default:
> >
> 
> I see what you're saying. But isn't this maybe a case of YAGNI? I
> didn't quite understand all the details of your idea either.
> 
> After trying out a few solutions this is what I've come up with
> (boring bits left out):
> 
> class RegistryBuilder {
>   Registry constructRegistry(ModuleProvider provider, Locale locale) {...}
>   static Registry constructDefaultRegistry() {...}
> }
> 
> interface ModuleProvider {
>   List getModuleDescriptors(ErrorHandler handler, RegistryAssembly
> assembly) {...}
> }
> 
> class ClasspathXmlModuleProvider implements ModuleProvider {
>   ClasspathXmlModuleProvider(ClassResolver resolver) {...}
> }
> 
> class XmlModuleProvider implements ModuleProvider {
>   XmlModuleProvider(ClassResolver resolver, Resource resource) {...}
>   XmlModuleProvider(ClassResolver resolver, List resources) {...}
> }
> 
> class AggregateModuleProvider implements ModuleProvider {
>   AggregateModuleProvider(List providers) {...}
> }
> 
> Note that the constructRegistry() method only accepts a single
> ModuleProvider (not a List). The idea is that using multiple
> ModuleProviders should be a quite rare case, where the
> AggregateModuleProvider can be used instead. If it just weren't such a
> pain to construct a List with a single element in Java...
> 
> I'm thinking if it would make sense to replace the XmlModuleProvider
> and ClasspathXmlModuleProvider with a single:
> 
> class XmlModuleProvider implements ModuleProvider {
>   XmlModuleProvider(ClassResolver resolver) {...}
>   XmlModuleProvider(ClassResolver resolver, Resource resource) {...}
>   XmlModuleProvider(ClassResolver resolver, List resources) {...}
> }
> 
> Thoughts?
> 
> --knut
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
>

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

Reply via email to