<style>
/* Changing the layout to use less space for mobiles */
@media screen and (max-device-width: 480px), screen and (-webkit-min-device-pixel-ratio: 2) {
#email-body { min-width: 30em !important; }
#email-page { padding: 8px !important; }
#email-banner { padding: 8px 8px 0 8px !important; }
#email-avatar { margin: 1px 8px 8px 0 !important; padding: 0 !important; }
#email-fields { padding: 0 8px 8px 8px !important; }
#email-gutter { width: 0 !important; }
}
</style>
<div id="email-body">
<table id="email-wrap" align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#f0f0f0;color:#000000;width:100%;">
<tr valign="top">
<td id="email-page" style="padding:16px !important;">
<table align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#ffffff;border:1px solid #bbbbbb;color:#000000;width:100%;">
<tr valign="top">
<td bgcolor="#4d5c47" style="background-color:#4d5c47;color:#ffffcc;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;line-height:1;"><img src="http://www.crosswire.org/bugs/s/en_US-l73y3/783/14/_/jira-logo-scaled.png" alt="" style="vertical-align:top;" /></td>
</tr><tr valign="top">
<td id="email-banner" style="padding:32px 32px 0 32px;">
<table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;">
<tr valign="top">
<td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;padding:0;">
<img id="email-avatar" src="http://www.crosswire.org/bugs/secure/useravatar?avatarId=10062" alt="" height="48" width="48" border="0" align="left" style="padding:0;margin: 0 16px 16px 0;" />
<div id="email-action" style="padding: 0 0 8px 0;font-size:12px;line-height:18px;">
<a class="user-hover" rel="mjdenham" id="email_mjdenham" href="http://www.crosswire.org/bugs/secure/ViewProfile.jspa?name=mjdenham" style="color:#000000;">Martin Denham</a>
created <img src="http://www.crosswire.org/bugs/images/icons/bug.gif" height="16" width="16" border="0" align="absmiddle" alt="Bug"> <a style='color:#000000;text-decoration:none;' href='http://www.crosswire.org/bugs/browse/JS-270'>JS-270</a>
</div>
<div id="email-summary" style="font-size:16px;line-height:20px;padding:2px 0 16px 0;">
<a style='color:#000000;text-decoration:none;' href='http://www.crosswire.org/bugs/browse/JS-270'><strong>Collections.sort(List<RocketPassage>) is reverse order - Rev first and Gen last</strong></a>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr valign="top">
<td id="email-fields" style="padding:0 32px 32px 32px;">
<table border="0" cellpadding="0" cellspacing="0" style="padding:0;text-align:left;width:100%;" width="100%">
<tr valign="top">
<td id="email-gutter" style="width:64px;white-space:nowrap;"></td>
<td>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Issue Type:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<img src="http://www.crosswire.org/bugs/images/icons/bug.gif" height="16" width="16" border="0" align="absmiddle" alt="Bug"> Bug
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Affects Versions:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
1.6.1 </td>
</tr>
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Assignee:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<a class="user-hover" rel="dmsmith" id="email_dmsmith" href="http://www.crosswire.org/bugs/secure/ViewProfile.jspa?name=dmsmith" style="color:#000000;">DM Smith</a>
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Components:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
o.c.jsword.passage </td>
</tr>
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Created:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
14/Apr/13 1:05 PM
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Description:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<p style='margin-top:0;margin-bottom:10px;'>Lists of RocketPassages now appear to sort in inverse biblical order whereas they used to sort in Biblical order when using Collections.sort(rocketPassageList).</p>
<p style='margin-top:0;margin-bottom:10px;'>And Bible bookmarks seem to be deserialized to RocketPassages and when sorted using the latest JSword bookmarks in Rev appear at the top of the list and Genesis at the bottom, but with pre-av11n code bookmarks in Genesis would appear at the top.</p>
<p style='margin-top:0;margin-bottom:10px;'>I have dug in a little.<br/>
This is the old code in AbstractPassage.compareTo:<br/>
Verse thatfirst = thatref.getVerseAt(0);<br/>
Verse thisfirst = getVerseAt(0);</p>
<p style='margin-top:0;margin-bottom:10px;'> return thisfirst.compareTo(thatfirst);<br/>
Verse.compareTo:<br/>
                int thatStart = that.getOrdinal();<br/>
