I can see the use of the "resource:" protocol in Avalon, but how would the "context:" protocol be interpreted? In Cocoon, this would load a resource relative to the WAR context path (well, actually however the environment implementation of Context.getResource was written.) How would the "context:" protocol be implemented outside of Cocoon and the environment.* interfaces?
Regards, --mike On Fri, 18 Jan 2002, Berin Loritsch wrote: > I looked into the SourceResolver code in Excalibur as I wanted to incorporate > its use into my Container abstraction code. I believe that these components are >indicative > of a greater issue in Cocoon. It is the fact that these components are so >intertwined > I have to have several support Components in my initial ComponentManager for the >system. > I find this is not optimal. > > Let's look for ways of optimizing its use, and out of this will come practical use >tips > and other such things. > > The Container abstraction code is designed to have a simple single point of entry for > a Container. A Container has the concept of a context directory (so the "context:" > protocol can be easily merged), and each Container manages its components. This > can help in simplifying Cocoon's code, as there is really a container hierarchy. > This is in practice as well as in theory. There is the root Container (Cocoon) > that implements the Processor interface. Each Sitemap represents a new Container > that implements the Processor interface. Each Container can have a unique mapping > of Components, etc. This provides a mechanism to keep each context directory > distinct for the sitmaps. > > The issues I see in SourceResolver are these: > > 1) SourceResolver and SourceFactory are full fledged Components. The SourceFactory >is > used strictly by the Resolver. Therefore, the SourceFactory should not be a full > component. It is only a helper class to the SourceResolver. > > 2) The Source interface only permits one-way communication. In Excalibur, there is >more > than only reading the "Source". This is why the Resource object is better. > > The issues I see in Parser are these: > > 3) The Parser interface is fine, but the two implementations are not. They each >implement > the ErrorHandler interface directly. The actions of those ErrorHandlers are not >only > constant, the are essentially the same. It would be better to have an outside > ErrorHandler object that both of those implementations used. The same instance >of > the ErrorHandler object can be used accross as many threads as is necessary. > > 4) There is no EntityResolver implementation available > > > As a general comment, when I see Role names like this: > > org.apache.cocoon.components.hsqldb.Server, I immediately recoil. My friends, this >is not > a component. > > When you are writing a Component's interface, don't take the easy road and slap a >wrapper > on whatever code you want. Take some time and consider how a Component is meant to >interact > with other components in a system. As much as possible, write components that do >not have > to maintain conversational state. Sometimes this is not possible, but really try to >think > about it. > > BTW, Don't implement Configurable if you aren't going to use the Configuration >object! > > Cocoon does need to inventory their components, and if Configurable is only being >used as > a wrapper for a Parameters object, implement Parameterizable. I don't like seeing >this: > > public void configure(Configuration config) > throws ConfigurationException > { > // set the base URL to the current directory > try > { > this.userDirectory = new File(System.getProperty("user.dir")).toURL(); > if ( this.getLogger().isDebugEnabled() ) > { > this.getLogger().debug("SourceResolver: Using base directory: " + >this.userDirectory); > } > } > catch (MalformedURLException mue) > { > throw new ConfigurationException("Malformed URL for user.dir", mue); > } > this.baseURL = this.userDirectory; > } > > If you don't need a configuration object, but need to perform some initialization, > use Initializable. > > > If I am going to use the SourceResolver or JaxpParser in the managed Container code >(which > handles the management of config files and everything), I need to use ThreadSafe >components. > I am going to change these components even more to make them ThreadSafe. In the >case of > SourceResolver, that means changing it's interface, and removing ResourceFactory as >a component. > We also need a "context:" uri handler as it has meaning even outside the Servlet >context. > > Avalon needs the "context:" and "resource:" uri handlers, so if there are any >takers, lets > get it implemented (I couldn't see where it was done already). > > > > > -- > > "They that give up essential liberty to obtain a little temporary safety > deserve neither liberty nor safety." > - Benjamin Franklin > > > -- > To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> > -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>