I also found an infinite loop if a component loads an XSL stylesheet
which has an invalid XPath function (e.g. <xsl:value-of
select="ext:format($a 'b')" /> - there should be a comma between $a
and b: "($a, 'b')"), which didn't seem to stop when I shutdown the
route (I don't recall seeing anything in the log suggesting it was
being shut down, but there were a lot of errors scrolling by very
fast). I had to head into the cache and nuke the bundle after
force-quitting SMX to get it to work properly, which was quite
awkward. I will raise a full bug report for that when I can.

- Andrew

On Fri, Nov 22, 2013 at 7:31 PM, Andrew Thorburn <nzi...@gmail.com> wrote:
> Possibly, though I may have to go back to A for some strange cases, which
> would rule that out. I also wasn't aware that you could override XSL
> templates / imports / etc, so that does make a case for doing it in pure
> XSL. That said, how do I reference a template that's in another OSGi bundle?
> Do I just add the requisite Import-Package statement for the package the
> resource is in?
>
> The other possibility, which *almost* worked, was creating a bean in Camel,
> then passing that in as an XSL parameter and calling instance methods on it,
> which would have given me full access to Camel/OSGi/etc, which would've been
> perfect. Unfortunately, Xalan isn't OSGi friendly, and since it wants to
> lookup the Class I'm calling methods on (frankly, it doesn't need to), it
> explodes because it can't find it. I can probably work around that, but it's
> less than ideal.
>
> So yeah, either injecting a bean into my template (with some effort to hack
> around class loader limitations), or see if I can do it all in XSL.
>
> Thanks,
>
> - Andrew
>
> On 21/11/2013 9:58 PM, "Walzer, Thomas" <thomas.wal...@integratix.net>
> wrote:
>>
>> Not sure if I got your requirements right.
>>
>> How about going a plain XSL way (no java mapping)? Doing everything in XSL
>> and using a generic template for address mapping. You could import it as
>> needed and overide as needed.
>>
>> Cheers, Thomas.
>>
>> Am 21.11.2013 um 03:13 schrieb Andrew Thorburn <nzi...@gmail.com>:
>>
>> > I am currently in the process of building a "simple" proof of concept
>> > using Camel and ServiceMix, and mostly it's been going fine - it so
>> > far has done exactly what I want, if not necessarily always how I
>> > want.
>> >
>> > However, I'm coming up a bit short on how to achieve what I want right
>> > now.
>> >
>> > The scenario is fairly simple:
>> >
>> > SMX is acting as a layer between my Application, A, and a remote
>> > application, R. To try and centralise a bunch of the logic, we are
>> > planning to have A transform a (non-trivial) graph of domain objects
>> > to XML and send them over to SMX. SMX will then take this set of XML,
>> > transform it into some different XML via XSL, transform that into a
>> > POJO, then transform the POJO into the flat file required by R.
>> >
>> > The problem I'm running into is that I need to combine some of the
>> > data in non-trivial ways. e.g. The domain objects I'm sending have
>> > address data like unitNo, streetNo, streetName, streetType, suburb,
>> > country, etc. Whereas R requires address line 1, 2, 3, 4, etc. So I
>> > need to turn our separate address fields into combined fields, based
>> > on various rules around shortening them if they're too long, etc.
>> >
>> > On top of that, some values also need to be mapped, as the value of
>> > the field in the domain object may be different to the value that R
>> > expects (e.g. A may have a street type of ST, but R may expect
>> > STREET). This occurs in the addresses, and also in other fields as
>> > well.
>> >
>> > This one ESB will handle multiple different interfaces on R, and I
>> > imagine that while most will share the same requirements as far as
>> > mapping and address formatting goes, I worry that some might not, so I
>> > would like to come up with a solution that makes it easy to have one
>> > generic implementation that can be overridden on a case-by-case basis,
>> > or be able to be exposed as a web service, etc.
>> >
>> > It's possible I'm overthinking this, but I'm not happy with my current
>> > solution:
>> >
>> > Camel Route is Web Service -> XSL -> XML -> ..., where the XSL calls
>> > out to a static Java method for transforming the address and
>> > translating codes. Note that there could be 5 - 10 different addresses
>> > in a single request, and 30+ elements that need a mapping, out of a
>> > much larger set of elements.
>> >
>> > My problem is that, while this seems fairly simple, it means I lose
>> > access to everything Camel-, Spring- and OSGi-related. Mostly, it
>> > means I'd have strong coupling between all my dependencies, no way to
>> > access any properties apart from System properties, no way to call
>> > Camel routes, etc, etc, which makes me very nervous, and just doesn't
>> > *feel* right (I know, I know - that's a terribly subjective
>> > qualification!).
>> >
>> > Does anyone see a better solution, or have any advice about things I
>> > should have a look at which could help? Can I, for example, gain
>> > access to the current CamelContext so I can call out to a camel route
>> > for address formatting or other such things?
>> >
>> > Or am I really just stuck going with this:
>> >
>> > public static NodeList formatAddress(NodeList address) { String unitNo
>> > = address.item(0).getChildNodes().item(0).getTextContent(); ... }
>> >
>> > public static String translate(String type, String val) { InputStream
>> > is = XSLUtil.class.getResourceAsStream(...); ... }
>> >
>> > Thanks,
>> >
>> > - Andrew Thorburn
>>
>

Reply via email to