the use of same-name siblings (sns) is discouraged since paths containing sns segments become instable, see [1] and [2].
cheers stefan [1] http://wiki.apache.org/jackrabbit/DavidsModel#Rule_.234:_Beware_of_Same_Name_Siblings. [2] http://www.day.com/specs/jcr/2.0/22_Same-Name_Siblings.html On Mon, Jul 15, 2013 at 12:15 AM, Ulrich <[email protected]> wrote: > I see a similiar effect for node-iterated result of a query; the delivered > sibling depends on my actions during the loop. > I'm running the code: > > NodeIterator nodeIterator = queryResult.getNodes(); > while (nodeIterator.hasNext()) { > Node selectNode = nodeIterator.nextNode(); > String nodename=selectNode.getPath(); > LOGGER.debug("Nodename1={}",nodename); > DoSomething doSomething = new DoSomething(selectNode); > } > > The DoSomething-Class doesn't change anything; it searches itself the > repository > tree for more infos. > > If I run DoSomething full functioning the list of logged nodenames is: > Nodename1=../jcr:content/content/contentcontainer2cols[4]/itemsLeft/richtextimage_3 > Nodename1=../jcr:content/content/contentcontainer2cols[2]/itemsRight/richtextimage_4 > Nodename1=../jcr:content/content/contentcontainer2cols[3]/itemsLeft/richtextimage_1 > Nodename1=../jcr:content/content/contentcontainer2cols[2]/itemsRight/richtextimage_0 > Nodename1=../jcr:content/content/contentcontainer2cols/itemsLeft/richtextimage > Nodename1=../jcr:content/content/contentcontainer2cols[3]/itemsRight/richtextimage_2 > > if I suppress all actions in DoSomething the result is: > Nodename1=../jcr:content/content/contentcontainer2cols[4]/itemsLeft/richtextimage_3 > Nodename1=../jcr:content/content/contentcontainer2cols[4]/itemsRight/richtextimage_4 > Nodename1=../jcr:content/content/contentcontainer2cols[3]/itemsLeft/richtextimage_1 > Nodename1=../jcr:content/content/contentcontainer2cols[2]/itemsRight/richtextimage_0 > Nodename1=../jcr:content/content/contentcontainer2cols/itemsLeft/richtextimage > Nodename1=../jcr:content/content/contentcontainer2cols[3]/itemsRight/richtextimage_2 > > In the second name the same-named sibling has changed to from > contentcontainer2cols[2] to contentcontainer2cols[4]. > > This is quite annoying; from now I can't work with the retrieved node directly > any more; I have to store the names in a list and iterate on the list then: > > NodeIterator nodeIterator = queryResult.getNodes(); > List<String> nodenames = new ArrayListy<String>(); > while (nodeIterator.hasNext()) { > Node selectNode = nodeIterator.nextNode(); > String nodename=selectNode.getPath(); > LOGGER.debug("Nodename1={}",nodename); > nodenames.add(nodename); > } > for (String nodename : nodenames) { > Node selectNode = session.getNode(nodename); > DoSomething doSomething = new DoSomething(selectNode); > } > > brgds, > Ulrich > > > >> Ulrich <[email protected]> hat am 11. Juli 2013 um 15:25 geschrieben: >> >> >> When changing ComparableNode-Constructor to: >> public ComparableNode(Node node) throws Exception { >> this.node=node; >> this.session=node.getSession(); >> LOGGER.info("Nodename2="+getNode().getPath()); >> buildEffectiveACL(); >> } >> >> I see these messages: >> Nodename1=/content/sibling[2]/mynode >> Nodename3=/content/sibling[2]/mynode >> Nodename2=/content/sibling[2]/mynode >> Nodename3=/content/sibling/mynode >> Nodename4=/content/sibling/mynode >> >> >> > Ulrich <[email protected]> hat am 11. Juli 2013 um 15:20 geschrieben: >> > >> > >> > While researching nodes I build for each of these nodes a new object with >> > some >> > methods to be tested. >> > So I have a class "ComparableNode": >> > >> > private Session session; >> > private final Node node; >> > >> > public ComparableNode(Node node) throws Exception { >> > this.node=node; >> > this.session=node.getSession(); >> > LOGGER.info("Nodename2="+node.getPath()); >> > buildEffectiveACL(); >> > } >> > >> > public Node getNode() throws RepositoryException { >> > LOGGER.info("Nodename3="+node.getPath()); >> > return this.node; >> > } >> > >> > The class is instantiated by: >> > LOGGER.info("Nodename1="+node.getPath()); >> > ComparableNode cmpNode = new ComparableNode(node); >> > LOGGER.info("Nodename4="+cmpNode.getNode()); >> > >> > The node itself partially contains a same-name sibling; by retrieving the >> > node >> > from my ComparableNode I lose the index of the sibling. >> > So when researching: /content/sibling[2]/mynode >> > I get these messages: >> > Nodename1=/content/sibling[2]/mynode >> > Nodename2=/content/sibling[2]/mynode >> > Nodename3=/content/sibling/mynode >> > Nodename4=/content/sibling/mynode >> > >> > As you can see the node itself is stored to a final variable by the >> > constructor >> > of ComparableNode. But when retrieving it, it represents a different node. >> > >> > Any idea, whats going on here? >> > >> > brgds, >> > Ulrich
