| Von: Vadim Gritsenko [mailto:[EMAIL PROTECTED]]
|
|
| Using action. Write your action which reads this <file/> fragment into
| DOM/SAX, extracts <storepath>, <origname>, <mimetype> and returns these
| values in the Map to the sitemap.
|
| Then, pass these values to the regular reader.
|
|
| Vadim
|
Hello Vadim,
thanx for your answer. I tried this, but I had some strange trouble. I
wrote my own Action and called it in the sitemap like this:
<map:act type="docprop"
src="xmldb:xindice://localhost:4080/db/gizmo/documents/#//document[@id=&apos
;{1}']">
My action has the method act as follows:
public Map act(Redirector redirector, SourceResolver resolver,
Map objectModel, String source, Parameters par)
throws Exception {
Source src = null;
HashMap actionMap = new HashMap();
try {
src = resolver.resolve(source);
String systemID = src.getSystemId();
if (this.getLogger().isDebugEnabled()) {
getLogger().debug("docprop source [" + source + "]");
getLogger().debug("docprop resolved to [" + systemID + "]");
}
// this all works fine...
// but...
Parser parser = (Parser)this.manager.lookup(Parser.ROLE);
// src.getInputSource() raises an exception!
Document sdoc = parser.parseDocument(src.getInputSource());
NodeList nl = sdoc.getElementsByTagName("document");
[...]
I got an exception from AbstractSAXSource.getInputStream...
org.apache.cocoon.ProcessingException: could not lookup pipeline components:
org.apache.avalon.framework.component.ComponentException: UnnamedSelector:
ComponentSelector could not find the component for hint: xml
at
org.apache.cocoon.components.source.AbstractSAXSource.getInputStream(Abstrac
tSAXSource.java:133)
at
org.apache.cocoon.components.source.AbstractSAXSource.getInputSource(Abstrac
tSAXSource.java:151)
at
de.taval.gizmo.acting.DocumentPropertyAction.act(DocumentPropertyAction.java
:116)
With other sources than the saxbased xmldbsource, it works fine.
Then I've copied the code of AbstractSAXSource.getInputStream and
AbstractSAXSource.getInputSource into my action and it works properly. But I
dont understand why, and this only works for SAX-based sources. Is this a
bug in AbstractSAXSource? I think, both methods should work. I dont
understand, why the same code works in my action and fails in the
AbstractSAXSource?!
Do you have any idea how to solve it? I would like to use any source for my
action, not only sax-sources, so do i have now to check for the source type
and have to implement the getInputStream method for all sourcetypes new?
Thanx
Tammo
PS: my new work-a-round (for sax sources only) act():
<snip>
ComponentSelector cs =
(ComponentSelector)this.manager.lookup(Serializer.ROLE + "Selector");
Serializer serializer = (Serializer)cs.select("xml");
ByteArrayOutputStream os = new ByteArrayOutputStream();
serializer.setOutputStream(os);
src.toSAX(serializer);
InputSource is = new InputSource(new
ByteArrayInputStream(os.toByteArray()));
is.setSystemId(src.getSystemId());
Parser parser = (Parser)this.manager.lookup(Parser.ROLE);
Document sdoc = parser.parseDocument(is);
NodeList nl = sdoc.getElementsByTagName("document");
</snip>
---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faq/index.html>
To unsubscribe, e-mail: <[EMAIL PROTECTED]>
For additional commands, e-mail: <[EMAIL PROTECTED]>