For those who want the details of the analysis so far:<div><br></div><div>We start with AbstractPassageBook.getOsisIterator. This core function essentially obtains the XML and converts it to a XML structure.</div><div><ul>
<li>This iterates over ranges first</li><ul><li>within each range, (1)</li><ul><li>adds some headers to the xml document (2)</li><li>iterates over each verse (3)</li><ul><li> calls getRawText</li><ul><li>getRawText in turn calls the relevant backend</li>
<li>The backend, calls activate</li><ul><li>uses the stored fields to retrieve the random access files that have already been opened (and cause the problem)</li><li>returns OSIS in raw &quot;string&quot; form (4)</li></ul>
</ul><li>adds the xml to the xml document (5)</li></ul></ul></ul></ul><div>My suggested refactoring, would be to re-jig things as follows:</div><div><ul><li>(removed)</li><ul><li>(removed)</li><ul><li>(removed)</li><li>(removed)</li>
<ul><li> calls getRawText</li><ul><li>getRawText in turn calls the relevant backend</li><li>The backend, calls activate (? no longer required?)</li><ul><li>uses the stored fields to retrieve the random access files that have already been opened (and cause the problem)</li>
<li><b>within each range, (1)</b></li><li><b>use passed-in parameter and adds some headers to the xml document (2)</b></li><li><b>iterates over each verse (3)</b></li><ul><li>returns OSIS in raw &quot;string&quot; form (4)</li>
<li><b>adds the xml to the xml document (5)</b></li></ul></ul></ul></ul></ul></ul></ul></div><div><br></div><div>Something along those lines anyway (lines in bold have moved/changed slightly)</div><div>Chris</div><div><br>
</div><div><br></div><br><div class="gmail_quote">On 23 August 2012 22:33, Chris Burrell <span dir="ltr">&lt;<a href="mailto:chris@burrell.me.uk" target="_blank">chris@burrell.me.uk</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi all<div><br></div><div>Just wondering if this section of the &quot;Activator&quot; code was introduced to reduce memory as a result of observing an issue, or not? I&#39;m looking at SwordGenBook in particular, but seeing all kinds of interesting things</div>

<div><br></div><div><ul><li>Activator has a reduceMemoryUsage method. This is based on KILL. Of the 3 enum constants, only 1 has a method that actually does something. And as far as I can tell, anyone can call reduceMemoryUsage at any time, which will then thoroughly break anything in the process of running by nulling out a whole load of references.</li>

<li>Secondly, there is this Lock object. It&#39;s not used to synchronise on, nor used in any form. The private javadoc comment is slightly mis-leading, unless I&#39;m missing a piece of code somewhere.</li><li>SwordGenBook.activate gets an empty set from its parent, and thereby the loop doesn&#39;t do anything.</li>

<li>the &quot;global&quot; field is always an empty ReadOnlyList as a result, can we remove and simplify this?</li></ul><div>In the SwordBook:</div><div><ul><li>activate() does nothing (apart from registering it with the activator, which seems to defeat the point as there is no clean-up)</li>

<li>deactivate() deactivates the backend it is based upon. Should this be done preferably by the backend rather than here?</li></ul><div>Finally, in order to address JS-109 and contain the refactoring process, I am thinking of changing the method signature for AbstractPassageBook.getRawText(). My intended approach is to pass in an extract parameter, as 1 or 2 anonymous class to post-process what has been discovered in reading the raw data. By doing so, I believe I might be able to push both loops from AbstractPassageBook into the backends, so that the backends themselves deal with iterating through ranges and verses. </div>

</div><div><br></div><div>The idea being, for performance reasons, we want to keep the random access files open and re-use the state. However, we don&#39;t want to be sharing the state across threads, and therefore that state needs to be local. Not sure if it&#39;s going to be feasible doing it that way, but I thought I might give it a go. It obviously might mean re-jigging the vast majority of the backends. Shout if you want some more details.</div>

<div><br></div></div><div>Cheers</div><span class="HOEnZb"><font color="#888888"><div>Chris</div><div><br></div>
</font></span></blockquote></div><br></div>