commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simon Räss <co...@gmx.ch>
Subject Re: [jxpath] Custom NodePointer implementation
Date Fri, 18 Jun 2004 09:17:41 GMT
Actually I want to get bar by index. So I've tried the static method 
alternative with success with the following method:

public static Bar bar(Foo foo, int index) {
  return foo.getBar((Language)mappings.get(index));
}

The idea is to have an ordering on Bar objects when evaluating xpath 
expressions. In the application imposing any order on Bar objects would 
not make sense because

a) the order can change
b) conceptually there is no notion of ordering

I registered the function with:

JXPathContext context = ...;
// MyFunctions contains the static method from above
context.setFunctions(new ClassFunctions(MyFunctions.class, "test"));

I can then use an xpath expression like:

/test:bar(/, 1)

to extract the first bar. Of course I have to set the mapping to be used 
by the bar method...

By the way, I tried the empty string as namespace parameter to 
ClassFunctions constructor but that did not work 
(NullPointerException...). Is this a bug?

An even simpler version uses an ExpressionContext (as highlighted in the 
users guide) as follows:

public static Bar bar(ExpressionContext context, int index) {
  Foo foo = (Foo)context.getContextNodePointer().getValue();
  return foo.getBar((Language)mappings.get(index));
}

the corresponding xpath is then:

/test:bar(1)

But I'd prefer the following (simpler) form:

/bar[1]

So I'll have to dig a bit deeper. Any help is still appreciated...


Simon


Dmitri Plotnikov wrote:

>Simon,
>
>A possible alternative to using custom NodePointers in this situation could
>be a custom Function.
>
>Step 1. You implement a static method that does pretty much what you have in
>your example:
>
>public class MyFunc {
> public static Bar barByLang(Foo foo, String ln) {
>  Language lang = (Language)mapping.get(ln);
>  return foo.getBar(lang);
> }
>}
>
>Step 2. Register the MyFunc class with JXPathContext.
>
>Step 3. Use the function like this context.getValue("barByLang(/foo,
>'fr')");
>
>Also see
>http://jakarta.apache.org/commons/jxpath/users-guide.html#Extension%20Functions
>
>
>Now, if you insist on custom implementation of NodePointer, choose the right
>superclass.  For example, BeanPropertyPointer might be the right one.
>
>I hope this helps
>
>- Dmitri
>
>----- Original Message ----- 
>From: "Simon Raess" <cocoa@gmx.ch>
>To: "Jakarta Commons Users List" <commons-user@jakarta.apache.org>
>Sent: Thursday, June 17, 2004 5:32 PM
>Subject: [jxpath] Custom NodePointer implementation
>
>
>
>>hi
>>
>>I hope to get some ideas how to implement the following:
>>
>>Let's say I have a class Foo that can contain several Bar instances.
>>The Bar instances are accessed by a key, let's say a Language object.
>>So I have the following methods in Foo:
>>
>>public Bar getBar(Language l);
>>public Set getLanguages();
>>
>>In the model of my application I don't want to have an absolute
>>ordering of Bar objects, that is I don't want to expose a method like
>>
>>public Bar getBar(int index);
>>
>>or similar. My idea is to have an external object impose an ordering on
>>the Bar objects (that is an ordering on languages). The point is, that
>>the ordering may change at runtime. What that basically means is, that
>>I'll have a mapping from a int key to a Language. For example the
>>mapping would contain:
>>
>>Language   int key
>>de         0
>>fr         1
>>en         2
>>
>>So my idea is to create a custom NodePointer that receives such a
>>mapping definition (so it knows about the ordering of languages). The
>>following xpath expression (with the above mapping definition) should
>>return the text with language fr:
>>
>>foo/bar[2]
>>
>>This should be translated (by the custom NodePointer) to a call to:
>>
>>int index = ...;
>>Foo foo = ...;
>>List mapping = ...;
>>Language lang = (Language)mapping.get(index);
>>Bar fr_bar = foo.getBar(lang);
>>
>>The following xpath
>>
>>foo/bar
>>
>>should probably be converted to something like
>>
>>List list = foo.getBar();
>>
>>I'm still unconfident about the jxpath internals, so could please
>>somebody give me some pointers how I could achieve that? I'm I on the
>>right tracks? Which methods from NodePointer class must I override
>>(except the abstract ones, of course)? Is there a simple example that
>>shows how to implement a NodePointer for objects without using any
>>reflection, introspection, ...? Is there anything else I should
>>consider? Please ask me if I missed some important information!
>>
>>best regards
>>Simon
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
>>For additional commands, e-mail: commons-user-help@jakarta.apache.org
>>
>>
>>
>>
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
>For additional commands, e-mail: commons-user-help@jakarta.apache.org
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-user-help@jakarta.apache.org


Mime
View raw message