Re: How to configure TraxProcessor in 2.2?
"Mark H. Wood" <[email protected]> Wed, 11 Dec 2019 08:58:47 -0500
| Newsgroups | gmane.text.xml.cocoon.user |
|---|---|
| Message-ID | <[email protected]> |
--Q68bSM7Ycu6FN28Q Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Dec 10, 2019 at 11:21:09PM +0100, gelo1234 wrote: > I don't think this is the proper way to do this and if it's possible at > all. Extension functions are only available in commercial releases of Sax= on > (PE and EE). > I'm afraid they are not available in open-source Saxon-HE. We were trying > to use Saxon-HE with Cocoon 3.0 and extension-functions without success. > You either have to use OLDER release of Saxon or pay for the license. No. Before trying this in Cocoon, I wrote a tiny test application, and it succeeded in defining integrated extension functions. https://github.com/mwoodiupui/confman-demo What one cannot do in Saxon-HE is register integrated extension functions using a configuration file, as one can in -PE or -EE. This is why I need to do configuration in Java. > wt., 10 gru 2019 o 21:19 Mark H. Wood <[email protected]> napisa=C5=82(a): >=20 > > On Tue, Dec 10, 2019 at 12:10:41AM +0100, gelo1234 wrote: > > > Mark, > > > > > > Why do you need a Custom XSLT Processor other than Saxon actually?? S= axon > > > should do the right thing. Why wrapping it inside any "upper-level" > > > Transformer? It's getting kinda weird. You can always add a new Java > > class > > > to standard Cocoon Processors/Transformers. > > > > Because, as I said, I need to configure Saxon, and Saxon-HE can only > > be configured programmatically. So, if I want to register an > > Integrated Extension Function, I have to gain access to the > > TransformerFactory being created somewhere in the bowels of Cocoon, > > get its Configuration, and call #registerExtensionFunction on that. > > > > To do this, I've created a class which extends TransformerFactoryImpl, > > added a @PostConstruct method (which Spring should call after > > instantiating the bean) to do the registration, and now I'm trying to > > tell Cocoon to use my factory instead of the one that > > javax.xml.transform.TransformerFactory will conjure up by default out > > of the service provider framework when Saxon is present. > > > > > https://mrhaki.blogspot.com/2008/09/use-saxon-in-cocoon-22.html > > > > I've seen that. So far it hasn't helped. > > > > > Greetings, > > > Greg > > > > > > > > > pon., 9 gru 2019 o 23:02 Mark H. Wood <[email protected]> napisa=C5=82(= a): > > > > > > > On Thu, Dec 05, 2019 at 04:13:08PM +0100, Javier Puerto wrote: > > > > > I recommend you to use the Spring configuration. I never had this > > > > > requirement before but by the error message and the configuration > > > > fragment > > > > > that you have sent the NPE is caused because you are not passing = an > > > > > instance of "org.dspace.saxon.ConfigurableTransformerFactory", you > > are > > > > > passing a String instead. > > > > > > > > > > <property name=3D'transformerFactory' > > > > > > > value=3D'org.dspace.saxon.ConfigurableTransformerFactory'/> > > > > > > > > > > IIRC you should change it to: > > > > > <property name=3D'transformerFactory'> > > > > > <bean class=3D"org.dspace.saxon.ConfigurableTransformerFactory"= /> > > > > > </property> > > > > > > > > > > The attribute "value" is for literal values. You can also define = the > > bean > > > > > with an ID and then use the attribute "ref" with the ID of the be= an. > > > > > I hope that helps. > > > > > > > > It would have made more sense for this to take a bean reference, but > > > > the Javadoc for TraxProcessor says that setTransformerFactory() tak= es > > > > a String argument. That seems to be correct: when I change it to a > > > > reference, I get: > > > > > > > > 09-Dec-2019 15:12:39.128 SEVERE [localhost-startStop-24] > > > > org.apache.catalina.cor > > > > e.StandardContext.listenerStart Exception sending context initializ= ed > > > > event to l > > > > istener instance of class > > > > [org.springframework.web.context.ContextLoaderListener > > > > ] > > > > org.springframework.beans.factory.BeanCreationException: Er= ror > > > > creating > > > > bean with name 'org.apache.excalibur.xml.xslt.XSLTProcessor/saxon' > > defined > > > > in Se > > > > rvletContext resource [/WEB-INF/spring/applicationContext.xml]: > > > > Initialization o > > > > f bean failed; nested exception is > > > > org.springframework.beans.ConversionNotSuppor > > > > tedException: Failed to convert property value of type > > > > 'org.dspace.saxon.Configu > > > > rableTransformerFactory' to required type 'java.lang.String' for > > property > > > > 'trans > > > > formerFactory'; nested exception is java.lang.IllegalStateException: > > > > Cannot conv > > > > ert value of type [org.dspace.saxon.ConfigurableTransformerFactory]= to > > > > required > > > > type [java.lang.String] for property 'transformerFactory': no match= ing > > > > editors o > > > > r conversion strategy found > > > > > > > > When I change it back to the literal name of the class, the > > > > webapp. starts normally. But it still errors out when it tries to = run > > > > the XSLT transformer. > > > > > > > > It begins to look as though one can't really wire up TraxProcessor > > > > using Spring. (By this I mean: using Spring's normal <bean> > > > > <property> etc.) I'm guessing that it blows up because nothing has > > > > called #parameterize(Parameters), because #parameterize() knows how > > > > the properties must be set up and makes sure they are all sensible, > > > > and thus something was left unset. > > > > > > > > I tried adding > > > > > > > > log4j.logger.org.apache.excalibur =3D DEBUG > > > > log4j.logger.org.apache.avalon =3D DEBUG > > > > > > > > to our logging config. but it made no useful difference in the > > > > output. I cannot see what paths are actually being consulted for > > > > Cocoon component configuration, but it seems that none of the places > > > > I've put my .xconf is one of them. > > > > > > > > > El mi=C3=A9., 4 dic. 2019 a las 22:46, Mark H. Wood (<mwood@iupui= =2Eedu>) > > > > escribi=C3=B3: > > > > > > > > > > > I'm using Cocoon 2.2. I need to pass a custom XSLT transformer > > > > > > factory (that wraps Saxon's to configure it) to TraxProcessor, = and > > the > > > > > > advice I've found in several places around the Web doesn't seem= to > > be > > > > > > working: my factory class never gets instantiated. > > > > > > > > > > > > I've got a file > > META-INF/cocoon/avalon/cocoon-core-saxon-xslt.xconf: > > > > > > > > > > > > <?xml version=3D"1.0" encoding=3D"UTF-8"?> > > > > > > <components> > > > > > > <component > > role=3D"org.apache.excalibur.xml.xslt.XSLTProcessor/saxon" > > > > > > class=3D"org.apache.cocoon.components.xslt.TraxProcessor"> > > > > > > <parameter name=3D"use-store" value=3D"true"/> > > > > > > <parameter name=3D"transformer-factory" > > > > > > > > > > value=3D"org.dspace.saxon.ConfigurableTransformerFactory"/> > > > > > > </component> > > > > > > </components> > > > > > > > > > > > > I also tried copying it to WEB-INF/cocoon and it didnt' seem to > > work > > > > > > there either. > > > > > > > > > > > > I do have <configurator:settings/> and <avalon:bridge/> in the > > Spring > > > > > > config. > > > > > > > > > > > > Is there some way to debug component configuration and see if t= he > > file > > > > > > is even being looked for (and where *is* configuration looking)? > > The > > > > > > Cocoon site directs me to Excalibur, which directs me to Avalon, > > which > > > > > > says that Avalon is wound up and directs me back to Excalibur..= =2E. > > > > > > > > > > > > > > > > > > > > > > > > I've also tried to configure the thing using Spring: > > > > > > > > > > > > <bean name=3D'org.apache.excalibur.xml.xslt.XSLTProcessor/s= axon' > > > > > > class=3D'org.apache.cocoon.components.xslt.TraxProces= sor' > > > > > > init-method=3D'initialize' > > > > > > destroy-method=3D'dispose'> > > > > > > <!--property name=3D'use-store' value=3D'true'/--> > > > > > > <property name=3D'transformerFactory' > > > > > > > > > > value=3D'org.dspace.saxon.ConfigurableTransformerFactory'/> > > > > > > </bean> > > > > > > > > > > > > but so far I'm missing something: TraxProcessor.sourceToSAX > > throws an > > > > > > NPE. I'm probably not setting the parameters correctly -- there > > isn't > > > > > > a setter for use-store at all, for example. > > > > > > > > > > > > I've found any number of pages that tell me Avalon configuratio= n is > > > > > > being replaced by Spring, but nothing practical on how to conve= rt > > > > > > Avalon configuration (such as the first sample above) to Spring= , or > > > > > > even how to write fresh Spring configuration for Cocoon compone= nts. > > > > > > It would be nice to know how to do this even if I wind up using= the > > > > > > Avalon approach with the present task. > > > > > > > > > > > > -- > > > > > > Mark H. Wood > > > > > > Lead Technology Analyst > > > > > > > > > > > > University Library > > > > > > Indiana University - Purdue University Indianapolis > > > > > > 755 W. Michigan Street > > > > > > Indianapolis, IN 46202 > > > > > > 317-274-0749 > > > > > > www.ulib.iupui.edu > > > > > > > > > > > > > > -- > > > > Mark H. Wood > > > > Lead Technology Analyst > > > > > > > > University Library > > > > Indiana University - Purdue University Indianapolis > > > > 755 W. Michigan Street > > > > Indianapolis, IN 46202 > > > > 317-274-0749 > > > > www.ulib.iupui.edu > > > > > > > > -- > > Mark H. Wood > > Lead Technology Analyst > > > > University Library > > Indiana University - Purdue University Indianapolis > > 755 W. Michigan Street > > Indianapolis, IN 46202 > > 317-274-0749 > > www.ulib.iupui.edu > > --=20 Mark H. Wood Lead Technology Analyst University Library Indiana University - Purdue University Indianapolis 755 W. Michigan Street Indianapolis, IN 46202 317-274-0749 www.ulib.iupui.edu --Q68bSM7Ycu6FN28Q Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iF0EABEIAB0WIQQuzJQcdfZrSe3FFBWz81Hgm5MobwUCXfD2FwAKCRCz81Hgm5Mo b+YgAJ9s2qkMa0LvZkZfzBjfLM0GMOQ0hgCeM2snJycKylShj6wsd1tOJXTBybw= =BFMu -----END PGP SIGNATURE----- --Q68bSM7Ycu6FN28Q--