On 16 mai 2011, at 22:10, Matt Benson wrote: > On Mon, May 16, 2011 at 3:01 PM, Romain Rouvoy <[email protected]> wrote: >> On 16 mai 2011, at 21:38, Matt Benson wrote: >>> On Mon, May 16, 2011 at 2:16 PM, Romain Rouvoy <[email protected]> >>> wrote: >>>> On 16 mai 2011, at 16:06, Matt Benson wrote: >>>>> On Mon, May 16, 2011 at 4:51 AM, Romain Rouvoy <[email protected]> >>>>> wrote: >>>>>> I'm using JXPath to query a graph of beans, which are heavily using >>>>>> lists, e.g.: >>>>>>> public class A { >>>>>>> List<B> getB() {...} >>>>>>> } >>>>>>> >>>>>>> public class B { >>>>>>> String getName() {...} >>>>>>> List<C> getC() {...} >>>>>>> } >>>>>>> >>>>>>> public class C { >>>>>>> String getName() {...} >>>>>>> } >>>>>> >>>>>> However, when I'm querying this graph of beans, the following request >>>>>> does not match any elements (while it should return several elements): >>>>>>> org.apache.commons.jxpath.JXPathContext.newContext(new A()); >>>>>>> context.getValue("b[@name='foo']/c/name"); >>>>>> Any idea? Does JXPath support navigation within lists? >>>>> What should happen is that getValue(expr) returns the first value >>>>> specified by your expression, while iterate(expr) would be the way you >>>>> would retrieve multiple results. If you can distill your problem down to >>>>> a failing JUnit test, please feel free to attach this to a JIRA issue. >>>> >>>> Thanks Matt, actually I use Scala to develop my application: >>>>> import scala.reflect.BeanProperty >>>>> >>>>> case class B(@BeanProperty val name:String) >>>>> >>>>> object a { >>>>> @BeanProperty val b = List[B](new B("FOOs"), new B("BARs")) >>>>> } >>>> >>>> The annotation @BeanProperty is used to generate getters at compile-time. >>>> >>>> >>>>> scala> val context = org.apache.commons.jxpath.JXPathContext.newContext(a) >>>>> context: org.apache.commons.jxpath.JXPathContext = >>>>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl@132bb617 >>>>> >>>>> scala> context.getValue("b") >>>>> res27: java.lang.Object = List(B(FOOs), B(BARs)) >>>> >>>> This is an expected behavior... >>>> >>>> >>>>> scala> context.getValue("b/name") >>>>> org.apache.commons.jxpath.JXPathNotFoundException: No value for xpath: >>>>> b/name >>>>> at >>>>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:383) >>>>> at >>>>> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313) >>>>> at .<init>(<console>:29) >>>>> at .<clinit>(<console>) >>>>> at RequestResult$.<init>(<console>:9) >>>>> at RequestResult$.<clinit>(<console>) >>>>> at RequestResult$scala_repl_result(<console>) >>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>>> at >>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) >>>>> at >>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) >>>>> at java.lang.reflect.Method.invoke(Method.java:597) >>>>> at scala.tools.nsc.Interpreter$Request$$a... >>>> >>>> According to your answer, I should get a String ("FOOs") and not an >>>> exception... >>>> Ideally, I would have expected a collection of String containing "FOOs" >>>> and "BARs"... :) >>>> >>>> >>>>> scala> val i = context.iterate("b/name") >>>>> i: java.util.Iterator[_] = >>>>> org.apache.commons.jxpath.ri.compiler.Expression$ValueIterator@3b29642c >>>>> >>>>> scala> i.hasNext >>>>> res30: Boolean = false >>>> >>>> And even when using the context.iterate method, the returned iterator is >>>> empty... >>>> >>>> Is that ok if I submit my Scala code except within JIRA? >>> >>> It'd probably be best to first verify whether your example (or something >>> mostly like it) works in Java before proceeding on to figuring out what, if >>> anything, fails when doing the same thing in Scala. I personally don't >>> have any experience with Scala, although I've been interested to get my >>> feet wet in that regard. >> >> Well, the equivalent program in Java works perfectly with JXPath... Thus, it >> sounds like the problems is due to the fact that JXPath cannot navigate >> through Scala lists (which are not inheriting from the Java collection >> framework). >> Do you think that such a support for the Scala collection library can be >> easily integrated within JXPath? I can try to contribute if you help me to >> get in :) > > It would be nice if it were possible to make the two work together, but... is > nothing available that can wrap your Scala list for better Java compatibility?
Not so easily, but I was thinking about registering specific Container or TypeConverter (?) within the JXPathContext to enable navigation within Scala collections Romain --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
