Alexander Klimetschek skrev:
Hi Daniel,

I am playing around with the new blocks protocol and the BlockServlets.
Cool!
I have two blocks A and B, B "inherits" from A and then there is a webapp that uses both blocks. The webapp has the DispatcherServlet configured in the web.xml and the mountPath for the two blocks is defined in the spring-bean config XML file. Now I face two problems:

1) I'd like to configure the mountPath to the blocks in the webapp, because the blocks itself are generic; I have tried it with a properties file manually placed in WEB-INF/cocoon/properties that sets the mountPath:

com.domain.package.blockA.mountPath=foo

But this does not work. How can I override the setting in the bean config XML with a property?
The possibility to override bean properties is very new and I have not tested it yet, see http://marc.theaimsgroup.com/?t=116012787900003&r=1&w=2 for a description of how it is supposed to work. I am not certain that it is tested yet. Maybe Carsten can say something about it.

For the moment it might be a safer bet to use the property mechanism that already is part of trunk. Here you need to use parameters like ${com.domain.package.blockA.mountPath} directly in the configuration and give them a default value in a property file. See e.g. http://svn.apache.org/repos/asf/cocoon/trunk/core/cocoon-core/src/main/resources/META-INF/legacy/xconf/cocoon-core-store.xconf.

2) The nice development feature of sitemap reloading does not work when working on blocks, because you cannot deploy a block with it's own web.xml (that has the necessary DispatcherServlet). I use the webapp which will use the packaged jars from A and B.

The hurdles here are:
a) the cocoon deployer will overwrite the web.xml with no DispatcherServlet configured
In the short term we should fix the deployer so that it doesn't remove the DispatcherServlet. I don't know much about how the deployer works, could someone who does comment on this?

We have some ideas about how to get rid of the need for the deployer in the development cycle. See http://marc.theaimsgroup.com/?t=116013240800001&r=1&w=2, http://marc.theaimsgroup.com/?t=116034430600002&r=1&w=2 and http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=116035392308084&w=2 for that discussion.

b) the blockContextURL should point to the source-folder (like in the sitemap generated by the deployer) so that reloading works on the developer's working directory
Currently the implementation only resolves a path relative to the webapp context (like for the context: protocol). This should clearly be generalized to be able to handle other protocols.

c) that blockContextURL must be overwritten by the deployer via a property (problem like in 1)
See my answer to 1)

I'd imagine a deployer that recognizes the -Dorg.apache.cocoon.mode=dev and then configures the webapp to work as above. I could do some work on the deployer plugin if those points are resolved.
Patches are always welcome.

Another question then arises for the final wiring of blocks: typically I have a root sitemap and mount my different sub-sitemaps there. But when each sub-sitemap is now served via a BlockServlet I must have the DispatcherServlet listening on "/" so that I need a separate BlockServlet serving the root (like /index.html). It would be very cool if one could mount a BlockServlet directly inside the root sitemap.
I think there are two main scenarios: You use a ordinary PipelineServlet for the root sitemap and BlockServlets for the blocks that you use. Or you let everything including the root sitemap be a block.

To make it easy to start using blocks from existing Cocoon webapps we should probably make the first alternative easy to use. In that scenario you typically will mount a SitemapServlet containing the root sitemap at "/", and the DispatcherServlet at e.g. "/blocks". The block protocol doesn't work from the root sitemap to the blocks, as the block protocol is designed for inter block communication and require that blocks are wired together with Spring. It might work with "http:/blocks/myBlock/foo", not certain though. I'm thinking about implementing a "blocks:" protocol for this scenario. It would use the global bean id for the block instead of the bean local property name. There was something like that in an early incarnation of the blocks framework.

For the case when also the main sitemap is in a block, you can just wire it to the used blocks and use the block: protocol. As long as the block deployer is required for updating the block, this would be rather painful. We really need to do something about the deployment.

Thanks for testing the blocks framework and for the feedback.

/Daniel

Reply via email to