Re: xalan usage in taglibs

Jeremy Boynes <[email protected]> Mon, 27 Nov 2017 11:01:09 -0800
Newsgroups gmane.comp.jakarta.taglibs.user
Message-ID <[email protected]>
> On Nov 27, 2017, at 7:38 AM, Romain Manni-Bucau =
<[email protected]> wrote:
>=20
> 2017-11-27 16:31 GMT+01:00 Jeremy Boynes <[email protected]>:
>> On Nov 27, 2017, at 12:07 AM, Matthew Broadhead
>> <[email protected]> wrote:
>>=20
>> In TomEE 7.0.3 everything is fine at startup.  But if a webapp is =
reloaded I
>> get
>> java.lang.ClassCastException: =
org.apache.xml.dtm.ref.DTMManagerDefault
>> cannot be cast to org.apache.xml.dtm.DTMManager
>> and the whole container needs to be restarted which is not ideal =
during
>> production
>>=20
>> Now in TomEE 7.0.4 I cannot even start without this error so I cannot
>> upgrade.
>>=20
>> It seems like a classloader issue but taglibs is the only hardcoded
>> dependency on xalan
>>=20
>>=20
>> Are you including the taglibs jars in your war when deploying to =
TomEE? You
>> shouldn=E2=80=99t need to do that as TomEE should be providing its =
own
>> implementation of JSTL which would mean there is a chance of conflict =
if you
>> also include them.
>=20
> Issue is xalan conflicts very easily in terms of transitive deps.
>=20
>>=20
>> =46rom a thread on tomee-users, it sounds like TomEE could be trying =
include
>> taglibs and avoid including the Xalan dependency but I wouldn=E2=80=99t=
 expect that
>> to work as it actually is needed by the XML tags. The dependency is
>> =E2=80=9Cprovided=E2=80=9D scope to avoid automatic transitive =
inclusion for applications
>> that don=E2=80=99t use the XML tags (which is most). For container =
integration it
>> should be included as an application might use those tags.
>=20
> TomEE bundles taglib and therefore must bundle xalan otherwise several
> features don't work and TCK don't pass.

That was one of the tradeoffs in fixing #27717. I tried to use pure JAXP =
and the implementation from the JRE but it had the same issue as the way =
1.1 worked, perhaps not surprisingly given they are both Xalan based. To =
avoid rebuilding the DTM for each XPath execution, the tags work the =
same way an XSLT does, creating the DTM once and then evaluating the =
expression using the DTM. Unfortunately that meant using the low-level =
Xalan DTM APIs hence the direct dependency. The trade off doing this =
was:

a) do nothing, leaving #27717 unresolved
b) use Xalan as a dependency that was only actually needed if the XML =
tags were used in an application
c) shade Xalan and increase the library size when most users wouldn=E2=80=99=
t need it
d) refactor the XML tags into a separate taglib from the others so users =
would need to include multiple libraries

Option b) seemed like a reasonable compromise because:
- users on a Servlet-profile container would not have JSTL provided by =
the container and so would control which dependencies they needed
- users on a Web- or Full-profile container would have the entire JSTL =
implementation provided by the container and the container vendor would =
have ensured the dependencies were resolved appropriately