TBH I'm somewhat surprised it doesn't already, but I haven't actually
ran/debugged your example.

On Sun, Sep 24, 2023 at 2:32 PM Debraj Manna <subharaj.ma...@gmail.com>
wrote:

> Is there a way I can throw some error from jxpath when this situation
> arises instead of getting stuck in a never ending loop?
>
> On Sun, 24 Sep, 2023, 22:54 Matt Benson, <gudnabr...@gmail.com> wrote:
>
> > Well, to be clear, you can have linked nodes. But if N had both `next`
> and
> > `previous` members is where you'd run into trouble.
> >
> > On Sun, Sep 24, 2023 at 12:22 PM Matt Benson <gudnabr...@gmail.com>
> wrote:
> >
> > > If you're doing a search down the tree you'd need some way to keep
> JXPath
> > > from traversing these relationships, yes.
> > >
> > > On Sun, Sep 24, 2023 at 11:59 AM Debraj Manna <
> subharaj.ma...@gmail.com>
> > > wrote:
> > >
> > >> Are you saying that in JxPath we cannot use something like below?
> > >>
> > >> class A {
> > >>     int n;
> > >>     A next;
> > >> }
> > >>
> > >> On Sun, Sep 24, 2023 at 8:43 PM Matt Benson <mben...@apache.org>
> wrote:
> > >>
> > >> > Is it possible the proto message (I'm not familiar with this API) is
> > >> built
> > >> > with internal recursive references, i.e. some child has a property
> > that
> > >> > points, possibly indirectly, to its parent? That would be the most
> > >> probable
> > >> > explanation, particularly as you say feeding jxpath the known
> absolute
> > >> path
> > >> > works.
> > >> >
> > >> > Matt
> > >> >
> > >> > On Sun, Sep 24, 2023, 9:44 AM Debraj Manna <
> subharaj.ma...@gmail.com>
> > >> > wrote:
> > >> >
> > >> > > It looks like it is getting stuck in some infinite loop. The
> thread
> > >> stack
> > >> > > looks like below after ~ 8 hours from the start.
> > >> > >
> > >> > > main  Runnable CPU usage on sample: 979ms
> > >> > >   jdk.internal.reflect.GeneratedMethodAccessor640.invoke()
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> > >> > >   java.lang.reflect.Method.invoke(Method.java:568)
> > >> > >
> > >>
> org.apache.commons.jxpath.util.ValueUtils.getValue(ValueUtils.java:367)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.model.beans.BeanPropertyPointer.getBaseValue(BeanPropertyPointer.java:120)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.model.beans.BeanPropertyPointer.getImmediateNode(BeanPropertyPointer.java:149)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.model.beans.PropertyPointer.getImmediateValuePointer(PropertyPointer.java:161)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.model.NodePointer.getValuePointer(NodePointer.java:297)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.getNodePointer(PropertyIterator.java:121)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.axes.DescendantContext.nextNode(DescendantContext.java:115)
> > >> > >
> > >>
> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:349)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.axes.ChildContext.getSingleNodePointer(ChildContext.java:70)
> > >> > >
> > >>
> org.apache.commons.jxpath.ri.compiler.Path.searchForPath(Path.java:201)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.compiler.Path.getSingleNodePointerForSteps(Path.java:176)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.compiler.LocationPath.computeValue(LocationPath.java:87)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:353)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:313)
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> com.spotnana.webhooks.isos.PNRListBuilderTest.testJxPathCtx(PNRListBuilderTest.java:366)
> > >> > >
> > >> > > On Sun, Sep 24, 2023 at 1:24 AM Debraj Manna <
> > >> subharaj.ma...@gmail.com>
> > >> > > wrote:
> > >> > >
> > >> > > > I am trying to search using JxPath on a proto message, My proto
> > >> message
> > >> > > is
> > >> > > > placed here
> > >> > > > <
> > >> https://gist.github.com/debraj-manna/4a8ded5d79dc9aee8d4c03d460327284
> > >> > >.
> > >> > > >
> > >> > > > val protoStr =
> > >> > > >
> > getStringFromFile("classpath:BookingEnginePnrUpdateEventProto.txt");
> > >> > > > val msgBld = BookingEnginePNRUpdateEvent.newBuilder();
> > >> > > > TextFormat.getParser().merge(protoStr, msgBld);
> > >> > > > val msgCtx = JXPathContext.newContext(msgBld.build());
> > >> > > > System.out.println(msgCtx.getValue("//employeeId"));
> > >> > > >
> > >> > > > I am observing that  msgCtx.getValue("//employeeId") is taking a
> > >> lot of
> > >> > > > time. Thread dumps at various points are placed in the below
> gist.
> > >> > > >
> > >> > > >
> > >> https://gist.github.com/debraj-manna/47852fa190075abdacd527969f355cde
> > >> > > >
> > >> > > > If I specify the entire path like
> > >> > > >
> > >> > >
> > >> >
> > >>
> >
> msgCtx.getValue("/metadata/bookerInfo/traveler/userBusinessInfo/employeeId").
> > >> > > > It is working fine.
> > >> > > >
> > >> > > > Can someone let me know what is going wrong? Is this expected?
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > > >
> > >> > >
> > >> >
> > >>
> > >
> >
>

Reply via email to