Matt Benson, thank you for your answer.
As you wrote, I put IMyNodeAggregate into field myCollection in RootStub
class. This is OK.
A)
1. public class Rules {
2. public static String getName(ExpressionContext context){
3. Pointer pointer = context.getContextNodePointer();
4. if(pointer == null){
5. return "";
6. } else {
7. if(pointer.getValue() instanceof IMyNode){
8. System.out.println("POINTER SET ON " + pointer);
9. IMyNode node = (IMyNode)pointer.getValue();
10. return node.someService().getName();
11. }
12. }
13. return "";
14. }
15. }
RootStub is submitted to newContext:
JXPathContext context = JXPathContext.newContext(rootStub);
and
context.getValue("/myCollection");
returns myCollection - OK
context.getValue("//myCollection");
returns myCollection - OK
context.getValue("/myCollection/.[rules:getName() = 'secondName']");
returns the instance of IMyNode which someService().getName() returns
"secondName" - OK
After line
context.getValue("/myCollection//.[rules:getName() = 'secondName']");
the next lines are NOT executed. Also no exception, and lenient mode is
not set. I do not understand what is going on.
Line 8. of Rules class prints "POINTER SET ON /myCollection[1]"
After this I have a lot of doubts, if I can use JXPath in my case.
B)
Can I use regex like here?
[rules:getName() matches '.*Name']
Thank you,
Kamil
W dniu 2012-11-02 18:18, Matt Benson pisze:
As Jun suggests, a custom extension function [1] is probably in order
to keep your expressions reasonably (!) short. Assuming you want to
use JXPath without modifying any of your existing code, I would
recommend trying to write a custom function that makes the call to
retrieve the name. Then your expression might look like
".[mynode:getName() = 'nodeName1']/.[mynode:getName() = 'nodeName2']"
etc. ISTR JXPath having a bit of trouble processing a collection as
the root, so you might experiment with making your IMyNodeAggregate be
a property of your root, or even the value of a variable.
Thinking further, you might get some mileage out of doing some custom
interface implementations. The discussion of maps [2] in the user
guide makes reference to the customization needed to treat any
arbitrary structure similarly to a map, which arguably your
IMyNodeAggregate is.
HTH,
Matt
[1] http://commons.apache.org/jxpath/users-guide.html#Custom_Extension_Functions
[2] http://commons.apache.org/jxpath/users-guide.html#Map_Element_Access
On Fri, Nov 2, 2012 at 11:59 AM, Jun Ouyang <jouya...@mail.ccsf.edu> wrote:
Sorry I am on transit right now so i cant give u a full and proper.respond.
But i think you can create your own jxpath function and invoke it to match
your need. In this case the function shall check if names are equal?
On Nov 2, 2012 9:47 AM, "we9" <w...@o2.pl> wrote:
I started to write some methods which process tree structure. The queries
are based on XPath. And now, I discovered JXPath. I was reading user-guide,
but I didn't find what I want.
I must be sure that there is no posibility to do this with JXPath.
I have the following interfaces:
interface IMyNode
interface IMyNodeAggregate<C extends IMyNode> implements Collection<C>,
IMyNode
I want to pass some root (instance of IMyAggregate) and using XPath
notation (eg. /nodeName1//nodeName2/**nodeName3) get proper IMyNode
instances. Name of IMyNode is avaliable by calling
myNode.someService().getName() so maybe some interface JXPath should be
implemented?
Please answer me if JXPath can help me?
Thank you in advance,
Kamil
------------------------------**------------------------------**---------
To unsubscribe, e-mail:
user-unsubscribe@commons.**apache.org<user-unsubscr...@commons.apache.org>
For additional commands, e-mail: user-h...@commons.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org