int thisStart = this.getOrdinal();<br/>
                if (thatStart > thisStart) {
return -1;
}<br/>
if (thatStart < thisStart) {
return 1;
}                </p>
<p style='margin-top:0;margin-bottom:10px;'>And here is the new code:<br/>
Verse thatfirst = thatref.getVerseAt(0);<br/>
Verse thisfirst = getVerseAt(0);<br/>
return getVersification().distance(thisfirst, thatfirst);<br/>
Versification:<br/>
public int distance(Verse start, Verse end) {<br/>
return end.getOrdinal() - start.getOrdinal();</p>
<p style='margin-top:0;margin-bottom:10px;'>To see the problem imagine in the old code:<br/>
if (thatVerseinRev > thisVerseInGen) // obviously true<br/>
return -1                                                                                // so in old code the compareTo result is -ve<br/>
But in the new code:<br/>
distance(thisVerseInGen, thatVerseInRev)<br/>
thatVerseInRev.ordinal - thisVerseInGen.ordinal         // result is +ve</p>
<p style='margin-top:0;margin-bottom:10px;'>Is it okay simply to reverse the order of that and this in AbstractPassage and make it:<br/>
return thatfirst.compareTo(thisfirst);<br/>
Will this problem be seen in any other places?</p>
<p style='margin-top:0;margin-bottom:10px;'>I created a couple of junits in VersificationParentTst and they seem to point to the problem only affecting lists of RocketPassage which initially surprised me until I noticed that Verse has it's own compareTo method.</p>
<p style='margin-top:0;margin-bottom:10px;'>// This test works correctly<br/>
public void testListSort() {<br/>
if (v11n.containsBook(BibleBook.GEN) && v11n.containsBook(BibleBook.REV)) {
List<Key> keyList = new ArrayList<Key>();
Verse gen11 = new Verse(v11n, BibleBook.GEN, 1, 1);
Verse rev11 = new Verse(v11n, BibleBook.REV, 1, 1);
keyList.add(gen11);
keyList.add(rev11);
Collections.sort(keyList);
assertEquals(gen11, keyList.get(0));
assertEquals(rev11, keyList.get(1));
}<br/>
}<br/>
// This test fails because Rev is first and Gen last<br/>
public void testListSort2() {<br/>
try {<br/>
if (v11n.containsBook(BibleBook.GEN) && v11n.containsBook(BibleBook.REV)) {
List<Key> keyList = new ArrayList<Key>();
// gen11 and rev11 created this way are actually RocketPassage objects, not Verse objects
Key gen11 = PassageKeyFactory.instance().getKey(v11n, "Gen.1.1");
Key rev11 = PassageKeyFactory.instance().getKey(v11n, "Rev.1.1");
keyList.add(gen11);
keyList.add(rev11);
Collections.sort(keyList);
assertEquals(gen11, keyList.get(0));
assertEquals(rev11, keyList.get(1));
}<br/>
} catch (Exception e) {
fail("Exception in testListSort2");
}<br/>
}</p>
<p style='margin-top:0;margin-bottom:10px;'>Regards<br/>
Martin</p>
</td>
</tr>
<tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Project:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<a style="color:#000000;" href="http://www.crosswire.org/bugs/browse/JS">JSword</a>
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Priority:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<img src="http://www.crosswire.org/bugs/images/icons/priority_minor.gif" height="16" width="16" border="0" align="absmiddle" alt="Minor"> Minor
</td>
</tr> <tr valign="top">
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
<strong style="font-weight:normal;color:#505050;">Reporter:</strong>
</td>
<td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
<a class="user-hover" rel="mjdenham" id="email_mjdenham" href="http://www.crosswire.org/bugs/secure/ViewProfile.jspa?name=mjdenham" style="color:#000000;">Martin Denham</a>
</td>
</tr> </table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td><!-- End #email-page -->
</tr>
<tr valign="top">
<td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:10px;line-height:14px;padding: 0 16px 16px 16px;text-align:center;">
This message is automatically generated by JIRA.<br />
If you think it was sent incorrectly, please contact your JIRA administrators<br />
For more information on JIRA, see: <a style='color:#000000;' href='http://www.atlassian.com/software/jira'>http://www.atlassian.com/software/jira</a>
</td>
</tr>
</table><!-- End #email-wrap -->
</div><!-- End #email-body -->