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.
>
Hm, I don't agree here completly. The SourceFactory is a componet
which can theoretically live on its own without a SourceResolver.
But the real intention behind making the SourceFactory a component
is the lifecycle configuration. There are some protocols (or
SourceFactories) which need a configuration, a SourceFactory needs
a Logger, it may be ThreadSafe or Poolable etc.
To avoid reimplementing all this in the SourceResolver, I thought
of making the SourceFactory an own component. Have a look at the
Cocoon code of the SourceResolver. It reimplements many things
the component manager does already. So why reinventing the wheel?
> 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.
>
Well, as I stated some weeks ago, the Resource object is very heavy
and not suitable for some cases like a cvs protocol etc.
I agree that the Source object is one-way but as soon as it is
established we can think of a good way for doing the two-way
communication.
> 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.
>
+1
> 4) There is no EntityResolver implementation available
>
>
Yes, but as soon as the entity resolver of the scratchpad is finished,
it can be used as an implementation.
> <snip>
>
> 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.
>
+1, the code above is my fault - as the first implementation was actually
really configurable, but than I didn't need the configuration anymore
but forgot to change the code.
(Hey, it's scratchpad code anyway...just a joke here).
I will change this.
>
> 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.
>
+1 for the context: factory.
Why do you need a thread safe source resolver? I thought the client
code of a component shouldn't make any assumptions about the lifetime
of a component.
And even if the source resolver is thread safe why can't the ResourceFactory
not be a component?
> 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).
>
When the 2.0.1 of cocoon is out, I will start to incorporate the
avalon scratchpad code into cocoon and will try to fix all the
points mentioned above.
Carsten
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>