<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Jan 11, 2014 at 9:30 PM, DM Smith <span dir="ltr">&lt;<a href="mailto:dmsmith@crosswire.org" target="_blank">dmsmith@crosswire.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><div class="im">
<div>On Jan 11, 2014, at 9:48 PM, Greg Hellings &lt;<a href="mailto:greg.hellings@gmail.com" target="_blank">greg.hellings@gmail.com</a>&gt; wrote:</div><br><blockquote type="cite"><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
for (Key key : book.getKey(requestedReference)) {</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
    BookData data = new BookData(book, key);</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
    </div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
    System.out.println(OSISUtil.getCanonicalText(data.getOSISFragment()));</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
}</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
<br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
This works fine for Bibles. I can iterate a single chapter, verse range, book, etc in a Bible. I can get out any entry in a Dictionary. I can even get the contents of a Gen Book if that sub-tree is only one level deep. E.g. I can get out Pilgrim&#39;s Progress &#39;SOURCE&#39; section or &#39;TITLE&#39; section. But I can&#39;t get out &#39;THE_AUTHOR&#39;S_APOLOGY_FOR_HIS_BOOK&#39; or &#39;PART_I&#39;. Both of them throw a NoSuchKeyException, although getGlobalKeyList() returned a key whose OSIS ID claims to be equal to that string. Am I doing something wrong here, or breaking some sort of assumption about module types?</div>
</blockquote><div><br></div></div>From memory:</div><div><br></div><div>The basic idea is that *a* key is either a leaf node or it can have (i.e. has) children.<br></div><div><br></div><div>So given a top level key. You&#39;ll need to ask it if it has children. If it does then you need to get them with that key&#39;s iterator.</div>
<div><br></div><div>This is true of every key: it implements hasChildren() which is a test that is needed before getting the children. And there are a variety of ways to get the children.</div><div><br></div><div>1) By iterator (it has multiple semantic depending on whether a Key is a single item, a list or a node in a tree)</div>
<div>2) by number (with key.getChildCount(), key.get(n)) (You can also reverse the call of get(n) with key.indexOf(c))</div><div><br></div><div>You&#39;ll either need recursion or a stack to do a depth first processing of the tree. I don&#39;t think we&#39;ve had a use case for having that in JSword. So far getting the children has been by user demand.</div>
</div></blockquote><div><br></div><div>This will be useful once I get the actual key.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div style="word-wrap:break-word"><div><br></div><div>The string that is used for a key in a gen book is a path from the root. I forget the representation of the path. I don&#39;t remember if there is a lookup given a path.</div>
</div></blockquote><div><br></div><div>It&#39;s this presentation that is tripping me up. To continue using Pilgrim&#39;s Progress as an example, the following call works:<br></div><div><br></div><div>Book book = Books.installed().getBook(&quot;Pilgrim&quot;);</div>
<div>Key baseKey = book.getKey(&quot;SOURCE&quot;);</div><div><br></div><div>This call, prints out the exception message, &quot;org.crosswire.jsword.passage.NoSuchKeyException: No entry for &#39;PART_I&#39; in Pilgrim.&quot;:</div>
<div><br></div><div>Book book = Books.installed().getBook(&quot;Pilgrim&quot;);</div><div>Key baseKey = book.getKey(&quot;PART_I&quot;);</div><div><br></div><div>However, when I iterate the results of getGlobalKeyList I see PART_I listed as a sub-key of the module. I&#39;m guessing that in BibleDesktop you&#39;re expanding a tree in the UI whose nodes already have a reference to the Key itself, so you don&#39;t need to retrieve an arbitrary key out of a GenBook? I&#39;m looking at this from the context of a web service where a request could come in with any arbitrary key depth.</div>
<div><br></div><div>--Greg</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">
<div><br></div><div>Given the above it is pretty easy. Split the path into a list. Match at the top level, iterate over the children until a match of the next level and repeat until last level is processed.</div><div><br>
</div><div>Hope this helps.</div><div><br></div><div>And welcome to the JSword world.</div><div><br></div><div>BTW, you may want to look at o.c.j.bridge and o.c.j.examples. For the most part I try to keep these up as a simple tutorial. Bridge is meant to be a collection of useful programs in their own right.</div>
<div><br></div><div>In Him,</div><div><span style="white-space:pre-wrap">        </span>DM</div><br></div><br>_______________________________________________<br>
jsword-devel mailing list<br>
<a href="mailto:jsword-devel@crosswire.org">jsword-devel@crosswire.org</a><br>
<a href="http://www.crosswire.org/mailman/listinfo/jsword-devel" target="_blank">http://www.crosswire.org/mailman/listinfo/jsword-devel</a><br>
<br></blockquote></div><br></div></div>