Regeneration from plexi 85c51d5
diff --git a/coverage/com.google.enterprise.adaptor.AbortImmediatelyFilter.html b/coverage/com.google.enterprise.adaptor.AbortImmediatelyFilter.html
index 489d066..6f816de 100644
--- a/coverage/com.google.enterprise.adaptor.AbortImmediatelyFilter.html
+++ b/coverage/com.google.enterprise.adaptor.AbortImmediatelyFilter.html
@@ -61,7 +61,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 22</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Filter that aborts the request when server is under high load. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 23</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">class</span> AbortImmediatelyFilter <span class="keyword">extends</span> Filter {</pre></td></tr>
+<tr> <td class="numLineCover"> 23</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> <span class="keyword">class</span> AbortImmediatelyFilter <span class="keyword">extends</span> Filter {</pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
@@ -79,14 +79,14 @@
<td class="src"><pre class="src"> <span class="comment">// Checking abortImmediately is part of a hack to immediately reject clients</span></pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// when the work queue grows too long.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"><a title="Line 33: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 33: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (HttpExchanges.abortImmediately.get() != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"><a title="Line 33: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 33: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (HttpExchanges.abortImmediately.get() != <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(</pre></td></tr>
<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"Aborting request because server is under high load"</span>);</pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> chain.doFilter(ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> chain.doFilter(ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.AbstractAdaptor.html b/coverage/com.google.enterprise.adaptor.AbstractAdaptor.html
index 3cc1d3d..d373f6e 100644
--- a/coverage/com.google.enterprise.adaptor.AbstractAdaptor.html
+++ b/coverage/com.google.enterprise.adaptor.AbstractAdaptor.html
@@ -12,7 +12,7 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.AbstractAdaptor.html">AbstractAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:80px"><span class="text">8/10</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.2;</span>1.2</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.AbstractAdaptor.html">AbstractAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:70px"><span class="text">7/10</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.2;</span>1.2</td></tr>
</table>
<div class="separator"> </div>
@@ -67,7 +67,7 @@
<td class="src"><pre class="src"> <span class="comment"> * and {@link Adaptor#getDocContent}.</span></pre></td></tr>
<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 334</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">class</span> AbstractAdaptor <span class="keyword">implements</span> Adaptor {</pre></td></tr>
+<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 333</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">class</span> AbstractAdaptor <span class="keyword">implements</span> Adaptor {</pre></td></tr>
<tr> <td class="numLineCover"> 27</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Logger.getLogger(AbstractAdaptor.<span class="keyword">class</span>.getName());</pre></td></tr>
@@ -80,7 +80,7 @@
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <p>This implementation provides {@link AuthzStatus#PERMIT} for all {@code</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <p>This implementation provides {@link AuthzStatus#DENY} for all {@code</span></pre></td></tr>
<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * DocId}s in an unmodifiable map.</span></pre></td></tr>
<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
@@ -91,14 +91,14 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> Map<DocId, AuthzStatus> isUserAuthorized(AuthnIdentity userIdentity,</pre></td></tr>
<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Collection<DocId> ids) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> Map<DocId, AuthzStatus> result</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> Map<DocId, AuthzStatus> result</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> HashMap<DocId, AuthzStatus>(ids.size() * 2);</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"><a title="Line 41: Conditional coverage 100% (2/2)."> 34</a></td> <td class="src"><pre class="src"> <a title="Line 41: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (DocId id : ids) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> result.put(id, AuthzStatus.PERMIT);</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"><a title="Line 41: Conditional coverage 100% (2/2)."> 1</a></td> <td class="src"><pre class="src"> <a title="Line 41: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (DocId id : ids) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> result.put(id, AuthzStatus.DENY);</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.unmodifiableMap(result);</pre></td></tr>
+<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.unmodifiableMap(result);</pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
@@ -115,7 +115,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> initConfig(Config config) {}</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> initConfig(Config config) {}</pre></td></tr>
<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
@@ -130,7 +130,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> init(AdaptorContext context) <span class="keyword">throws</span> Exception {}</pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> <span class="keyword">void</span> init(AdaptorContext context) <span class="keyword">throws</span> Exception {}</span></pre></td></tr>
<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.AbstractDocIdPusher.html b/coverage/com.google.enterprise.adaptor.AbstractDocIdPusher.html
index 5b9dbc4..13729aa 100644
--- a/coverage/com.google.enterprise.adaptor.AbstractDocIdPusher.html
+++ b/coverage/com.google.enterprise.adaptor.AbstractDocIdPusher.html
@@ -12,7 +12,7 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.AbstractDocIdPusher.html">AbstractDocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">9/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5;</span>1.5</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.AbstractDocIdPusher.html">AbstractDocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:88px"><span class="text">8/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5;</span>1.5</td></tr>
</table>
<div class="separator"> </div>
@@ -59,7 +59,7 @@
<td class="src"><pre class="src"> <span class="comment"> * Abstract class providing most methods required for a {@code DocIdPusher}.</span></pre></td></tr>
<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">abstract</span> <span class="keyword">class</span> AbstractDocIdPusher <span class="keyword">implements</span> DocIdPusher {</pre></td></tr>
+<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 44</td> <td class="src"><pre class="src"> <span class="keyword">abstract</span> <span class="keyword">class</span> AbstractDocIdPusher <span class="keyword">implements</span> DocIdPusher {</pre></td></tr>
<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
@@ -72,7 +72,7 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> DocId pushDocIds(Iterable<DocId> docIds)</pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> pushDocIds(docIds, <span class="keyword">null</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 29</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> pushDocIds(docIds, <span class="keyword">null</span>);</span></pre></td></tr>
<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
@@ -93,13 +93,13 @@
<td class="src"><pre class="src"> PushErrorHandler handler)</pre></td></tr>
<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> List<Record> records = <span class="keyword">new</span> ArrayList<Record>();</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"><a title="Line 41: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 41: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (DocId docId : docIds) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> records.add(<span class="keyword">new</span> Record.Builder(docId).build());</pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> List<Record> records = <span class="keyword">new</span> ArrayList<Record>();</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"><a title="Line 41: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 41: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (DocId docId : docIds) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> records.add(<span class="keyword">new</span> Record.Builder(docId).build());</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> Record record = pushRecords(records, handler);</pre></td></tr>
-<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"><a title="Line 45: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 45: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> record == <span class="keyword">null</span> ? <span class="keyword">null</span> : record.getDocId();</a></pre></td></tr>
+<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Record record = pushRecords(records, handler);</pre></td></tr>
+<tr> <td class="numLineCover"> 45</td> <td class="nbHitsUncovered"><a title="Line 45: Conditional coverage 50% (1/2)."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 45: Conditional coverage 50% (1/2)."> <span class="keyword">return</span> record == <span class="keyword">null</span> ? <span class="keyword">null</span> : record.getDocId();</a></span></pre></td></tr>
<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.AbstractLazyOutputStream.html b/coverage/com.google.enterprise.adaptor.AbstractLazyOutputStream.html
index 874717a..da2ef53 100644
--- a/coverage/com.google.enterprise.adaptor.AbstractLazyOutputStream.html
+++ b/coverage/com.google.enterprise.adaptor.AbstractLazyOutputStream.html
@@ -61,7 +61,7 @@
<td class="src"><pre class="src"> <span class="comment"> * {@link #retrieveOs}, but calls {@code retrieveOs()} only once needed.</span></pre></td></tr>
<tr> <td class="numLine"> 22</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 23</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">abstract</span> <span class="keyword">class</span> AbstractLazyOutputStream <span class="keyword">extends</span> OutputStream {</pre></td></tr>
+<tr> <td class="numLineCover"> 23</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> <span class="keyword">abstract</span> <span class="keyword">class</span> AbstractLazyOutputStream <span class="keyword">extends</span> OutputStream {</pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> OutputStream os;</pre></td></tr>
<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
@@ -70,27 +70,27 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> close() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 28</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> loadOs();</pre></td></tr>
-<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> os.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 28</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> loadOs();</pre></td></tr>
+<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> os.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> flush() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 28</td> <td class="src"><pre class="src"> loadOs();</pre></td></tr>
-<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> os.flush();</pre></td></tr>
-<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> loadOs();</pre></td></tr>
+<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> os.flush();</pre></td></tr>
+<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> write(<span class="keyword">byte</span>[] b, <span class="keyword">int</span> off, <span class="keyword">int</span> len) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> loadOs();</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> os.write(b, off, len);</pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> loadOs();</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> os.write(b, off, len);</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
@@ -112,11 +112,11 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">protected</span> <span class="keyword">void</span> loadOs() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"><a title="Line 56: Conditional coverage 100% (2/2)."> 68</a></td> <td class="src"><pre class="src"> <a title="Line 56: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (os == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> os = retrieveOs();</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"><a title="Line 56: Conditional coverage 100% (2/2)."> 59</a></td> <td class="src"><pre class="src"> <a title="Line 56: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (os == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> os = retrieveOs();</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 66</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 57</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.AdministratorSecurityHandler.html b/coverage/com.google.enterprise.adaptor.AdministratorSecurityHandler.html
index 127635c..9a9493f 100644
--- a/coverage/com.google.enterprise.adaptor.AdministratorSecurityHandler.html
+++ b/coverage/com.google.enterprise.adaptor.AdministratorSecurityHandler.html
@@ -119,11 +119,11 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> AdministratorSecurityHandler(HttpHandler handler,</pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> SessionManager<HttpExchange> sessionManager, AuthnClient authnClient) {</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.handler = handler;</pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sessionManager = sessionManager;</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.authnClient = authnClient;</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> SessionManager<HttpExchange> sessionManager, AuthnClient authnClient) {</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.handler = handler;</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sessionManager = sessionManager;</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.authnClient = authnClient;</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
@@ -132,8 +132,8 @@
<td class="src"><pre class="src"> SessionManager<HttpExchange> sessionManager, String gsaHostname,</pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">boolean</span> useHttps) {</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(handler, sessionManager, <span class="keyword">new</span> GsaAuthnClient(gsaHostname, useHttps));</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(handler, sessionManager, <span class="keyword">new</span> GsaAuthnClient(gsaHostname, useHttps));</pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
@@ -315,10 +315,10 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> useHttps;</pre></td></tr>
<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GsaAuthnClient(String gsaHostname, <span class="keyword">boolean</span> useHttps) {</pre></td></tr>
-<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.gsaHostname = gsaHostname;</pre></td></tr>
-<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.useHttps = useHttps;</pre></td></tr>
-<tr> <td class="numLineCover"> 186</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GsaAuthnClient(String gsaHostname, <span class="keyword">boolean</span> useHttps) {</pre></td></tr>
+<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.gsaHostname = gsaHostname;</pre></td></tr>
+<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.useHttps = useHttps;</pre></td></tr>
+<tr> <td class="numLineCover"> 186</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 188</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.Application.html b/coverage/com.google.enterprise.adaptor.Application.html
index c1d9835..cb5c3df 100644
--- a/coverage/com.google.enterprise.adaptor.Application.html
+++ b/coverage/com.google.enterprise.adaptor.Application.html
@@ -12,11 +12,11 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">29</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:73px"><span class="text">80/109</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:62px"><span class="text">10/16</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">7/7</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">5/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$ShutdownHook</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:33px"><span class="text">1/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$SuggestHandlerAbortPolicy</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:44px"><span class="text">4/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">25</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:81px"><span class="text">108/133</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:79px"><span class="text">19/24</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">7/7</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">5/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$ShutdownHook</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:33px"><span class="text">1/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$SuggestHandlerAbortPolicy</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:44px"><span class="text">4/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
</table>
<div class="separator"> </div>
@@ -54,472 +54,638 @@
<tr> <td class="numLine"> 16</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 17</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.HttpServer;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> com.google.common.annotations.VisibleForTesting;</pre></td></tr>
<tr> <td class="numLine"> 18</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.HttpsConfigurator;</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 19</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.HttpsParameters;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.HttpServer;</pre></td></tr>
<tr> <td class="numLine"> 20</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.HttpsServer;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.HttpsConfigurator;</pre></td></tr>
<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.HttpsParameters;</pre></td></tr>
<tr> <td class="numLine"> 22</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.io.IOException;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.HttpsServer;</pre></td></tr>
<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.net.*;</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.security.NoSuchAlgorithmException;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.io.File;</pre></td></tr>
<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.concurrent.*;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.io.IOException;</pre></td></tr>
<tr> <td class="numLine"> 26</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.logging.Level;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.net.*;</pre></td></tr>
<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.logging.Logger;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.security.NoSuchAlgorithmException;</pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.Arrays;</pre></td></tr>
<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> javax.net.ssl.SSLContext;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.concurrent.*;</pre></td></tr>
<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> javax.net.ssl.SSLParameters;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.logging.Level;</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.logging.Logger;</pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Provides framework for adaptors to act as a stand-alone application. This</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> javax.net.ssl.SSLContext;</pre></td></tr>
<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * entails creating well-configured HttpServer instances, argument parsing,</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> javax.net.ssl.SSLParameters;</pre></td></tr>
<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * shutdown handling, and more.</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">class</span> Application {</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Provides framework for adaptors to act as a stand-alone application. This</span></pre></td></tr>
<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String SLEEP_PATH = <span class="string">"/sleep"</span>;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * entails creating well-configured HttpServer instances, argument parsing,</span></pre></td></tr>
<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
-<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = Logger.getLogger(Application.<span class="keyword">class</span>.getName());</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * shutdown handling, and more.</span></pre></td></tr>
+<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">class</span> Application {</pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String SLEEP_PATH = <span class="string">"/sleep"</span>;</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Config config;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String DEFAULT_CONFIG_FILE</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> GsaCommunicationHandler gsa;</pre></td></tr>
+ <td class="src"><pre class="src"> = <span class="string">"adaptor-config.properties"</span>;</pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> Thread shutdownHook;</pre></td></tr>
-<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> HttpServer primaryServer;</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> HttpServer dashboardServer;</pre></td></tr>
+ <td class="src"><pre class="src"> = Logger.getLogger(Application.<span class="keyword">class</span>.getName());</pre></td></tr>
<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 49</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Application(Adaptor adaptor, Config config) {</pre></td></tr>
-<tr> <td class="numLineCover"> 50</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
+<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Config config;</pre></td></tr>
+<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> GsaCommunicationHandler gsa;</pre></td></tr>
<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> gsa = <span class="keyword">new</span> GsaCommunicationHandler(adaptor, config);</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> Thread shutdownHook;</pre></td></tr>
+<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> HttpServer primaryServer;</pre></td></tr>
+<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> HttpServer dashboardServer;</pre></td></tr>
<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Start necessary services for receiving requests and managing background</span></pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Application(Adaptor adaptor, Config config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * tasks. Non-daemon threads are created, so call {@link #stop} for graceful</span></pre></td></tr>
-<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * manual shutdown. A shutdown hook is automatically installed that calls</span></pre></td></tr>
-<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * {@code stop()}.</span></pre></td></tr>
-<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> start() <span class="keyword">throws</span> IOException, InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsUncovered"><a title="Line 63: Conditional coverage 50% (1/2)."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 63: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (primaryServer != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Already started"</span>);</span></pre></td></tr>
-<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> shutdownHook = <span class="keyword">new</span> Thread(<span class="keyword">new</span> ShutdownHook(), <span class="string">"gsacomm-shutdown"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Runtime.getRuntime().addShutdownHook(shutdownHook);</pre></td></tr>
-<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> primaryServer = createHttpServer();</pre></td></tr>
-<tr> <td class="numLineCover"> 70</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> dashboardServer = createDashboardHttpServer();</pre></td></tr>
-<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> primaryServer.start();</pre></td></tr>
-<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> dashboardServer.start();</pre></td></tr>
-<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> gsa.start(primaryServer, dashboardServer);</pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> gsa = <span class="keyword">new</span> GsaCommunicationHandler(adaptor, config);</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Start necessary services for receiving requests and managing background</span></pre></td></tr>
+<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * tasks. Non-daemon threads are created, so call {@link #stop} for graceful</span></pre></td></tr>
+<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * manual shutdown. A shutdown hook is automatically installed that calls</span></pre></td></tr>
+<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * {@code stop()}.</span></pre></td></tr>
+<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> start() <span class="keyword">throws</span> IOException, InterruptedException {</pre></td></tr>
+<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> daemonInit();</pre></td></tr>
+<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// The shutdown hook is purposefully not part of the deamon methods,</span></pre></td></tr>
+<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// because it should only be done when running from the command line.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> shutdownHook = <span class="keyword">new</span> Thread(<span class="keyword">new</span> ShutdownHook(), <span class="string">"gsacomm-shutdown"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Runtime.getRuntime().addShutdownHook(shutdownHook);</pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Stop processing incoming requests and background tasks, allowing graceful</span></pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> daemonStart();</pre></td></tr>
+<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * shutdown.</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> stop(<span class="keyword">long</span> time, TimeUnit unit) {</pre></td></tr>
-<tr> <td class="numLineCover"> 82</td> <td class="nbHitsCovered"><a title="Line 82: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 82: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (primaryServer == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Already stopped"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Reserves resources for later use. This may be run with different</span></pre></td></tr>
+<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * permissions (like as root), to reserve ports or other things that need</span></pre></td></tr>
+<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * elevated privileges.</span></pre></td></tr>
<tr> <td class="numLine"> 84</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> daemonInit() <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsUncovered"><a title="Line 86: Conditional coverage 50% (1/2)."> 6</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 86: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (primaryServer != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Already started"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 85</td> <td class="nbHitsUncovered"><a title="Line 85: Conditional coverage 50% (1/2)."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 85: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (shutdownHook != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Runtime.getRuntime().removeShutdownHook(shutdownHook);</pre></td></tr>
-<tr> <td class="numLineCover"> 88</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalStateException ex) {</span></pre></td></tr>
-<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Already executing hook.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> shutdownHook = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> primaryServer = createHttpServer(config);</pre></td></tr>
+<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> dashboardServer = createDashboardHttpServer(config);</pre></td></tr>
+<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Because once stopped the server can't be reused, we can't reuse its</span></pre></td></tr>
<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// bind()ed socket if we stop it. So although ideally we would start/stop in</span></pre></td></tr>
<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// daemonStart/daemonStop, we instead must do it in</span></pre></td></tr>
+<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// daemonInit/daemonDestroy.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> primaryServer.start();</pre></td></tr>
+<tr> <td class="numLineCover"> 96</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> dashboardServer.start();</pre></td></tr>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 94</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> gsa.stop(time, unit);</pre></td></tr>
-<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> SleepHandler sleepHandler = <span class="keyword">new</span> SleepHandler(100 <span class="comment">/* millis */</span>);</pre></td></tr>
-<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Workaround Java Bug 7105369.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> primaryServer.createContext(SLEEP_PATH, sleepHandler);</pre></td></tr>
-<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> issueSleepGetRequest(config.getServerPort());</pre></td></tr>
<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> primaryServer.stop((<span class="keyword">int</span>) unit.toSeconds(time));</pre></td></tr>
-<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.finer(<span class="string">"Completed primary server stop"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> ((ExecutorService) primaryServer.getExecutor()).shutdownNow();</pre></td></tr>
-<tr> <td class="numLineCover"> 103</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> primaryServer = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 100</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Really start. This must be called after a successful {@link #daemonInit}.</span></pre></td></tr>
+<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">void</span> daemonStart() <span class="keyword">throws</span> IOException, InterruptedException {</pre></td></tr>
+<tr> <td class="numLineCover"> 103</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> gsa.start(primaryServer, dashboardServer);</pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Workaround Java Bug 7105369.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> dashboardServer.createContext(SLEEP_PATH, sleepHandler);</pre></td></tr>
-<tr> <td class="numLineCover"> 107</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> issueSleepGetRequest(config.getServerDashboardPort());</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Stop processing incoming requests and background tasks, allowing graceful</span></pre></td></tr>
<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 109</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> dashboardServer.stop((<span class="keyword">int</span>) unit.toSeconds(time));</pre></td></tr>
-<tr> <td class="numLineCover"> 110</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> ((ExecutorService) dashboardServer.getExecutor()).shutdownNow();</pre></td></tr>
-<tr> <td class="numLineCover"> 111</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.finer(<span class="string">"Completed dashboard stop"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 112</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> dashboardServer = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 113</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * shutdown.</span></pre></td></tr>
+<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> stop(<span class="keyword">long</span> time, TimeUnit unit) {</pre></td></tr>
+<tr> <td class="numLineCover"> 111</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> daemonStop(time, unit);</pre></td></tr>
+<tr> <td class="numLineCover"> 112</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> daemonDestroy(time, unit);</pre></td></tr>
+<tr> <td class="numLineCover"> 113</td> <td class="nbHitsUncovered"><a title="Line 113: Conditional coverage 50% (1/2)."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 113: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (shutdownHook != <span class="keyword">null</span>) {</a></span></pre></td></tr>
<tr> <td class="numLine"> 114</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Issues a GET request to a SleepHandler. This is used to workaround Java</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 115</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Runtime.getRuntime().removeShutdownHook(shutdownHook);</pre></td></tr>
+<tr> <td class="numLineCover"> 116</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalStateException ex) {</span></pre></td></tr>
<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Bug 7105369.</span></pre></td></tr>
-<tr> <td class="numLine"> 118</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <p>The bug is an issue with HttpServer where stop() waits the full amount</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// Already executing hook.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> shutdownHook = <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * of allotted time if the serve is idle. However, if a request is being</span></pre></td></tr>
-<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * handled when stop() is called, then it will return as soon as all requests</span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 121</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 122</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * are processed, or the allotted time is reached.</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <p>Thus, this workaround tries to force a request to be in-procees when</span></pre></td></tr>
-<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * stop() is called, so that it can return sooner. We issue a request to a</span></pre></td></tr>
-<tr> <td class="numLine"> 126</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * SleepHandler that takes a fixed amount of time to process the request</span></pre></td></tr>
-<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * before calling stop(). In the event everything goes as planned, the request</span></pre></td></tr>
-<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * completes after stop() has been called and allows stop() to exit quickly.</span></pre></td></tr>
-<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> issueSleepGetRequest(<span class="keyword">int</span> port) {</pre></td></tr>
-<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> URL url;</pre></td></tr>
-<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 133</td> <td class="nbHitsCovered"><a title="Line 133: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 133: Conditional coverage 100% (2/2)."> url = <span class="keyword">new</span> URL(config.isServerSecure() ? <span class="string">"https"</span> : <span class="string">"http"</span>,</a></pre></td></tr>
-<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.getServerHostname(), port, SLEEP_PATH);</pre></td></tr>
-<tr> <td class="numLineCover"> 135</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (MalformedURLException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 136</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING,</span></pre></td></tr>
-<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"Unexpected error. Shutting down will be slow."</span>, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 138</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">final</span> URLConnection conn;</pre></td></tr>
-<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 143</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> conn = url.openConnection();</pre></td></tr>
-<tr> <td class="numLineCover"> 144</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> conn.connect();</pre></td></tr>
-<tr> <td class="numLineCover"> 145</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (IOException ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Error performing shutdown GET"</span>, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Provide some time for the connect() to be processed on the server.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 151</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> Thread.sleep(15);</pre></td></tr>
-<tr> <td class="numLineCover"> 152</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 153</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 154</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">new</span> Thread(<span class="keyword">new</span> Runnable() {</pre></td></tr>
-<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
-<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 159</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> conn.getInputStream().close();</pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.finer(<span class="string">"Closed shutdown GET"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (IOException ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Error closing stream of shutdown GET"</span>, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 163</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }).start();</pre></td></tr>
-<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> HttpServer createHttpServer() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLine"> 169</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> HttpServer server;</pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"><a title="Line 170: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 170: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!config.isServerSecure()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 171</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> server = HttpServer.create();</pre></td></tr>
-<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 173</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> server = HttpsServer.create();</pre></td></tr>
-<tr> <td class="numLine"> 174</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 175</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpsConfigurator httpsConf</pre></td></tr>
-<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> = <span class="keyword">new</span> HttpsConfigurator(SSLContext.getDefault()) {</pre></td></tr>
-<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> configure(HttpsParameters params) {</pre></td></tr>
-<tr> <td class="numLineCover"> 178</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> SSLParameters sslParams</pre></td></tr>
-<tr> <td class="numLine"> 179</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = getSSLContext().getDefaultSSLParameters();</pre></td></tr>
-<tr> <td class="numLine"> 180</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Allow verifying the GSA and other trusted computers.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> sslParams.setWantClientAuth(<span class="keyword">true</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> params.setSSLParameters(sslParams);</pre></td></tr>
-<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 184</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> };</pre></td></tr>
-<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ((HttpsServer) server).setHttpsConfigurator(httpsConf);</pre></td></tr>
-<tr> <td class="numLineCover"> 186</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (java.security.NoSuchAlgorithmException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 187</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">int</span> maxThreads = config.getServerMaxWorkerThreads();</pre></td></tr>
-<tr> <td class="numLineCover"> 192</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">int</span> queueCapacity = config.getServerQueueCapacity();</pre></td></tr>
-<tr> <td class="numLineCover"> 193</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> BlockingQueue<Runnable> blockingQueue</pre></td></tr>
-<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = <span class="keyword">new</span> ArrayBlockingQueue<Runnable>(queueCapacity);</pre></td></tr>
-<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// The Executor can't reject jobs directly, because HttpServer does not</span></pre></td></tr>
-<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// appear to handle that case.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 197</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> RejectedExecutionHandler policy</pre></td></tr>
-<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = <span class="keyword">new</span> SuggestHandlerAbortPolicy(HttpExchanges.abortImmediately);</pre></td></tr>
-<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Executor executor = <span class="keyword">new</span> ThreadPoolExecutor(maxThreads, maxThreads,</pre></td></tr>
-<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> 1, TimeUnit.MINUTES, blockingQueue, policy);</pre></td></tr>
-<tr> <td class="numLineCover"> 201</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> server.setExecutor(executor);</pre></td></tr>
-<tr> <td class="numLine"> 202</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> server.bind(<span class="keyword">new</span> InetSocketAddress(config.getServerPort()), 0);</pre></td></tr>
-<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.info(<span class="string">"GSA host name: "</span> + config.getGsaHostname());</pre></td></tr>
-<tr> <td class="numLineCover"> 205</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.info(<span class="string">"server is listening on port #"</span> + server.getAddress().getPort());</pre></td></tr>
-<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">return</span> server;</pre></td></tr>
-<tr> <td class="numLine"> 207</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 209</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> HttpServer createDashboardHttpServer() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 210</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> secure = config.isServerSecure();</pre></td></tr>
-<tr> <td class="numLine"> 211</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> HttpServer server;</pre></td></tr>
-<tr> <td class="numLineCover"> 212</td> <td class="nbHitsCovered"><a title="Line 212: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 212: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!secure) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 213</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> server = HttpServer.create();</pre></td></tr>
-<tr> <td class="numLine"> 214</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> server = HttpsServer.create();</pre></td></tr>
-<tr> <td class="numLine"> 216</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> SSLContext defaultSslContext;</pre></td></tr>
-<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> defaultSslContext = SSLContext.getDefault();</pre></td></tr>
-<tr> <td class="numLineCover"> 219</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NoSuchAlgorithmException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 220</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 221</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpsConfigurator httpsConf = <span class="keyword">new</span> HttpsConfigurator(defaultSslContext);</pre></td></tr>
-<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ((HttpsServer) server).setHttpsConfigurator(httpsConf);</pre></td></tr>
-<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// The Dashboard is on a separate port to prevent malicious HTML documents</span></pre></td></tr>
-<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// in the user's repository from performing admin actions with</span></pre></td></tr>
-<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// XMLHttpRequest or the like, as the HTML page will then be blocked by</span></pre></td></tr>
-<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// same-origin policies.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 229</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> server.bind(<span class="keyword">new</span> InetSocketAddress(config.getServerDashboardPort()), 0);</pre></td></tr>
-<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 231</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Use separate Executor for Dashboard to allow the administrator to</span></pre></td></tr>
-<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// investigate why things are going wrong without waiting on the normal work</span></pre></td></tr>
-<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// queue.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">int</span> maxThreads = 4;</pre></td></tr>
-<tr> <td class="numLineCover"> 235</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Executor executor = <span class="keyword">new</span> ThreadPoolExecutor(maxThreads, maxThreads,</pre></td></tr>
-<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> 10, TimeUnit.MINUTES, <span class="keyword">new</span> LinkedBlockingQueue<Runnable>());</pre></td></tr>
-<tr> <td class="numLineCover"> 237</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> server.setExecutor(executor);</pre></td></tr>
-<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 239</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.info(<span class="string">"dashboard is listening on port #"</span></pre></td></tr>
-<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + server.getAddress().getPort());</pre></td></tr>
-<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 242</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">return</span> server;</pre></td></tr>
-<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 244</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/** Returns the {@link GsaCommunicationHandler} used by this instance. */</span></pre></td></tr>
-<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> GsaCommunicationHandler getGsaCommunicationHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 247</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> gsa;</span></pre></td></tr>
-<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 249</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Main for adaptors to utilize when wanting to act as an application. This</span></pre></td></tr>
-<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * method primarily parses arguments and creates an application instance</span></pre></td></tr>
-<tr> <td class="numLine"> 253</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * before calling it's {@link #start}.</span></pre></td></tr>
-<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * @return the application instance in use</span></pre></td></tr>
-<tr> <td class="numLine"> 256</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Stop all the services we provide. This is the opposite of {@link</span></pre></td></tr>
+<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * #daemonStart}.</span></pre></td></tr>
+<tr> <td class="numLine"> 126</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> Application main(Adaptor adaptor, String[] args) {</pre></td></tr>
-<tr> <td class="numLineCover"> 258</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Config config = <span class="keyword">new</span> Config();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 259</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> adaptor.initConfig(config);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 260</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> config.autoConfig(args);</span></pre></td></tr>
-<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 262</td> <td class="nbHitsUncovered"><a title="Line 262: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 262: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (config.useAdaptorAutoUnzip()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 263</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> adaptor = <span class="keyword">new</span> AutoUnzipAdaptor(adaptor);</span></pre></td></tr>
-<tr> <td class="numLine"> 264</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> daemonStop(<span class="keyword">long</span> time, TimeUnit unit) {</pre></td></tr>
+<tr> <td class="numLineCover"> 128</td> <td class="nbHitsCovered"><a title="Line 128: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 128: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (primaryServer == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Already stopped"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 265</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Application app = <span class="keyword">new</span> Application(adaptor, config);</span></pre></td></tr>
-<tr> <td class="numLine"> 266</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 131</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> gsa.stop(time, unit);</pre></td></tr>
+<tr> <td class="numLineCover"> 132</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Setup providing content.</span></pre></td></tr>
-<tr> <td class="numLine"> 268</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Release reserved resources. This is the opposite of {@link</span></pre></td></tr>
+<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * #daemonInit}.</span></pre></td></tr>
+<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 138</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> daemonDestroy(<span class="keyword">long</span> time, TimeUnit unit) {</pre></td></tr>
+<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> httpServerShutdown(primaryServer, time, unit);</pre></td></tr>
+<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.finer(<span class="string">"Completed primary server stop"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 141</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> primaryServer = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 143</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> httpServerShutdown(dashboardServer, time, unit);</pre></td></tr>
+<tr> <td class="numLineCover"> 144</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.finer(<span class="string">"Completed dashboard stop"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 145</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> dashboardServer = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 147</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> httpServerShutdown(HttpServer server, <span class="keyword">long</span> time,</pre></td></tr>
+<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> TimeUnit unit) {</pre></td></tr>
+<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Workaround Java Bug 7105369.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 151</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> SleepHandler sleepHandler = <span class="keyword">new</span> SleepHandler(100 <span class="comment">/* millis */</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 152</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> server.createContext(SLEEP_PATH, sleepHandler);</pre></td></tr>
+<tr> <td class="numLineCover"> 153</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> issueSleepGetRequest(server.getAddress(), server <span class="keyword">instanceof</span> HttpsServer);</pre></td></tr>
+<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> server.stop((<span class="keyword">int</span>) unit.toSeconds(time));</pre></td></tr>
+<tr> <td class="numLineCover"> 156</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> ((ExecutorService) server.getExecutor()).shutdownNow();</pre></td></tr>
+<tr> <td class="numLineCover"> 157</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 160</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Issues a GET request to a SleepHandler. This is used to workaround Java</span></pre></td></tr>
+<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Bug 7105369.</span></pre></td></tr>
+<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <p>The bug is an issue with HttpServer where stop() waits the full amount</span></pre></td></tr>
+<tr> <td class="numLine"> 164</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * of allotted time if the serve is idle. However, if a request is being</span></pre></td></tr>
+<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * handled when stop() is called, then it will return as soon as all requests</span></pre></td></tr>
+<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * are processed, or the allotted time is reached.</span></pre></td></tr>
+<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <p>Thus, this workaround tries to force a request to be in-procees when</span></pre></td></tr>
+<tr> <td class="numLine"> 169</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * stop() is called, so that it can return sooner. We issue a request to a</span></pre></td></tr>
+<tr> <td class="numLine"> 170</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * SleepHandler that takes a fixed amount of time to process the request</span></pre></td></tr>
+<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * before calling stop(). In the event everything goes as planned, the request</span></pre></td></tr>
+<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * completes after stop() has been called and allows stop() to exit quickly.</span></pre></td></tr>
+<tr> <td class="numLine"> 173</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 174</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> issueSleepGetRequest(InetSocketAddress address,</pre></td></tr>
+<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isHttps) {</pre></td></tr>
+<tr> <td class="numLine"> 176</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> URL url;</pre></td></tr>
+<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 269</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> app.start();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 270</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"doc content serving started"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 271</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 272</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"could not start serving"</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 273</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 274</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"could not start serving"</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 275</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 178</td> <td class="nbHitsCovered"><a title="Line 178: Conditional coverage 100% (2/2)."> 12</a></td> <td class="src"><pre class="src"> <a title="Line 178: Conditional coverage 100% (2/2)."> url = <span class="keyword">new</span> URL(isHttps ? <span class="string">"https"</span> : <span class="string">"http"</span>,</a></pre></td></tr>
+<tr> <td class="numLine"> 179</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> address.getAddress().getHostAddress(), address.getPort(), SLEEP_PATH);</pre></td></tr>
+<tr> <td class="numLineCover"> 180</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (MalformedURLException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING,</span></pre></td></tr>
+<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"Unexpected error. Shutting down will be slow."</span>, ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 183</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 185</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">final</span> URLConnection conn;</pre></td></tr>
+<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> conn = url.openConnection();</pre></td></tr>
+<tr> <td class="numLineCover"> 189</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> conn.connect();</pre></td></tr>
+<tr> <td class="numLineCover"> 190</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (IOException ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Error performing shutdown GET"</span>, ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 192</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 193</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Provide some time for the connect() to be processed on the server.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 196</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> Thread.sleep(15);</pre></td></tr>
+<tr> <td class="numLineCover"> 197</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 198</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 200</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">new</span> Thread(<span class="keyword">new</span> Runnable() {</pre></td></tr>
+<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 202</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> conn.getInputStream().close();</pre></td></tr>
+<tr> <td class="numLineCover"> 205</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.finer(<span class="string">"Closed shutdown GET"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (IOException ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Error closing stream of shutdown GET"</span>, ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 208</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 209</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 210</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }).start();</pre></td></tr>
+<tr> <td class="numLineCover"> 211</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 212</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> HttpServer createHttpServer(Config config) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLine"> 214</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> HttpServer server;</pre></td></tr>
+<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"><a title="Line 215: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 215: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!config.isServerSecure()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 216</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> server = HttpServer.create();</pre></td></tr>
+<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> server = HttpsServer.create();</pre></td></tr>
+<tr> <td class="numLine"> 219</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 220</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpsConfigurator httpsConf</pre></td></tr>
+<tr> <td class="numLineCover"> 221</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> = <span class="keyword">new</span> HttpsConfigurator(SSLContext.getDefault()) {</pre></td></tr>
+<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> configure(HttpsParameters params) {</pre></td></tr>
+<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> SSLParameters sslParams</pre></td></tr>
+<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = getSSLContext().getDefaultSSLParameters();</pre></td></tr>
+<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Allow verifying the GSA and other trusted computers.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 226</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> sslParams.setWantClientAuth(<span class="keyword">true</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 227</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> params.setSSLParameters(sslParams);</pre></td></tr>
+<tr> <td class="numLineCover"> 228</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> };</pre></td></tr>
+<tr> <td class="numLineCover"> 230</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ((HttpsServer) server).setHttpsConfigurator(httpsConf);</pre></td></tr>
+<tr> <td class="numLineCover"> 231</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (java.security.NoSuchAlgorithmException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 232</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 234</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 236</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">int</span> maxThreads = config.getServerMaxWorkerThreads();</pre></td></tr>
+<tr> <td class="numLineCover"> 237</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">int</span> queueCapacity = config.getServerQueueCapacity();</pre></td></tr>
+<tr> <td class="numLineCover"> 238</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> BlockingQueue<Runnable> blockingQueue</pre></td></tr>
+<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = <span class="keyword">new</span> ArrayBlockingQueue<Runnable>(queueCapacity);</pre></td></tr>
+<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// The Executor can't reject jobs directly, because HttpServer does not</span></pre></td></tr>
+<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// appear to handle that case.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 242</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> RejectedExecutionHandler policy</pre></td></tr>
+<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = <span class="keyword">new</span> SuggestHandlerAbortPolicy(HttpExchanges.abortImmediately);</pre></td></tr>
+<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> Executor executor = <span class="keyword">new</span> ThreadPoolExecutor(maxThreads, maxThreads,</pre></td></tr>
+<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> 1, TimeUnit.MINUTES, blockingQueue, policy);</pre></td></tr>
+<tr> <td class="numLineCover"> 246</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> server.setExecutor(executor);</pre></td></tr>
+<tr> <td class="numLine"> 247</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 248</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> server.bind(<span class="keyword">new</span> InetSocketAddress(config.getServerPort()), 0);</pre></td></tr>
+<tr> <td class="numLineCover"> 249</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.info(<span class="string">"GSA host name: "</span> + config.getGsaHostname());</pre></td></tr>
+<tr> <td class="numLineCover"> 250</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.info(<span class="string">"server is listening on port #"</span> + server.getAddress().getPort());</pre></td></tr>
+<tr> <td class="numLineCover"> 251</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> server;</pre></td></tr>
+<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 253</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> HttpServer createDashboardHttpServer(Config config)</pre></td></tr>
+<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> secure = config.isServerSecure();</pre></td></tr>
+<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> HttpServer server;</pre></td></tr>
+<tr> <td class="numLineCover"> 258</td> <td class="nbHitsCovered"><a title="Line 258: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 258: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!secure) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> server = HttpServer.create();</pre></td></tr>
+<tr> <td class="numLine"> 260</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 261</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> server = HttpsServer.create();</pre></td></tr>
+<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> SSLContext defaultSslContext;</pre></td></tr>
+<tr> <td class="numLine"> 263</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 264</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> defaultSslContext = SSLContext.getDefault();</pre></td></tr>
+<tr> <td class="numLineCover"> 265</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NoSuchAlgorithmException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 266</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 267</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 268</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpsConfigurator httpsConf = <span class="keyword">new</span> HttpsConfigurator(defaultSslContext);</pre></td></tr>
+<tr> <td class="numLineCover"> 269</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ((HttpsServer) server).setHttpsConfigurator(httpsConf);</pre></td></tr>
+<tr> <td class="numLine"> 270</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 271</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// The Dashboard is on a separate port to prevent malicious HTML documents</span></pre></td></tr>
+<tr> <td class="numLine"> 272</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// in the user's repository from performing admin actions with</span></pre></td></tr>
+<tr> <td class="numLine"> 273</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// XMLHttpRequest or the like, as the HTML page will then be blocked by</span></pre></td></tr>
+<tr> <td class="numLine"> 274</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// same-origin policies.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 275</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> server.bind(<span class="keyword">new</span> InetSocketAddress(config.getServerDashboardPort()), 0);</pre></td></tr>
<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 277</td> <td class="nbHitsUncovered"><a title="Line 277: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 277: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (config.isAdaptorPushDocIdsOnStartup()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 278</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"Pushing once at program start"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 279</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> app.getGsaCommunicationHandler().checkAndScheduleImmediatePushOfDocIds();</span></pre></td></tr>
-<tr> <td class="numLine"> 280</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 281</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 282</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> app;</span></pre></td></tr>
-<tr> <td class="numLine"> 283</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Use separate Executor for Dashboard to allow the administrator to</span></pre></td></tr>
+<tr> <td class="numLine"> 278</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// investigate why things are going wrong without waiting on the normal work</span></pre></td></tr>
+<tr> <td class="numLine"> 279</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// queue.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 280</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">int</span> maxThreads = 4;</pre></td></tr>
+<tr> <td class="numLineCover"> 281</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> Executor executor = <span class="keyword">new</span> ThreadPoolExecutor(maxThreads, maxThreads,</pre></td></tr>
+<tr> <td class="numLine"> 282</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> 10, TimeUnit.MINUTES, <span class="keyword">new</span> LinkedBlockingQueue<Runnable>());</pre></td></tr>
+<tr> <td class="numLineCover"> 283</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> server.setExecutor(executor);</pre></td></tr>
<tr> <td class="numLine"> 284</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> ShutdownHook <span class="keyword">implements</span> Runnable {</pre></td></tr>
+<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.info(<span class="string">"dashboard is listening on port #"</span></pre></td></tr>
<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
+ <td class="src"><pre class="src"> + server.getAddress().getPort());</pre></td></tr>
<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
-<tr> <td class="numLineCover"> 288</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> stop(3, TimeUnit.SECONDS);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 289</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 288</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> server;</pre></td></tr>
+<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 291</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/** Returns the {@link GsaCommunicationHandler} used by this instance. */</span></pre></td></tr>
<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 293</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Executes Runnable in current thread, but only after setting a thread-local</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> GsaCommunicationHandler getGsaCommunicationHandler() {</pre></td></tr>
+<tr> <td class="numLineCover"> 293</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> gsa;</pre></td></tr>
<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * object. The code that will be run, is expected to take notice of the set</span></pre></td></tr>
-<tr> <td class="numLine"> 295</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * variable and abort immediately. This is a hack.</span></pre></td></tr>
-<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> SuggestHandlerAbortPolicy</pre></td></tr>
-<tr> <td class="numLine"> 298</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">implements</span> RejectedExecutionHandler {</pre></td></tr>
-<tr> <td class="numLine"> 299</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> ThreadLocal<Object> abortImmediately;</pre></td></tr>
-<tr> <td class="numLineCover"> 300</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Object signal = <span class="keyword">new</span> Object();</pre></td></tr>
-<tr> <td class="numLine"> 301</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 302</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">public</span> SuggestHandlerAbortPolicy(ThreadLocal<Object> abortImmediately) {</pre></td></tr>
-<tr> <td class="numLineCover"> 303</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.abortImmediately = abortImmediately;</pre></td></tr>
-<tr> <td class="numLineCover"> 304</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 305</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 306</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 307</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> rejectedExecution(Runnable r, ThreadPoolExecutor executor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 308</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> abortImmediately.set(signal);</span></pre></td></tr>
-<tr> <td class="numLine"> 309</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 310</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> r.run();</span></pre></td></tr>
-<tr> <td class="numLine"> 311</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 312</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> abortImmediately.set(<span class="keyword">null</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 313</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 314</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 315</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 316</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 295</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Returns the {@link Config} used by this instance. */</span></pre></td></tr>
+<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Config getConfig() {</pre></td></tr>
+<tr> <td class="numLineCover"> 298</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> config;</pre></td></tr>
+<tr> <td class="numLine"> 299</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 300</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 301</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 302</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Load default configuration file and parse command line options.</span></pre></td></tr>
+<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * @return unused command line arguments</span></pre></td></tr>
+<tr> <td class="numLine"> 305</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * @throws IllegalStateException when not all configuration keys have values</span></pre></td></tr>
+<tr> <td class="numLine"> 306</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 307</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @VisibleForTesting</pre></td></tr>
+<tr> <td class="numLine"> 308</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> String[] autoConfig(Config config, String[] args, File configFile) {</pre></td></tr>
+<tr> <td class="numLine"> 309</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> i;</pre></td></tr>
+<tr> <td class="numLineCover"> 310</td> <td class="nbHitsCovered"><a title="Line 310: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 310: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (i = 0; i < args.length; i++) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 311</td> <td class="nbHitsUncovered"><a title="Line 311: Conditional coverage 50% (1/2)."> 7</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 311: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!args[i].startsWith(<span class="string">"-D"</span>)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 312</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 313</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 314</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> String arg = args[i].substring(2);</pre></td></tr>
+<tr> <td class="numLineCover"> 315</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> String[] parts = arg.split(<span class="string">"="</span>, 2);</pre></td></tr>
+<tr> <td class="numLineCover"> 316</td> <td class="nbHitsUncovered"><a title="Line 316: Conditional coverage 50% (1/2)."> 7</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 316: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (parts.length < 2) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 317</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 318</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 319</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> config.setValue(parts[0], parts[1]);</pre></td></tr>
+<tr> <td class="numLine"> 320</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 321</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> loadConfigFile(config, configFile);</pre></td></tr>
+<tr> <td class="numLineCover"> 322</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> config.validate();</pre></td></tr>
+<tr> <td class="numLineCover"> 323</td> <td class="nbHitsCovered"><a title="Line 323: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 323: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (i == 0) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 324</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> args;</pre></td></tr>
+<tr> <td class="numLine"> 325</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 326</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Arrays.copyOfRange(args, i, args.length);</pre></td></tr>
+<tr> <td class="numLine"> 327</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 329</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 330</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 331</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Loads the provided config file, if it exists. It squelches any errors so</span></pre></td></tr>
+<tr> <td class="numLine"> 332</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * that you are free to call it without error handling, since this is</span></pre></td></tr>
+<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * typically non-fatal.</span></pre></td></tr>
+<tr> <td class="numLine"> 334</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 335</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> loadConfigFile(Config config, File configFile) {</pre></td></tr>
+<tr> <td class="numLineCover"> 336</td> <td class="nbHitsUncovered"><a title="Line 336: Conditional coverage 75% (3/4) [each condition: 100%, 50%]."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 336: Conditional coverage 75% (3/4) [each condition: 100%, 50%]."> <span class="keyword">if</span> (configFile.exists() && configFile.isFile()) {</a></span></pre></td></tr>
+<tr> <td class="numLine"> 337</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 338</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> config.load(configFile);</pre></td></tr>
+<tr> <td class="numLineCover"> 339</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 340</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> System.err.println(<span class="string">"Exception when reading "</span> + configFile);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 341</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ex.printStackTrace(System.err);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 342</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 343</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 344</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 345</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 346</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 347</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Main for adaptors to utilize when wanting to act as an application. This</span></pre></td></tr>
+<tr> <td class="numLine"> 348</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * method primarily parses arguments and creates an application instance</span></pre></td></tr>
+<tr> <td class="numLine"> 349</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * before calling it's {@link #start}.</span></pre></td></tr>
+<tr> <td class="numLine"> 350</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 351</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * @return the application instance in use</span></pre></td></tr>
+<tr> <td class="numLine"> 352</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 353</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> Application main(Adaptor adaptor, String[] args) {</pre></td></tr>
+<tr> <td class="numLineCover"> 354</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Application app = daemonMain(adaptor, args);</span></pre></td></tr>
+<tr> <td class="numLine"> 355</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 356</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Setup providing content.</span></pre></td></tr>
+<tr> <td class="numLine"> 357</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 358</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> app.start();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 359</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"doc content serving started"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 360</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 361</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"could not start serving"</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 362</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 363</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"could not start serving"</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 364</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 365</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 366</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> app;</span></pre></td></tr>
+<tr> <td class="numLine"> 367</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 368</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 369</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 370</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Performs basic bootstrapping like normal {@link #main}, but does not start</span></pre></td></tr>
+<tr> <td class="numLine"> 371</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * the application.</span></pre></td></tr>
+<tr> <td class="numLine"> 372</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 373</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> Application daemonMain(Adaptor adaptor, String[] args) {</pre></td></tr>
+<tr> <td class="numLineCover"> 374</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> Config config = <span class="keyword">new</span> Config();</pre></td></tr>
+<tr> <td class="numLineCover"> 375</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> adaptor.initConfig(config);</pre></td></tr>
+<tr> <td class="numLineCover"> 376</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> autoConfig(config, args, <span class="keyword">new</span> File(DEFAULT_CONFIG_FILE));</pre></td></tr>
+<tr> <td class="numLineCover"> 377</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> Application(adaptor, config);</pre></td></tr>
+<tr> <td class="numLine"> 378</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 379</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 380</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> ShutdownHook <span class="keyword">implements</span> Runnable {</pre></td></tr>
+<tr> <td class="numLine"> 381</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 382</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+<tr> <td class="numLineCover"> 383</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> stop(3, TimeUnit.SECONDS);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 384</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 385</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 386</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 387</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 388</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Executes Runnable in current thread, but only after setting a thread-local</span></pre></td></tr>
+<tr> <td class="numLine"> 389</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * object. The code that will be run, is expected to take notice of the set</span></pre></td></tr>
+<tr> <td class="numLine"> 390</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * variable and abort immediately. This is a hack.</span></pre></td></tr>
+<tr> <td class="numLine"> 391</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 392</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> SuggestHandlerAbortPolicy</pre></td></tr>
+<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">implements</span> RejectedExecutionHandler {</pre></td></tr>
+<tr> <td class="numLine"> 394</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> ThreadLocal<Object> abortImmediately;</pre></td></tr>
+<tr> <td class="numLineCover"> 395</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Object signal = <span class="keyword">new</span> Object();</pre></td></tr>
+<tr> <td class="numLine"> 396</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 397</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">public</span> SuggestHandlerAbortPolicy(ThreadLocal<Object> abortImmediately) {</pre></td></tr>
+<tr> <td class="numLineCover"> 398</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.abortImmediately = abortImmediately;</pre></td></tr>
+<tr> <td class="numLineCover"> 399</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 400</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 401</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 402</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> rejectedExecution(Runnable r, ThreadPoolExecutor executor) {</pre></td></tr>
+<tr> <td class="numLineCover"> 403</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> abortImmediately.set(signal);</span></pre></td></tr>
+<tr> <td class="numLine"> 404</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 405</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> r.run();</span></pre></td></tr>
+<tr> <td class="numLine"> 406</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 407</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> abortImmediately.set(<span class="keyword">null</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 408</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 409</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 410</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 411</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.AsyncDocIdSender.html b/coverage/com.google.enterprise.adaptor.AsyncDocIdSender.html
index 6935072..3e5f6a5 100644
--- a/coverage/com.google.enterprise.adaptor.AsyncDocIdSender.html
+++ b/coverage/com.google.enterprise.adaptor.AsyncDocIdSender.html
@@ -70,7 +70,7 @@
<td class="src"><pre class="src"> <span class="comment"> * and running for items to be sent.</span></pre></td></tr>
<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 65</td> <td class="src"><pre class="src"> <span class="keyword">class</span> AsyncDocIdSender <span class="keyword">implements</span> DocumentHandler.AsyncPusher {</pre></td></tr>
+<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 70</td> <td class="src"><pre class="src"> <span class="keyword">class</span> AsyncDocIdSender <span class="keyword">implements</span> DocumentHandler.AsyncPusher {</pre></td></tr>
<tr> <td class="numLineCover"> 27</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Logger.getLogger(AsyncDocIdSender.<span class="keyword">class</span>.getName());</pre></td></tr>
@@ -86,7 +86,7 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> TimeUnit maxLatencyUnit;</pre></td></tr>
<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> BlockingQueue<DocIdSender.Item> queue;</pre></td></tr>
-<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Runnable worker = <span class="keyword">new</span> WorkerRunnable();</pre></td></tr>
+<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Runnable worker = <span class="keyword">new</span> WorkerRunnable();</pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
@@ -105,21 +105,21 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> AsyncDocIdSender(ItemPusher itemPusher, <span class="keyword">int</span> maxBatchSize,</pre></td></tr>
-<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> <span class="keyword">long</span> maxLatency, TimeUnit maxLatencyUnit, <span class="keyword">int</span> queueCapacity) {</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"><a title="Line 46: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 15</a></td> <td class="src"><pre class="src"> <a title="Line 46: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (itemPusher == <span class="keyword">null</span> || maxLatencyUnit == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">long</span> maxLatency, TimeUnit maxLatencyUnit, <span class="keyword">int</span> queueCapacity) {</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"><a title="Line 46: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 16</a></td> <td class="src"><pre class="src"> <a title="Line 46: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (itemPusher == <span class="keyword">null</span> || maxLatencyUnit == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 49</td> <td class="nbHitsCovered"><a title="Line 49: Conditional coverage 100% (2/2)."> 13</a></td> <td class="src"><pre class="src"> <a title="Line 49: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (maxBatchSize < 1) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 49</td> <td class="nbHitsCovered"><a title="Line 49: Conditional coverage 100% (2/2)."> 14</a></td> <td class="src"><pre class="src"> <a title="Line 49: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (maxBatchSize < 1) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 50</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"maxBatchSize must be positive"</span>);</pre></td></tr>
<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.itemPusher = itemPusher;</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maxBatchSize = maxBatchSize;</pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maxLatency = maxLatency;</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maxLatencyUnit = maxLatencyUnit;</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.queue = <span class="keyword">new</span> ArrayBlockingQueue<DocIdSender.Item>(queueCapacity);</pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.itemPusher = itemPusher;</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maxBatchSize = maxBatchSize;</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maxLatency = maxLatency;</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maxLatencyUnit = maxLatencyUnit;</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.queue = <span class="keyword">new</span> ArrayBlockingQueue<DocIdSender.Item>(queueCapacity);</pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
@@ -143,34 +143,34 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Runnable worker() {</pre></td></tr>
-<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">return</span> worker;</pre></td></tr>
+<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">return</span> worker;</pre></td></tr>
<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 73</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> WorkerRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> WorkerRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> List<DocIdSender.Item> list = <span class="keyword">new</span> ArrayList<DocIdSender.Item>();</pre></td></tr>
+<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> List<DocIdSender.Item> list = <span class="keyword">new</span> ArrayList<DocIdSender.Item>();</pre></td></tr>
<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">while</span> (<span class="keyword">true</span>) {</pre></td></tr>
-<tr> <td class="numLineCover"> 80</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> BlockingQueueBatcher.take(</pre></td></tr>
+<tr> <td class="numLineCover"> 80</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> BlockingQueueBatcher.take(</pre></td></tr>
<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> queue, list, maxBatchSize, maxLatency, maxLatencyUnit);</pre></td></tr>
<tr> <td class="numLineCover"> 82</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> itemPusher.pushItems(list.iterator(), <span class="keyword">null</span>);</pre></td></tr>
<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> list.clear();</pre></td></tr>
<tr> <td class="numLine"> 84</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 85</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (InterruptedException ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"AsyncDocIdSender worker shutdown"</span>, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> Thread.currentThread().interrupt();</pre></td></tr>
+<tr> <td class="numLineCover"> 85</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (InterruptedException ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"AsyncDocIdSender worker shutdown"</span>, ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> Thread.currentThread().interrupt();</pre></td></tr>
<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.AutoUnzipAdaptor.html b/coverage/com.google.enterprise.adaptor.AutoUnzipAdaptor.html
deleted file mode 100644
index 05306a7..0000000
--- a/coverage/com.google.enterprise.adaptor.AutoUnzipAdaptor.html
+++ /dev/null
@@ -1,761 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-<title>Coverage Report</title>
-<link title="Style" type="text/css" rel="stylesheet" href="css/main.css"/>
-<script type="text/javascript" src="js/popup.js"></script>
-</head>
-<body>
-<h5>Coverage Report - com.google.enterprise.adaptor.AutoUnzipAdaptor</h5>
-<div class="separator"> </div>
-<table class="report">
-<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">47</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">94/141</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">16</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:54px"><span class="text">19/35</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$AutoUnzipRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$AutoUnzipResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:53px"><span class="text">7/13</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$AutoUnzipResponse$State</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$InnerAdaptorContext</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$InnerDocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">2/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$LazyOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$NoContentsResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
-
-</table>
-<div class="separator"> </div>
-<table cellspacing="0" cellpadding="0" class="src">
-<tr> <td class="numLine"> 1</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Copyright 2011 Google Inc. All Rights Reserved.</span></pre></td></tr>
-<tr> <td class="numLine"> 2</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
-<tr> <td class="numLine"> 3</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span></pre></td></tr>
-<tr> <td class="numLine"> 4</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// you may not use this file except in compliance with the License.</span></pre></td></tr>
-<tr> <td class="numLine"> 5</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// You may obtain a copy of the License at</span></pre></td></tr>
-<tr> <td class="numLine"> 6</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
-<tr> <td class="numLine"> 7</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></pre></td></tr>
-<tr> <td class="numLine"> 8</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
-<tr> <td class="numLine"> 9</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Unless required by applicable law or agreed to in writing, software</span></pre></td></tr>
-<tr> <td class="numLine"> 10</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span></pre></td></tr>
-<tr> <td class="numLine"> 11</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></pre></td></tr>
-<tr> <td class="numLine"> 12</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// See the License for the specific language governing permissions and</span></pre></td></tr>
-<tr> <td class="numLine"> 13</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// limitations under the License.</span></pre></td></tr>
-<tr> <td class="numLine"> 14</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 15</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">package</span> com.google.enterprise.adaptor;</pre></td></tr>
-<tr> <td class="numLine"> 16</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 17</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.io.*;</pre></td></tr>
-<tr> <td class="numLine"> 18</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.*;</pre></td></tr>
-<tr> <td class="numLine"> 19</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.logging.*;</pre></td></tr>
-<tr> <td class="numLine"> 20</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.zip.*;</pre></td></tr>
-<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 22</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Wrapping Adaptor that auto-unzips zips within the nested Adaptor.</span></pre></td></tr>
-<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">class</span> AutoUnzipAdaptor <span class="keyword">extends</span> WrapperAdaptor {</pre></td></tr>
-<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
-<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = Logger.getLogger(AutoUnzipAdaptor.<span class="keyword">class</span>.getName());</pre></td></tr>
-<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Delimiter to separate a file from the ZIP it is contained within for use in</span></pre></td></tr>
-<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * DocIds.</span></pre></td></tr>
-<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String DELIMITER = <span class="string">"!"</span>;</pre></td></tr>
-<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Escape normal '!' using '\\!' (single backslash, bang)</span></pre></td></tr>
-<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String ESCAPE_DELIMITER = <span class="string">"\\\\!"</span>;</pre></td></tr>
-<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Matches strings that contain a '!' with no preceding backslash</span></pre></td></tr>
-<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String DELIMITER_MATCHER = <span class="string">"(?<!\\\\)!"</span>;</pre></td></tr>
-<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> DocIdPusher pusher;</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> DocIdPusher innerPusher = <span class="keyword">new</span> InnerDocIdPusher();</pre></td></tr>
-<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Wrap {@code adaptor} with auto-unzip functionality.</span></pre></td></tr>
-<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> AutoUnzipAdaptor(Adaptor adaptor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">super</span>(adaptor);</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Auto-expand all ZIPs listed by the wrapped adaptor in addition to the</span></pre></td></tr>
-<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * normal contents the wrapped adaptor provides.</span></pre></td></tr>
-<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocIds(DocIdPusher pusher) <span class="keyword">throws</span> IOException,</pre></td></tr>
-<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.getDocIds(innerPusher);</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> DocIdPusher.Record pushRecords(</pre></td></tr>
-<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Iterable<DocIdPusher.Record> records, PushErrorHandler handler)</pre></td></tr>
-<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> List<DocIdPusher.Record> expanded = <span class="keyword">new</span> ArrayList<DocIdPusher.Record>();</pre></td></tr>
-<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Used for returning the original DocIdPusher.Record instead of an</span></pre></td></tr>
-<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// equivalent DocIdPusher.Record when an error occurs.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> Map<DocIdPusher.Record, DocIdPusher.Record> newOrigMap</pre></td></tr>
-<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = <span class="keyword">new</span> HashMap<DocIdPusher.Record, DocIdPusher.Record>();</pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"><a title="Line 66: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 66: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (DocIdPusher.Record docRecord : records) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> DocId docId = docRecord.getDocId();</pre></td></tr>
-<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> DocIdPusher.Record newRecord = createDerivativeRecord(docRecord,</pre></td></tr>
-<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> escape(docId.getUniqueId()));</pre></td></tr>
-<tr> <td class="numLineCover"> 70</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> expanded.add(newRecord);</pre></td></tr>
-<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> newOrigMap.put(newRecord, docRecord);</pre></td></tr>
-<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"><a title="Line 73: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 73: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!docId.getUniqueId().endsWith(<span class="string">".zip"</span>)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
-<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Add the children documents of a zip immediately after the zip, so when</span></pre></td></tr>
-<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// an error occurs we can correctly inform the client which document the</span></pre></td></tr>
-<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// failure was on.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 79</td> <td class="nbHitsUncovered"><a title="Line 79: Conditional coverage 50% (1/2)."> 2</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 79: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (docRecord.isToBeDeleted()) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Not a great case since we don't remember what files were in each zip.</span></pre></td></tr>
-<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// The GSA will have to figure out the files are gone via 404s later.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 82</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">continue</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 84</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> File tmpFile;</pre></td></tr>
-<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> tmpFile = File.createTempFile(<span class="string">"adaptorlib"</span>, <span class="string">".tmp"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 88</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Could not create temporary file"</span>, ex);</span></pre></td></tr>
-<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Bail for this entry</span></pre></td></tr>
-<tr> <td class="numLineCover"> 90</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">continue</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 94</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> OutputStream os = <span class="keyword">new</span> FileOutputStream(tmpFile);</pre></td></tr>
-<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 96</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> GetContentsResponse resp = <span class="keyword">new</span> GetContentsResponse(os);</pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.getDocContent(<span class="keyword">new</span> GetContentsRequest(docId), resp);</pre></td></tr>
-<tr> <td class="numLineCover"> 98</td> <td class="nbHitsUncovered"><a title="Line 98: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 98: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (resp.isNotFound()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 99</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.FINE, <span class="string">"Unexpectedly, a doc just listed doesn't "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 100</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">"exist: {0}"</span>, docId);</pre></td></tr>
-<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
-<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> os.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 105</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (IOException ex) {</pre></td></tr>
-<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// We don't throw this exception because we want to remain as</span></pre></td></tr>
-<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// transparent as possible. This should be a additional feature that</span></pre></td></tr>
-<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// doesn't bring down the world when things go wrong.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 110</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Exception trying to auto-expand a zip"</span>, ex);</pre></td></tr>
-<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 112</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 113</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> DocIdPusher.Record escaped = createDerivativeRecord(docRecord,</pre></td></tr>
-<tr> <td class="numLine"> 114</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> escape(docId.getUniqueId()));</pre></td></tr>
-<tr> <td class="numLineCover"> 115</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> listZip(escaped, tmpFile, expanded, newOrigMap);</pre></td></tr>
-<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 117</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> tmpFile.delete();</pre></td></tr>
-<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 121</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> DocIdPusher.Record failedRecord = pusher.pushRecords(expanded, handler);</pre></td></tr>
-<tr> <td class="numLineCover"> 122</td> <td class="nbHitsUncovered"><a title="Line 122: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 122: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (failedRecord == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Success.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 126</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> failedRecord = newOrigMap.get(failedRecord);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 127</td> <td class="nbHitsUncovered"><a title="Line 127: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 127: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (failedRecord == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 128</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Bug triggered"</span>);</span></pre></td></tr>
-<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 130</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> failedRecord;</span></pre></td></tr>
-<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Creates a new {@code DocIdPusher.Record} that is a copy</span></pre></td></tr>
-<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * of {@code docRecord}, but with a different uniqueId of its {@link DocId}.</span></pre></td></tr>
-<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> DocIdPusher.Record createDerivativeRecord(</pre></td></tr>
-<tr> <td class="numLine"> 138</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> DocIdPusher.Record docRecord, String uniqueId) {</pre></td></tr>
-<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> DocIdPusher.Record.Builder dup = <span class="keyword">new</span> DocIdPusher.Record.Builder(docRecord);</pre></td></tr>
-<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> <span class="keyword">return</span> dup.setDocId(<span class="keyword">new</span> DocId(uniqueId)).build();</pre></td></tr>
-<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Get list of files within zip. Recursive method to handle listing ZIPs in</span></pre></td></tr>
-<tr> <td class="numLine"> 145</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * ZIPs.</span></pre></td></tr>
-<tr> <td class="numLine"> 146</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 147</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> listZip(DocIdPusher.Record docRecord, File rawZip,</pre></td></tr>
-<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> List<DocIdPusher.Record> expanded,</pre></td></tr>
-<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Map<DocIdPusher.Record, DocIdPusher.Record> newOrigMap) {</pre></td></tr>
-<tr> <td class="numLineCover"> 150</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> DocId docId = docRecord.getDocId();</pre></td></tr>
-<tr> <td class="numLine"> 151</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> ZipFile zip;</pre></td></tr>
-<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 153</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> zip = <span class="keyword">new</span> ZipFile(rawZip);</pre></td></tr>
-<tr> <td class="numLineCover"> 154</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 155</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Could not open zip."</span>, ex);</span></pre></td></tr>
-<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Bail for this entry</span></pre></td></tr>
-<tr> <td class="numLineCover"> 157</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">for</span> (Enumeration<? <span class="keyword">extends</span> ZipEntry> en = zip.entries();</pre></td></tr>
-<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"><a title="Line 161: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 161: Conditional coverage 100% (2/2)."> en.hasMoreElements(); ) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> ZipEntry e = en.nextElement();</pre></td></tr>
-<tr> <td class="numLineCover"> 163</td> <td class="nbHitsUncovered"><a title="Line 163: Conditional coverage 50% (1/2)."> 6</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 163: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (e.isDirectory()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 164</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">continue</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String uniqId = docId.getUniqueId() + DELIMITER + escape(e.getName());</pre></td></tr>
-<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> DocIdPusher.Record nestedRecord</pre></td></tr>
-<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = createDerivativeRecord(docRecord, uniqId);</pre></td></tr>
-<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> expanded.add(nestedRecord);</pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> newOrigMap.put(nestedRecord, docRecord);</pre></td></tr>
-<tr> <td class="numLineCover"> 171</td> <td class="nbHitsUncovered"><a title="Line 171: Conditional coverage 50% (1/2)."> 6</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 171: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (uniqId.endsWith(<span class="string">".zip"</span>)) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> InputStream nestedIs;</pre></td></tr>
-<tr> <td class="numLine"> 173</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 174</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> nestedIs = zip.getInputStream(e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 175</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 176</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING,</span></pre></td></tr>
-<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"Could not get recursive zip file contents within zip"</span>, ex);</pre></td></tr>
-<tr> <td class="numLine"> 178</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Bail for this entry</span></pre></td></tr>
-<tr> <td class="numLineCover"> 179</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">continue</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 180</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 181</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> File innerRawZip;</pre></td></tr>
-<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 183</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> innerRawZip = IOHelper.writeToTempFile(nestedIs);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 184</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 185</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Could write out to temporary file"</span>, ex);</span></pre></td></tr>
-<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Bail for this entry</span></pre></td></tr>
-<tr> <td class="numLineCover"> 187</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">continue</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 188</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 190</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> listZip(nestedRecord, innerRawZip, expanded, newOrigMap);</span></pre></td></tr>
-<tr> <td class="numLine"> 191</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 192</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> innerRawZip.delete();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 193</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 195</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 197</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">try</span> {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 198</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> zip.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 199</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 200</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Could not close zip."</span>, ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 201</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 206</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Splits an encoded DocId into an unencoded DocId portion, and possibly an</span></pre></td></tr>
-<tr> <td class="numLine"> 207</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * additional still-encoded portion.</span></pre></td></tr>
-<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 209</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> DocId[] getDocIdParts(DocId internalDocId) {</pre></td></tr>
-<tr> <td class="numLineCover"> 210</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> String[] parts = internalDocId.getUniqueId().split(DELIMITER_MATCHER, 2);</pre></td></tr>
-<tr> <td class="numLineCover"> 211</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> parts[0] = unescape(parts[0]);</pre></td></tr>
-<tr> <td class="numLineCover"> 212</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> DocId[] docParts = <span class="keyword">new</span> DocId[parts.length];</pre></td></tr>
-<tr> <td class="numLineCover"> 213</td> <td class="nbHitsCovered"><a title="Line 213: Conditional coverage 100% (2/2)."> 42</a></td> <td class="src"><pre class="src"> <a title="Line 213: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < parts.length; i++) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> docParts[i] = <span class="keyword">new</span> DocId(parts[i]);</pre></td></tr>
-<tr> <td class="numLine"> 215</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 216</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docParts;</pre></td></tr>
-<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 219</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Provide content of file that exists within a ZIP provided by the wrapped</span></pre></td></tr>
-<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * adaptor or simply call wrapped adaptor.</span></pre></td></tr>
-<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocContent(Request req, Response resp) <span class="keyword">throws</span> IOException,</pre></td></tr>
-<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 226</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> DocId docId = req.getDocId();</pre></td></tr>
-<tr> <td class="numLineCover"> 227</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> DocId[] parts = getDocIdParts(docId);</pre></td></tr>
-<tr> <td class="numLineCover"> 228</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> Request auRequest = <span class="keyword">new</span> AutoUnzipRequest(req, parts[0]);</pre></td></tr>
-<tr> <td class="numLineCover"> 229</td> <td class="nbHitsCovered"><a title="Line 229: Conditional coverage 100% (2/2)."> 12</a></td> <td class="src"><pre class="src"> <a title="Line 229: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (parts.length == 1) {</a></pre></td></tr>
-<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// This was just a normal file, without any of our escapes</span></pre></td></tr>
-<tr> <td class="numLineCover"> 231</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.getDocContent(auRequest, resp);</pre></td></tr>
-<tr> <td class="numLineCover"> 232</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> File tmpFile = File.createTempFile(<span class="string">"adaptorlib"</span>, <span class="string">".tmp"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 236</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> OutputStream tmpFileOs = <span class="keyword">new</span> FileOutputStream(tmpFile);</pre></td></tr>
-<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> AutoUnzipResponse auResponse;</pre></td></tr>
-<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 239</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> auResponse = <span class="keyword">new</span> AutoUnzipResponse(resp, tmpFileOs);</pre></td></tr>
-<tr> <td class="numLineCover"> 240</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.getDocContent(auRequest, auResponse);</pre></td></tr>
-<tr> <td class="numLineCover"> 241</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> tmpFileOs.flush();</pre></td></tr>
-<tr> <td class="numLine"> 242</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 243</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> tmpFileOs.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 245</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">switch</span> (auResponse.getState()) {</pre></td></tr>
-<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> NORESPONSE:</pre></td></tr>
-<tr> <td class="numLine"> 247</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// This is an error, but we will let a higher level complain about it</span></pre></td></tr>
-<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLine"> 249</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> NOTMODIFIED:</pre></td></tr>
-<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> NOTFOUND:</pre></td></tr>
-<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// No content needed, we are done here</span></pre></td></tr>
-<tr> <td class="numLine"> 253</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> CONTENT:</pre></td></tr>
-<tr> <td class="numLine"> 256</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 258</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> extractDocFromZip(parts[1], tmpFile, <span class="keyword">new</span> LazyOutputStream(resp));</pre></td></tr>
-<tr> <td class="numLineCover"> 260</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (FileNotFoundException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 261</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.FINE, <span class="string">"Could not find file within zip for docId ''{0}'': "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">"{1}"</span>, <span class="keyword">new</span> Object[] {docId.getUniqueId(), e.getMessage()});</pre></td></tr>
-<tr> <td class="numLineCover"> 263</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
-<tr> <td class="numLine"> 264</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 265</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 266</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 267</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tmpFile.delete();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 268</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 269</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 270</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 271</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 272</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Recursively provide content of file within ZIP file {@code is}. Recursion</span></pre></td></tr>
-<tr> <td class="numLine"> 273</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * allows providing a file within a ZIP within a ZIP.</span></pre></td></tr>
-<tr> <td class="numLine"> 274</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 275</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> extractDocFromZip(DocId docId, File file,</pre></td></tr>
-<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> OutputStream os) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 277</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> ZipFile zip = <span class="keyword">new</span> ZipFile(file);</pre></td></tr>
-<tr> <td class="numLine"> 278</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 279</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> DocId[] parts = getDocIdParts(docId);</pre></td></tr>
-<tr> <td class="numLineCover"> 280</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String filename = parts[0].getUniqueId();</pre></td></tr>
-<tr> <td class="numLineCover"> 281</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> ZipEntry entry = zip.getEntry(filename);</pre></td></tr>
-<tr> <td class="numLineCover"> 282</td> <td class="nbHitsUncovered"><a title="Line 282: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> 6</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 282: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> <span class="keyword">if</span> (entry == <span class="keyword">null</span> || entry.isDirectory()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 283</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> FileNotFoundException(<span class="string">"Could not find file '"</span> + filename);</span></pre></td></tr>
-<tr> <td class="numLine"> 284</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> InputStream nestedIs = zip.getInputStream(entry);</pre></td></tr>
-<tr> <td class="numLineCover"> 286</td> <td class="nbHitsUncovered"><a title="Line 286: Conditional coverage 50% (1/2)."> 6</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 286: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (parts.length == 1) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 287</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> IOHelper.copyStream(nestedIs, os);</pre></td></tr>
-<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 289</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> File innerFile = IOHelper.writeToTempFile(nestedIs);</span></pre></td></tr>
-<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 291</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> extractDocFromZip(parts[1], innerFile, os);</span></pre></td></tr>
-<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 293</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> innerFile.delete();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 294</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 295</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 297</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">try</span> {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 298</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> zip.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 299</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 300</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Failed to close zip."</span>, ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 301</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 302</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 303</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 305</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 306</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> init(AdaptorContext context) <span class="keyword">throws</span> Exception {</pre></td></tr>
-<tr> <td class="numLineCover"> 307</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.pusher = context.getDocIdPusher();</pre></td></tr>
-<tr> <td class="numLineCover"> 308</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.init(<span class="keyword">new</span> InnerAdaptorContext(context, innerPusher));</pre></td></tr>
-<tr> <td class="numLineCover"> 309</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 310</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 311</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 312</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Map<DocId, AuthzStatus> isUserAuthorized(AuthnIdentity userIdentity,</pre></td></tr>
-<tr> <td class="numLine"> 313</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Collection<DocId> ids) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 314</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> List<DocId> unescapedIds = <span class="keyword">new</span> ArrayList<DocId>(ids.size());</span></pre></td></tr>
-<tr> <td class="numLineCover"> 315</td> <td class="nbHitsUncovered"><a title="Line 315: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 315: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (DocId id : ids) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 316</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> unescapedIds.add(getDocIdParts(id)[0]);</span></pre></td></tr>
-<tr> <td class="numLine"> 317</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 318</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">super</span>.isUserAuthorized(userIdentity,</span></pre></td></tr>
-<tr> <td class="numLine"> 319</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Collections.unmodifiableList(unescapedIds));</pre></td></tr>
-<tr> <td class="numLine"> 320</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 322</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 323</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Escape used characters within a DocId provided by wrapped adaptor or file</span></pre></td></tr>
-<tr> <td class="numLine"> 324</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * names within a zip file.</span></pre></td></tr>
-<tr> <td class="numLine"> 325</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 326</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> String escape(String string) {</pre></td></tr>
-<tr> <td class="numLineCover"> 327</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> <span class="keyword">return</span> string.replaceAll(DELIMITER, ESCAPE_DELIMITER);</pre></td></tr>
-<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 329</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 330</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 331</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Remove escapes added by {@link #escape}.</span></pre></td></tr>
-<tr> <td class="numLine"> 332</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> String unescape(String string) {</pre></td></tr>
-<tr> <td class="numLineCover"> 334</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> string.replaceAll(ESCAPE_DELIMITER, DELIMITER);</pre></td></tr>
-<tr> <td class="numLine"> 335</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 336</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 337</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> AutoUnzipRequest <span class="keyword">extends</span> WrapperRequest {</pre></td></tr>
-<tr> <td class="numLine"> 338</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> DocId docId;</pre></td></tr>
-<tr> <td class="numLine"> 339</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 340</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> AutoUnzipRequest(Request request, DocId docId) {</pre></td></tr>
-<tr> <td class="numLineCover"> 341</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">super</span>(request);</pre></td></tr>
-<tr> <td class="numLineCover"> 342</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docId = docId;</pre></td></tr>
-<tr> <td class="numLineCover"> 343</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 344</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 345</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 346</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocId getDocId() {</pre></td></tr>
-<tr> <td class="numLineCover"> 347</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docId;</pre></td></tr>
-<tr> <td class="numLine"> 348</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 349</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 350</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 351</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 352</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Handles the GET request case.</span></pre></td></tr>
-<tr> <td class="numLine"> 353</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 354</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> AutoUnzipResponse <span class="keyword">extends</span> WrapperResponse {</pre></td></tr>
-<tr> <td class="numLine"> 355</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> OutputStream os;</pre></td></tr>
-<tr> <td class="numLineCover"> 356</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">private</span> State state = State.NORESPONSE;</pre></td></tr>
-<tr> <td class="numLine"> 357</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 358</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> AutoUnzipResponse(Response response, OutputStream os) {</pre></td></tr>
-<tr> <td class="numLineCover"> 359</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">super</span>(response);</pre></td></tr>
-<tr> <td class="numLineCover"> 360</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.os = os;</pre></td></tr>
-<tr> <td class="numLineCover"> 361</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 362</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 363</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 364</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> respondNotModified() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 365</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> state = State.NOTMODIFIED;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 366</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">super</span>.respondNotModified();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 367</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 368</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 369</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 370</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> respondNotFound() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 371</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> state = State.NOTFOUND;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 372</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">super</span>.respondNotFound();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 373</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 374</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 375</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 376</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> OutputStream getOutputStream() {</pre></td></tr>
-<tr> <td class="numLine"> 377</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// This case is the only one that requires we auto-unzip anything</span></pre></td></tr>
-<tr> <td class="numLineCover"> 378</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> state = State.CONTENT;</pre></td></tr>
-<tr> <td class="numLineCover"> 379</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> os;</pre></td></tr>
-<tr> <td class="numLine"> 380</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 381</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 382</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> State getState() {</pre></td></tr>
-<tr> <td class="numLineCover"> 383</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> state;</pre></td></tr>
-<tr> <td class="numLine"> 384</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 385</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 386</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">static</span> enum State {NORESPONSE, NOTMODIFIED, NOTFOUND, CONTENT};</pre></td></tr>
-<tr> <td class="numLine"> 387</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 388</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 389</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 390</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Handles the HEAD request case.</span></pre></td></tr>
-<tr> <td class="numLine"> 391</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 392</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> NoContentsResponse <span class="keyword">extends</span> WrapperResponse {</pre></td></tr>
-<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> NoContentsResponse(Response response) {</pre></td></tr>
-<tr> <td class="numLineCover"> 394</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">super</span>(response);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 395</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 396</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 397</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLineCover"> 398</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> <span class="keyword">void</span> setContentType(String contentType) {}</span></pre></td></tr>
-<tr> <td class="numLine"> 399</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 400</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 401</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 402</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * OutputStream that passes all calls to the {@code OutputStream} provided by</span></pre></td></tr>
-<tr> <td class="numLine"> 403</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * {@link Response#getOutputStream}, but calls {@code getOutputStream} only</span></pre></td></tr>
-<tr> <td class="numLine"> 404</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * once needed. This allows for code to be provided an OutputStream that</span></pre></td></tr>
-<tr> <td class="numLine"> 405</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * writes directly to the {@code Response}, but also allows the code to</span></pre></td></tr>
-<tr> <td class="numLine"> 406</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * call {@link Response#respondNotFound} before writing to the stream.</span></pre></td></tr>
-<tr> <td class="numLine"> 407</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 408</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> LazyOutputStream <span class="keyword">extends</span> AbstractLazyOutputStream {</pre></td></tr>
-<tr> <td class="numLine"> 409</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> Response resp;</pre></td></tr>
-<tr> <td class="numLine"> 410</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 411</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">public</span> LazyOutputStream(Response resp) {</pre></td></tr>
-<tr> <td class="numLineCover"> 412</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.resp = resp;</pre></td></tr>
-<tr> <td class="numLineCover"> 413</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 414</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 415</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 416</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">protected</span> OutputStream retrieveOs() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 417</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> resp.getOutputStream();</pre></td></tr>
-<tr> <td class="numLine"> 418</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 419</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 420</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 421</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> InnerDocIdPusher <span class="keyword">extends</span> AbstractDocIdPusher {</pre></td></tr>
-<tr> <td class="numLine"> 422</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 423</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher.Record pushRecords(</pre></td></tr>
-<tr> <td class="numLine"> 424</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Iterable<DocIdPusher.Record> records, PushErrorHandler handler)</pre></td></tr>
-<tr> <td class="numLine"> 425</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 426</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> AutoUnzipAdaptor.<span class="keyword">this</span>.pushRecords(records, handler);</pre></td></tr>
-<tr> <td class="numLine"> 427</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 428</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 429</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 430</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocId pushNamedResources(Map<DocId, Acl> resources,</pre></td></tr>
-<tr> <td class="numLine"> 431</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> PushErrorHandler handler)</pre></td></tr>
-<tr> <td class="numLine"> 432</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 433</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> pusher.pushNamedResources(resources, handler);</span></pre></td></tr>
-<tr> <td class="numLine"> 434</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 435</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 436</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 437</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 438</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> InnerAdaptorContext <span class="keyword">extends</span> WrapperAdaptorContext {</pre></td></tr>
-<tr> <td class="numLine"> 439</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> DocIdPusher pusher;</pre></td></tr>
-<tr> <td class="numLine"> 440</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 441</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> InnerAdaptorContext(AdaptorContext context, DocIdPusher pusher) {</pre></td></tr>
-<tr> <td class="numLineCover"> 442</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">super</span>(context);</pre></td></tr>
-<tr> <td class="numLineCover"> 443</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.pusher = pusher;</pre></td></tr>
-<tr> <td class="numLineCover"> 444</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 445</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 446</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 447</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher getDocIdPusher() {</pre></td></tr>
-<tr> <td class="numLineCover"> 448</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> pusher;</span></pre></td></tr>
-<tr> <td class="numLine"> 449</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 450</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 451</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-</table>
-
-<div class="footer">Report generated by <a href="http://cobertura.sourceforge.net/" target="_top">Cobertura</a> 1.9.4.1.</div>
-</body>
-</html>
diff --git a/coverage/com.google.enterprise.adaptor.BlockingQueueBatcher.html b/coverage/com.google.enterprise.adaptor.BlockingQueueBatcher.html
index 9b232ab..e23e340 100644
--- a/coverage/com.google.enterprise.adaptor.BlockingQueueBatcher.html
+++ b/coverage/com.google.enterprise.adaptor.BlockingQueueBatcher.html
@@ -117,22 +117,22 @@
<td class="src"><pre class="src"> Collection<? <span class="keyword">super</span> T> batch, <span class="keyword">int</span> maxBatchSize, <span class="keyword">long</span> maxLatency,</pre></td></tr>
<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> TimeUnit maxLatencyUnit) <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">long</span> maxLatencyNanos = maxLatencyUnit.toNanos(maxLatency);</pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">long</span> maxLatencyNanos = maxLatencyUnit.toNanos(maxLatency);</pre></td></tr>
<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">int</span> curBatchSize = 0;</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">long</span> stopBatchTimeNanos = -1;</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">int</span> curBatchSize = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">long</span> stopBatchTimeNanos = -1;</pre></td></tr>
<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// The loop flow is 1) block, 2) drain queue, 3) possibly consume batch.</span></pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">while</span> (<span class="keyword">true</span>) {</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> timeout = <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"><a title="Line 60: Conditional coverage 100% (2/2)."> 20</a></td> <td class="src"><pre class="src"> <a title="Line 60: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (stopBatchTimeNanos == -1) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> timeout = <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"><a title="Line 60: Conditional coverage 100% (2/2)."> 21</a></td> <td class="src"><pre class="src"> <a title="Line 60: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (stopBatchTimeNanos == -1) {</a></pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Start of new batch. Block for the first item of this batch.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> batch.add(queue.take());</pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> batch.add(queue.take());</pre></td></tr>
<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> curBatchSize++;</pre></td></tr>
<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> stopBatchTimeNanos = timeProvider.relativeTime(TimeUnit.NANOSECONDS)</pre></td></tr>
<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.CircularBufferHandler.html b/coverage/com.google.enterprise.adaptor.CircularBufferHandler.html
index 1db2898..ba9384c 100644
--- a/coverage/com.google.enterprise.adaptor.CircularBufferHandler.html
+++ b/coverage/com.google.enterprise.adaptor.CircularBufferHandler.html
@@ -77,13 +77,13 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> CircularBufferHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 31</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(DEFAULT_SIZE);</pre></td></tr>
-<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 31</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(DEFAULT_SIZE);</pre></td></tr>
+<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CircularBufferHandler(<span class="keyword">int</span> size) {</pre></td></tr>
-<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> buffer = <span class="keyword">new</span> LogRecord[size];</pre></td></tr>
-<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CircularBufferHandler(<span class="keyword">int</span> size) {</pre></td></tr>
+<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> buffer = <span class="keyword">new</span> LogRecord[size];</pre></td></tr>
+<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
@@ -103,17 +103,17 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> publish(LogRecord record) {</pre></td></tr>
-<tr> <td class="numLineCover"> 48</td> <td class="nbHitsUncovered"><a title="Line 48: Conditional coverage 50% (1/2)."> 91</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 48: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!isLoggable(record)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 48</td> <td class="nbHitsUncovered"><a title="Line 48: Conditional coverage 50% (1/2)."> 114</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 48: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!isLoggable(record)) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 49</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 91</td> <td class="src"><pre class="src"> buffer[tail] = record;</pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 91</td> <td class="src"><pre class="src"> tail = (tail + 1) % buffer.length;</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsUncovered"><a title="Line 53: Conditional coverage 50% (1/2)."> 91</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 53: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (head == tail) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 114</td> <td class="src"><pre class="src"> buffer[tail] = record;</pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 114</td> <td class="src"><pre class="src"> tail = (tail + 1) % buffer.length;</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsUncovered"><a title="Line 53: Conditional coverage 50% (1/2)."> 114</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 53: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (head == tail) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 54</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> head = (head + 1) % buffer.length;</span></pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 91</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 114</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.CommandStreamParser.html b/coverage/com.google.enterprise.adaptor.CommandStreamParser.html
index 778ee55..b3504b8 100644
--- a/coverage/com.google.enterprise.adaptor.CommandStreamParser.html
+++ b/coverage/com.google.enterprise.adaptor.CommandStreamParser.html
@@ -12,10 +12,10 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">20</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:88px"><span class="text">161/181</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">33</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:73px"><span class="text">90/123</span></div></div></td></tr></table></td><td class="value"><span class="hidden">6.875;</span>6.875</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">6.875;</span>6.875</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$Command</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:85px"><span class="text">6/7</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">6.875;</span>6.875</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$Operation</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">19/19</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">6.875;</span>6.875</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">21</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:89px"><span class="text">182/203</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">41</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:71px"><span class="text">101/142</span></div></div></td></tr></table></td><td class="value"><span class="hidden">7.625;</span>7.625</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">7.625;</span>7.625</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$Command</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:85px"><span class="text">6/7</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">7.625;</span>7.625</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$Operation</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">26/26</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">7.625;</span>7.625</td></tr>
</table>
<div class="separator"> </div>
@@ -267,769 +267,884 @@
<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * "meta-value=" -- specifies a metadata value associated with</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "meta-name=" -- specifies a metadata key, to be followed by a metadata-value<p></span></pre></td></tr>
<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * immediately preceding metadata-name<p></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 126</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "meta-value=" -- specifies a metadata value associated with</span></pre></td></tr>
<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * "content" -- signals the beginning of binary content which</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * immediately preceding metadata-name<p></span></pre></td></tr>
<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * continues to the end of the file or stream<p></span></pre></td></tr>
-<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * "content" -- signals the beginning of binary content which</span></pre></td></tr>
<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <h1>Authorizer Commands:</h1></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * continues to the end of the file or stream<p></span></pre></td></tr>
<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * "authz-status=" -- specifies whether a document is visible to a</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "last-modified=" -- specifies the last time the document or its metadata has changed.</span></pre></td></tr>
<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * specified user. The argument must be PERMIT, DENY or INDETERMINATE<p></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * The argument is a number representing the number of seconds since the standard base</span></pre></td></tr>
<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * time known as the epoch", namely January 1, 1970, 00:00:00 GMT.<p></span></pre></td></tr>
<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * "user=" -- specifies the user for whom the authorization check will be made<p></span></pre></td></tr>
-<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * "secure=" -- specifies whether the document is non-public. The argument is either 'true' or</span></pre></td></tr>
<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * "password=" -- specifies the password for the user. (optional)<p></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * 'false'.<p></span></pre></td></tr>
<tr> <td class="numLine"> 138</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * </span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 139</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * "group=" -- specifies a security group to which the user belongs.<p></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "anchor-uri=" -- specifies an anchor URI, to be followed by anchor-text.<p></span></pre></td></tr>
<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * End-of-stream terminates the data transmission. Multiple consecutive delimiters are collapsed</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "anchor-text=" -- specifies the text associated with an anchor-uri.<p></span></pre></td></tr>
<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * into a single delimiter and terminates the current id-list should one exist.<p></span></pre></td></tr>
-<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * "no-index=" -- specifies whether the document should be indexed by the GSA. The argument is</span></pre></td></tr>
<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Unrecognized commands generate a warning but are otherwise ignored.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * either 'true' or 'false'.<p></span></pre></td></tr>
<tr> <td class="numLine"> 145</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 146</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <h3>Examples</h3></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "no-follow=" -- specifies whether the document's links should be followed by the GSA. The</span></pre></td></tr>
<tr> <td class="numLine"> 147</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * argument is either 'true' or 'false'.<p></span></pre></td></tr>
<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Example 1:<p></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "no-archive=" -- specifies whether GSA document will allow the user to see a cached version of</span></pre></td></tr>
<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <pre></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * the document. The argument is either 'true' or 'false'.<p></span></pre></td></tr>
<tr> <td class="numLine"> 151</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * {@code</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * GSA Adaptor Data Version 1 [<delimiter>]</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "display-url=" -- specifies an alternative link to be displayed in the search results.</span></pre></td></tr>
<tr> <td class="numLine"> 153</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id-list</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * This must be a properly formed URL.<p></span></pre></td></tr>
<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file1</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 155</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file2</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "crawl-once=" -- specifies that the document will be crawled by the</span></pre></td></tr>
<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file3</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * GSA one time but then never re-crawled. The argument should be 'true' or 'false'.<p></span></pre></td></tr>
<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file4</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file5</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "lock=" -- Causes the document to remain in the index unless explicitly removed.</span></pre></td></tr>
<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * }</pre></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * If every document in the GSA is locked then locked document may be forced out when maximum</span></pre></td></tr>
<tr> <td class="numLine"> 160</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * capacity is reached.<p></span></pre></td></tr>
<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Example 2:<p></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <h1>Authorizer Commands:</h1></span></pre></td></tr>
<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <pre></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 164</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * {@code</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "authz-status=" -- specifies whether a document is visible to a</span></pre></td></tr>
<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * GSA Adaptor Data Version 1 [<delimiter>]</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * specified user. The argument must be PERMIT, DENY or INDETERMINATE<p></span></pre></td></tr>
<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file1</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file2</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "user=" -- specifies the user for whom the authorization check will be made<p></span></pre></td></tr>
<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * crawl-immediately</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 169</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * last-modified=20110803 16:07:23</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "password=" -- specifies the password for the user. (optional)<p></span></pre></td></tr>
<tr> <td class="numLine"> 170</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * </span></pre></td></tr>
<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * meta-name=Department</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * "group=" -- specifies a security group to which the user belongs.<p></span></pre></td></tr>
<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * meta-content=Engineering</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 173</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * End-of-stream terminates the data transmission. Multiple consecutive delimiters are collapsed</span></pre></td></tr>
<tr> <td class="numLine"> 174</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * meta-name=Creator</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * into a single delimiter and terminates the current id-list should one exist.<p></span></pre></td></tr>
<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * meta-content=howardhawks</span></pre></td></tr>
-<tr> <td class="numLine"> 176</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 176</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Unrecognized commands generate a warning but are otherwise ignored.</span></pre></td></tr>
<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file3</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 178</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file4</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <h3>Examples</h3></span></pre></td></tr>
<tr> <td class="numLine"> 179</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file5</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 180</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * }</pre></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Example 1:<p></span></pre></td></tr>
<tr> <td class="numLine"> 181</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Data passed to command line authorizer via stdin for authz check.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <pre></span></pre></td></tr>
<tr> <td class="numLine"> 183</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Entries will always occur in this order: user, password, group, id.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * {@code</span></pre></td></tr>
<tr> <td class="numLine"> 184</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * password and group information is optional. Any number of group and</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * GSA Adaptor Data Version 1 [<delimiter>]</span></pre></td></tr>
<tr> <td class="numLine"> 185</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id entries can exist. Each of the documents with a listed id should</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * id-list</span></pre></td></tr>
<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * be checked.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file1</span></pre></td></tr>
<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <pre></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file2</span></pre></td></tr>
<tr> <td class="numLine"> 188</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * {@code</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file3</span></pre></td></tr>
<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * GSA Adaptor Data Version 1 [<delimiter>]</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file4</span></pre></td></tr>
<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * user=tim_smith</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * /home/repository/docs/file5</span></pre></td></tr>
<tr> <td class="numLine"> 191</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * password=abc123</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * }</pre></span></pre></td></tr>
<tr> <td class="numLine"> 192</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * group=managers</span></pre></td></tr>
-<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * group=research</span></pre></td></tr>
-<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file1</span></pre></td></tr>
-<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file2</span></pre></td></tr>
-<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * }</pre></span></pre></td></tr>
-<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * AuthZ response passed from command line authorizer via stdout.</span></pre></td></tr>
-<tr> <td class="numLine"> 199</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Each doc id must include an authz-status entry.</span></pre></td></tr>
-<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Example 2:<p></span></pre></td></tr>
+<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <pre></span></pre></td></tr>
-<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * {@code</span></pre></td></tr>
-<tr> <td class="numLine"> 202</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * GSA Adaptor Data Version 1 [<delimiter>]</span></pre></td></tr>
-<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file1</span></pre></td></tr>
-<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * authz-status=PERMIT</span></pre></td></tr>
-<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 199</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file2</span></pre></td></tr>
+<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * crawl-immediately</span></pre></td></tr>
+<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * last-modified=20110803 16:07:23</span></pre></td></tr>
+<tr> <td class="numLine"> 202</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * meta-name=Department</span></pre></td></tr>
+<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * meta-content=Engineering</span></pre></td></tr>
+<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 206</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * authz-status=DENY</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * meta-name=Creator</span></pre></td></tr>
<tr> <td class="numLine"> 207</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * }</pre></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * meta-content=howardhawks</span></pre></td></tr>
<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 209</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> CommandStreamParser {</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file3</span></pre></td></tr>
<tr> <td class="numLine"> 210</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file4</span></pre></td></tr>
<tr> <td class="numLine"> 211</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 212</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> enum Operation {</pre></td></tr>
-<tr> <td class="numLineCover"> 213</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ID(<span class="string">"id"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> RESULT_LINK(<span class="string">"result-link"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> LAST_MODIFIED(<span class="string">"last-modified"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 216</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> CRAWL_IMMEDIATELY(<span class="string">"crawl-immediately"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 217</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> CRAWL_ONCE(<span class="string">"crawl-once"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> LOCK(<span class="string">"lock"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> DELETE(<span class="string">"delete"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 220</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> UP_TO_DATE(<span class="string">"up-to-date"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 221</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> NOT_FOUND(<span class="string">"not-found"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> MIME_TYPE(<span class="string">"mime-type"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> META_NAME(<span class="string">"meta-name"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 224</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> META_VALUE(<span class="string">"meta-value"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 225</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> CONTENT(<span class="string">"content"</span>),</pre></td></tr>
-<tr> <td class="numLineCover"> 226</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> AUTHZ_STATUS(<span class="string">"authz-status"</span>),</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file5</span></pre></td></tr>
+<tr> <td class="numLine"> 212</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * }</pre></span></pre></td></tr>
+<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 214</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Data passed to command line authorizer via stdin for authz check.</span></pre></td></tr>
+<tr> <td class="numLine"> 215</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Entries will always occur in this order: user, password, group, id.</span></pre></td></tr>
+<tr> <td class="numLine"> 216</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * password and group information is optional. Any number of group and</span></pre></td></tr>
+<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * id entries can exist. Each of the documents with a listed id should</span></pre></td></tr>
+<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * be checked.</span></pre></td></tr>
+<tr> <td class="numLine"> 219</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <pre></span></pre></td></tr>
+<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * {@code</span></pre></td></tr>
+<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * GSA Adaptor Data Version 1 [<delimiter>]</span></pre></td></tr>
+<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * user=tim_smith</span></pre></td></tr>
+<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * password=abc123</span></pre></td></tr>
+<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * group=managers</span></pre></td></tr>
+<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * group=research</span></pre></td></tr>
+<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file1</span></pre></td></tr>
<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> ;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file2</span></pre></td></tr>
<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * }</pre></span></pre></td></tr>
<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> String commandName;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 231</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Operation(String commandName) {</pre></td></tr>
-<tr> <td class="numLineCover"> 232</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.commandName = commandName;</pre></td></tr>
-<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * AuthZ response passed from command line authorizer via stdout.</span></pre></td></tr>
+<tr> <td class="numLine"> 231</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Each doc id must include an authz-status entry.</span></pre></td></tr>
+<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <pre></span></pre></td></tr>
+<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * {@code</span></pre></td></tr>
<tr> <td class="numLine"> 234</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * GSA Adaptor Data Version 1 [<delimiter>]</span></pre></td></tr>
<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getCommandName() {</pre></td></tr>
-<tr> <td class="numLineCover"> 236</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">return</span> commandName;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file1</span></pre></td></tr>
+<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * authz-status=PERMIT</span></pre></td></tr>
<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * id=/home/repository/docs/file2</span></pre></td></tr>
<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * authz-status=DENY</span></pre></td></tr>
<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 240</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log = Logger.getLogger(CommandStreamParser.<span class="keyword">class</span>.getName());</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * }</pre></span></pre></td></tr>
+<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String HEADER_PREFIX = <span class="string">"GSA Adaptor Data Version"</span>;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> CommandStreamParser {</pre></td></tr>
<tr> <td class="numLine"> 242</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String DISALLOWED_DELIMITER_CHARS_REGEX = <span class="string">"[a-zA-Z0-9:/\\-_ =\\+\\[\\]]"</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 243</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Charset CHARSET = Charset.forName(<span class="string">"UTF-8"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 244</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Map<String, Operation> STRING_TO_OPERATION;</pre></td></tr>
-<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 247</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">static</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 248</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> Map<String, Operation> stringToOperation = <span class="keyword">new</span> HashMap<String, Operation>();</pre></td></tr>
-<tr> <td class="numLineCover"> 249</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> <span class="keyword">for</span> (Operation operation : Operation.values()) {</pre></td></tr>
-<tr> <td class="numLineCover"> 250</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> stringToOperation.put(operation.getCommandName(), operation);</pre></td></tr>
-<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 252</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> STRING_TO_OPERATION = Collections.unmodifiableMap(stringToOperation);</pre></td></tr>
-<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> enum Operation {</pre></td></tr>
+<tr> <td class="numLineCover"> 245</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ID(<span class="string">"id"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 246</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> RESULT_LINK(<span class="string">"result-link"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 247</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> LAST_MODIFIED(<span class="string">"last-modified"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 248</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> CRAWL_IMMEDIATELY(<span class="string">"crawl-immediately"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 249</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> CRAWL_ONCE(<span class="string">"crawl-once"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 250</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> LOCK(<span class="string">"lock"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 251</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> DELETE(<span class="string">"delete"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 252</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> UP_TO_DATE(<span class="string">"up-to-date"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> NOT_FOUND(<span class="string">"not-found"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 254</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> MIME_TYPE(<span class="string">"mime-type"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 255</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> META_NAME(<span class="string">"meta-name"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> META_VALUE(<span class="string">"meta-value"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 257</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> CONTENT(<span class="string">"content"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 258</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> AUTHZ_STATUS(<span class="string">"authz-status"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> SECURE(<span class="string">"secure"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ANCHOR_URI(<span class="string">"anchor-uri"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 261</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ANCHOR_TEXT(<span class="string">"anchor-text"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 262</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> NO_INDEX(<span class="string">"no-index"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 263</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> NO_FOLLOW(<span class="string">"no-follow"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 264</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> NO_ARCHIVE(<span class="string">"no-archive"</span>),</pre></td></tr>
+<tr> <td class="numLineCover"> 265</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> DISPLAY_URL(<span class="string">"display-url"</span>),</pre></td></tr>
+<tr> <td class="numLine"> 266</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> ;</pre></td></tr>
+<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> InputStream inputStream;</pre></td></tr>
-<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">int</span> versionNumber = 0;</pre></td></tr>
-<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> String delimiter;</pre></td></tr>
-<tr> <td class="numLine"> 258</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> inIdList;</pre></td></tr>
-<tr> <td class="numLine"> 259</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 268</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> String commandName;</pre></td></tr>
+<tr> <td class="numLine"> 269</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 260</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/** */</span></pre></td></tr>
-<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> Command {</pre></td></tr>
-<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 263</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> Operation operation;</pre></td></tr>
-<tr> <td class="numLine"> 264</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> String argument;</pre></td></tr>
-<tr> <td class="numLine"> 265</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 266</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> Command(Operation operation, String argument) {</pre></td></tr>
-<tr> <td class="numLineCover"> 267</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.operation = operation;</pre></td></tr>
-<tr> <td class="numLineCover"> 268</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.argument = argument;</pre></td></tr>
-<tr> <td class="numLineCover"> 269</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 270</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 271</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Operation getOperation() {</pre></td></tr>
-<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"> 30079</td> <td class="src"><pre class="src"> <span class="keyword">return</span> operation;</pre></td></tr>
+<tr> <td class="numLineCover"> 270</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Operation(String commandName) {</pre></td></tr>
+<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.commandName = commandName;</pre></td></tr>
+<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 273</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 274</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 275</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getArgument() {</pre></td></tr>
-<tr> <td class="numLineCover"> 276</td> <td class="nbHitsCovered"> 30058</td> <td class="src"><pre class="src"> <span class="keyword">return</span> argument;</pre></td></tr>
-<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 274</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> String getCommandName() {</pre></td></tr>
+<tr> <td class="numLineCover"> 275</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">return</span> commandName;</pre></td></tr>
+<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 278</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 279</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> hasArgument() {</pre></td></tr>
-<tr> <td class="numLineCover"> 280</td> <td class="nbHitsUncovered"><a title="Line 280: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 280: Conditional coverage 0% (0/2)."> <span class="keyword">return</span> argument != <span class="keyword">null</span>;</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 279</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log = Logger.getLogger(CommandStreamParser.<span class="keyword">class</span>.getName());</pre></td></tr>
+<tr> <td class="numLine"> 280</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String HEADER_PREFIX = <span class="string">"GSA Adaptor Data Version"</span>;</pre></td></tr>
<tr> <td class="numLine"> 281</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 282</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String DISALLOWED_DELIMITER_CHARS_REGEX = <span class="string">"[a-zA-Z0-9:/\\-_ =\\+\\[\\]]"</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 282</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Charset CHARSET = Charset.forName(<span class="string">"UTF-8"</span>);</pre></td></tr>
<tr> <td class="numLine"> 283</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CommandStreamParser(InputStream inputStream) {</pre></td></tr>
-<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.inputStream = inputStream;</pre></td></tr>
-<tr> <td class="numLineCover"> 286</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> inIdList = <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 287</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 284</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Map<String, Operation> STRING_TO_OPERATION;</pre></td></tr>
+<tr> <td class="numLine"> 285</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getVersionNumber() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 290</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> checkHeader();</pre></td></tr>
-<tr> <td class="numLineCover"> 291</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> versionNumber;</pre></td></tr>
-<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 287</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> Map<String, Operation> stringToOperation = <span class="keyword">new</span> HashMap<String, Operation>();</pre></td></tr>
+<tr> <td class="numLineCover"> 288</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">for</span> (Operation operation : Operation.values()) {</pre></td></tr>
+<tr> <td class="numLineCover"> 289</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> stringToOperation.put(operation.getCommandName(), operation);</pre></td></tr>
+<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 291</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> STRING_TO_OPERATION = Collections.unmodifiableMap(stringToOperation);</pre></td></tr>
+<tr> <td class="numLineCover"> 292</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 293</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Map<DocId, AuthzStatus> readFromAuthorizer() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> Map<DocId, AuthzStatus> result = <span class="keyword">new</span> HashMap<DocId, AuthzStatus>();</pre></td></tr>
-<tr> <td class="numLineCover"> 296</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> String docId = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 297</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> AuthzStatus authzStatus = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 298</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> Command command = readCommand();</pre></td></tr>
-<tr> <td class="numLine"> 299</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> InputStream inputStream;</pre></td></tr>
+<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">int</span> versionNumber = 0;</pre></td></tr>
+<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> String delimiter;</pre></td></tr>
+<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> inIdList;</pre></td></tr>
+<tr> <td class="numLine"> 298</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 299</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** */</span></pre></td></tr>
<tr> <td class="numLine"> 300</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Starting out at end-of-stream so return an empty list.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 301</td> <td class="nbHitsCovered"><a title="Line 301: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 301: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (command == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 302</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> result;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> Command {</pre></td></tr>
+<tr> <td class="numLine"> 301</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 302</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> Operation operation;</pre></td></tr>
<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> String argument;</pre></td></tr>
<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 305</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// The first operation must be a doc ID.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 306</td> <td class="nbHitsCovered"><a title="Line 306: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 306: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (command.getOperation() != Operation.ID) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 307</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Authorizer Error: the first operator must be a document ID. "</span></pre></td></tr>
-<tr> <td class="numLine"> 308</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">" Instead encountered '"</span> + command.getOperation() + <span class="string">"'."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 305</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> Command(Operation operation, String argument) {</pre></td></tr>
+<tr> <td class="numLineCover"> 306</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.operation = operation;</pre></td></tr>
+<tr> <td class="numLineCover"> 307</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.argument = argument;</pre></td></tr>
+<tr> <td class="numLineCover"> 308</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 309</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 310</td> <td class="nbHitsCovered"><a title="Line 310: Conditional coverage 100% (2/2)."> 14</a></td> <td class="src"><pre class="src"> <a title="Line 310: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (command != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 311</td> <td class="nbHitsUncovered"><a title="Line 311: Conditional coverage 66% (2/3)."> 12</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 311: Conditional coverage 66% (2/3)."> <span class="keyword">switch</span> (command.getOperation()) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 312</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> ID:</pre></td></tr>
-<tr> <td class="numLineCover"> 313</td> <td class="nbHitsCovered"><a title="Line 313: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 313: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (docId != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 314</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> result.put(<span class="keyword">new</span> DocId(docId), authzStatus);</pre></td></tr>
-<tr> <td class="numLine"> 315</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 316</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> docId = command.getArgument();</pre></td></tr>
-<tr> <td class="numLineCover"> 317</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> authzStatus = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 318</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 319</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> AUTHZ_STATUS:</pre></td></tr>
-<tr> <td class="numLineCover"> 320</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String authzStatusString = command.getArgument();</pre></td></tr>
-<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 322</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> authzStatus = AuthzStatus.valueOf(authzStatusString);</pre></td></tr>
-<tr> <td class="numLineCover"> 323</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalArgumentException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 324</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"Unrecognized authz-status of '"</span> + authzStatusString + <span class="string">"' for document: '"</span> +</span></pre></td></tr>
-<tr> <td class="numLine"> 325</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> docId + <span class="string">"'"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 326</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 327</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">default</span>:</pre></td></tr>
-<tr> <td class="numLineCover"> 329</td> <td class="nbHitsUncovered"><a title="Line 329: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 329: Conditional coverage 0% (0/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Authorizer Error: invalid operation: '"</span> + command.getOperation() +</a></span></pre></td></tr>
-<tr> <td class="numLine"> 330</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> (command.hasArgument() ? <span class="string">"' with argument: '"</span> + command.getArgument() + <span class="string">"'"</span> : <span class="string">"'"</span>));</pre></td></tr>
-<tr> <td class="numLine"> 331</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 332</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
-<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 334</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> result.put(<span class="keyword">new</span> DocId(docId), authzStatus);</pre></td></tr>
-<tr> <td class="numLine"> 335</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 336</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.unmodifiableMap(result);</pre></td></tr>
-<tr> <td class="numLine"> 337</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 310</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Operation getOperation() {</pre></td></tr>
+<tr> <td class="numLineCover"> 311</td> <td class="nbHitsCovered"> 30089</td> <td class="src"><pre class="src"> <span class="keyword">return</span> operation;</pre></td></tr>
+<tr> <td class="numLine"> 312</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 313</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 314</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> String getArgument() {</pre></td></tr>
+<tr> <td class="numLineCover"> 315</td> <td class="nbHitsCovered"> 30068</td> <td class="src"><pre class="src"> <span class="keyword">return</span> argument;</pre></td></tr>
+<tr> <td class="numLine"> 316</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 317</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 318</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> hasArgument() {</pre></td></tr>
+<tr> <td class="numLineCover"> 319</td> <td class="nbHitsUncovered"><a title="Line 319: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 319: Conditional coverage 0% (0/2)."> <span class="keyword">return</span> argument != <span class="keyword">null</span>;</a></span></pre></td></tr>
+<tr> <td class="numLine"> 320</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 322</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 323</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CommandStreamParser(InputStream inputStream) {</pre></td></tr>
+<tr> <td class="numLineCover"> 324</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.inputStream = inputStream;</pre></td></tr>
+<tr> <td class="numLineCover"> 325</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> inIdList = <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 326</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 327</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getVersionNumber() <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 329</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> checkHeader();</pre></td></tr>
+<tr> <td class="numLineCover"> 330</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> versionNumber;</pre></td></tr>
+<tr> <td class="numLine"> 331</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 332</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Map<DocId, AuthzStatus> readFromAuthorizer() <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 334</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> Map<DocId, AuthzStatus> result = <span class="keyword">new</span> HashMap<DocId, AuthzStatus>();</pre></td></tr>
+<tr> <td class="numLineCover"> 335</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> String docId = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 336</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> AuthzStatus authzStatus = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 337</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> Command command = readCommand();</pre></td></tr>
<tr> <td class="numLine"> 338</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 339</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> readFromRetriever(DocId docId, Response response) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLine"> 340</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 341</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> Command command = readCommand();</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// Starting out at end-of-stream so return an empty list.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 340</td> <td class="nbHitsCovered"><a title="Line 340: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 340: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (command == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 341</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> result;</pre></td></tr>
<tr> <td class="numLine"> 342</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 343</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 343</td> <td class="nbHitsUncovered"><a title="Line 343: Conditional coverage 50% (1/2)."> 7</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 343: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (command == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 344</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Invalid or missing retriever data."</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 345</td> <td class="nbHitsUncovered"><a title="Line 345: Conditional coverage 50% (1/2)."> 7</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 345: Conditional coverage 50% (1/2)."> } <span class="keyword">else</span> <span class="keyword">if</span> (command.getOperation() != Operation.ID) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 346</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Retriever Error: the first operator must be a document ID. "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 344</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// The first operation must be a doc ID.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 345</td> <td class="nbHitsCovered"><a title="Line 345: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 345: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (command.getOperation() != Operation.ID) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 346</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Authorizer Error: the first operator must be a document ID. "</span></pre></td></tr>
<tr> <td class="numLine"> 347</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">" Instead encountered '"</span> + command.getOperation() + <span class="string">"'."</span>);</pre></td></tr>
<tr> <td class="numLine"> 348</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 349</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 350</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> DocId foundDocId = <span class="keyword">new</span> DocId(command.getArgument());</pre></td></tr>
-<tr> <td class="numLineCover"> 351</td> <td class="nbHitsUncovered"><a title="Line 351: Conditional coverage 50% (1/2)."> 7</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 351: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!docId.equals(foundDocId)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 352</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"requested document "</span> + docId + <span class="string">" does not match retrieved "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 353</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">"document "</span> + foundDocId + <span class="string">"."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 349</td> <td class="nbHitsCovered"><a title="Line 349: Conditional coverage 100% (2/2)."> 14</a></td> <td class="src"><pre class="src"> <a title="Line 349: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (command != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 350</td> <td class="nbHitsUncovered"><a title="Line 350: Conditional coverage 66% (2/3)."> 12</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 350: Conditional coverage 66% (2/3)."> <span class="keyword">switch</span> (command.getOperation()) {</a></span></pre></td></tr>
+<tr> <td class="numLine"> 351</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> ID:</pre></td></tr>
+<tr> <td class="numLineCover"> 352</td> <td class="nbHitsCovered"><a title="Line 352: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 352: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (docId != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 353</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> result.put(<span class="keyword">new</span> DocId(docId), authzStatus);</pre></td></tr>
<tr> <td class="numLine"> 354</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 355</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
-<tr> <td class="numLineCover"> 356</td> <td class="nbHitsCovered"><a title="Line 356: Conditional coverage 100% (2/2)."> 24</a></td> <td class="src"><pre class="src"> <a title="Line 356: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (command != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 357</td> <td class="nbHitsUncovered"><a title="Line 357: Conditional coverage 50% (4/8)."> 17</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 357: Conditional coverage 50% (4/8)."> <span class="keyword">switch</span> (command.getOperation()) {</a></span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 355</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> docId = command.getArgument();</pre></td></tr>
+<tr> <td class="numLineCover"> 356</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> authzStatus = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 357</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 358</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> ID:</pre></td></tr>
-<tr> <td class="numLineCover"> 359</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Only one document ID can be specified in a retriever message"</span>);</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> AUTHZ_STATUS:</pre></td></tr>
+<tr> <td class="numLineCover"> 359</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String authzStatusString = command.getArgument();</pre></td></tr>
<tr> <td class="numLine"> 360</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> CONTENT:</pre></td></tr>
-<tr> <td class="numLineCover"> 361</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> IOHelper.copyStream(inputStream, response.getOutputStream());</pre></td></tr>
-<tr> <td class="numLineCover"> 362</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 363</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> META_NAME:</pre></td></tr>
-<tr> <td class="numLineCover"> 364</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String metaName = command.getArgument();</pre></td></tr>
-<tr> <td class="numLineCover"> 365</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
-<tr> <td class="numLineCover"> 366</td> <td class="nbHitsUncovered"><a title="Line 366: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> 6</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 366: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> <span class="keyword">if</span> (command == <span class="keyword">null</span> || command.getOperation() != Operation.META_VALUE) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 367</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"meta-name must be immediately followed by meta-value"</span>);</span></pre></td></tr>
-<tr> <td class="numLine"> 368</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 369</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.log(Level.FINEST, <span class="string">"Retriever: {0} has metadata {1}={2}"</span>,</pre></td></tr>
-<tr> <td class="numLine"> 370</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {docId.getUniqueId(), metaName,</pre></td></tr>
-<tr> <td class="numLine"> 371</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> command.getArgument()});</pre></td></tr>
-<tr> <td class="numLineCover"> 372</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> response.addMetadata(metaName, command.getArgument());</pre></td></tr>
-<tr> <td class="numLineCover"> 373</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 374</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> UP_TO_DATE:</pre></td></tr>
-<tr> <td class="numLineCover"> 375</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.log(Level.FINEST, <span class="string">"Retriever: {0} is up to date."</span>, docId.getUniqueId());</pre></td></tr>
-<tr> <td class="numLineCover"> 376</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> response.respondNotModified();</pre></td></tr>
-<tr> <td class="numLineCover"> 377</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 378</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> NOT_FOUND:</pre></td></tr>
-<tr> <td class="numLineCover"> 379</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> response.respondNotFound();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 380</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 381</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> MIME_TYPE:</pre></td></tr>
-<tr> <td class="numLineCover"> 382</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.log(Level.FINEST, <span class="string">"Retriever: {0} has mime-type {1}"</span>,</pre></td></tr>
-<tr> <td class="numLine"> 383</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {docId.getUniqueId(), command.getArgument()});</pre></td></tr>
-<tr> <td class="numLineCover"> 384</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> response.setContentType(command.getArgument());</pre></td></tr>
-<tr> <td class="numLineCover"> 385</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 386</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">default</span>:</pre></td></tr>
-<tr> <td class="numLineCover"> 387</td> <td class="nbHitsUncovered"><a title="Line 387: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 387: Conditional coverage 0% (0/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Retriever Error: invalid operation: '"</span> + command.getOperation() +</a></span></pre></td></tr>
-<tr> <td class="numLine"> 388</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> (command.hasArgument() ? <span class="string">"' with argument: '"</span> + command.getArgument() + <span class="string">"'"</span> : <span class="string">"'"</span>));</pre></td></tr>
-<tr> <td class="numLine"> 389</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 390</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
-<tr> <td class="numLine"> 391</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 392</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 394</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 395</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Parse a listing response, sending results to {@code pusher}. If {@code handler} is {@code</span></pre></td></tr>
-<tr> <td class="numLine"> 396</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * null}, then {@code pusher}'s default handler will be used. In case of failure sending in</span></pre></td></tr>
-<tr> <td class="numLine"> 397</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * {@code pusher}, the rest of the input stream may not be read.</span></pre></td></tr>
-<tr> <td class="numLine"> 398</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 399</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * @return {@code null} on success, otherwise the first Record to fail</span></pre></td></tr>
-<tr> <td class="numLine"> 400</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 401</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher.Record readFromLister(DocIdPusher pusher, PushErrorHandler handler)</pre></td></tr>
-<tr> <td class="numLine"> 402</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">throws</span> IOException, InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 403</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> ArrayList<DocIdPusher.Record> result = <span class="keyword">new</span> ArrayList<DocIdPusher.Record>();</pre></td></tr>
-<tr> <td class="numLineCover"> 404</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> DocIdPusher.Record.Builder builder = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 405</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> Command command = readCommand();</pre></td></tr>
-<tr> <td class="numLine"> 406</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 407</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Starting out at end-of-stream so don't send anything.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 408</td> <td class="nbHitsCovered"><a title="Line 408: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 408: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (command == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 409</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLine"> 410</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 411</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 412</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// The first operation must be a doc ID.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 413</td> <td class="nbHitsCovered"><a title="Line 413: Conditional coverage 100% (2/2)."> 9</a></td> <td class="src"><pre class="src"> <a title="Line 413: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (command.getOperation() != Operation.ID) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 414</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Lister Error: the first operator must be a document ID. "</span></pre></td></tr>
-<tr> <td class="numLine"> 415</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">" Instead encountered '"</span> + command.getOperation() + <span class="string">"'."</span>);</pre></td></tr>
-<tr> <td class="numLine"> 416</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 417</td> <td class="nbHitsCovered"><a title="Line 417: Conditional coverage 100% (2/2)."> 30031</a></td> <td class="src"><pre class="src"> <a title="Line 417: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (command != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 418</td> <td class="nbHitsUncovered"><a title="Line 418: Conditional coverage 50% (7/14)."> 30023</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 418: Conditional coverage 50% (7/14)."> <span class="keyword">switch</span> (command.getOperation()) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 419</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> ID:</pre></td></tr>
-<tr> <td class="numLineCover"> 420</td> <td class="nbHitsCovered"><a title="Line 420: Conditional coverage 100% (2/2)."> 30015</a></td> <td class="src"><pre class="src"> <a title="Line 420: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (builder != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 421</td> <td class="nbHitsCovered"> 30007</td> <td class="src"><pre class="src"> result.add(builder.build());</pre></td></tr>
-<tr> <td class="numLine"> 422</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// TODO(ejona): make threshold smarter.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 423</td> <td class="nbHitsCovered"><a title="Line 423: Conditional coverage 100% (2/2)."> 30007</a></td> <td class="src"><pre class="src"> <a title="Line 423: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (result.size() >= 10000) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 424</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> DocIdPusher.Record errorRecord = pusher.pushRecords(result, handler);</pre></td></tr>
-<tr> <td class="numLineCover"> 425</td> <td class="nbHitsUncovered"><a title="Line 425: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 425: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (errorRecord != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 426</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> errorRecord;</span></pre></td></tr>
-<tr> <td class="numLine"> 427</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 428</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> result.clear();</pre></td></tr>
-<tr> <td class="numLine"> 429</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 430</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 431</td> <td class="nbHitsCovered"> 30015</td> <td class="src"><pre class="src"> builder = <span class="keyword">new</span> DocIdPusher.Record.Builder(<span class="keyword">new</span> DocId(command.getArgument()));</pre></td></tr>
-<tr> <td class="numLineCover"> 432</td> <td class="nbHitsCovered"> 30015</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 433</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> LAST_MODIFIED:</pre></td></tr>
-<tr> <td class="numLine"> 434</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Convert seconds to milliseconds for Date constructor.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 435</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> builder.setLastModified(<span class="keyword">new</span> Date(Long.parseLong(command.getArgument()) * 1000));</pre></td></tr>
-<tr> <td class="numLineCover"> 436</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 437</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> RESULT_LINK:</pre></td></tr>
-<tr> <td class="numLine"> 438</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 439</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> builder.setResultLink(<span class="keyword">new</span> URI(command.getArgument()));</pre></td></tr>
-<tr> <td class="numLineCover"> 440</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (URISyntaxException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 441</td> <td class="nbHitsUncovered"><a title="Line 441: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 441: Conditional coverage 0% (0/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Lister Error: invalid URL: '"</span> + command.getOperation()</a></span></pre></td></tr>
-<tr> <td class="numLine"> 442</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + (command.hasArgument() ? <span class="string">"' with argument: '"</span></pre></td></tr>
+<tr> <td class="numLineCover"> 361</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> authzStatus = AuthzStatus.valueOf(authzStatusString);</pre></td></tr>
+<tr> <td class="numLineCover"> 362</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalArgumentException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 363</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"Unrecognized authz-status of '"</span> + authzStatusString + <span class="string">"' for document: '"</span> +</span></pre></td></tr>
+<tr> <td class="numLine"> 364</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> docId + <span class="string">"'"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 365</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 366</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 367</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">default</span>:</pre></td></tr>
+<tr> <td class="numLineCover"> 368</td> <td class="nbHitsUncovered"><a title="Line 368: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 368: Conditional coverage 0% (0/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Authorizer Error: invalid operation: '"</span> + command.getOperation() +</a></span></pre></td></tr>
+<tr> <td class="numLine"> 369</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> (command.hasArgument() ? <span class="string">"' with argument: '"</span> + command.getArgument() + <span class="string">"'"</span> : <span class="string">"'"</span>));</pre></td></tr>
+<tr> <td class="numLine"> 370</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 371</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
+<tr> <td class="numLine"> 372</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 373</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> result.put(<span class="keyword">new</span> DocId(docId), authzStatus);</pre></td></tr>
+<tr> <td class="numLine"> 374</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 375</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.unmodifiableMap(result);</pre></td></tr>
+<tr> <td class="numLine"> 376</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 377</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 378</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> readFromRetriever(DocId docId, Response response) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLine"> 379</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 380</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> Command command = readCommand();</pre></td></tr>
+<tr> <td class="numLine"> 381</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 382</td> <td class="nbHitsUncovered"><a title="Line 382: Conditional coverage 50% (1/2)."> 7</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 382: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (command == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 383</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Invalid or missing retriever data."</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 384</td> <td class="nbHitsUncovered"><a title="Line 384: Conditional coverage 50% (1/2)."> 7</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 384: Conditional coverage 50% (1/2)."> } <span class="keyword">else</span> <span class="keyword">if</span> (command.getOperation() != Operation.ID) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 385</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Retriever Error: the first operator must be a document ID. "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 386</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + <span class="string">" Instead encountered '"</span> + command.getOperation() + <span class="string">"'."</span>);</pre></td></tr>
+<tr> <td class="numLine"> 387</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 388</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 389</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> DocId foundDocId = <span class="keyword">new</span> DocId(command.getArgument());</pre></td></tr>
+<tr> <td class="numLineCover"> 390</td> <td class="nbHitsUncovered"><a title="Line 390: Conditional coverage 50% (1/2)."> 7</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 390: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!docId.equals(foundDocId)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 391</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"requested document "</span> + docId + <span class="string">" does not match retrieved "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 392</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + <span class="string">"document "</span> + foundDocId + <span class="string">"."</span>);</pre></td></tr>
+<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 394</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
+<tr> <td class="numLineCover"> 395</td> <td class="nbHitsCovered"><a title="Line 395: Conditional coverage 100% (2/2)."> 33</a></td> <td class="src"><pre class="src"> <a title="Line 395: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (command != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 396</td> <td class="nbHitsUncovered"><a title="Line 396: Conditional coverage 76% (13/17)."> 26</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 396: Conditional coverage 76% (13/17)."> <span class="keyword">switch</span> (command.getOperation()) {</a></span></pre></td></tr>
+<tr> <td class="numLine"> 397</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> ID:</pre></td></tr>
+<tr> <td class="numLineCover"> 398</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Only one document ID can be specified in a retriever message"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 399</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> CONTENT:</pre></td></tr>
+<tr> <td class="numLineCover"> 400</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> IOHelper.copyStream(inputStream, response.getOutputStream());</pre></td></tr>
+<tr> <td class="numLineCover"> 401</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 402</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> META_NAME:</pre></td></tr>
+<tr> <td class="numLineCover"> 403</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String metaName = command.getArgument();</pre></td></tr>
+<tr> <td class="numLineCover"> 404</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
+<tr> <td class="numLineCover"> 405</td> <td class="nbHitsUncovered"><a title="Line 405: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> 6</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 405: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> <span class="keyword">if</span> (command == <span class="keyword">null</span> || command.getOperation() != Operation.META_VALUE) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 406</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"meta-name must be immediately followed by meta-value"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 407</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 408</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.log(Level.FINEST, <span class="string">"Retriever: {0} has metadata {1}={2}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 409</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {docId.getUniqueId(), metaName,</pre></td></tr>
+<tr> <td class="numLine"> 410</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> command.getArgument()});</pre></td></tr>
+<tr> <td class="numLineCover"> 411</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> response.addMetadata(metaName, command.getArgument());</pre></td></tr>
+<tr> <td class="numLineCover"> 412</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 413</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> UP_TO_DATE:</pre></td></tr>
+<tr> <td class="numLineCover"> 414</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.log(Level.FINEST, <span class="string">"Retriever: {0} is up to date."</span>, docId.getUniqueId());</pre></td></tr>
+<tr> <td class="numLineCover"> 415</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> response.respondNotModified();</pre></td></tr>
+<tr> <td class="numLineCover"> 416</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 417</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> NOT_FOUND:</pre></td></tr>
+<tr> <td class="numLineCover"> 418</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> response.respondNotFound();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 419</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 420</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> MIME_TYPE:</pre></td></tr>
+<tr> <td class="numLineCover"> 421</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.log(Level.FINEST, <span class="string">"Retriever: {0} has mime-type {1}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 422</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {docId.getUniqueId(), command.getArgument()});</pre></td></tr>
+<tr> <td class="numLineCover"> 423</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> response.setContentType(command.getArgument());</pre></td></tr>
+<tr> <td class="numLineCover"> 424</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 425</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> LAST_MODIFIED:</pre></td></tr>
+<tr> <td class="numLine"> 426</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Convert seconds to milliseconds for Date constructor.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 427</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.setLastModified(<span class="keyword">new</span> Date(Long.parseLong(command.getArgument()) * 1000));</pre></td></tr>
+<tr> <td class="numLineCover"> 428</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 429</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> SECURE:</pre></td></tr>
+<tr> <td class="numLineCover"> 430</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.setSecure(Boolean.parseBoolean(command.getArgument()));</pre></td></tr>
+<tr> <td class="numLineCover"> 431</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 432</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> ANCHOR_URI:</pre></td></tr>
+<tr> <td class="numLineCover"> 433</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> URI anchorUri = URI.create(command.getArgument());</pre></td></tr>
+<tr> <td class="numLineCover"> 434</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
+<tr> <td class="numLineCover"> 435</td> <td class="nbHitsUncovered"><a title="Line 435: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 435: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> <span class="keyword">if</span> (command == <span class="keyword">null</span> || command.getOperation() != Operation.ANCHOR_TEXT) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 436</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"anchor-uri must be immediately followed by anchor-text"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 437</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 438</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.addAnchor(anchorUri, command.getArgument());</pre></td></tr>
+<tr> <td class="numLineCover"> 439</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 440</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> NO_INDEX:</pre></td></tr>
+<tr> <td class="numLineCover"> 441</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.setNoIndex(Boolean.parseBoolean(command.getArgument()));</pre></td></tr>
+<tr> <td class="numLineCover"> 442</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 443</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + command.getArgument() + <span class="string">"'"</span> : <span class="string">"'"</span>), e);</pre></td></tr>
-<tr> <td class="numLineCover"> 444</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 445</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> NO_FOLLOW:</pre></td></tr>
+<tr> <td class="numLineCover"> 444</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.setNoFollow(Boolean.parseBoolean(command.getArgument()));</pre></td></tr>
+<tr> <td class="numLineCover"> 445</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 446</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> CRAWL_IMMEDIATELY:</pre></td></tr>
-<tr> <td class="numLineCover"> 447</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> builder.setCrawlImmediately(<span class="keyword">true</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> NO_ARCHIVE:</pre></td></tr>
+<tr> <td class="numLineCover"> 447</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.setNoArchive(Boolean.parseBoolean(command.getArgument()));</pre></td></tr>
<tr> <td class="numLineCover"> 448</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 449</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> CRAWL_ONCE:</pre></td></tr>
-<tr> <td class="numLineCover"> 450</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> builder.setCrawlOnce(<span class="keyword">true</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> DISPLAY_URL:</pre></td></tr>
+<tr> <td class="numLineCover"> 450</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.setDisplayUrl(URI.create(command.getArgument()));</pre></td></tr>
<tr> <td class="numLineCover"> 451</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 452</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> LOCK:</pre></td></tr>
-<tr> <td class="numLineCover"> 453</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> builder.setLock(<span class="keyword">true</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 454</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> CRAWL_ONCE:</pre></td></tr>
+<tr> <td class="numLineCover"> 453</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.setCrawlOnce(Boolean.parseBoolean(command.getArgument()));</pre></td></tr>
+<tr> <td class="numLineCover"> 454</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 455</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">case</span> DELETE:</pre></td></tr>
-<tr> <td class="numLineCover"> 456</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> builder.setDeleteFromIndex(<span class="keyword">true</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 457</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> LOCK:</pre></td></tr>
+<tr> <td class="numLineCover"> 456</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> response.setLock(Boolean.parseBoolean(command.getArgument()));</pre></td></tr>
+<tr> <td class="numLineCover"> 457</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 458</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">default</span>:</pre></td></tr>
-<tr> <td class="numLineCover"> 459</td> <td class="nbHitsUncovered"><a title="Line 459: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 459: Conditional coverage 0% (0/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Lister Error: invalid operation: '"</span> + command.getOperation() +</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 459</td> <td class="nbHitsUncovered"><a title="Line 459: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 459: Conditional coverage 0% (0/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Retriever Error: invalid operation: '"</span> + command.getOperation() +</a></span></pre></td></tr>
<tr> <td class="numLine"> 460</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> (command.hasArgument() ? <span class="string">"' with argument: '"</span> + command.getArgument() + <span class="string">"'"</span> : <span class="string">"'"</span>));</pre></td></tr>
<tr> <td class="numLine"> 461</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 462</td> <td class="nbHitsCovered"> 30023</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
+<tr> <td class="numLineCover"> 462</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
<tr> <td class="numLine"> 463</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 464</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> result.add(builder.build());</pre></td></tr>
-<tr> <td class="numLineCover"> 465</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">return</span> pusher.pushRecords(result, handler);</pre></td></tr>
-<tr> <td class="numLine"> 466</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 467</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 464</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 465</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 468</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 466</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 467</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Parse a listing response, sending results to {@code pusher}. If {@code handler} is {@code</span></pre></td></tr>
+<tr> <td class="numLine"> 468</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * null}, then {@code pusher}'s default handler will be used. In case of failure sending in</span></pre></td></tr>
<tr> <td class="numLine"> 469</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Read a command from the command stream</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * {@code pusher}, the rest of the input stream may not be read.</span></pre></td></tr>
<tr> <td class="numLine"> 470</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 471</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * @return The next command from the command stream. for end-of-steam null is returned.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * @return {@code null} on success, otherwise the first Record to fail</span></pre></td></tr>
<tr> <td class="numLine"> 472</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * @throws IOException on stream read error</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 473</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher.Record readFromLister(DocIdPusher pusher, PushErrorHandler handler)</pre></td></tr>
<tr> <td class="numLine"> 474</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> Command readCommand() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLine"> 475</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">throws</span> IOException, InterruptedException {</pre></td></tr>
+<tr> <td class="numLineCover"> 475</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> ArrayList<DocIdPusher.Record> result = <span class="keyword">new</span> ArrayList<DocIdPusher.Record>();</pre></td></tr>
+<tr> <td class="numLineCover"> 476</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> DocIdPusher.Record.Builder builder = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 477</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> Command command = readCommand();</pre></td></tr>
+<tr> <td class="numLine"> 478</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 476</td> <td class="nbHitsCovered"> 30091</td> <td class="src"><pre class="src"> Command result = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLine"> 477</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 479</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Starting out at end-of-stream so don't send anything.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 480</td> <td class="nbHitsCovered"><a title="Line 480: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 480: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (command == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 481</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLine"> 482</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 483</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 478</td> <td class="nbHitsCovered"><a title="Line 478: Conditional coverage 100% (2/2)."> 60160</a></td> <td class="src"><pre class="src"> <a title="Line 478: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (result == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 479</td> <td class="nbHitsCovered"> 30093</td> <td class="src"><pre class="src"> String commandTokens[] = parseNextLine();</pre></td></tr>
-<tr> <td class="numLineCover"> 480</td> <td class="nbHitsCovered"><a title="Line 480: Conditional coverage 100% (2/2)."> 30089</a></td> <td class="src"><pre class="src"> <a title="Line 480: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (commandTokens == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 481</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 482</td> <td class="nbHitsCovered"><a title="Line 482: Conditional coverage 100% (2/2)."> 30070</a></td> <td class="src"><pre class="src"> <a title="Line 482: Conditional coverage 100% (2/2)."> } <span class="keyword">else</span> <span class="keyword">if</span> ((commandTokens[0].equals(<span class="string">"repository-unavailable"</span>))) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 483</td> <td class="nbHitsUncovered"><a title="Line 483: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 483: Conditional coverage 50% (1/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Error: repository unavailable. "</span></a></span></pre></td></tr>
<tr> <td class="numLine"> 484</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + (commandTokens.length > 1 ? commandTokens[1] : <span class="string">""</span>));</pre></td></tr>
-<tr> <td class="numLine"> 485</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 486</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 487</td> <td class="nbHitsCovered"> 30069</td> <td class="src"><pre class="src"> Operation operation = STRING_TO_OPERATION.get(commandTokens[0]);</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// The first operation must be a doc ID.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 485</td> <td class="nbHitsCovered"><a title="Line 485: Conditional coverage 100% (2/2)."> 9</a></td> <td class="src"><pre class="src"> <a title="Line 485: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (command.getOperation() != Operation.ID) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 486</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Lister Error: the first operator must be a document ID. "</span></pre></td></tr>
+<tr> <td class="numLine"> 487</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + <span class="string">" Instead encountered '"</span> + command.getOperation() + <span class="string">"'."</span>);</pre></td></tr>
<tr> <td class="numLine"> 488</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Skip over unrecognized commands</span></pre></td></tr>
-<tr> <td class="numLineCover"> 489</td> <td class="nbHitsCovered"><a title="Line 489: Conditional coverage 100% (2/2)."> 30069</a></td> <td class="src"><pre class="src"> <a title="Line 489: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (operation == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLine"> 490</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// TODO(johnfelton) add a warning about an unrecognized command</span></pre></td></tr>
-<tr> <td class="numLineCover"> 491</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
-<tr> <td class="numLine"> 492</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 493</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 494</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> String argument = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLine"> 495</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 496</td> <td class="nbHitsCovered"><a title="Line 496: Conditional coverage 100% (2/2)."> 30067</a></td> <td class="src"><pre class="src"> <a title="Line 496: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (commandTokens.length > 1) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 497</td> <td class="nbHitsCovered"> 30051</td> <td class="src"><pre class="src"> argument = commandTokens[1];</pre></td></tr>
-<tr> <td class="numLine"> 498</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 489</td> <td class="nbHitsCovered"><a title="Line 489: Conditional coverage 100% (2/2)."> 30031</a></td> <td class="src"><pre class="src"> <a title="Line 489: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (command != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 490</td> <td class="nbHitsUncovered"><a title="Line 490: Conditional coverage 35% (7/20)."> 30023</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 490: Conditional coverage 35% (7/20)."> <span class="keyword">switch</span> (command.getOperation()) {</a></span></pre></td></tr>
+<tr> <td class="numLine"> 491</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> ID:</pre></td></tr>
+<tr> <td class="numLineCover"> 492</td> <td class="nbHitsCovered"><a title="Line 492: Conditional coverage 100% (2/2)."> 30015</a></td> <td class="src"><pre class="src"> <a title="Line 492: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (builder != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 493</td> <td class="nbHitsCovered"> 30007</td> <td class="src"><pre class="src"> result.add(builder.build());</pre></td></tr>
+<tr> <td class="numLine"> 494</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// TODO(ejona): make threshold smarter.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 495</td> <td class="nbHitsCovered"><a title="Line 495: Conditional coverage 100% (2/2)."> 30007</a></td> <td class="src"><pre class="src"> <a title="Line 495: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (result.size() >= 10000) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 496</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> DocIdPusher.Record errorRecord = pusher.pushRecords(result, handler);</pre></td></tr>
+<tr> <td class="numLineCover"> 497</td> <td class="nbHitsUncovered"><a title="Line 497: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 497: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (errorRecord != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 498</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> errorRecord;</span></pre></td></tr>
<tr> <td class="numLine"> 499</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 500</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> result = <span class="keyword">new</span> Command(operation, argument);</pre></td></tr>
-<tr> <td class="numLineCover"> 501</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 502</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> <span class="keyword">return</span> result;</pre></td></tr>
-<tr> <td class="numLine"> 503</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 504</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 500</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> result.clear();</pre></td></tr>
+<tr> <td class="numLine"> 501</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 502</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 503</td> <td class="nbHitsCovered"> 30015</td> <td class="src"><pre class="src"> builder = <span class="keyword">new</span> DocIdPusher.Record.Builder(<span class="keyword">new</span> DocId(command.getArgument()));</pre></td></tr>
+<tr> <td class="numLineCover"> 504</td> <td class="nbHitsCovered"> 30015</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 505</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> String[] parseNextLine() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 506</td> <td class="nbHitsCovered"> 30093</td> <td class="src"><pre class="src"> checkHeader();</pre></td></tr>
-<tr> <td class="numLineCover"> 507</td> <td class="nbHitsCovered"> 30089</td> <td class="src"><pre class="src"> String line = <span class="string">""</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 508</td> <td class="nbHitsCovered"><a title="Line 508: Conditional coverage 100% (2/2)."> 60183</a></td> <td class="src"><pre class="src"> <a title="Line 508: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (line.length() == 0) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 509</td> <td class="nbHitsCovered"> 30113</td> <td class="src"><pre class="src"> line = readCharsUntilMarker(delimiter);</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> LAST_MODIFIED:</pre></td></tr>
+<tr> <td class="numLine"> 506</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Convert seconds to milliseconds for Date constructor.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 507</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> builder.setLastModified(<span class="keyword">new</span> Date(Long.parseLong(command.getArgument()) * 1000));</pre></td></tr>
+<tr> <td class="numLineCover"> 508</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 509</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> RESULT_LINK:</pre></td></tr>
<tr> <td class="numLine"> 510</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// On End-Of-Stream return the end-message command</span></pre></td></tr>
-<tr> <td class="numLineCover"> 511</td> <td class="nbHitsCovered"><a title="Line 511: Conditional coverage 100% (2/2)."> 30113</a></td> <td class="src"><pre class="src"> <a title="Line 511: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (line == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 512</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLine"> 513</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 511</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> builder.setResultLink(<span class="keyword">new</span> URI(command.getArgument()));</pre></td></tr>
+<tr> <td class="numLineCover"> 512</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (URISyntaxException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 513</td> <td class="nbHitsUncovered"><a title="Line 513: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 513: Conditional coverage 0% (0/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Lister Error: invalid URL: '"</span> + command.getOperation()</a></span></pre></td></tr>
<tr> <td class="numLine"> 514</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// If nothing is between the last delimiter and this one then exit ID list mode</span></pre></td></tr>
-<tr> <td class="numLineCover"> 515</td> <td class="nbHitsCovered"><a title="Line 515: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 30094</a></td> <td class="src"><pre class="src"> <a title="Line 515: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (inIdList && line.length() == 0) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 516</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> inIdList = <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 517</td> <td class="nbHitsCovered"><a title="Line 517: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 30093</a></td> <td class="src"><pre class="src"> <a title="Line 517: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> } <span class="keyword">else</span> <span class="keyword">if</span> (!inIdList && line.equals(<span class="string">"id-list"</span>)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 518</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> inIdList = <span class="keyword">true</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 519</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> line = <span class="string">""</span>; <span class="comment">// loop again</span></pre></td></tr>
-<tr> <td class="numLine"> 520</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> + (command.hasArgument() ? <span class="string">"' with argument: '"</span></pre></td></tr>
+<tr> <td class="numLine"> 515</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + command.getArgument() + <span class="string">"'"</span> : <span class="string">"'"</span>), e);</pre></td></tr>
+<tr> <td class="numLineCover"> 516</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 517</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 518</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> CRAWL_IMMEDIATELY:</pre></td></tr>
+<tr> <td class="numLineCover"> 519</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> builder.setCrawlImmediately(<span class="keyword">true</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 520</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 521</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 522</td> <td class="nbHitsCovered"><a title="Line 522: Conditional coverage 100% (2/2)."> 30070</a></td> <td class="src"><pre class="src"> <a title="Line 522: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (inIdList) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 523</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> String[]{<span class="string">"id"</span>, line};</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> CRAWL_ONCE:</pre></td></tr>
+<tr> <td class="numLineCover"> 522</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> builder.setCrawlOnce(<span class="keyword">true</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 523</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 524</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 525</td> <td class="nbHitsCovered"> 30067</td> <td class="src"><pre class="src"> <span class="keyword">return</span> line.split(<span class="string">"="</span>, 2);</pre></td></tr>
-<tr> <td class="numLine"> 526</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> LOCK:</pre></td></tr>
+<tr> <td class="numLineCover"> 525</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> builder.setLock(<span class="keyword">true</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 526</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 527</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 528</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 529</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Read and verify the data format header if needed.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> DELETE:</pre></td></tr>
+<tr> <td class="numLineCover"> 528</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> builder.setDeleteFromIndex(<span class="keyword">true</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 529</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 530</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 531</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> checkHeader() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 532</td> <td class="nbHitsCovered"><a title="Line 532: Conditional coverage 100% (2/2)."> 30095</a></td> <td class="src"><pre class="src"> <a title="Line 532: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">this</span>.delimiter != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 533</td> <td class="nbHitsCovered"> 30069</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLine"> 534</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">default</span>:</pre></td></tr>
+<tr> <td class="numLineCover"> 531</td> <td class="nbHitsUncovered"><a title="Line 531: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 531: Conditional coverage 0% (0/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Lister Error: invalid operation: '"</span> + command.getOperation() +</a></span></pre></td></tr>
+<tr> <td class="numLine"> 532</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> (command.hasArgument() ? <span class="string">"' with argument: '"</span> + command.getArgument() + <span class="string">"'"</span> : <span class="string">"'"</span>));</pre></td></tr>
+<tr> <td class="numLine"> 533</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 534</td> <td class="nbHitsCovered"> 30023</td> <td class="src"><pre class="src"> command = readCommand();</pre></td></tr>
<tr> <td class="numLine"> 535</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 536</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> String line = readCharsUntilMarker(<span class="string">"["</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 537</td> <td class="nbHitsUncovered"><a title="Line 537: Conditional coverage 66% (4/6) [each condition: 50%, 100%, 50%]."> 26</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 537: Conditional coverage 66% (4/6) [each condition: 50%, 100%, 50%]."> <span class="keyword">if</span> ((line == <span class="keyword">null</span>) || (line.length() < HEADER_PREFIX.length()) ||</a></span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 536</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> result.add(builder.build());</pre></td></tr>
+<tr> <td class="numLineCover"> 537</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">return</span> pusher.pushRecords(result, handler);</pre></td></tr>
<tr> <td class="numLine"> 538</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> !line.substring(0, HEADER_PREFIX.length()).equals(HEADER_PREFIX)) {</pre></td></tr>
-<tr> <td class="numLineCover"> 539</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Adaptor data must begin with '"</span> + HEADER_PREFIX + <span class="string">"'"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 540</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 541</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 539</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 542</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> String versionNumberString = line.substring(HEADER_PREFIX.length());</pre></td></tr>
-<tr> <td class="numLineCover"> 543</td> <td class="nbHitsUncovered"><a title="Line 543: Conditional coverage 50% (1/2)."> 25</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 543: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (versionNumberString.length() < 3) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 544</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Format version '"</span> + versionNumberString + <span class="string">"' is invalid. "</span> +</span></pre></td></tr>
+<tr> <td class="numLine"> 540</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 541</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Read a command from the command stream</span></pre></td></tr>
+<tr> <td class="numLine"> 542</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 543</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * @return The next command from the command stream. for end-of-steam null is returned.</span></pre></td></tr>
+<tr> <td class="numLine"> 544</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * @throws IOException on stream read error</span></pre></td></tr>
<tr> <td class="numLine"> 545</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"The version must be at least one digit with one leading space and one trailing space."</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 546</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> Command readCommand() <span class="keyword">throws</span> IOException {</pre></td></tr>
<tr> <td class="numLine"> 547</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 548</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> delimiter = readCharsUntilMarker(<span class="string">"]"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 549</td> <td class="nbHitsUncovered"><a title="Line 549: Conditional coverage 75% (3/4) [each condition: 50%, 100%]."> 25</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 549: Conditional coverage 75% (3/4) [each condition: 50%, 100%]."> <span class="keyword">if</span> ((delimiter == <span class="keyword">null</span>) || (delimiter.length() < 1)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 550</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Delimiter must be at least one character long."</span>);</pre></td></tr>
-<tr> <td class="numLine"> 551</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 552</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 548</td> <td class="nbHitsCovered"> 30101</td> <td class="src"><pre class="src"> Command result = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLine"> 549</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 553</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> Pattern pattern = Pattern.compile(DISALLOWED_DELIMITER_CHARS_REGEX);</pre></td></tr>
-<tr> <td class="numLineCover"> 554</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> Matcher matcher = pattern.matcher(delimiter);</pre></td></tr>
-<tr> <td class="numLine"> 555</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 556</td> <td class="nbHitsCovered"><a title="Line 556: Conditional coverage 100% (2/2)."> 24</a></td> <td class="src"><pre class="src"> <a title="Line 556: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (matcher.find()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 557</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Invalid character in delimiter."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 550</td> <td class="nbHitsCovered"><a title="Line 550: Conditional coverage 100% (2/2)."> 60180</a></td> <td class="src"><pre class="src"> <a title="Line 550: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (result == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 551</td> <td class="nbHitsCovered"> 30103</td> <td class="src"><pre class="src"> String commandTokens[] = parseNextLine();</pre></td></tr>
+<tr> <td class="numLineCover"> 552</td> <td class="nbHitsCovered"><a title="Line 552: Conditional coverage 100% (2/2)."> 30099</a></td> <td class="src"><pre class="src"> <a title="Line 552: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (commandTokens == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 553</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 554</td> <td class="nbHitsCovered"><a title="Line 554: Conditional coverage 100% (2/2)."> 30080</a></td> <td class="src"><pre class="src"> <a title="Line 554: Conditional coverage 100% (2/2)."> } <span class="keyword">else</span> <span class="keyword">if</span> ((commandTokens[0].equals(<span class="string">"repository-unavailable"</span>))) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 555</td> <td class="nbHitsUncovered"><a title="Line 555: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 555: Conditional coverage 50% (1/2)."> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Error: repository unavailable. "</span></a></span></pre></td></tr>
+<tr> <td class="numLine"> 556</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + (commandTokens.length > 1 ? commandTokens[1] : <span class="string">""</span>));</pre></td></tr>
+<tr> <td class="numLine"> 557</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 558</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 559</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 559</td> <td class="nbHitsCovered"> 30079</td> <td class="src"><pre class="src"> Operation operation = STRING_TO_OPERATION.get(commandTokens[0]);</pre></td></tr>
<tr> <td class="numLine"> 560</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 561</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> versionNumber = Integer.parseInt(versionNumberString.trim());</pre></td></tr>
-<tr> <td class="numLineCover"> 562</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (NumberFormatException e) {</pre></td></tr>
-<tr> <td class="numLineCover"> 563</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Format version '"</span> + versionNumberString + <span class="string">"' is invalid."</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 564</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 565</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 566</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Skip over unrecognized commands</span></pre></td></tr>
+<tr> <td class="numLineCover"> 561</td> <td class="nbHitsCovered"><a title="Line 561: Conditional coverage 100% (2/2)."> 30079</a></td> <td class="src"><pre class="src"> <a title="Line 561: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (operation == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLine"> 562</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// TODO(johnfelton) add a warning about an unrecognized command</span></pre></td></tr>
+<tr> <td class="numLineCover"> 563</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
+<tr> <td class="numLine"> 564</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 565</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 566</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> String argument = <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 567</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 568</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">byte</span>[] readBytesUntilMarker(<span class="keyword">byte</span>[] marker) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLine"> 569</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 568</td> <td class="nbHitsCovered"><a title="Line 568: Conditional coverage 100% (2/2)."> 30077</a></td> <td class="src"><pre class="src"> <a title="Line 568: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (commandTokens.length > 1) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 569</td> <td class="nbHitsCovered"> 30061</td> <td class="src"><pre class="src"> argument = commandTokens[1];</pre></td></tr>
+<tr> <td class="numLine"> 570</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 571</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 570</td> <td class="nbHitsUncovered"><a title="Line 570: Conditional coverage 50% (1/2)."> 30164</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 570: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (marker.length == 0) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 571</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Internal Error: Marker length must be greater than zero."</span>);</span></pre></td></tr>
-<tr> <td class="numLine"> 572</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 573</td> <td class="nbHitsCovered"> 30164</td> <td class="src"><pre class="src"> ByteArrayOutputStream byteArrayOutputStream = <span class="keyword">new</span> ByteArrayOutputStream();</pre></td></tr>
-<tr> <td class="numLineCover"> 574</td> <td class="nbHitsCovered"> 30164</td> <td class="src"><pre class="src"> <span class="keyword">int</span> matchPosition = 0;</pre></td></tr>
-<tr> <td class="numLineCover"> 575</td> <td class="nbHitsCovered"> 30164</td> <td class="src"><pre class="src"> <span class="keyword">int</span> nextByte = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 572</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> result = <span class="keyword">new</span> Command(operation, argument);</pre></td></tr>
+<tr> <td class="numLineCover"> 573</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 574</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> <span class="keyword">return</span> result;</pre></td></tr>
+<tr> <td class="numLine"> 575</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 576</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 577</td> <td class="nbHitsCovered"><a title="Line 577: Conditional coverage 100% (2/2)."> 380886</a></td> <td class="src"><pre class="src"> <a title="Line 577: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (matchPosition < marker.length) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 578</td> <td class="nbHitsCovered"> 350747</td> <td class="src"><pre class="src"> nextByte = inputStream.read();</pre></td></tr>
-<tr> <td class="numLineCover"> 579</td> <td class="nbHitsCovered"><a title="Line 579: Conditional coverage 100% (2/2)."> 350747</a></td> <td class="src"><pre class="src"> <a title="Line 579: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (nextByte == ((<span class="keyword">int</span>) marker[matchPosition] & 0xff)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 580</td> <td class="nbHitsCovered"> 30184</td> <td class="src"><pre class="src"> matchPosition += 1;</pre></td></tr>
-<tr> <td class="numLine"> 581</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 582</td> <td class="nbHitsUncovered"><a title="Line 582: Conditional coverage 50% (1/2)."> 320563</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 582: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (matchPosition > 0) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 583</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> byteArrayOutputStream.write(marker, 0, matchPosition);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 584</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> matchPosition = 0;</span></pre></td></tr>
+<tr> <td class="numLine"> 577</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> String[] parseNextLine() <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 578</td> <td class="nbHitsCovered"> 30103</td> <td class="src"><pre class="src"> checkHeader();</pre></td></tr>
+<tr> <td class="numLineCover"> 579</td> <td class="nbHitsCovered"> 30099</td> <td class="src"><pre class="src"> String line = <span class="string">""</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 580</td> <td class="nbHitsCovered"><a title="Line 580: Conditional coverage 100% (2/2)."> 60203</a></td> <td class="src"><pre class="src"> <a title="Line 580: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (line.length() == 0) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 581</td> <td class="nbHitsCovered"> 30123</td> <td class="src"><pre class="src"> line = readCharsUntilMarker(delimiter);</pre></td></tr>
+<tr> <td class="numLine"> 582</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// On End-Of-Stream return the end-message command</span></pre></td></tr>
+<tr> <td class="numLineCover"> 583</td> <td class="nbHitsCovered"><a title="Line 583: Conditional coverage 100% (2/2)."> 30123</a></td> <td class="src"><pre class="src"> <a title="Line 583: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (line == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 584</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 585</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 586</td> <td class="nbHitsCovered"><a title="Line 586: Conditional coverage 100% (2/2)."> 320563</a></td> <td class="src"><pre class="src"> <a title="Line 586: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (nextByte == -1) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 587</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 588</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 589</td> <td class="nbHitsCovered"> 320538</td> <td class="src"><pre class="src"> byteArrayOutputStream.write(nextByte);</pre></td></tr>
-<tr> <td class="numLine"> 590</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 591</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 586</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// If nothing is between the last delimiter and this one then exit ID list mode</span></pre></td></tr>
+<tr> <td class="numLineCover"> 587</td> <td class="nbHitsCovered"><a title="Line 587: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 30104</a></td> <td class="src"><pre class="src"> <a title="Line 587: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (inIdList && line.length() == 0) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 588</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> inIdList = <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 589</td> <td class="nbHitsCovered"><a title="Line 589: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 30103</a></td> <td class="src"><pre class="src"> <a title="Line 589: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> } <span class="keyword">else</span> <span class="keyword">if</span> (!inIdList && line.equals(<span class="string">"id-list"</span>)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 590</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> inIdList = <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 591</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> line = <span class="string">""</span>; <span class="comment">// loop again</span></pre></td></tr>
<tr> <td class="numLine"> 592</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 593</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 593</td> <td class="nbHitsCovered"> 30164</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] result = byteArrayOutputStream.toByteArray();</pre></td></tr>
-<tr> <td class="numLineCover"> 594</td> <td class="nbHitsCovered"><a title="Line 594: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 30164</a></td> <td class="src"><pre class="src"> <a title="Line 594: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (nextByte == -1 && result.length == 0) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 595</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 594</td> <td class="nbHitsCovered"><a title="Line 594: Conditional coverage 100% (2/2)."> 30080</a></td> <td class="src"><pre class="src"> <a title="Line 594: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (inIdList) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 595</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> String[]{<span class="string">"id"</span>, line};</pre></td></tr>
<tr> <td class="numLine"> 596</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 597</td> <td class="nbHitsCovered"> 30145</td> <td class="src"><pre class="src"> <span class="keyword">return</span> result;</pre></td></tr>
-<tr> <td class="numLine"> 598</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 599</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 597</td> <td class="nbHitsCovered"> 30077</td> <td class="src"><pre class="src"> <span class="keyword">return</span> line.split(<span class="string">"="</span>, 2);</pre></td></tr>
+<tr> <td class="numLine"> 598</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 600</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 599</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 600</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 601</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> String readCharsUntilMarker(String marker) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 602</td> <td class="nbHitsCovered"> 30164</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] byteMarker = marker.getBytes(CHARSET);</pre></td></tr>
-<tr> <td class="numLineCover"> 603</td> <td class="nbHitsCovered"> 30164</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] bytes = readBytesUntilMarker(byteMarker);</pre></td></tr>
-<tr> <td class="numLineCover"> 604</td> <td class="nbHitsCovered"><a title="Line 604: Conditional coverage 100% (2/2)."> 30164</a></td> <td class="src"><pre class="src"> <a title="Line 604: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (bytes == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 605</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Read and verify the data format header if needed.</span></pre></td></tr>
+<tr> <td class="numLine"> 602</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 603</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> checkHeader() <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 604</td> <td class="nbHitsCovered"><a title="Line 604: Conditional coverage 100% (2/2)."> 30105</a></td> <td class="src"><pre class="src"> <a title="Line 604: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">this</span>.delimiter != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 605</td> <td class="nbHitsCovered"> 30079</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
<tr> <td class="numLine"> 606</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 607</td> <td class="nbHitsCovered"> 30145</td> <td class="src"><pre class="src"> <span class="keyword">return</span> CHARSET.newDecoder().decode(ByteBuffer.wrap(bytes)).toString();</pre></td></tr>
-<tr> <td class="numLine"> 608</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 607</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 608</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> String line = readCharsUntilMarker(<span class="string">"["</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 609</td> <td class="nbHitsUncovered"><a title="Line 609: Conditional coverage 66% (4/6) [each condition: 50%, 100%, 50%]."> 26</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 609: Conditional coverage 66% (4/6) [each condition: 50%, 100%, 50%]."> <span class="keyword">if</span> ((line == <span class="keyword">null</span>) || (line.length() < HEADER_PREFIX.length()) ||</a></span></pre></td></tr>
+<tr> <td class="numLine"> 610</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> !line.substring(0, HEADER_PREFIX.length()).equals(HEADER_PREFIX)) {</pre></td></tr>
+<tr> <td class="numLineCover"> 611</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Adaptor data must begin with '"</span> + HEADER_PREFIX + <span class="string">"'"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 612</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 613</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 614</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> String versionNumberString = line.substring(HEADER_PREFIX.length());</pre></td></tr>
+<tr> <td class="numLineCover"> 615</td> <td class="nbHitsUncovered"><a title="Line 615: Conditional coverage 50% (1/2)."> 25</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 615: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (versionNumberString.length() < 3) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 616</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Format version '"</span> + versionNumberString + <span class="string">"' is invalid. "</span> +</span></pre></td></tr>
+<tr> <td class="numLine"> 617</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"The version must be at least one digit with one leading space and one trailing space."</span>);</pre></td></tr>
+<tr> <td class="numLine"> 618</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 619</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 620</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> delimiter = readCharsUntilMarker(<span class="string">"]"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 621</td> <td class="nbHitsUncovered"><a title="Line 621: Conditional coverage 75% (3/4) [each condition: 50%, 100%]."> 25</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 621: Conditional coverage 75% (3/4) [each condition: 50%, 100%]."> <span class="keyword">if</span> ((delimiter == <span class="keyword">null</span>) || (delimiter.length() < 1)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 622</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Delimiter must be at least one character long."</span>);</pre></td></tr>
+<tr> <td class="numLine"> 623</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 624</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 625</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> Pattern pattern = Pattern.compile(DISALLOWED_DELIMITER_CHARS_REGEX);</pre></td></tr>
+<tr> <td class="numLineCover"> 626</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> Matcher matcher = pattern.matcher(delimiter);</pre></td></tr>
+<tr> <td class="numLine"> 627</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 628</td> <td class="nbHitsCovered"><a title="Line 628: Conditional coverage 100% (2/2)."> 24</a></td> <td class="src"><pre class="src"> <a title="Line 628: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (matcher.find()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 629</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Invalid character in delimiter."</span>);</pre></td></tr>
+<tr> <td class="numLine"> 630</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 631</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 632</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 633</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> versionNumber = Integer.parseInt(versionNumberString.trim());</pre></td></tr>
+<tr> <td class="numLineCover"> 634</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (NumberFormatException e) {</pre></td></tr>
+<tr> <td class="numLineCover"> 635</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Format version '"</span> + versionNumberString + <span class="string">"' is invalid."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 636</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 637</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 638</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 639</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 640</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">byte</span>[] readBytesUntilMarker(<span class="keyword">byte</span>[] marker) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLine"> 641</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 642</td> <td class="nbHitsUncovered"><a title="Line 642: Conditional coverage 50% (1/2)."> 30174</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 642: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (marker.length == 0) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 643</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Internal Error: Marker length must be greater than zero."</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 644</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 645</td> <td class="nbHitsCovered"> 30174</td> <td class="src"><pre class="src"> ByteArrayOutputStream byteArrayOutputStream = <span class="keyword">new</span> ByteArrayOutputStream();</pre></td></tr>
+<tr> <td class="numLineCover"> 646</td> <td class="nbHitsCovered"> 30174</td> <td class="src"><pre class="src"> <span class="keyword">int</span> matchPosition = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 647</td> <td class="nbHitsCovered"> 30174</td> <td class="src"><pre class="src"> <span class="keyword">int</span> nextByte = 0;</pre></td></tr>
+<tr> <td class="numLine"> 648</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 649</td> <td class="nbHitsCovered"><a title="Line 649: Conditional coverage 100% (2/2)."> 381098</a></td> <td class="src"><pre class="src"> <a title="Line 649: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (matchPosition < marker.length) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 650</td> <td class="nbHitsCovered"> 350949</td> <td class="src"><pre class="src"> nextByte = inputStream.read();</pre></td></tr>
+<tr> <td class="numLineCover"> 651</td> <td class="nbHitsCovered"><a title="Line 651: Conditional coverage 100% (2/2)."> 350949</a></td> <td class="src"><pre class="src"> <a title="Line 651: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (nextByte == ((<span class="keyword">int</span>) marker[matchPosition] & 0xff)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 652</td> <td class="nbHitsCovered"> 30194</td> <td class="src"><pre class="src"> matchPosition += 1;</pre></td></tr>
+<tr> <td class="numLine"> 653</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 654</td> <td class="nbHitsUncovered"><a title="Line 654: Conditional coverage 50% (1/2)."> 320755</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 654: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (matchPosition > 0) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 655</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> byteArrayOutputStream.write(marker, 0, matchPosition);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 656</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> matchPosition = 0;</span></pre></td></tr>
+<tr> <td class="numLine"> 657</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 658</td> <td class="nbHitsCovered"><a title="Line 658: Conditional coverage 100% (2/2)."> 320755</a></td> <td class="src"><pre class="src"> <a title="Line 658: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (nextByte == -1) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 659</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 660</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 661</td> <td class="nbHitsCovered"> 320730</td> <td class="src"><pre class="src"> byteArrayOutputStream.write(nextByte);</pre></td></tr>
+<tr> <td class="numLine"> 662</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 663</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 664</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 665</td> <td class="nbHitsCovered"> 30174</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] result = byteArrayOutputStream.toByteArray();</pre></td></tr>
+<tr> <td class="numLineCover"> 666</td> <td class="nbHitsCovered"><a title="Line 666: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 30174</a></td> <td class="src"><pre class="src"> <a title="Line 666: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (nextByte == -1 && result.length == 0) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 667</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLine"> 668</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 669</td> <td class="nbHitsCovered"> 30155</td> <td class="src"><pre class="src"> <span class="keyword">return</span> result;</pre></td></tr>
+<tr> <td class="numLine"> 670</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 671</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 609</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 672</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 673</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> String readCharsUntilMarker(String marker) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 674</td> <td class="nbHitsCovered"> 30174</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] byteMarker = marker.getBytes(CHARSET);</pre></td></tr>
+<tr> <td class="numLineCover"> 675</td> <td class="nbHitsCovered"> 30174</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] bytes = readBytesUntilMarker(byteMarker);</pre></td></tr>
+<tr> <td class="numLineCover"> 676</td> <td class="nbHitsCovered"><a title="Line 676: Conditional coverage 100% (2/2)."> 30174</a></td> <td class="src"><pre class="src"> <a title="Line 676: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (bytes == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 677</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLine"> 678</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 679</td> <td class="nbHitsCovered"> 30155</td> <td class="src"><pre class="src"> <span class="keyword">return</span> CHARSET.newDecoder().decode(ByteBuffer.wrap(bytes)).toString();</pre></td></tr>
+<tr> <td class="numLine"> 680</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 681</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.Config.html b/coverage/com.google.enterprise.adaptor.Config.html
index 4538afc..0992af0 100644
--- a/coverage/com.google.enterprise.adaptor.Config.html
+++ b/coverage/com.google.enterprise.adaptor.Config.html
@@ -12,11 +12,11 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">19</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:91px"><span class="text">197/216</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">12</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">60/72</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$3</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$ValueComputer</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">18</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:90px"><span class="text">178/196</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">11</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:81px"><span class="text">49/60</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$3</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$ValueComputer</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
</table>
<div class="separator"> </div>
@@ -54,1379 +54,1305 @@
<tr> <td class="numLine"> 16</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 17</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">import</span> com.google.common.annotations.VisibleForTesting;</pre></td></tr>
-<tr> <td class="numLine"> 18</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 19</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.io.*;</pre></td></tr>
-<tr> <td class="numLine"> 20</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 18</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.net.InetAddress;</pre></td></tr>
-<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 19</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.net.URI;</pre></td></tr>
-<tr> <td class="numLine"> 22</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 20</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.net.UnknownHostException;</pre></td></tr>
-<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.nio.charset.Charset;</pre></td></tr>
-<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 22</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.text.MessageFormat;</pre></td></tr>
-<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.util.*;</pre></td></tr>
-<tr> <td class="numLine"> 26</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.util.concurrent.CopyOnWriteArrayList;</pre></td></tr>
-<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">import</span> java.util.logging.*;</pre></td></tr>
-<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 26</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Configuration values for this program, like the GSA's hostname. Also several</span></pre></td></tr>
-<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * knobs, or controls, for changing the behavior of the program.</span></pre></td></tr>
-<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>All available configuration:<br></span></pre></td></tr>
-<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <style type="text/css"> td { padding-right:2em; } </style></span></pre></td></tr>
-<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <table></span></pre></td></tr>
-<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td align=center><b>required?</b></td></span></pre></td></tr>
-<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <td><b>name</b></td><td><b>meaning</b></td></span></pre></td></tr>
-<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>adaptor.autoUnzip </td><td> expand zip files and send</span></pre></td></tr>
-<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * each file inside separatly. Defaults to false</span></pre></td></tr>
-<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>adaptor.sendDocControlsHeader </td><td>use </span></pre></td></tr>
-<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * X-Gsa-Doc-Controls HTTP header with namespaced ACLs.</span></pre></td></tr>
-<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Otherwise ACLs are sent without namespace and as metadata.</span></pre></td></tr>
-<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Defaults to false</span></pre></td></tr>
-<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>adaptor.fullListingSchedule </td><td> when to invoke </span></pre></td></tr>
-<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * {@link Adaptor#getDocIds Adaptor.getDocIds}, in cron format (minute,</span></pre></td></tr>
-<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * hour, day of month, month, day of week). Defaults to 0 3 * * *</span></pre></td></tr>
-<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>adaptor.incrementalPollPeriodSecs </td><td> number</span></pre></td></tr>
-<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * of seconds between invocations of {@link</span></pre></td></tr>
-<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * PollingIncrementalAdaptor#getModifiedDocIds</span></pre></td></tr>
-<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * PollingIncrementalAdaptor.getModifiedDocIds}. Defaults to 900</span></pre></td></tr>
-<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>adaptor.docContentTimeoutSecs </td><td> number of seconds</span></pre></td></tr>
-<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * before a call to get document content times out and is interrupted.</span></pre></td></tr>
-<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Defaults to 30</span></pre></td></tr>
-<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>adaptor.pushDocIdsOnStartup </td><td> whether to invoke</span></pre></td></tr>
-<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * {@link Adaptor#getDocIds Adaptor.getDocIds} on process start</span></pre></td></tr>
-<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * (in addition to adaptor.fullListingSchedule). Defaults to true</span></pre></td></tr>
-<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>docId.isUrl </td><td> say your adaptor's document ids</span></pre></td></tr>
-<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * are already URLs and avoid them being inserted into adaptor</span></pre></td></tr>
-<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> generated URLs. Defaults to false</span></pre></td></tr>
-<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>feed.crawlImmediatelyBitEnabled </td><td> send bit telling</span></pre></td></tr>
-<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * GSA to crawl immediately. Defaults to false</span></pre></td></tr>
-<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>feed.maxUrls </td><td> set max number of URLs included</span></pre></td></tr>
-<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * per feed file. Defaults to 5000</span></pre></td></tr>
-<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>feed.name </td><td> source name used in feeds. Generated</span></pre></td></tr>
-<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * if not provided</span></pre></td></tr>
-<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>feed.noRecrawlBitEnabled </td><td> send bit telling</span></pre></td></tr>
-<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * GSA to crawl your documents only once. Defaults to false</span></pre></td></tr>
-<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>gsa.614FeedWorkaroundEnabled </td><td> enable detour</span></pre></td></tr>
-<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * around particular feed parsing failure found in GSA version 6.14 .</span></pre></td></tr>
-<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Defaults to false</span></pre></td></tr>
-<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>gsa.70AuthMethodWorkaroundEnabled </td><td> send authmethod</span></pre></td></tr>
-<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * in feed files to workaround early GSA 7.0 bug. Defaults to false</span></pre></td></tr>
-<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>gsa.characterEncoding </td><td> character set used</span></pre></td></tr>
-<tr> <td class="numLine"> 73</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * in feed files. Defaults to UTF-8</span></pre></td></tr>
-<tr> <td class="numLine"> 74</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td align="center"> yes </td><td>gsa.hostname </td><td> machine to</span></pre></td></tr>
-<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * send feed files to. Process errors if not provided </span></pre></td></tr>
-<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>gsa.samlEntityId </td><td> The SAML Entity ID that</span></pre></td></tr>
+<tr> <td class="numLine"> 73</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * identifies the GSA. Defaults to</span></pre></td></tr>
+<tr> <td class="numLine"> 74</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * http://google.com/enterprise/gsa/security-manager</span></pre></td></tr>
+<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>journal.reducedMem </td><td> avoid tracking per URL </span></pre></td></tr>
-<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * information in RAM; suggested with over five hundred thousand documents.</span></pre></td></tr>
-<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Defaults to true</span></pre></td></tr>
-<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.dashboardPort </td><td> port on adaptor's</span></pre></td></tr>
-<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * machine for accessing adaptor's dashboard. Defaults to 5679</span></pre></td></tr>
-<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.docIdPath </td><td> part of URL preceding</span></pre></td></tr>
-<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * encoded document ids. Defaults to /doc/</span></pre></td></tr>
-<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.fullAccessHosts </td><td> hosts allowed access</span></pre></td></tr>
-<tr> <td class="numLine"> 84</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * without authentication</span></pre></td></tr>
-<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 84</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * (certificates still needed when in secure mode). Defaults to</span></pre></td></tr>
-<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * empty but implicitly contains gsa.hostname</span></pre></td></tr>
-<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.hostname </td><td></span></pre></td></tr>
-<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * hostname of adaptor machine for URL generation. </span></pre></td></tr>
-<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The GSA will use this hostname to crawl the adaptor.</span></pre></td></tr>
-<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Defaults to automatically detected hostname</span></pre></td></tr>
-<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.keyAlias </td><td> keystore alias where</span></pre></td></tr>
-<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * encryption (public and private) keys are stored.</span></pre></td></tr>
-<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Defaults to adaptor</span></pre></td></tr>
-<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.maxWorkerThreads </td><td> number of maximum</span></pre></td></tr>
-<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * simultenous retrievals allowed. Defaults to 16</span></pre></td></tr>
-<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.port </td><td> retriever port. Defaults to 5678</span></pre></td></tr>
-<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.queueCapacity </td><td> max retriever queue size.</span></pre></td></tr>
-<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Defaults to 160</span></pre></td></tr>
-<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.reverseProxyPort </td><td> port used in</span></pre></td></tr>
-<tr> <td class="numLine"> 100</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * retriever URLs (in case requests</span></pre></td></tr>
-<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 100</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * are routed through a reverse proxy). Defaults to server.port</span></pre></td></tr>
-<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.reverseProxyProtocol </td><td> either http or https,</span></pre></td></tr>
-<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * depending on proxy traffic. Defaults to https in secure</span></pre></td></tr>
-<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * mode and http otherwise</span></pre></td></tr>
+<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.samlEntityId </td><td> The SAML Entity ID that the</span></pre></td></tr>
<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.secure </td><td> enables https and certificate</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Adaptor will use to identity itself. Defaults to</span></pre></td></tr>
<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * checking. Defaults to false</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * http://google.com/enterprise/gsa/adaptor</span></pre></td></tr>
<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.useCompression </td><td> compress retrieval</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.secure </td><td> enables https and certificate</span></pre></td></tr>
<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * responses. Defaults to true</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * checking. Defaults to false</span></pre></td></tr>
<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>transform.maxDocumentBytes </td><td> max size of</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>server.useCompression </td><td> compress retrieval</span></pre></td></tr>
<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * document that will get transformed. Defaults to 1048576</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * responses. Defaults to true</span></pre></td></tr>
<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>transform.pipeline </td><td> sequence of</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>transform.maxDocumentBytes </td><td> max size of</span></pre></td></tr>
<tr> <td class="numLine"> 112</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * transformation steps. Defaults to no-pipeline</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * document that will get transformed. Defaults to 1048576</span></pre></td></tr>
<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>transform.required </td><td> fail retrieval if document is</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>transform.pipeline </td><td> sequence of</span></pre></td></tr>
<tr> <td class="numLine"> 114</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * over maxDocumentBytes. Defaults to false</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * transformation steps. Defaults to no-pipeline</span></pre></td></tr>
<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * </table></span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * <tr><td> </td><td>transform.required </td><td> fail retrieval if document is</span></pre></td></tr>
<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * over maxDocumentBytes. Defaults to false</span></pre></td></tr>
<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> Config {</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * </table></span></pre></td></tr>
<tr> <td class="numLine"> 118</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String DEFAULT_CONFIG_FILE</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = <span class="string">"adaptor-config.properties"</span>;</pre></td></tr>
-<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> Config {</pre></td></tr>
+<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log = Logger.getLogger(Config.<span class="keyword">class</span>.getName());</pre></td></tr>
+<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 121</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log = Logger.getLogger(Config.<span class="keyword">class</span>.getName());</pre></td></tr>
<tr> <td class="numLine"> 122</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Configuration keys whose default value is {@code null}. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Set<String> noDefaultConfig = <span class="keyword">new</span> HashSet<String>();</pre></td></tr>
-<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 123</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Set<String> noDefaultConfig = <span class="keyword">new</span> HashSet<String>();</pre></td></tr>
+<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Default configuration values. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Properties defaultConfig = <span class="keyword">new</span> Properties();</pre></td></tr>
-<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 125</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Properties defaultConfig = <span class="keyword">new</span> Properties();</pre></td></tr>
+<tr> <td class="numLine"> 126</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Overriding configuration values loaded from command line. */</span></pre></td></tr>
-<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Reads require no additional locks, but modifications require lock on 'this'</span></pre></td></tr>
-<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// to prevent lost updates.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 130</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">volatile</span> Properties config = <span class="keyword">new</span> Properties(defaultConfig);</pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">volatile</span> Properties config = <span class="keyword">new</span> Properties(defaultConfig);</pre></td></tr>
+<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/** Default configuration to use in {@link #loadDefaultConfigFile}. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 132</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> @VisibleForTesting</pre></td></tr>
-<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> File defaultConfigFile = <span class="keyword">new</span> File(DEFAULT_CONFIG_FILE);</pre></td></tr>
-<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The actual config file in use, or {@code null} if none have been loaded.</span></pre></td></tr>
-<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> File configFile;</pre></td></tr>
-<tr> <td class="numLine"> 138</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">long</span> configFileLastModified;</pre></td></tr>
-<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<ConfigModificationListener> modificationListeners</pre></td></tr>
-<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 135</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<ConfigModificationListener> modificationListeners</pre></td></tr>
+<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> CopyOnWriteArrayList<ConfigModificationListener>();</pre></td></tr>
-<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 138</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Map from config key to computer that generates the value for the key. These</span></pre></td></tr>
-<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 139</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * generated values are generally due to one value being formed from other</span></pre></td></tr>
-<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * values by default.</span></pre></td></tr>
-<tr> <td class="numLine"> 145</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Map<String, ValueComputer> computeMap</pre></td></tr>
-<tr> <td class="numLine"> 147</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Map<String, ValueComputer> computeMap</pre></td></tr>
+<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> HashMap<String, ValueComputer>();</pre></td></tr>
-<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 149</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Config() {</pre></td></tr>
-<tr> <td class="numLineCover"> 150</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> String hostname = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLine"> 151</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 145</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Config() {</pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> String hostname = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLine"> 147</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 152</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> hostname = InetAddress.getLocalHost().getCanonicalHostName();</pre></td></tr>
-<tr> <td class="numLineCover"> 153</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (UnknownHostException ex) {</span></pre></td></tr>
-<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> hostname = InetAddress.getLocalHost().getCanonicalHostName();</pre></td></tr>
+<tr> <td class="numLineCover"> 149</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (UnknownHostException ex) {</span></pre></td></tr>
+<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Ignore</span></pre></td></tr>
-<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 156</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.hostname"</span>, hostname);</pre></td></tr>
-<tr> <td class="numLineCover"> 157</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.port"</span>, <span class="string">"5678"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.reverseProxyPort"</span>, <span class="string">"GENERATE"</span>, <span class="keyword">new</span> ValueComputer() {</pre></td></tr>
-<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 151</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 152</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.hostname"</span>, hostname);</pre></td></tr>
+<tr> <td class="numLineCover"> 153</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.port"</span>, <span class="string">"5678"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 154</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.reverseProxyPort"</span>, <span class="string">"GENERATE"</span>, <span class="keyword">new</span> ValueComputer() {</pre></td></tr>
+<tr> <td class="numLine"> 155</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String compute(String rawValue) {</pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsUncovered"><a title="Line 160: Conditional coverage 50% (1/2)."> 46</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 160: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="string">"GENERATE"</span>.equals(rawValue)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.port"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 156</td> <td class="nbHitsUncovered"><a title="Line 156: Conditional coverage 50% (1/2)."> 49</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 156: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="string">"GENERATE"</span>.equals(rawValue)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 157</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.port"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 163</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> rawValue;</span></pre></td></tr>
-<tr> <td class="numLine"> 164</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 159</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> rawValue;</span></pre></td></tr>
+<tr> <td class="numLine"> 160</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> });</pre></td></tr>
-<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.reverseProxyProtocol"</span>, <span class="string">"GENERATE"</span>, <span class="keyword">new</span> ValueComputer() {</pre></td></tr>
-<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.reverseProxyProtocol"</span>, <span class="string">"GENERATE"</span>, <span class="keyword">new</span> ValueComputer() {</pre></td></tr>
+<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String compute(String rawValue) {</pre></td></tr>
-<tr> <td class="numLineCover"> 168</td> <td class="nbHitsUncovered"><a title="Line 168: Conditional coverage 50% (1/2)."> 46</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 168: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="string">"GENERATE"</span>.equals(rawValue)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"><a title="Line 169: Conditional coverage 100% (2/2)."> 46</a></td> <td class="src"><pre class="src"> <a title="Line 169: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> isServerSecure() ? <span class="string">"https"</span> : <span class="string">"http"</span>;</a></pre></td></tr>
-<tr> <td class="numLine"> 170</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 164</td> <td class="nbHitsUncovered"><a title="Line 164: Conditional coverage 50% (1/2)."> 49</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 164: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="string">"GENERATE"</span>.equals(rawValue)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"><a title="Line 165: Conditional coverage 100% (2/2)."> 49</a></td> <td class="src"><pre class="src"> <a title="Line 165: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> isServerSecure() ? <span class="string">"https"</span> : <span class="string">"http"</span>;</a></pre></td></tr>
+<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 171</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> rawValue;</span></pre></td></tr>
-<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 167</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> rawValue;</span></pre></td></tr>
+<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 173</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 169</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> });</pre></td></tr>
-<tr> <td class="numLineCover"> 174</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.dashboardPort"</span>, <span class="string">"5679"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 175</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.docIdPath"</span>, <span class="string">"/doc/"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.fullAccessHosts"</span>, <span class="string">""</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 177</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.secure"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 178</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.keyAlias"</span>, <span class="string">"adaptor"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 179</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.maxWorkerThreads"</span>, <span class="string">"16"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 180</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.dashboardPort"</span>, <span class="string">"5679"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 171</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.docIdPath"</span>, <span class="string">"/doc/"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 172</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.fullAccessHosts"</span>, <span class="string">""</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 173</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.secure"</span>, <span class="string">"false"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 174</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.keyAlias"</span>, <span class="string">"adaptor"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 175</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.maxWorkerThreads"</span>, <span class="string">"16"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 176</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// A queue that takes one second to drain, assuming 16 threads and 100 ms</span></pre></td></tr>
-<tr> <td class="numLine"> 181</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// for each request.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.queueCapacity"</span>, <span class="string">"160"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.useCompression"</span>, <span class="string">"true"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.hostname"</span>, <span class="keyword">null</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.characterEncoding"</span>, <span class="string">"UTF-8"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 186</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.614FeedWorkaroundEnabled"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.70AuthMethodWorkaroundEnabled"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"docId.isUrl"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 189</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"feed.name"</span>, <span class="string">"GENERATE"</span>, <span class="keyword">new</span> ValueComputer() {</pre></td></tr>
-<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 178</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.queueCapacity"</span>, <span class="string">"160"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 179</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.useCompression"</span>, <span class="string">"true"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 180</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"server.samlEntityId"</span>, <span class="string">"http://google.com/enterprise/gsa/adaptor"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.hostname"</span>, <span class="keyword">null</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.characterEncoding"</span>, <span class="string">"UTF-8"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.614FeedWorkaroundEnabled"</span>, <span class="string">"false"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.70AuthMethodWorkaroundEnabled"</span>, <span class="string">"false"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"gsa.samlEntityId"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"http://google.com/enterprise/gsa/security-manager"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"docId.isUrl"</span>, <span class="string">"false"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"feed.name"</span>, <span class="string">"GENERATE"</span>, <span class="keyword">new</span> ValueComputer() {</pre></td></tr>
+<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String compute(String rawValue) {</pre></td></tr>
-<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"><a title="Line 191: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 191: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"GENERATE"</span>.equals(rawValue)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 192</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="string">"adaptor_"</span> + getValue(<span class="string">"server.hostname"</span>).replace(<span class="string">'.'</span>, <span class="string">'-'</span>)</pre></td></tr>
-<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 190</td> <td class="nbHitsCovered"><a title="Line 190: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 190: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"GENERATE"</span>.equals(rawValue)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="string">"adaptor_"</span> + getValue(<span class="string">"server.hostname"</span>).replace(<span class="string">'.'</span>, <span class="string">'-'</span>)</pre></td></tr>
+<tr> <td class="numLine"> 192</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">"_"</span> + getValue(<span class="string">"server.port"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 195</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">return</span> rawValue;</pre></td></tr>
-<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 194</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">return</span> rawValue;</pre></td></tr>
+<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> });</pre></td></tr>
-<tr> <td class="numLineCover"> 198</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"feed.noRecrawlBitEnabled"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"feed.crawlImmediatelyBitEnabled"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 197</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"feed.noRecrawlBitEnabled"</span>, <span class="string">"false"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 198</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"feed.crawlImmediatelyBitEnabled"</span>, <span class="string">"false"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 199</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">//addKey("feed.noFollowBitEnabled", "false");</span></pre></td></tr>
-<tr> <td class="numLineCover"> 201</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"feed.maxUrls"</span>, <span class="string">"5000"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.pushDocIdsOnStartup"</span>, <span class="string">"true"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.autoUnzip"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 200</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"feed.maxUrls"</span>, <span class="string">"5000"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 201</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.pushDocIdsOnStartup"</span>, <span class="string">"true"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 202</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// 3:00 AM every day.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 205</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.fullListingSchedule"</span>, <span class="string">"0 3 * * *"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 206</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.fullListingSchedule"</span>, <span class="string">"0 3 * * *"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// 15 minutes.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.incrementalPollPeriodSecs"</span>, <span class="string">"900"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 208</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.docContentTimeoutSecs"</span>, <span class="string">"30"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 209</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"transform.pipeline"</span>, <span class="string">""</span>);</pre></td></tr>
-<tr> <td class="numLine"> 210</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 205</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.incrementalPollPeriodSecs"</span>, <span class="string">"900"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.docContentTimeoutSecs"</span>, <span class="string">"30"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"transform.pipeline"</span>, <span class="string">""</span>);</pre></td></tr>
+<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// 1 MiB.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 211</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"transform.maxDocumentBytes"</span>, <span class="string">"1048576"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 212</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"transform.required"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 213</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"journal.reducedMem"</span>, <span class="string">"true"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.sendDocControlsHeader"</span>, <span class="string">"false"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 216</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 209</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"transform.maxDocumentBytes"</span>, <span class="string">"1048576"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 210</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"transform.required"</span>, <span class="string">"false"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 211</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"journal.reducedMem"</span>, <span class="string">"true"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 212</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> addKey(<span class="string">"adaptor.sendDocControlsHeader"</span>, <span class="string">"false"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 213</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 214</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 215</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Set<String> getAllKeys() {</pre></td></tr>
-<tr> <td class="numLineCover"> 218</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> config.stringPropertyNames();</span></pre></td></tr>
-<tr> <td class="numLine"> 219</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 216</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> config.stringPropertyNames();</span></pre></td></tr>
+<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 219</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/* Preferences requiring you to set them: */</span></pre></td></tr>
-<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Required to be set: GSA machine to send document ids to. This is the</span></pre></td></tr>
-<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * hostname of your GSA on your network.</span></pre></td></tr>
-<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String getGsaHostname() {</pre></td></tr>
+<tr> <td class="numLineCover"> 225</td> <td class="nbHitsCovered"> 68</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"gsa.hostname"</span>);</pre></td></tr>
<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getGsaHostname() {</pre></td></tr>
-<tr> <td class="numLineCover"> 227</td> <td class="nbHitsCovered"> 63</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"gsa.hostname"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/* Preferences suggested you set them: */</span></pre></td></tr>
<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/* Preferences suggested you set them: */</span></pre></td></tr>
-<tr> <td class="numLine"> 231</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> String getFeedName() {</pre></td></tr>
+<tr> <td class="numLineCover"> 231</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"feed.name"</span>);</pre></td></tr>
<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getFeedName() {</pre></td></tr>
-<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"feed.name"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 234</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Suggested to be set: Local port, on this computer, onto which requests from</span></pre></td></tr>
-<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * GSA come in on.</span></pre></td></tr>
-<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> getServerPort() {</pre></td></tr>
+<tr> <td class="numLineCover"> 239</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.port"</span>));</pre></td></tr>
<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getServerPort() {</pre></td></tr>
-<tr> <td class="numLineCover"> 241</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.port"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 242</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 244</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The port that should be used in feed file and other references to the</span></pre></td></tr>
-<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 244</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * adaptor. This does not affect the actual port the adaptor uses.</span></pre></td></tr>
-<tr> <td class="numLine"> 247</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> getServerReverseProxyPort() {</pre></td></tr>
+<tr> <td class="numLineCover"> 247</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.reverseProxyPort"</span>));</pre></td></tr>
<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getServerReverseProxyPort() {</pre></td></tr>
-<tr> <td class="numLineCover"> 249</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.reverseProxyPort"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 249</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 253</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The protocol that should be used in feed files and other references to the</span></pre></td></tr>
-<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * adaptor. This does not affect the actual protocol the adaptor uses.</span></pre></td></tr>
-<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 253</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String getServerReverseProxyProtocol() {</pre></td></tr>
+<tr> <td class="numLineCover"> 255</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.reverseProxyProtocol"</span>);</pre></td></tr>
<tr> <td class="numLine"> 256</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getServerReverseProxyProtocol() {</pre></td></tr>
-<tr> <td class="numLineCover"> 257</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.reverseProxyProtocol"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 258</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 259</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 260</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Local port, on this computer, from which the dashboard is served.</span></pre></td></tr>
-<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 260</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> getServerDashboardPort() {</pre></td></tr>
+<tr> <td class="numLineCover"> 262</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.dashboardPort"</span>));</pre></td></tr>
<tr> <td class="numLine"> 263</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getServerDashboardPort() {</pre></td></tr>
-<tr> <td class="numLineCover"> 264</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.dashboardPort"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 264</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 265</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 266</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/* More sophisticated preferences that can be left</span></pre></td></tr>
-<tr> <td class="numLine"> 268</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 266</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> unmodified for simple deployment and initial POC: */</span></pre></td></tr>
-<tr> <td class="numLine"> 269</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 270</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 268</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Optional (default false): If your DocIds are already valid URLs you can</span></pre></td></tr>
-<tr> <td class="numLine"> 271</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 269</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * have this method return true and they will be sent to GSA unmodified. If</span></pre></td></tr>
-<tr> <td class="numLine"> 272</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 270</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * your DocId is like http://procurement.corp.company.com/internal/011212.html</span></pre></td></tr>
-<tr> <td class="numLine"> 273</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 271</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * you can turn this true and that URL will be handed to the GSA.</span></pre></td></tr>
-<tr> <td class="numLine"> 274</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 272</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 275</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 273</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>By default DocIds are URL encoded and prefixed with http:// and this</span></pre></td></tr>
-<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 274</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * host's name and port.</span></pre></td></tr>
-<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 275</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isDocIdUrl() {</pre></td></tr>
+<tr> <td class="numLineCover"> 277</td> <td class="nbHitsCovered"> 40</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"docId.isUrl"</span>));</pre></td></tr>
<tr> <td class="numLine"> 278</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isDocIdUrl() {</pre></td></tr>
-<tr> <td class="numLineCover"> 279</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"docId.isUrl"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 279</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 280</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 281</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 282</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Without changes contains InetAddress.getLocalHost().getHostName(). */</span></pre></td></tr>
+<tr> <td class="numLine"> 281</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String getServerHostname() {</pre></td></tr>
+<tr> <td class="numLineCover"> 282</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.hostname"</span>);</pre></td></tr>
<tr> <td class="numLine"> 283</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getServerHostname() {</pre></td></tr>
-<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 55</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.hostname"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 284</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 285</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Comma-separated list of IPs or hostnames that can retrieve content without</span></pre></td></tr>
-<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * authentication checks. The GSA's hostname is implicitly in this list.</span></pre></td></tr>
-<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 291</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>When in secure mode, clients are requested to provide a client</span></pre></td></tr>
-<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * certificate. If the provided client certificate is valid and the Common</span></pre></td></tr>
-<tr> <td class="numLine"> 293</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 291</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Name (CN) of the Subject is in this list (case-insensitively), then it is</span></pre></td></tr>
+<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * given access.</span></pre></td></tr>
+<tr> <td class="numLine"> 293</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * given access.</span></pre></td></tr>
-<tr> <td class="numLine"> 295</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>In non-secure mode, the hostnames in this list are resolved to IPs at</span></pre></td></tr>
-<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 295</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * startup and when a request is made from one of those IPs the client is</span></pre></td></tr>
-<tr> <td class="numLine"> 298</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * given access.</span></pre></td></tr>
-<tr> <td class="numLine"> 299</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 298</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String[] getServerFullAccessHosts() {</pre></td></tr>
+<tr> <td class="numLineCover"> 299</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.fullAccessHosts"</span>).split(<span class="string">","</span>);</pre></td></tr>
<tr> <td class="numLine"> 300</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String[] getServerFullAccessHosts() {</pre></td></tr>
-<tr> <td class="numLineCover"> 301</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.fullAccessHosts"</span>).split(<span class="string">","</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 301</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 302</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 305</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Optional: Returns this host's base URI which other paths will be resolved</span></pre></td></tr>
-<tr> <td class="numLine"> 306</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * against. It is used to construct URIs to provide to the GSA for it to</span></pre></td></tr>
-<tr> <td class="numLine"> 307</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 305</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * contact this server for various services. For documents (which is probably</span></pre></td></tr>
-<tr> <td class="numLine"> 308</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 306</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * what you care about), the {@link #getServerBaseUri(DocId)} version is used</span></pre></td></tr>
-<tr> <td class="numLine"> 309</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 307</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * instead.</span></pre></td></tr>
-<tr> <td class="numLine"> 310</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 308</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 311</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 309</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>It must contain the protocol, hostname, and port, but may optionally</span></pre></td></tr>
-<tr> <td class="numLine"> 312</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 310</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * contain a path like {@code /yourfavoritepath}. By default, the protocol,</span></pre></td></tr>
-<tr> <td class="numLine"> 313</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 311</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * hostname, and port are retrieved automatically and no path is set.</span></pre></td></tr>
-<tr> <td class="numLine"> 314</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 312</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 313</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> URI getServerBaseUri() {</pre></td></tr>
+<tr> <td class="numLineCover"> 314</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">return</span> URI.create(getServerReverseProxyProtocol() + <span class="string">"://"</span></pre></td></tr>
<tr> <td class="numLine"> 315</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> URI getServerBaseUri() {</pre></td></tr>
-<tr> <td class="numLineCover"> 316</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">return</span> URI.create(getServerReverseProxyProtocol() + <span class="string">"://"</span></pre></td></tr>
-<tr> <td class="numLine"> 317</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + getServerHostname() + <span class="string">":"</span> + getServerReverseProxyPort());</pre></td></tr>
+<tr> <td class="numLine"> 316</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 317</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 318</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 319</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 320</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Optional: Path below {@link #getServerBaseUri(DocId)} where documents are</span></pre></td></tr>
-<tr> <td class="numLine"> 322</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 320</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * namespaced. Generally, should be at least {@code "/"} and end with a slash.</span></pre></td></tr>
-<tr> <td class="numLine"> 323</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 322</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String getServerDocIdPath() {</pre></td></tr>
+<tr> <td class="numLineCover"> 323</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.docIdPath"</span>);</pre></td></tr>
<tr> <td class="numLine"> 324</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getServerDocIdPath() {</pre></td></tr>
-<tr> <td class="numLineCover"> 325</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.docIdPath"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 325</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 326</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 327</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 329</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Optional: Returns the host's base URI which GSA will contact for document</span></pre></td></tr>
-<tr> <td class="numLine"> 330</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * information, including document contents. By default it returns {@link</span></pre></td></tr>
-<tr> <td class="numLine"> 331</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 329</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * #getServerBaseUri()}. However, if you would like to direct GSA's queries</span></pre></td></tr>
-<tr> <td class="numLine"> 332</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 330</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * for contents to go to other computers/binaries then you can change this</span></pre></td></tr>
-<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 331</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * method.</span></pre></td></tr>
-<tr> <td class="numLine"> 334</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 332</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 335</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>For example, imagine that you want five binaries to serve the contents</span></pre></td></tr>
-<tr> <td class="numLine"> 336</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 334</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * of files to the GSA. In this case you could split the document ids into</span></pre></td></tr>
-<tr> <td class="numLine"> 337</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 335</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * five categories using something like:</span></pre></td></tr>
-<tr> <td class="numLine"> 338</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 336</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 339</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 337</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <pre>String urlBeginnings[] = new String[] {</span></pre></td></tr>
-<tr> <td class="numLine"> 340</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 338</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * "http://content-server-A:5678",</span></pre></td></tr>
-<tr> <td class="numLine"> 341</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 339</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * "http://content-server-B:5678",</span></pre></td></tr>
-<tr> <td class="numLine"> 342</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 340</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * "http://backup-server-A:5678",</span></pre></td></tr>
-<tr> <td class="numLine"> 343</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 341</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * "http://backup-server-B:5678",</span></pre></td></tr>
-<tr> <td class="numLine"> 344</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 342</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * "http://new-server:7878"</span></pre></td></tr>
-<tr> <td class="numLine"> 345</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 343</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * };</span></pre></td></tr>
-<tr> <td class="numLine"> 346</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 344</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * int shard = docId.getUniqueId().hashCode() % 5;</span></pre></td></tr>
-<tr> <td class="numLine"> 347</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 345</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * return URI.create(urlBeginnings[shard]);</pre></span></pre></td></tr>
-<tr> <td class="numLine"> 348</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 346</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 349</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 347</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>Note that this URI is used in conjunction with {@link</span></pre></td></tr>
-<tr> <td class="numLine"> 350</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 348</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * #getServerDocIdPath} and the document ID to form the full URL. In addition,</span></pre></td></tr>
-<tr> <td class="numLine"> 351</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 349</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * by using {@link #getServerBaseUri()} and {@code getDocIdPath()}, we have to</span></pre></td></tr>
-<tr> <td class="numLine"> 352</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 350</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * be able to parse back the original document ID when a request comes to this</span></pre></td></tr>
-<tr> <td class="numLine"> 353</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 351</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * server.</span></pre></td></tr>
-<tr> <td class="numLine"> 354</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 352</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 353</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> URI getServerBaseUri(DocId docId) {</pre></td></tr>
+<tr> <td class="numLineCover"> 354</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getServerBaseUri();</pre></td></tr>
<tr> <td class="numLine"> 355</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> URI getServerBaseUri(DocId docId) {</pre></td></tr>
-<tr> <td class="numLineCover"> 356</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getServerBaseUri();</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 356</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 357</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 358</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 359</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 360</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Whether full security should be enabled. When {@code true}, the adaptor is</span></pre></td></tr>
-<tr> <td class="numLine"> 361</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 359</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * locked down using HTTPS, checks certificates, and generally behaves in a</span></pre></td></tr>
-<tr> <td class="numLine"> 362</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 360</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * fully-secure manner. When {@code false} (default), the adaptor serves</span></pre></td></tr>
-<tr> <td class="numLine"> 363</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 361</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * content over HTTP and is unable to authenticate users (all users are</span></pre></td></tr>
-<tr> <td class="numLine"> 364</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 362</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * treated as anonymous).</span></pre></td></tr>
-<tr> <td class="numLine"> 365</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 363</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 366</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 364</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>The need for this setting is because when enabled, security requires a</span></pre></td></tr>
-<tr> <td class="numLine"> 367</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 365</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * reasonable amount of configuration and know-how. To provide easy</span></pre></td></tr>
-<tr> <td class="numLine"> 368</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 366</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * out-of-the-box execution, this is disabled by default.</span></pre></td></tr>
-<tr> <td class="numLine"> 369</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 367</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 368</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isServerSecure() {</pre></td></tr>
+<tr> <td class="numLineCover"> 369</td> <td class="nbHitsCovered"> 89</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"server.secure"</span>));</pre></td></tr>
<tr> <td class="numLine"> 370</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isServerSecure() {</pre></td></tr>
-<tr> <td class="numLineCover"> 371</td> <td class="nbHitsCovered"> 88</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"server.secure"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 371</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 372</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 373</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 374</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 375</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The alias in the keystore that has the key to use for encryption.</span></pre></td></tr>
-<tr> <td class="numLine"> 376</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 374</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 375</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String getServerKeyAlias() {</pre></td></tr>
+<tr> <td class="numLineCover"> 376</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.keyAlias"</span>);</pre></td></tr>
<tr> <td class="numLine"> 377</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getServerKeyAlias() {</pre></td></tr>
-<tr> <td class="numLineCover"> 378</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.keyAlias"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 378</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 379</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 380</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 381</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 382</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The maximum number of worker threads to use to respond to document</span></pre></td></tr>
-<tr> <td class="numLine"> 383</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 381</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * requests. The main reason to limit the number of threads is that each can</span></pre></td></tr>
-<tr> <td class="numLine"> 384</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 382</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * be using a transform pipeline and will have multiple complete copies of the</span></pre></td></tr>
-<tr> <td class="numLine"> 385</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 383</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * response in memory at the same time.</span></pre></td></tr>
-<tr> <td class="numLine"> 386</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 384</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 385</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> getServerMaxWorkerThreads() {</pre></td></tr>
+<tr> <td class="numLineCover"> 386</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.maxWorkerThreads"</span>));</pre></td></tr>
<tr> <td class="numLine"> 387</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getServerMaxWorkerThreads() {</pre></td></tr>
-<tr> <td class="numLineCover"> 388</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.maxWorkerThreads"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 388</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 389</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 390</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 391</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 392</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The maximum request queue length.</span></pre></td></tr>
-<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 391</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 392</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> getServerQueueCapacity() {</pre></td></tr>
+<tr> <td class="numLineCover"> 393</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.queueCapacity"</span>));</pre></td></tr>
<tr> <td class="numLine"> 394</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getServerQueueCapacity() {</pre></td></tr>
-<tr> <td class="numLineCover"> 395</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"server.queueCapacity"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 395</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 396</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 397</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> String getServerSamlEntityId() {</pre></td></tr>
+<tr> <td class="numLineCover"> 397</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"server.samlEntityId"</span>);</pre></td></tr>
<tr> <td class="numLine"> 398</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isServerToUseCompression() {</pre></td></tr>
-<tr> <td class="numLineCover"> 399</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"server.useCompression"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 399</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 400</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 401</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isServerToUseCompression() {</pre></td></tr>
+<tr> <td class="numLineCover"> 401</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"server.useCompression"</span>));</pre></td></tr>
<tr> <td class="numLine"> 402</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> sendDocControlsHeader() {</pre></td></tr>
-<tr> <td class="numLineCover"> 403</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"adaptor.sendDocControlsHeader"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 403</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 404</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 405</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> sendDocControlsHeader() {</pre></td></tr>
+<tr> <td class="numLineCover"> 405</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"adaptor.sendDocControlsHeader"</span>));</pre></td></tr>
<tr> <td class="numLine"> 406</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 407</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Optional (default false): Adds no-recrawl bit with sent records in feed</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 408</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * file. If connector handles updates and deletes then GSA does not have to</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 409</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * recrawl periodically to notice that a document is changed or deleted.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Optional (default false): Adds no-recrawl bit with sent records in feed</span></pre></td></tr>
<tr> <td class="numLine"> 410</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * file. If connector handles updates and deletes then GSA does not have to</span></pre></td></tr>
<tr> <td class="numLine"> 411</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isFeedNoRecrawlBitEnabled() {</pre></td></tr>
-<tr> <td class="numLineCover"> 412</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Boolean.getBoolean(getValue(<span class="string">"feed.noRecrawlBitEnabled"</span>));</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * recrawl periodically to notice that a document is changed or deleted.</span></pre></td></tr>
+<tr> <td class="numLine"> 412</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 413</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 414</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isFeedNoRecrawlBitEnabled() {</pre></td></tr>
+<tr> <td class="numLineCover"> 414</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Boolean.getBoolean(getValue(<span class="string">"feed.noRecrawlBitEnabled"</span>));</span></pre></td></tr>
<tr> <td class="numLine"> 415</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 416</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Optional (default false): Adds crawl-immediately bit with sent records in</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 417</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * feed file. This bit makes the sent URL get crawl priority.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 418</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Optional (default false): Adds crawl-immediately bit with sent records in</span></pre></td></tr>
<tr> <td class="numLine"> 419</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isCrawlImmediatelyBitEnabled() {</pre></td></tr>
-<tr> <td class="numLineCover"> 420</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"feed.crawlImmediatelyBitEnabled"</span>));</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * feed file. This bit makes the sent URL get crawl priority.</span></pre></td></tr>
+<tr> <td class="numLine"> 420</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 421</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 422</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isCrawlImmediatelyBitEnabled() {</pre></td></tr>
+<tr> <td class="numLineCover"> 422</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"feed.crawlImmediatelyBitEnabled"</span>));</span></pre></td></tr>
<tr> <td class="numLine"> 423</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 424</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Whether the default {@code main()} should automatically start pushing all</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 425</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * document ids on startup. Defaults to {@code true}.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 426</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Whether the default {@code main()} should automatically start pushing all</span></pre></td></tr>
<tr> <td class="numLine"> 427</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isAdaptorPushDocIdsOnStartup() {</pre></td></tr>
-<tr> <td class="numLineCover"> 428</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"adaptor.pushDocIdsOnStartup"</span>));</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * document ids on startup. Defaults to {@code true}.</span></pre></td></tr>
+<tr> <td class="numLine"> 428</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 429</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 430</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isAdaptorPushDocIdsOnStartup() {</pre></td></tr>
+<tr> <td class="numLineCover"> 430</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"adaptor.pushDocIdsOnStartup"</span>));</pre></td></tr>
<tr> <td class="numLine"> 431</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 432</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Automatically unzips and {@code DocId}s ending in {@code .zip} and provides</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 433</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * them to the GSA.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 434</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 435</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> useAdaptorAutoUnzip() {</pre></td></tr>
-<tr> <td class="numLineCover"> 436</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"adaptor.autoUnzip"</span>));</span></pre></td></tr>
-<tr> <td class="numLine"> 437</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } </pre></td></tr>
-<tr> <td class="numLine"> 438</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 439</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 440</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Cron-style format for describing when the adaptor should perform full</span></pre></td></tr>
-<tr> <td class="numLine"> 441</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 435</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * listings of {@code DocId}s. Multiple times can be specified by separating</span></pre></td></tr>
-<tr> <td class="numLine"> 442</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 436</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * them with a '|' (vertical bar).</span></pre></td></tr>
-<tr> <td class="numLine"> 443</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 437</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 438</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String getAdaptorFullListingSchedule() {</pre></td></tr>
+<tr> <td class="numLineCover"> 439</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"adaptor.fullListingSchedule"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 440</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 441</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 442</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">long</span> getAdaptorIncrementalPollPeriodMillis() {</pre></td></tr>
+<tr> <td class="numLineCover"> 443</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Long.parseLong(getValue(<span class="string">"adaptor.incrementalPollPeriodSecs"</span>)) * 1000;</pre></td></tr>
<tr> <td class="numLine"> 444</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getAdaptorFullListingSchedule() {</pre></td></tr>
-<tr> <td class="numLineCover"> 445</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"adaptor.fullListingSchedule"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 445</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 446</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 447</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">long</span> getAdaptorDocContentTimeoutMillis() {</pre></td></tr>
+<tr> <td class="numLineCover"> 447</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Long.parseLong(getValue(<span class="string">"adaptor.docContentTimeoutSecs"</span>)) * 1000;</pre></td></tr>
<tr> <td class="numLine"> 448</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">long</span> getAdaptorIncrementalPollPeriodMillis() {</pre></td></tr>
-<tr> <td class="numLineCover"> 449</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Long.parseLong(getValue(<span class="string">"adaptor.incrementalPollPeriodSecs"</span>)) * 1000;</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 449</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 450</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 451</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 452</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">long</span> getAdaptorDocContentTimeoutMillis() {</pre></td></tr>
-<tr> <td class="numLineCover"> 453</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Long.parseLong(getValue(<span class="string">"adaptor.docContentTimeoutSecs"</span>)) * 1000;</pre></td></tr>
-<tr> <td class="numLine"> 454</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 455</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 456</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 457</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Returns a list of maps correspending to each transform in the pipeline.</span></pre></td></tr>
-<tr> <td class="numLine"> 458</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 452</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Each map is the configuration entries for that transform. The 'name'</span></pre></td></tr>
-<tr> <td class="numLine"> 459</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 453</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * configuration entry is added in each map based on the name provided by the</span></pre></td></tr>
-<tr> <td class="numLine"> 460</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 454</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * user.</span></pre></td></tr>
+<tr> <td class="numLine"> 455</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 456</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">synchronized</span> List<Map<String, String>> getTransformPipelineSpec() {</pre></td></tr>
+<tr> <td class="numLineCover"> 457</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String configKey = <span class="string">"transform.pipeline"</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 458</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> String configValue = getValue(configKey).trim();</pre></td></tr>
+<tr> <td class="numLineCover"> 459</td> <td class="nbHitsCovered"><a title="Line 459: Conditional coverage 100% (2/2)."> 14</a></td> <td class="src"><pre class="src"> <a title="Line 459: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">""</span>.equals(configValue)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 460</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.emptyList();</pre></td></tr>
<tr> <td class="numLine"> 461</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 462</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> List<Map<String, String>> getTransformPipelineSpec() {</pre></td></tr>
-<tr> <td class="numLineCover"> 463</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String configKey = <span class="string">"transform.pipeline"</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 464</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> String configValue = getValue(configKey).trim();</pre></td></tr>
-<tr> <td class="numLineCover"> 465</td> <td class="nbHitsCovered"><a title="Line 465: Conditional coverage 100% (2/2)."> 13</a></td> <td class="src"><pre class="src"> <a title="Line 465: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">""</span>.equals(configValue)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 466</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.emptyList();</pre></td></tr>
-<tr> <td class="numLine"> 467</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 468</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> String[] items = getValue(configKey).split(<span class="string">","</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 469</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> List<Map<String, String>> transforms</pre></td></tr>
-<tr> <td class="numLine"> 470</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 462</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> String[] items = getValue(configKey).split(<span class="string">","</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 463</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> List<Map<String, String>> transforms</pre></td></tr>
+<tr> <td class="numLine"> 464</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> ArrayList<Map<String, String>>(items.length);</pre></td></tr>
-<tr> <td class="numLineCover"> 471</td> <td class="nbHitsCovered"><a title="Line 471: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 471: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String item : items) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 472</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> item = item.trim();</pre></td></tr>
-<tr> <td class="numLineCover"> 473</td> <td class="nbHitsCovered"><a title="Line 473: Conditional coverage 100% (2/2)."> 5</a></td> <td class="src"><pre class="src"> <a title="Line 473: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">""</span>.equals(item)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 474</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Invalid format: "</span> + configValue);</pre></td></tr>
-<tr> <td class="numLine"> 475</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 465</td> <td class="nbHitsCovered"><a title="Line 465: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 465: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String item : items) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 466</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> item = item.trim();</pre></td></tr>
+<tr> <td class="numLineCover"> 467</td> <td class="nbHitsCovered"><a title="Line 467: Conditional coverage 100% (2/2)."> 5</a></td> <td class="src"><pre class="src"> <a title="Line 467: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">""</span>.equals(item)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 468</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Invalid format: "</span> + configValue);</pre></td></tr>
+<tr> <td class="numLine"> 469</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 476</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Map<String, String> params</pre></td></tr>
-<tr> <td class="numLine"> 477</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 470</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Map<String, String> params</pre></td></tr>
+<tr> <td class="numLine"> 471</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = getValuesWithPrefix(configKey + <span class="string">"."</span> + item + <span class="string">"."</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 478</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> params.put(<span class="string">"name"</span>, item);</pre></td></tr>
-<tr> <td class="numLineCover"> 479</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> transforms.add(params);</pre></td></tr>
-<tr> <td class="numLine"> 480</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 472</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> params.put(<span class="string">"name"</span>, item);</pre></td></tr>
+<tr> <td class="numLineCover"> 473</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> transforms.add(params);</pre></td></tr>
+<tr> <td class="numLine"> 474</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 481</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> transforms;</pre></td></tr>
+<tr> <td class="numLineCover"> 475</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> transforms;</pre></td></tr>
+<tr> <td class="numLine"> 476</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 477</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 478</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> getTransformMaxDocumentBytes() {</pre></td></tr>
+<tr> <td class="numLineCover"> 479</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"transform.maxDocumentBytes"</span>));</pre></td></tr>
+<tr> <td class="numLine"> 480</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 481</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 482</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 483</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isTransformRequired() {</pre></td></tr>
+<tr> <td class="numLineCover"> 483</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"transform.required"</span>));</pre></td></tr>
<tr> <td class="numLine"> 484</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getTransformMaxDocumentBytes() {</pre></td></tr>
-<tr> <td class="numLineCover"> 485</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"transform.maxDocumentBytes"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 485</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 486</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 487</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isJournalReducedMem() {</pre></td></tr>
+<tr> <td class="numLineCover"> 487</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"journal.reducedMem"</span>));</pre></td></tr>
<tr> <td class="numLine"> 488</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isTransformRequired() {</pre></td></tr>
-<tr> <td class="numLineCover"> 489</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"transform.required"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 489</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 490</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 491</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 492</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isJournalReducedMem() {</pre></td></tr>
-<tr> <td class="numLineCover"> 493</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"journal.reducedMem"</span>));</pre></td></tr>
-<tr> <td class="numLine"> 494</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 495</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 496</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// TODO(pjo): Implement on GSA</span></pre></td></tr>
-<tr> <td class="numLine"> 497</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 491</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// /**</span></pre></td></tr>
-<tr> <td class="numLine"> 498</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 492</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// * Optional (default false): Adds no-follow bit with sent records in feed</span></pre></td></tr>
-<tr> <td class="numLine"> 499</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 493</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// * file. No-follow means that if document content has links they are not</span></pre></td></tr>
-<tr> <td class="numLine"> 500</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 494</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// * followed.</span></pre></td></tr>
-<tr> <td class="numLine"> 501</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 495</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// */</span></pre></td></tr>
-<tr> <td class="numLine"> 502</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// public boolean isNoFollowBitEnabled() {</span></pre></td></tr>
-<tr> <td class="numLine"> 503</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 496</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// boolean isNoFollowBitEnabled() {</span></pre></td></tr>
+<tr> <td class="numLine"> 497</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// return Boolean.parseBoolean(getValue("feed.noFollowBitEnabled"));</span></pre></td></tr>
-<tr> <td class="numLine"> 504</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 498</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// }</span></pre></td></tr>
-<tr> <td class="numLine"> 505</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 499</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 506</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 500</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/* Preferences expected to never change: */</span></pre></td></tr>
-<tr> <td class="numLine"> 507</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 501</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 508</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 502</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Provides the character encoding the GSA prefers. */</span></pre></td></tr>
+<tr> <td class="numLine"> 503</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> Charset getGsaCharacterEncoding() {</pre></td></tr>
+<tr> <td class="numLineCover"> 504</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Charset.forName(getValue(<span class="string">"gsa.characterEncoding"</span>));</pre></td></tr>
+<tr> <td class="numLine"> 505</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 506</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 507</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isGsa614FeedWorkaroundEnabled() {</pre></td></tr>
+<tr> <td class="numLineCover"> 508</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"gsa.614FeedWorkaroundEnabled"</span>));</pre></td></tr>
<tr> <td class="numLine"> 509</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Charset getGsaCharacterEncoding() {</pre></td></tr>
-<tr> <td class="numLineCover"> 510</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Charset.forName(getValue(<span class="string">"gsa.characterEncoding"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 510</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 511</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 512</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> isGsa70AuthMethodWorkaroundEnabled() {</pre></td></tr>
+<tr> <td class="numLineCover"> 512</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"gsa.70AuthMethodWorkaroundEnabled"</span>));</pre></td></tr>
<tr> <td class="numLine"> 513</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isGsa614FeedWorkaroundEnabled() {</pre></td></tr>
-<tr> <td class="numLineCover"> 514</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"gsa.614FeedWorkaroundEnabled"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 514</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 515</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 516</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> String getGsaSamlEntityId() {</pre></td></tr>
+<tr> <td class="numLineCover"> 516</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getValue(<span class="string">"gsa.samlEntityId"</span>);</pre></td></tr>
<tr> <td class="numLine"> 517</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isGsa70AuthMethodWorkaroundEnabled() {</pre></td></tr>
-<tr> <td class="numLineCover"> 518</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Boolean.parseBoolean(getValue(<span class="string">"gsa.70AuthMethodWorkaroundEnabled"</span>));</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 518</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 519</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 520</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 521</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 522</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Provides max number of URLs (equal to number of document ids) that are sent</span></pre></td></tr>
-<tr> <td class="numLine"> 523</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 521</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * to the GSA per feed file.</span></pre></td></tr>
-<tr> <td class="numLine"> 524</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 522</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 523</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> getFeedMaxUrls() {</pre></td></tr>
+<tr> <td class="numLineCover"> 524</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"feed.maxUrls"</span>));</pre></td></tr>
<tr> <td class="numLine"> 525</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getFeedMaxUrls() {</pre></td></tr>
-<tr> <td class="numLineCover"> 526</td> <td class="nbHitsCovered"> 28</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Integer.parseInt(getValue(<span class="string">"feed.maxUrls"</span>));</pre></td></tr>
-<tr> <td class="numLine"> 527</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 526</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 527</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 528</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Load user-provided configuration file.</span></pre></td></tr>
<tr> <td class="numLine"> 529</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 530</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Load user-provided configuration file.</span></pre></td></tr>
-<tr> <td class="numLine"> 531</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 532</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> load(String configFile) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 533</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> load(<span class="keyword">new</span> File(configFile));</span></pre></td></tr>
-<tr> <td class="numLineCover"> 534</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 531</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> load(<span class="keyword">new</span> File(configFile));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 532</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 533</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 534</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 535</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 536</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 537</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Load user-provided configuration file.</span></pre></td></tr>
-<tr> <td class="numLine"> 538</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 536</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 539</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 537</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> load(File configFile) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 540</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.configFile = configFile;</pre></td></tr>
-<tr> <td class="numLineCover"> 541</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> configFileLastModified = configFile.lastModified();</pre></td></tr>
-<tr> <td class="numLineCover"> 542</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Reader reader = createReader(configFile);</pre></td></tr>
-<tr> <td class="numLine"> 543</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 538</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.configFile = configFile;</pre></td></tr>
+<tr> <td class="numLineCover"> 539</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> configFileLastModified = configFile.lastModified();</pre></td></tr>
+<tr> <td class="numLineCover"> 540</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Reader reader = createReader(configFile);</pre></td></tr>
+<tr> <td class="numLine"> 541</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 544</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> load(reader);</pre></td></tr>
-<tr> <td class="numLine"> 545</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 542</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> load(reader);</pre></td></tr>
+<tr> <td class="numLine"> 543</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 546</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> reader.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 547</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 548</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 549</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 544</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> reader.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 545</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 546</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 547</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 550</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 548</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 551</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 549</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Load user-provided configuration file, replacing any previously loaded file</span></pre></td></tr>
-<tr> <td class="numLine"> 552</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 550</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * configuration.</span></pre></td></tr>
-<tr> <td class="numLine"> 553</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 551</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 554</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 552</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> load(Reader configFile) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 555</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Properties newConfigFileProperties = <span class="keyword">new</span> Properties(defaultConfig);</pre></td></tr>
-<tr> <td class="numLineCover"> 556</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> newConfigFileProperties.load(configFile);</pre></td></tr>
-<tr> <td class="numLine"> 557</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 553</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Properties newConfigFileProperties = <span class="keyword">new</span> Properties(defaultConfig);</pre></td></tr>
+<tr> <td class="numLineCover"> 554</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> newConfigFileProperties.load(configFile);</pre></td></tr>
+<tr> <td class="numLine"> 555</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 558</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 556</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Config fakeOldConfig;</pre></td></tr>
-<tr> <td class="numLine"> 559</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 557</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Set<String> differentKeys;</pre></td></tr>
-<tr> <td class="numLineCover"> 560</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
-<tr> <td class="numLine"> 561</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 558</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
+<tr> <td class="numLine"> 559</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Create replacement config.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 562</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Properties newConfig = <span class="keyword">new</span> Properties(newConfigFileProperties);</pre></td></tr>
-<tr> <td class="numLineCover"> 563</td> <td class="nbHitsCovered"><a title="Line 563: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 563: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Object o : config.keySet()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 564</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> newConfig.put(o, config.get(o));</pre></td></tr>
+<tr> <td class="numLineCover"> 560</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Properties newConfig = <span class="keyword">new</span> Properties(newConfigFileProperties);</pre></td></tr>
+<tr> <td class="numLineCover"> 561</td> <td class="nbHitsCovered"><a title="Line 561: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 561: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Object o : config.keySet()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 562</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> newConfig.put(o, config.get(o));</pre></td></tr>
+<tr> <td class="numLine"> 563</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 564</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 565</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 566</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 567</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Find differences.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 568</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> differentKeys = findDifferences(config, newConfig);</pre></td></tr>
-<tr> <td class="numLine"> 569</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 566</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> differentKeys = findDifferences(config, newConfig);</pre></td></tr>
+<tr> <td class="numLine"> 567</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 570</td> <td class="nbHitsCovered"><a title="Line 570: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 570: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (differentKeys.isEmpty()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 571</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.info(<span class="string">"No configuration changes found"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 572</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLine"> 573</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 568</td> <td class="nbHitsCovered"><a title="Line 568: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 568: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (differentKeys.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 569</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.info(<span class="string">"No configuration changes found"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 570</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
+<tr> <td class="numLine"> 571</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 572</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 573</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> validate(newConfig);</pre></td></tr>
<tr> <td class="numLine"> 574</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 575</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> validate(newConfig);</pre></td></tr>
-<tr> <td class="numLine"> 576</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 575</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> fakeOldConfig = <span class="keyword">new</span> Config();</pre></td></tr>
+<tr> <td class="numLineCover"> 576</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> fakeOldConfig.config = config;</pre></td></tr>
+<tr> <td class="numLineCover"> 577</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = newConfig;</pre></td></tr>
+<tr> <td class="numLineCover"> 578</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 579</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.info(<span class="string">"New configuration file loaded"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 580</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> fireConfigModificationEvent(fakeOldConfig, differentKeys);</pre></td></tr>
+<tr> <td class="numLineCover"> 581</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 582</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 577</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> fakeOldConfig = <span class="keyword">new</span> Config();</pre></td></tr>
-<tr> <td class="numLineCover"> 578</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> fakeOldConfig.config = config;</pre></td></tr>
-<tr> <td class="numLineCover"> 579</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = newConfig;</pre></td></tr>
-<tr> <td class="numLineCover"> 580</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 581</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> log.info(<span class="string">"New configuration file loaded"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 582</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> fireConfigModificationEvent(fakeOldConfig, differentKeys);</pre></td></tr>
-<tr> <td class="numLineCover"> 583</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 584</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 585</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 583</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Reader createReader(File configFile) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 586</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> InputStreamReader(<span class="keyword">new</span> BufferedInputStream(</span></pre></td></tr>
-<tr> <td class="numLine"> 587</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 584</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> InputStreamReader(<span class="keyword">new</span> BufferedInputStream(</span></pre></td></tr>
+<tr> <td class="numLine"> 585</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> FileInputStream(configFile)), Charset.forName(<span class="string">"UTF-8"</span>));</pre></td></tr>
+<tr> <td class="numLine"> 586</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 587</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 588</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 589</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 590</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 591</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * @return {@code true} if configuration file was modified.</span></pre></td></tr>
-<tr> <td class="numLine"> 592</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 590</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 593</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 591</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> ensureLatestConfigLoaded() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 594</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
-<tr> <td class="numLineCover"> 595</td> <td class="nbHitsUncovered"><a title="Line 595: Conditional coverage 66% (4/6) [each condition: 100%, 50%, 50%]."> 5</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 595: Conditional coverage 66% (4/6) [each condition: 100%, 50%, 50%]."> <span class="keyword">if</span> (configFile == <span class="keyword">null</span> || !configFile.exists() || !configFile.isFile()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 596</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLine"> 597</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 592</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
+<tr> <td class="numLineCover"> 593</td> <td class="nbHitsUncovered"><a title="Line 593: Conditional coverage 66% (4/6) [each condition: 100%, 50%, 50%]."> 5</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 593: Conditional coverage 66% (4/6) [each condition: 100%, 50%, 50%]."> <span class="keyword">if</span> (configFile == <span class="keyword">null</span> || !configFile.exists() || !configFile.isFile()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 594</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLine"> 595</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 598</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 596</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Check for modifications.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 599</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">long</span> newLastModified = configFile.lastModified();</pre></td></tr>
-<tr> <td class="numLineCover"> 600</td> <td class="nbHitsUncovered"><a title="Line 600: Conditional coverage 75% (3/4) [each condition: 100%, 50%]."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 600: Conditional coverage 75% (3/4) [each condition: 100%, 50%]."> <span class="keyword">if</span> (configFileLastModified == newLastModified || newLastModified == 0) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 601</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 597</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">long</span> newLastModified = configFile.lastModified();</pre></td></tr>
+<tr> <td class="numLineCover"> 598</td> <td class="nbHitsUncovered"><a title="Line 598: Conditional coverage 75% (3/4) [each condition: 100%, 50%]."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 598: Conditional coverage 75% (3/4) [each condition: 100%, 50%]."> <span class="keyword">if</span> (configFileLastModified == newLastModified || newLastModified == 0) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 599</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLine"> 600</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 601</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.info(<span class="string">"Noticed modified configuration file"</span>);</pre></td></tr>
<tr> <td class="numLine"> 602</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 603</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.info(<span class="string">"Noticed modified configuration file"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 604</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 605</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> load(configFile);</pre></td></tr>
-<tr> <td class="numLineCover"> 606</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 607</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 603</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> load(configFile);</pre></td></tr>
+<tr> <td class="numLineCover"> 604</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 605</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLine"> 606</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 607</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 608</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 609</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 610</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Set<String> findDifferences(Properties config, Properties newConfig) {</pre></td></tr>
-<tr> <td class="numLineCover"> 611</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Set<String> differentKeys = <span class="keyword">new</span> HashSet<String>();</pre></td></tr>
-<tr> <td class="numLineCover"> 612</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Set<String> names = <span class="keyword">new</span> HashSet<String>();</pre></td></tr>
-<tr> <td class="numLineCover"> 613</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> names.addAll(config.stringPropertyNames());</pre></td></tr>
-<tr> <td class="numLineCover"> 614</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> names.addAll(newConfig.stringPropertyNames());</pre></td></tr>
-<tr> <td class="numLineCover"> 615</td> <td class="nbHitsCovered"><a title="Line 615: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 615: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String name : names) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 616</td> <td class="nbHitsCovered"> 250</td> <td class="src"><pre class="src"> String value = config.getProperty(name);</pre></td></tr>
-<tr> <td class="numLineCover"> 617</td> <td class="nbHitsCovered"> 250</td> <td class="src"><pre class="src"> String newValue = newConfig.getProperty(name);</pre></td></tr>
-<tr> <td class="numLineCover"> 618</td> <td class="nbHitsUncovered"><a title="Line 618: Conditional coverage 87% (7/8) [each condition: 100%, 50%, 100%, 100%]."> 250</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 618: Conditional coverage 87% (7/8) [each condition: 100%, 50%, 100%, 100%]."> <span class="keyword">boolean</span> equal = (value == <span class="keyword">null</span> && newValue == <span class="keyword">null</span>)</a></span></pre></td></tr>
-<tr> <td class="numLine"> 619</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 609</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Set<String> differentKeys = <span class="keyword">new</span> HashSet<String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 610</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Set<String> names = <span class="keyword">new</span> HashSet<String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 611</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> names.addAll(config.stringPropertyNames());</pre></td></tr>
+<tr> <td class="numLineCover"> 612</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> names.addAll(newConfig.stringPropertyNames());</pre></td></tr>
+<tr> <td class="numLineCover"> 613</td> <td class="nbHitsCovered"><a title="Line 613: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 613: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String name : names) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 614</td> <td class="nbHitsCovered"> 258</td> <td class="src"><pre class="src"> String value = config.getProperty(name);</pre></td></tr>
+<tr> <td class="numLineCover"> 615</td> <td class="nbHitsCovered"> 258</td> <td class="src"><pre class="src"> String newValue = newConfig.getProperty(name);</pre></td></tr>
+<tr> <td class="numLineCover"> 616</td> <td class="nbHitsUncovered"><a title="Line 616: Conditional coverage 87% (7/8) [each condition: 100%, 50%, 100%, 100%]."> 258</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 616: Conditional coverage 87% (7/8) [each condition: 100%, 50%, 100%, 100%]."> <span class="keyword">boolean</span> equal = (value == <span class="keyword">null</span> && newValue == <span class="keyword">null</span>)</a></span></pre></td></tr>
+<tr> <td class="numLine"> 617</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> || (value != <span class="keyword">null</span> && value.equals(newValue));</pre></td></tr>
-<tr> <td class="numLineCover"> 620</td> <td class="nbHitsCovered"><a title="Line 620: Conditional coverage 100% (2/2)."> 250</a></td> <td class="src"><pre class="src"> <a title="Line 620: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!equal) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 621</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> differentKeys.add(name);</pre></td></tr>
-<tr> <td class="numLine"> 622</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 618</td> <td class="nbHitsCovered"><a title="Line 618: Conditional coverage 100% (2/2)."> 258</a></td> <td class="src"><pre class="src"> <a title="Line 618: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!equal) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 619</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> differentKeys.add(name);</pre></td></tr>
+<tr> <td class="numLine"> 620</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 623</td> <td class="nbHitsCovered"> 250</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 624</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">return</span> differentKeys;</pre></td></tr>
+<tr> <td class="numLineCover"> 621</td> <td class="nbHitsCovered"> 258</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 622</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">return</span> differentKeys;</pre></td></tr>
+<tr> <td class="numLine"> 623</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 624</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 625</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 626</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 627</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 628</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Loads {@code adaptor-config.properties} in the current directory, if it</span></pre></td></tr>
-<tr> <td class="numLine"> 629</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * exists. It squelches any errors so that you are free to call it without</span></pre></td></tr>
-<tr> <td class="numLine"> 630</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * error handling, since this is typically non-fatal.</span></pre></td></tr>
-<tr> <td class="numLine"> 631</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 632</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> loadDefaultConfigFile() {</pre></td></tr>
-<tr> <td class="numLineCover"> 633</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> configFile = defaultConfigFile;</pre></td></tr>
-<tr> <td class="numLineCover"> 634</td> <td class="nbHitsUncovered"><a title="Line 634: Conditional coverage 75% (3/4) [each condition: 100%, 50%]."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 634: Conditional coverage 75% (3/4) [each condition: 100%, 50%]."> <span class="keyword">if</span> (configFile.exists() && configFile.isFile()) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 635</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 636</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> load(configFile);</pre></td></tr>
-<tr> <td class="numLineCover"> 637</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 638</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> System.err.println(<span class="string">"Exception when reading "</span> + configFile);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 639</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ex.printStackTrace(System.err);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 640</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 641</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 642</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 643</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 644</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> validate() {</pre></td></tr>
-<tr> <td class="numLineCover"> 645</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> validate(config);</pre></td></tr>
-<tr> <td class="numLineCover"> 646</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 647</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 626</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> validate(config);</pre></td></tr>
+<tr> <td class="numLineCover"> 627</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 628</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 648</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 629</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> validate(Properties config) {</pre></td></tr>
-<tr> <td class="numLineCover"> 649</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> Set<String> unset = <span class="keyword">new</span> HashSet<String>();</pre></td></tr>
-<tr> <td class="numLineCover"> 650</td> <td class="nbHitsCovered"><a title="Line 650: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 650: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String key : noDefaultConfig) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 651</td> <td class="nbHitsCovered"><a title="Line 651: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 651: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (config.getProperty(key) == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 652</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> unset.add(key);</pre></td></tr>
-<tr> <td class="numLine"> 653</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 630</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> Set<String> unset = <span class="keyword">new</span> HashSet<String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 631</td> <td class="nbHitsCovered"><a title="Line 631: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 631: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String key : noDefaultConfig) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 632</td> <td class="nbHitsCovered"><a title="Line 632: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 632: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (config.getProperty(key) == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 633</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> unset.add(key);</pre></td></tr>
+<tr> <td class="numLine"> 634</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 654</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 635</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 655</td> <td class="nbHitsCovered"><a title="Line 655: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 655: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (unset.size() != 0) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 656</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Missing configuration values: "</span> + unset);</pre></td></tr>
-<tr> <td class="numLine"> 657</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 636</td> <td class="nbHitsCovered"><a title="Line 636: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 636: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (unset.size() != 0) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 637</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Missing configuration values: "</span> + unset);</pre></td></tr>
+<tr> <td class="numLine"> 638</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 658</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 659</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 639</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 640</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 660</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 641</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 661</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Load default configuration file and parse command line options.</span></pre></td></tr>
-<tr> <td class="numLine"> 662</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 663</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * @return unused command line arguments</span></pre></td></tr>
-<tr> <td class="numLine"> 664</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * @throws IllegalStateException when not all configuration keys have values</span></pre></td></tr>
-<tr> <td class="numLine"> 665</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 666</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String[] autoConfig(String[] args) {</pre></td></tr>
-<tr> <td class="numLine"> 667</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">int</span> i;</pre></td></tr>
-<tr> <td class="numLineCover"> 668</td> <td class="nbHitsCovered"><a title="Line 668: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 668: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (i = 0; i < args.length; i++) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 669</td> <td class="nbHitsUncovered"><a title="Line 669: Conditional coverage 50% (1/2)."> 2</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 669: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!args[i].startsWith(<span class="string">"-D"</span>)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 670</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 671</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 672</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> String arg = args[i].substring(2);</pre></td></tr>
-<tr> <td class="numLineCover"> 673</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> String[] parts = arg.split(<span class="string">"="</span>, 2);</pre></td></tr>
-<tr> <td class="numLineCover"> 674</td> <td class="nbHitsUncovered"><a title="Line 674: Conditional coverage 50% (1/2)."> 2</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 674: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (parts.length < 2) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 675</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 676</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 677</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> setValue(parts[0], parts[1]);</pre></td></tr>
-<tr> <td class="numLine"> 678</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 679</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> loadDefaultConfigFile();</pre></td></tr>
-<tr> <td class="numLineCover"> 680</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> validate();</pre></td></tr>
-<tr> <td class="numLineCover"> 681</td> <td class="nbHitsCovered"><a title="Line 681: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 681: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (i == 0) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 682</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> args;</pre></td></tr>
-<tr> <td class="numLine"> 683</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 684</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Arrays.copyOfRange(args, i, args.length);</pre></td></tr>
-<tr> <td class="numLine"> 685</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 686</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 687</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 688</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 689</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 642</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Get a configuration value exactly as provided in configuration. Generally,</span></pre></td></tr>
-<tr> <td class="numLine"> 690</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 643</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * {@link #getValue} should be used instead of this method.</span></pre></td></tr>
-<tr> <td class="numLine"> 691</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 644</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 692</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 645</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * @return raw non-{@code null} value of {@code key}</span></pre></td></tr>
-<tr> <td class="numLine"> 693</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 646</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * @throws IllegalStateException if {@code key} has no value</span></pre></td></tr>
+<tr> <td class="numLine"> 647</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 648</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> String getRawValue(String key) {</pre></td></tr>
+<tr> <td class="numLineCover"> 649</td> <td class="nbHitsCovered"> 745</td> <td class="src"><pre class="src"> String value = config.getProperty(key);</pre></td></tr>
+<tr> <td class="numLineCover"> 650</td> <td class="nbHitsUncovered"><a title="Line 650: Conditional coverage 50% (1/2)."> 745</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 650: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (value == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 651</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(MessageFormat.format(</span></pre></td></tr>
+<tr> <td class="numLine"> 652</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"You must set configuration key ''{0}''."</span>, key));</pre></td></tr>
+<tr> <td class="numLine"> 653</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 654</td> <td class="nbHitsCovered"> 745</td> <td class="src"><pre class="src"> <span class="keyword">return</span> value;</pre></td></tr>
+<tr> <td class="numLine"> 655</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 656</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 657</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 658</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Get a configuration value as computed based on the configuration. Some</span></pre></td></tr>
+<tr> <td class="numLine"> 659</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * configuration values can be generated from other values. This method</span></pre></td></tr>
+<tr> <td class="numLine"> 660</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * returns that computed configuration value instead of the raw value provided</span></pre></td></tr>
+<tr> <td class="numLine"> 661</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * in configuration. This method should be preferred over {@link</span></pre></td></tr>
+<tr> <td class="numLine"> 662</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * #getRawValue}.</span></pre></td></tr>
+<tr> <td class="numLine"> 663</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 664</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * @return non-{@code null} value of {@code key}</span></pre></td></tr>
+<tr> <td class="numLine"> 665</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * @throws IllegalStateException if {@code key} has no value</span></pre></td></tr>
+<tr> <td class="numLine"> 666</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 667</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> String getValue(String key) {</pre></td></tr>
+<tr> <td class="numLineCover"> 668</td> <td class="nbHitsCovered"> 744</td> <td class="src"><pre class="src"> String value = getRawValue(key);</pre></td></tr>
+<tr> <td class="numLineCover"> 669</td> <td class="nbHitsCovered"> 744</td> <td class="src"><pre class="src"> ValueComputer computer = computeMap.get(key);</pre></td></tr>
+<tr> <td class="numLineCover"> 670</td> <td class="nbHitsCovered"><a title="Line 670: Conditional coverage 100% (2/2)."> 744</a></td> <td class="src"><pre class="src"> <a title="Line 670: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (computer != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 671</td> <td class="nbHitsCovered"> 109</td> <td class="src"><pre class="src"> value = computer.compute(value);</pre></td></tr>
+<tr> <td class="numLine"> 672</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 673</td> <td class="nbHitsCovered"> 744</td> <td class="src"><pre class="src"> <span class="keyword">return</span> value;</pre></td></tr>
+<tr> <td class="numLine"> 674</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 675</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 676</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 677</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Gets all configuration values that begin with {@code prefix}, returning</span></pre></td></tr>
+<tr> <td class="numLine"> 678</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * them as a map with the keys having {@code prefix} removed.</span></pre></td></tr>
+<tr> <td class="numLine"> 679</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 680</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> Map<String, String> getValuesWithPrefix(String prefix) {</pre></td></tr>
+<tr> <td class="numLineCover"> 681</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> Map<String, String> values = <span class="keyword">new</span> HashMap<String, String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 682</td> <td class="nbHitsCovered"><a title="Line 682: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 682: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String key : config.stringPropertyNames()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 683</td> <td class="nbHitsCovered"><a title="Line 683: Conditional coverage 100% (2/2)."> 254</a></td> <td class="src"><pre class="src"> <a title="Line 683: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!key.startsWith(prefix)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 684</td> <td class="nbHitsCovered"> 243</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
+<tr> <td class="numLine"> 685</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 686</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> values.put(key.substring(prefix.length()), config.getProperty(key));</pre></td></tr>
+<tr> <td class="numLine"> 687</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 688</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">return</span> values;</pre></td></tr>
+<tr> <td class="numLine"> 689</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 690</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 691</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 692</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Add configuration key. If {@code defaultValue} is {@code null}, then no</span></pre></td></tr>
+<tr> <td class="numLine"> 693</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * default value is used and the user must provide one.</span></pre></td></tr>
<tr> <td class="numLine"> 694</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 695</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getRawValue(String key) {</pre></td></tr>
-<tr> <td class="numLineCover"> 696</td> <td class="nbHitsCovered"> 697</td> <td class="src"><pre class="src"> String value = config.getProperty(key);</pre></td></tr>
-<tr> <td class="numLineCover"> 697</td> <td class="nbHitsUncovered"><a title="Line 697: Conditional coverage 50% (1/2)."> 697</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 697: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (value == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 698</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(MessageFormat.format(</span></pre></td></tr>
-<tr> <td class="numLine"> 699</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"You must set configuration key ''{0}''."</span>, key));</pre></td></tr>
-<tr> <td class="numLine"> 700</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> addKey(String key, String defaultValue) {</pre></td></tr>
+<tr> <td class="numLineCover"> 696</td> <td class="nbHitsCovered"><a title="Line 696: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 2856</a></td> <td class="src"><pre class="src"> <a title="Line 696: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (defaultConfig.containsKey(key) || noDefaultConfig.contains(key)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 697</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Key already added: "</span> + key);</pre></td></tr>
+<tr> <td class="numLine"> 698</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 701</td> <td class="nbHitsCovered"> 697</td> <td class="src"><pre class="src"> <span class="keyword">return</span> value;</pre></td></tr>
-<tr> <td class="numLine"> 702</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 699</td> <td class="nbHitsCovered"><a title="Line 699: Conditional coverage 100% (2/2)."> 2854</a></td> <td class="src"><pre class="src"> <a title="Line 699: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (defaultValue == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 700</td> <td class="nbHitsCovered"> 92</td> <td class="src"><pre class="src"> noDefaultConfig.add(key);</pre></td></tr>
+<tr> <td class="numLine"> 701</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 702</td> <td class="nbHitsCovered"> 2762</td> <td class="src"><pre class="src"> defaultConfig.setProperty(key, defaultValue);</pre></td></tr>
<tr> <td class="numLine"> 703</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 704</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 704</td> <td class="nbHitsCovered"> 2854</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 705</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Get a configuration value as computed based on the configuration. Some</span></pre></td></tr>
-<tr> <td class="numLine"> 706</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * configuration values can be generated from other values. This method</span></pre></td></tr>
-<tr> <td class="numLine"> 707</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * returns that computed configuration value instead of the raw value provided</span></pre></td></tr>
-<tr> <td class="numLine"> 708</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * in configuration. This method should be preferred over {@link</span></pre></td></tr>
-<tr> <td class="numLine"> 709</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * #getRawValue}.</span></pre></td></tr>
-<tr> <td class="numLine"> 710</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 711</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * @return non-{@code null} value of {@code key}</span></pre></td></tr>
-<tr> <td class="numLine"> 712</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * @throws IllegalStateException if {@code key} has no value</span></pre></td></tr>
-<tr> <td class="numLine"> 713</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 714</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> String getValue(String key) {</pre></td></tr>
-<tr> <td class="numLineCover"> 715</td> <td class="nbHitsCovered"> 696</td> <td class="src"><pre class="src"> String value = getRawValue(key);</pre></td></tr>
-<tr> <td class="numLineCover"> 716</td> <td class="nbHitsCovered"> 696</td> <td class="src"><pre class="src"> ValueComputer computer = computeMap.get(key);</pre></td></tr>
-<tr> <td class="numLineCover"> 717</td> <td class="nbHitsCovered"><a title="Line 717: Conditional coverage 100% (2/2)."> 696</a></td> <td class="src"><pre class="src"> <a title="Line 717: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (computer != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 718</td> <td class="nbHitsCovered"> 103</td> <td class="src"><pre class="src"> value = computer.compute(value);</pre></td></tr>
-<tr> <td class="numLine"> 719</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 720</td> <td class="nbHitsCovered"> 696</td> <td class="src"><pre class="src"> <span class="keyword">return</span> value;</pre></td></tr>
-<tr> <td class="numLine"> 721</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 722</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 723</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 706</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> addKey(String key, String defaultValue,</pre></td></tr>
+<tr> <td class="numLine"> 707</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> ValueComputer computer) {</pre></td></tr>
+<tr> <td class="numLineCover"> 708</td> <td class="nbHitsCovered"> 271</td> <td class="src"><pre class="src"> addKey(key, defaultValue);</pre></td></tr>
+<tr> <td class="numLineCover"> 709</td> <td class="nbHitsCovered"> 271</td> <td class="src"><pre class="src"> computeMap.put(key, computer);</pre></td></tr>
+<tr> <td class="numLineCover"> 710</td> <td class="nbHitsCovered"> 271</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 711</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 712</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 724</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Gets all configuration values that begin with {@code prefix}, returning</span></pre></td></tr>
-<tr> <td class="numLine"> 725</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * them as a map with the keys having {@code prefix} removed.</span></pre></td></tr>
-<tr> <td class="numLine"> 726</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 713</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Change the default value of a preexisting configuration key. If {@code</span></pre></td></tr>
+<tr> <td class="numLine"> 714</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * defaultValue} is {@code null}, then no default is used and the user must</span></pre></td></tr>
+<tr> <td class="numLine"> 715</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * provide one.</span></pre></td></tr>
+<tr> <td class="numLine"> 716</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 727</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> Map<String, String> getValuesWithPrefix(String prefix) {</pre></td></tr>
-<tr> <td class="numLineCover"> 728</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> Map<String, String> values = <span class="keyword">new</span> HashMap<String, String>();</pre></td></tr>
-<tr> <td class="numLineCover"> 729</td> <td class="nbHitsCovered"><a title="Line 729: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 729: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String key : config.stringPropertyNames()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 730</td> <td class="nbHitsCovered"><a title="Line 730: Conditional coverage 100% (2/2)."> 247</a></td> <td class="src"><pre class="src"> <a title="Line 730: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!key.startsWith(prefix)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 731</td> <td class="nbHitsCovered"> 236</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
-<tr> <td class="numLine"> 732</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 733</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> values.put(key.substring(prefix.length()), config.getProperty(key));</pre></td></tr>
-<tr> <td class="numLine"> 734</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 717</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> overrideKey(String key, String defaultValue) {</pre></td></tr>
+<tr> <td class="numLineCover"> 718</td> <td class="nbHitsUncovered"><a title="Line 718: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 718: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> <span class="keyword">if</span> (!defaultConfig.containsKey(key) && !noDefaultConfig.contains(key)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 719</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Overriding unknown configuration key: {0}"</span>, key);</span></pre></td></tr>
+<tr> <td class="numLine"> 720</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 735</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">return</span> values;</pre></td></tr>
-<tr> <td class="numLine"> 736</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 721</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> defaultConfig.remove(key);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 722</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> noDefaultConfig.remove(key);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 723</td> <td class="nbHitsUncovered"><a title="Line 723: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 723: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (defaultValue == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 724</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> noDefaultConfig.add(key);</span></pre></td></tr>
+<tr> <td class="numLine"> 725</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 726</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> defaultConfig.setProperty(key, defaultValue);</span></pre></td></tr>
+<tr> <td class="numLine"> 727</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 728</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 729</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 730</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 731</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Manually set a configuration value. Depending on when called, it can</span></pre></td></tr>
+<tr> <td class="numLine"> 732</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * override a user's configuration, which should be avoided.</span></pre></td></tr>
+<tr> <td class="numLine"> 733</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 734</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> setValue(String key, String value) {</pre></td></tr>
+<tr> <td class="numLineCover"> 735</td> <td class="nbHitsCovered"> 126</td> <td class="src"><pre class="src"> config.setProperty(key, value);</pre></td></tr>
+<tr> <td class="numLineCover"> 736</td> <td class="nbHitsCovered"> 126</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 737</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 738</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 739</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Add configuration key. If {@code defaultValue} is {@code null}, then no</span></pre></td></tr>
-<tr> <td class="numLine"> 740</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * default value is used and the user must provide one.</span></pre></td></tr>
-<tr> <td class="numLine"> 741</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 742</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> addKey(String key, String defaultValue) {</pre></td></tr>
-<tr> <td class="numLineCover"> 743</td> <td class="nbHitsCovered"><a title="Line 743: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 2736</a></td> <td class="src"><pre class="src"> <a title="Line 743: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (defaultConfig.containsKey(key) || noDefaultConfig.contains(key)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 744</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Key already added: "</span> + key);</pre></td></tr>
-<tr> <td class="numLine"> 745</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 746</td> <td class="nbHitsCovered"><a title="Line 746: Conditional coverage 100% (2/2)."> 2734</a></td> <td class="src"><pre class="src"> <a title="Line 746: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (defaultValue == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 747</td> <td class="nbHitsCovered"> 91</td> <td class="src"><pre class="src"> noDefaultConfig.add(key);</pre></td></tr>
-<tr> <td class="numLine"> 748</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 749</td> <td class="nbHitsCovered"> 2643</td> <td class="src"><pre class="src"> defaultConfig.setProperty(key, defaultValue);</pre></td></tr>
-<tr> <td class="numLine"> 750</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 751</td> <td class="nbHitsCovered"> 2734</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 752</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 753</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> addKey(String key, String defaultValue,</pre></td></tr>
-<tr> <td class="numLine"> 754</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> ValueComputer computer) {</pre></td></tr>
-<tr> <td class="numLineCover"> 755</td> <td class="nbHitsCovered"> 268</td> <td class="src"><pre class="src"> addKey(key, defaultValue);</pre></td></tr>
-<tr> <td class="numLineCover"> 756</td> <td class="nbHitsCovered"> 268</td> <td class="src"><pre class="src"> computeMap.put(key, computer);</pre></td></tr>
-<tr> <td class="numLineCover"> 757</td> <td class="nbHitsCovered"> 268</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 758</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 759</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 760</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Change the default value of a preexisting configuration key. If {@code</span></pre></td></tr>
-<tr> <td class="numLine"> 761</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * defaultValue} is {@code null}, then no default is used and the user must</span></pre></td></tr>
-<tr> <td class="numLine"> 762</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * provide one.</span></pre></td></tr>
-<tr> <td class="numLine"> 763</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 764</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> overrideKey(String key, String defaultValue) {</pre></td></tr>
-<tr> <td class="numLineCover"> 765</td> <td class="nbHitsUncovered"><a title="Line 765: Conditional coverage 25% (1/4) [each condition: 50%, 0%]."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 765: Conditional coverage 25% (1/4) [each condition: 50%, 0%]."> <span class="keyword">if</span> (!defaultConfig.containsKey(key) && !noDefaultConfig.contains(key)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 766</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Overriding unknown configuration key: {0}"</span>, key);</span></pre></td></tr>
-<tr> <td class="numLine"> 767</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 768</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> defaultConfig.remove(key);</pre></td></tr>
-<tr> <td class="numLineCover"> 769</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> noDefaultConfig.remove(key);</pre></td></tr>
-<tr> <td class="numLineCover"> 770</td> <td class="nbHitsUncovered"><a title="Line 770: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 770: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (defaultValue == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 771</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> noDefaultConfig.add(key);</span></pre></td></tr>
-<tr> <td class="numLine"> 772</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 773</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> defaultConfig.setProperty(key, defaultValue);</pre></td></tr>
-<tr> <td class="numLine"> 774</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 775</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 776</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 777</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 778</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Manually set a configuration value. Depending on when called, it can</span></pre></td></tr>
-<tr> <td class="numLine"> 779</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * override a user's configuration, which should be avoided.</span></pre></td></tr>
-<tr> <td class="numLine"> 780</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 781</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> setValue(String key, String value) {</pre></td></tr>
-<tr> <td class="numLineCover"> 782</td> <td class="nbHitsCovered"> 111</td> <td class="src"><pre class="src"> config.setProperty(key, value);</pre></td></tr>
-<tr> <td class="numLineCover"> 783</td> <td class="nbHitsCovered"> 111</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 784</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 785</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">void</span> addConfigModificationListener(</pre></td></tr>
-<tr> <td class="numLine"> 786</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 739</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> ConfigModificationListener listener) {</pre></td></tr>
-<tr> <td class="numLineCover"> 787</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> modificationListeners.add(listener);</pre></td></tr>
-<tr> <td class="numLineCover"> 788</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 789</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 740</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> modificationListeners.add(listener);</pre></td></tr>
+<tr> <td class="numLineCover"> 741</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 742</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 790</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 743</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">void</span> removeConfigModificationListener(</pre></td></tr>
-<tr> <td class="numLine"> 791</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 744</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> ConfigModificationListener listener) {</pre></td></tr>
-<tr> <td class="numLineCover"> 792</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> modificationListeners.remove(listener);</pre></td></tr>
-<tr> <td class="numLineCover"> 793</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 794</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 745</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> modificationListeners.remove(listener);</pre></td></tr>
+<tr> <td class="numLineCover"> 746</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 747</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 795</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 748</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> fireConfigModificationEvent(Config oldConfig,</pre></td></tr>
-<tr> <td class="numLine"> 796</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 749</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Set<String> modifiedKeys) {</pre></td></tr>
-<tr> <td class="numLineCover"> 797</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> ConfigModificationEvent ev</pre></td></tr>
-<tr> <td class="numLine"> 798</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 750</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> ConfigModificationEvent ev</pre></td></tr>
+<tr> <td class="numLine"> 751</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> ConfigModificationEvent(<span class="keyword">this</span>, oldConfig, modifiedKeys);</pre></td></tr>
-<tr> <td class="numLineCover"> 799</td> <td class="nbHitsCovered"><a title="Line 799: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 799: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (ConfigModificationListener listener : modificationListeners) {</a></pre></td></tr>
-<tr> <td class="numLine"> 800</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 752</td> <td class="nbHitsCovered"><a title="Line 752: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 752: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (ConfigModificationListener listener : modificationListeners) {</a></pre></td></tr>
+<tr> <td class="numLine"> 753</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 801</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> listener.configModified(ev);</pre></td></tr>
-<tr> <td class="numLineCover"> 802</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 803</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING,</span></pre></td></tr>
-<tr> <td class="numLine"> 804</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 754</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> listener.configModified(ev);</pre></td></tr>
+<tr> <td class="numLineCover"> 755</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 756</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING,</span></pre></td></tr>
+<tr> <td class="numLine"> 757</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"Unexpected exception. Consider filing a bug."</span>, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 805</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 806</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 758</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 759</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 807</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 808</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 760</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 761</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 809</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 762</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">interface</span> ValueComputer {</pre></td></tr>
-<tr> <td class="numLine"> 810</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 763</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 811</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 764</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Computes the effective value of a configuration value provided the</span></pre></td></tr>
-<tr> <td class="numLine"> 812</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 765</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * literal value provided in configuration.</span></pre></td></tr>
-<tr> <td class="numLine"> 813</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 766</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 814</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 767</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String compute(String rawValue);</pre></td></tr>
-<tr> <td class="numLine"> 815</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 768</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 816</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 769</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.CronScheduler.html b/coverage/com.google.enterprise.adaptor.CronScheduler.html
index 77d6a76..85d8751 100644
--- a/coverage/com.google.enterprise.adaptor.CronScheduler.html
+++ b/coverage/com.google.enterprise.adaptor.CronScheduler.html
@@ -62,21 +62,21 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 20</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> CronScheduler(ScheduledExecutorService executor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 21</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(executor, <span class="keyword">new</span> SystemTimeProvider(), TimeZone.getDefault());</pre></td></tr>
-<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 21</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(executor, <span class="keyword">new</span> SystemTimeProvider(), TimeZone.getDefault());</pre></td></tr>
+<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> CronScheduler(ScheduledExecutorService executor, TimeProvider timeProvider,</pre></td></tr>
-<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> TimeZone timeZone) {</pre></td></tr>
-<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"><a title="Line 26: Conditional coverage 100% (2/2)."> 20</a></td> <td class="src"><pre class="src"> <a title="Line 26: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (executor == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> TimeZone timeZone) {</pre></td></tr>
+<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"><a title="Line 26: Conditional coverage 100% (2/2)."> 21</a></td> <td class="src"><pre class="src"> <a title="Line 26: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (executor == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 27</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.executor = executor;</pre></td></tr>
-<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeProvider = timeProvider;</pre></td></tr>
-<tr> <td class="numLineCover"> 31</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeZone = timeZone;</pre></td></tr>
-<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.executor = executor;</pre></td></tr>
+<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeProvider = timeProvider;</pre></td></tr>
+<tr> <td class="numLineCover"> 31</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeZone = timeZone;</pre></td></tr>
+<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
@@ -97,27 +97,27 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> Future<?> schedule(String pattern, Runnable runnable)</pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> IllegalArgumentException {</pre></td></tr>
-<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> CronPattern compiledPattern = CronPattern.create(pattern);</pre></td></tr>
-<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> CronFilterRunnable toRun</pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> CronPattern compiledPattern = CronPattern.create(pattern);</pre></td></tr>
+<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> CronFilterRunnable toRun</pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> CronFilterRunnable(compiledPattern, runnable);</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">final</span> <span class="keyword">long</span> minuteMillis = 60 * 1000;</pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">long</span> delayToNextMinuteMillis</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">final</span> <span class="keyword">long</span> minuteMillis = 60 * 1000;</pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">long</span> delayToNextMinuteMillis</pre></td></tr>
<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = minuteMillis - (timeProvider.currentTimeMillis() % minuteMillis);</pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Add a second to the delay, so we are less likely to fire before the</span></pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// minute starts.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">long</span> delayMillis = delayToNextMinuteMillis + 1000;</pre></td></tr>
+<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">long</span> delayMillis = delayToNextMinuteMillis + 1000;</pre></td></tr>
<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// If toRun takes a while to run, invocations to it will be queued and will</span></pre></td></tr>
<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// be run as soon as it completes.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> Future<?> future = executor.scheduleAtFixedRate(</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> Future<?> future = executor.scheduleAtFixedRate(</pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> toRun, delayMillis, minuteMillis, TimeUnit.MILLISECONDS);</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> CronFuture.create(future, toRun);</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> CronFuture.create(future, toRun);</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
@@ -148,10 +148,10 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Runnable delegate;</pre></td></tr>
<tr> <td class="numLine"> 74</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CronFilterRunnable(CronPattern pattern, Runnable delegate) {</pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.pattern = pattern;</pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delegate = delegate;</pre></td></tr>
-<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CronFilterRunnable(CronPattern pattern, Runnable delegate) {</pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.pattern = pattern;</pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delegate = delegate;</pre></td></tr>
+<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
@@ -196,7 +196,7 @@
<td class="src"><pre class="src"> <span class="comment"> * Forwards all calls to the delegate returned by {@link #delegate}.</span></pre></td></tr>
<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 36</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">abstract</span> <span class="keyword">static</span> <span class="keyword">class</span> ForwardingFuture<V> <span class="keyword">implements</span> Future<V> {</pre></td></tr>
+<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">abstract</span> <span class="keyword">static</span> <span class="keyword">class</span> ForwardingFuture<V> <span class="keyword">implements</span> Future<V> {</pre></td></tr>
<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">protected</span> <span class="keyword">abstract</span> Future<V> delegate();</pre></td></tr>
<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
@@ -258,17 +258,17 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> CronFilterRunnable runnable;</pre></td></tr>
<tr> <td class="numLine"> 139</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CronFuture(Future<V> delegate, CronFilterRunnable runnable) {</pre></td></tr>
-<tr> <td class="numLineCover"> 141</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delegate = delegate;</pre></td></tr>
-<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.runnable = runnable;</pre></td></tr>
-<tr> <td class="numLineCover"> 143</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CronFuture(Future<V> delegate, CronFilterRunnable runnable) {</pre></td></tr>
+<tr> <td class="numLineCover"> 141</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delegate = delegate;</pre></td></tr>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.runnable = runnable;</pre></td></tr>
+<tr> <td class="numLineCover"> 143</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 145</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <V> CronFuture<V> create(</pre></td></tr>
<tr> <td class="numLine"> 146</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Future<V> delegate, CronFilterRunnable runnable) {</pre></td></tr>
-<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> CronFuture<V>(delegate, runnable);</pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> CronFuture<V>(delegate, runnable);</pre></td></tr>
<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
@@ -350,13 +350,13 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> numberToIndex(<span class="keyword">int</span> i) {</pre></td></tr>
-<tr> <td class="numLineCover"> 198</td> <td class="nbHitsCovered"><a title="Line 198: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 83</a></td> <td class="src"><pre class="src"> <a title="Line 198: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (i < offset || i >= offset + numValues) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 198</td> <td class="nbHitsCovered"><a title="Line 198: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 85</a></td> <td class="src"><pre class="src"> <a title="Line 198: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (i < offset || i >= offset + numValues) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Bounds for "</span> + name()</pre></td></tr>
<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">" is "</span> + offset + <span class="string">"-"</span> + (offset + numValues - 1) + <span class="string">": "</span> + i);</pre></td></tr>
<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 81</td> <td class="src"><pre class="src"> <span class="keyword">return</span> i - offset;</pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 83</td> <td class="src"><pre class="src"> <span class="keyword">return</span> i - offset;</pre></td></tr>
<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
@@ -370,7 +370,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 209</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> numValues() {</pre></td></tr>
-<tr> <td class="numLineCover"> 210</td> <td class="nbHitsCovered"> 933</td> <td class="src"><pre class="src"> <span class="keyword">return</span> numValues;</pre></td></tr>
+<tr> <td class="numLineCover"> 210</td> <td class="nbHitsCovered"> 991</td> <td class="src"><pre class="src"> <span class="keyword">return</span> numValues;</pre></td></tr>
<tr> <td class="numLine"> 211</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 212</td> <td class="nbHits"> </td>
@@ -391,9 +391,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> List<BitSet> fields;</pre></td></tr>
<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 221</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">private</span> CronPattern(List<BitSet> fields) {</pre></td></tr>
-<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.fields = fields;</pre></td></tr>
-<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 221</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">private</span> CronPattern(List<BitSet> fields) {</pre></td></tr>
+<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.fields = fields;</pre></td></tr>
+<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
@@ -426,9 +426,9 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> CronPattern create(String timeSpecification)</pre></td></tr>
<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> IllegalArgumentException {</pre></td></tr>
-<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> timeSpecification = timeSpecification.trim();</pre></td></tr>
-<tr> <td class="numLineCover"> 245</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> String[] stringFields = timeSpecification.split(<span class="string">"\\s+"</span>, -1);</pre></td></tr>
-<tr> <td class="numLineCover"> 246</td> <td class="nbHitsCovered"><a title="Line 246: Conditional coverage 100% (2/2)."> 25</a></td> <td class="src"><pre class="src"> <a title="Line 246: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (stringFields.length != FIELDS.size()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> timeSpecification = timeSpecification.trim();</pre></td></tr>
+<tr> <td class="numLineCover"> 245</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> String[] stringFields = timeSpecification.split(<span class="string">"\\s+"</span>, -1);</pre></td></tr>
+<tr> <td class="numLineCover"> 246</td> <td class="nbHitsCovered"><a title="Line 246: Conditional coverage 100% (2/2)."> 26</a></td> <td class="src"><pre class="src"> <a title="Line 246: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (stringFields.length != FIELDS.size()) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 247</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(</pre></td></tr>
<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"Should have precisely 5 fields: "</span></pre></td></tr>
@@ -436,17 +436,17 @@
<td class="src"><pre class="src"> + <span class="string">"minute, hour, day of month, month, day of week"</span>);</pre></td></tr>
<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 251</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> List<BitSet> fields = <span class="keyword">new</span> ArrayList<BitSet>(FIELDS.size());</pre></td></tr>
-<tr> <td class="numLineCover"> 252</td> <td class="nbHitsCovered"><a title="Line 252: Conditional coverage 100% (2/2)."> 138</a></td> <td class="src"><pre class="src"> <a title="Line 252: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < FIELDS.size(); i++) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 117</td> <td class="src"><pre class="src"> String stringField = stringFields[i];</pre></td></tr>
-<tr> <td class="numLineCover"> 254</td> <td class="nbHitsCovered"> 117</td> <td class="src"><pre class="src"> Field fieldType = FIELDS.get(i);</pre></td></tr>
-<tr> <td class="numLineCover"> 255</td> <td class="nbHitsCovered"> 117</td> <td class="src"><pre class="src"> BitSet set = <span class="keyword">new</span> BitSet(fieldType.numValues());</pre></td></tr>
-<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"><a title="Line 256: Conditional coverage 100% (2/2)."> 231</a></td> <td class="src"><pre class="src"> <a title="Line 256: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String element : stringField.split(<span class="string">","</span>, -1)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 257</td> <td class="nbHitsCovered"> 117</td> <td class="src"><pre class="src"> <span class="keyword">int</span> step = 1;</pre></td></tr>
+<tr> <td class="numLineCover"> 251</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> List<BitSet> fields = <span class="keyword">new</span> ArrayList<BitSet>(FIELDS.size());</pre></td></tr>
+<tr> <td class="numLineCover"> 252</td> <td class="nbHitsCovered"><a title="Line 252: Conditional coverage 100% (2/2)."> 144</a></td> <td class="src"><pre class="src"> <a title="Line 252: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < FIELDS.size(); i++) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 122</td> <td class="src"><pre class="src"> String stringField = stringFields[i];</pre></td></tr>
+<tr> <td class="numLineCover"> 254</td> <td class="nbHitsCovered"> 122</td> <td class="src"><pre class="src"> Field fieldType = FIELDS.get(i);</pre></td></tr>
+<tr> <td class="numLineCover"> 255</td> <td class="nbHitsCovered"> 122</td> <td class="src"><pre class="src"> BitSet set = <span class="keyword">new</span> BitSet(fieldType.numValues());</pre></td></tr>
+<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"><a title="Line 256: Conditional coverage 100% (2/2)."> 241</a></td> <td class="src"><pre class="src"> <a title="Line 256: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String element : stringField.split(<span class="string">","</span>, -1)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 257</td> <td class="nbHitsCovered"> 122</td> <td class="src"><pre class="src"> <span class="keyword">int</span> step = 1;</pre></td></tr>
<tr> <td class="numLine"> 258</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> {</pre></td></tr>
-<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 117</td> <td class="src"><pre class="src"> String[] parts = element.split(<span class="string">"/"</span>, 2);</pre></td></tr>
-<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"><a title="Line 260: Conditional coverage 100% (2/2)."> 117</a></td> <td class="src"><pre class="src"> <a title="Line 260: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (parts.length == 2) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 122</td> <td class="src"><pre class="src"> String[] parts = element.split(<span class="string">"/"</span>, 2);</pre></td></tr>
+<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"><a title="Line 260: Conditional coverage 100% (2/2)."> 122</a></td> <td class="src"><pre class="src"> <a title="Line 260: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (parts.length == 2) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 261</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> element = parts[0];</pre></td></tr>
<tr> <td class="numLineCover"> 262</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> step = Integer.parseInt(parts[1]);</pre></td></tr>
<tr> <td class="numLine"> 263</td> <td class="nbHits"> </td>
@@ -455,16 +455,16 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 265</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 266</td> <td class="nbHitsCovered"><a title="Line 266: Conditional coverage 100% (2/2)."> 117</a></td> <td class="src"><pre class="src"> <a title="Line 266: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"*"</span>.equals(element)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 267</td> <td class="nbHitsCovered"><a title="Line 267: Conditional coverage 100% (2/2)."> 816</a></td> <td class="src"><pre class="src"> <a title="Line 267: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> j = 0; j < fieldType.numValues(); j += step) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 268</td> <td class="nbHitsCovered"> 775</td> <td class="src"><pre class="src"> set.set(j);</pre></td></tr>
+<tr> <td class="numLineCover"> 266</td> <td class="nbHitsCovered"><a title="Line 266: Conditional coverage 100% (2/2)."> 122</a></td> <td class="src"><pre class="src"> <a title="Line 266: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"*"</span>.equals(element)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 267</td> <td class="nbHitsCovered"><a title="Line 267: Conditional coverage 100% (2/2)."> 869</a></td> <td class="src"><pre class="src"> <a title="Line 267: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> j = 0; j < fieldType.numValues(); j += step) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 268</td> <td class="nbHitsCovered"> 825</td> <td class="src"><pre class="src"> set.set(j);</pre></td></tr>
<tr> <td class="numLine"> 269</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 270</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> { <span class="comment">// Is numerical, which permits ranges.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"> 76</td> <td class="src"><pre class="src"> <span class="keyword">int</span>[] range = stringsToInts(element.split(<span class="string">"-"</span>, 2));</pre></td></tr>
-<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"><a title="Line 272: Conditional coverage 100% (2/2)."> 75</a></td> <td class="src"><pre class="src"> <a title="Line 272: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (range.length == 1) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 273</td> <td class="nbHitsCovered"> 73</td> <td class="src"><pre class="src"> set.set(fieldType.numberToIndex(range[0]));</pre></td></tr>
+<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> <span class="keyword">int</span>[] range = stringsToInts(element.split(<span class="string">"-"</span>, 2));</pre></td></tr>
+<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"><a title="Line 272: Conditional coverage 100% (2/2)."> 77</a></td> <td class="src"><pre class="src"> <a title="Line 272: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (range.length == 1) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 273</td> <td class="nbHitsCovered"> 75</td> <td class="src"><pre class="src"> set.set(fieldType.numberToIndex(range[0]));</pre></td></tr>
<tr> <td class="numLine"> 274</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
<tr> <td class="numLine"> 275</td> <td class="nbHits"> </td>
@@ -485,22 +485,22 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 284</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 114</td> <td class="src"><pre class="src"> fields.add(set);</pre></td></tr>
+<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 119</td> <td class="src"><pre class="src"> fields.add(set);</pre></td></tr>
<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 287</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> CronPattern(fields);</pre></td></tr>
+<tr> <td class="numLineCover"> 287</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> CronPattern(fields);</pre></td></tr>
<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">int</span>[] stringsToInts(String[] ss) {</pre></td></tr>
-<tr> <td class="numLineCover"> 291</td> <td class="nbHitsCovered"> 76</td> <td class="src"><pre class="src"> <span class="keyword">int</span>[] is = <span class="keyword">new</span> <span class="keyword">int</span>[ss.length];</pre></td></tr>
-<tr> <td class="numLineCover"> 292</td> <td class="nbHitsCovered"><a title="Line 292: Conditional coverage 100% (2/2)."> 153</a></td> <td class="src"><pre class="src"> <a title="Line 292: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < ss.length; i++) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 293</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> is[i] = Integer.parseInt(ss[i]);</pre></td></tr>
+<tr> <td class="numLineCover"> 291</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> <span class="keyword">int</span>[] is = <span class="keyword">new</span> <span class="keyword">int</span>[ss.length];</pre></td></tr>
+<tr> <td class="numLineCover"> 292</td> <td class="nbHitsCovered"><a title="Line 292: Conditional coverage 100% (2/2)."> 157</a></td> <td class="src"><pre class="src"> <a title="Line 292: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < ss.length; i++) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 293</td> <td class="nbHitsCovered"> 80</td> <td class="src"><pre class="src"> is[i] = Integer.parseInt(ss[i]);</pre></td></tr>
<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 75</td> <td class="src"><pre class="src"> <span class="keyword">return</span> is;</pre></td></tr>
+<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 77</td> <td class="src"><pre class="src"> <span class="keyword">return</span> is;</pre></td></tr>
<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.Daemon.html b/coverage/com.google.enterprise.adaptor.Daemon.html
new file mode 100644
index 0000000..ac92116
--- /dev/null
+++ b/coverage/com.google.enterprise.adaptor.Daemon.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<title>Coverage Report</title>
+<link title="Style" type="text/css" rel="stylesheet" href="css/main.css"/>
+<script type="text/javascript" src="js/popup.js"></script>
+</head>
+<body>
+<h5>Coverage Report - com.google.enterprise.adaptor.Daemon</h5>
+<div class="separator"> </div>
+<table class="report">
+<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
+ <tr><td><a href="com.google.enterprise.adaptor.Daemon.html">Daemon</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">28/28</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.1666666666666665;</span>2.167</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Daemon.html">Daemon$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:55px"><span class="text">5/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.1666666666666665;</span>2.167</td></tr>
+
+</table>
+<div class="separator"> </div>
+<table cellspacing="0" cellpadding="0" class="src">
+<tr> <td class="numLine"> 1</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Copyright 2013 Google Inc. All Rights Reserved.</span></pre></td></tr>
+<tr> <td class="numLine"> 2</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
+<tr> <td class="numLine"> 3</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span></pre></td></tr>
+<tr> <td class="numLine"> 4</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// you may not use this file except in compliance with the License.</span></pre></td></tr>
+<tr> <td class="numLine"> 5</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// You may obtain a copy of the License at</span></pre></td></tr>
+<tr> <td class="numLine"> 6</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
+<tr> <td class="numLine"> 7</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></pre></td></tr>
+<tr> <td class="numLine"> 8</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
+<tr> <td class="numLine"> 9</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Unless required by applicable law or agreed to in writing, software</span></pre></td></tr>
+<tr> <td class="numLine"> 10</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span></pre></td></tr>
+<tr> <td class="numLine"> 11</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></pre></td></tr>
+<tr> <td class="numLine"> 12</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// See the License for the specific language governing permissions and</span></pre></td></tr>
+<tr> <td class="numLine"> 13</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// limitations under the License.</span></pre></td></tr>
+<tr> <td class="numLine"> 14</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 15</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">package</span> com.google.enterprise.adaptor;</pre></td></tr>
+<tr> <td class="numLine"> 16</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 17</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> com.google.common.annotations.VisibleForTesting;</pre></td></tr>
+<tr> <td class="numLine"> 18</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 19</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> org.apache.commons.daemon.DaemonContext;</pre></td></tr>
+<tr> <td class="numLine"> 20</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.Arrays;</pre></td></tr>
+<tr> <td class="numLine"> 22</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.concurrent.CountDownLatch;</pre></td></tr>
+<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.concurrent.TimeUnit;</pre></td></tr>
+<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 26</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Allows running an adaptor as a daemon when used in conjunction with procrun</span></pre></td></tr>
+<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * or jsvc.</span></pre></td></tr>
+<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <p>Example execution with jsvc:</span></pre></td></tr>
+<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <pre>jsvc -pidfile adaptor.pid -cp someadaptor-withlib.jar \</span></pre></td></tr>
+<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * com.google.enterprise.adaptor.Daemon package.SomeAdaptor</pre></span></pre></td></tr>
+<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> Daemon <span class="keyword">implements</span> org.apache.commons.daemon.Daemon {</pre></td></tr>
+<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> Application app;</pre></td></tr>
+<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> DaemonContext context;</pre></td></tr>
+<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> init(DaemonContext context) <span class="keyword">throws</span> Exception {</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"><a title="Line 39: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 39: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">this</span>.context != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Already initialized"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.context = context;</pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> String[] args = context.getArguments();</pre></td></tr>
+<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"><a title="Line 44: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 44: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (args.length < 1) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(</pre></td></tr>
+<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"Missing argument: adaptor class name"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> Adaptor adaptor</pre></td></tr>
+<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = Class.forName(args[0]).asSubclass(Adaptor.<span class="keyword">class</span>).newInstance();</pre></td></tr>
+<tr> <td class="numLineCover"> 50</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> args = Arrays.copyOfRange(args, 1, args.length);</pre></td></tr>
+<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> app = Application.daemonMain(adaptor, args);</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> app.daemonInit();</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> destroy() {</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"><a title="Line 58: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 58: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (app != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> app.daemonDestroy(5, TimeUnit.SECONDS);</pre></td></tr>
+<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> context = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> app = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> start() <span class="keyword">throws</span> Exception {</pre></td></tr>
+<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">final</span> Application savedApp;</pre></td></tr>
+<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">final</span> DaemonContext savedContext;</pre></td></tr>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">final</span> CountDownLatch latch = <span class="keyword">new</span> CountDownLatch(1);</pre></td></tr>
+<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Save values so that there aren't any races with stop/destroy.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> savedApp = <span class="keyword">this</span>.app;</pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> savedContext = <span class="keyword">this</span>.context;</pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Run in a new thread so that stop() can be called before we complete</span></pre></td></tr>
+<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// starting (since starting can take a long time if the Adaptor keeps</span></pre></td></tr>
+<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// throwing an exception). However, we still try to wait for start to</span></pre></td></tr>
+<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// complete normally to ease testing and improve the user experience in the</span></pre></td></tr>
+<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// common case of starting being quick.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 80</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">new</span> Thread(<span class="keyword">new</span> Runnable() {</pre></td></tr>
+<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> savedApp.daemonStart();</pre></td></tr>
+<tr> <td class="numLineCover"> 85</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
+<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// We must be shutting down.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> savedContext.getController().fail(ex);</span></pre></td></tr>
+<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> latch.countDown();</pre></td></tr>
+<tr> <td class="numLineCover"> 92</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 93</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }).start();</pre></td></tr>
+<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> latch.await(5, TimeUnit.SECONDS);</pre></td></tr>
+<tr> <td class="numLineCover"> 96</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> stop() <span class="keyword">throws</span> Exception {</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> app.daemonStop(5, TimeUnit.SECONDS);</pre></td></tr>
+<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @VisibleForTesting</pre></td></tr>
+<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> Application getApplication() {</pre></td></tr>
+<tr> <td class="numLineCover"> 105</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> app;</pre></td></tr>
+<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+</table>
+
+<div class="footer">Report generated by <a href="http://cobertura.sourceforge.net/" target="_top">Cobertura</a> 1.9.4.1.</div>
+</body>
+</html>
diff --git a/coverage/com.google.enterprise.adaptor.Dashboard.html b/coverage/com.google.enterprise.adaptor.Dashboard.html
index 8b5c500..bed6c35 100644
--- a/coverage/com.google.enterprise.adaptor.Dashboard.html
+++ b/coverage/com.google.enterprise.adaptor.Dashboard.html
@@ -100,7 +100,7 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> HttpServerScope scope;</pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> CircularLogRpcMethod circularLogRpcMethod;</pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> StatusMonitor monitor = <span class="keyword">new</span> StatusMonitor();</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> StatusMonitor monitor = <span class="keyword">new</span> StatusMonitor();</pre></td></tr>
<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> GsaCommunicationHandler gsaCommHandler;</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
@@ -113,61 +113,61 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> Dashboard(Config config, GsaCommunicationHandler gsaCommHandler,</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Journal journal, SessionManager<HttpExchange> sessionManager,</pre></td></tr>
-<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> SensitiveValueCodec secureValueCodec, Adaptor adaptor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.gsaCommHandler = gsaCommHandler;</pre></td></tr>
-<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
-<tr> <td class="numLineCover"> 49</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sessionManager = sessionManager;</pre></td></tr>
+<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> SensitiveValueCodec secureValueCodec, Adaptor adaptor) {</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.gsaCommHandler = gsaCommHandler;</pre></td></tr>
+<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
+<tr> <td class="numLineCover"> 49</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sessionManager = sessionManager;</pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler = <span class="keyword">new</span> RpcHandler(sessionManager);</pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"startFeedPush"</span>, <span class="keyword">new</span> StartFeedPushRpcMethod());</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"startIncrementalFeedPush"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler = <span class="keyword">new</span> RpcHandler(sessionManager);</pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"startFeedPush"</span>, <span class="keyword">new</span> StartFeedPushRpcMethod());</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"startIncrementalFeedPush"</span>,</pre></td></tr>
<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> StartIncrementalFeedPushRpcMethod());</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> circularLogRpcMethod = <span class="keyword">new</span> CircularLogRpcMethod();</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"getLog"</span>, circularLogRpcMethod);</pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"getConfig"</span>, <span class="keyword">new</span> ConfigRpcMethod(config));</pre></td></tr>
-<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"getStats"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> circularLogRpcMethod = <span class="keyword">new</span> CircularLogRpcMethod();</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"getLog"</span>, circularLogRpcMethod);</pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"getConfig"</span>, <span class="keyword">new</span> ConfigRpcMethod(config));</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"getStats"</span>,</pre></td></tr>
<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> StatRpcMethod(journal, adaptor));</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"getStatuses"</span>, <span class="keyword">new</span> StatusRpcMethod(monitor));</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"checkForUpdatedConfig"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"getStatuses"</span>, <span class="keyword">new</span> StatusRpcMethod(monitor));</pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"checkForUpdatedConfig"</span>,</pre></td></tr>
<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> CheckForUpdatedConfigRpcMethod(gsaCommHandler));</pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"encodeSensitiveValue"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> rpcHandler.registerRpcMethod(<span class="string">"encodeSensitiveValue"</span>,</pre></td></tr>
<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> EncodeSensitiveValueMethod(secureValueCodec));</pre></td></tr>
<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> monitor.addSource(<span class="keyword">new</span> LastPushStatusSource(journal));</pre></td></tr>
-<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> monitor.addSource(<span class="keyword">new</span> RetrieverStatusSource(journal));</pre></td></tr>
-<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> monitor.addSource(<span class="keyword">new</span> GsaCrawlingStatusSource(journal));</pre></td></tr>
-<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> monitor.addSource(<span class="keyword">new</span> LastPushStatusSource(journal));</pre></td></tr>
+<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> monitor.addSource(<span class="keyword">new</span> RetrieverStatusSource(journal));</pre></td></tr>
+<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> monitor.addSource(<span class="keyword">new</span> GsaCrawlingStatusSource(journal));</pre></td></tr>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Starts listening for connections to the dashboard. */</span></pre></td></tr>
<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> start(HttpServer dashboardServer) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.scope = <span class="keyword">new</span> HttpServerScope(dashboardServer);</pre></td></tr>
-<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">int</span> dashboardPort = dashboardServer.getAddress().getPort();</pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"><a title="Line 75: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 75: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (dashboardPort != config.getServerDashboardPort()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> config.setValue(<span class="string">"server.dashboardPort"</span>, <span class="string">""</span> + dashboardPort);</pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.scope = <span class="keyword">new</span> HttpServerScope(dashboardServer);</pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">int</span> dashboardPort = dashboardServer.getAddress().getPort();</pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"><a title="Line 75: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 75: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (dashboardPort != config.getServerDashboardPort()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> config.setValue(<span class="string">"server.dashboardPort"</span>, <span class="string">""</span> + dashboardPort);</pre></td></tr>
<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> secure = config.isServerSecure();</pre></td></tr>
-<tr> <td class="numLineCover"> 79</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> HttpHandler dashboardHandler = <span class="keyword">new</span> DashboardHandler();</pre></td></tr>
-<tr> <td class="numLineCover"> 80</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/dashboard"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> secure = config.isServerSecure();</pre></td></tr>
+<tr> <td class="numLineCover"> 79</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> HttpHandler dashboardHandler = <span class="keyword">new</span> DashboardHandler();</pre></td></tr>
+<tr> <td class="numLineCover"> 80</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/dashboard"</span>,</pre></td></tr>
<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> createAdminSecurityHandler(dashboardHandler, config, sessionManager,</pre></td></tr>
<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> secure)));</pre></td></tr>
-<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/rpc"</span>, createAdminSecurityHandler(</pre></td></tr>
+<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/rpc"</span>, createAdminSecurityHandler(</pre></td></tr>
<tr> <td class="numLine"> 84</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> rpcHandler, config, sessionManager, secure)));</pre></td></tr>
-<tr> <td class="numLineCover"> 85</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/"</span>, <span class="keyword">new</span> RedirectHandler(<span class="string">"/dashboard"</span>)));</pre></td></tr>
-<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 85</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/"</span>, <span class="keyword">new</span> RedirectHandler(<span class="string">"/dashboard"</span>)));</pre></td></tr>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
@@ -176,7 +176,7 @@
<td class="src"><pre class="src"> HttpHandler handler, Config config,</pre></td></tr>
<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> SessionManager<HttpExchange> sessionManager, <span class="keyword">boolean</span> secure) {</pre></td></tr>
-<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> AdministratorSecurityHandler(handler, sessionManager,</pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> AdministratorSecurityHandler(handler, sessionManager,</pre></td></tr>
<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> config.getGsaHostname(), secure);</pre></td></tr>
<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
@@ -185,17 +185,17 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> stop() {</pre></td></tr>
-<tr> <td class="numLineCover"> 96</td> <td class="nbHitsUncovered"><a title="Line 96: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 96: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (circularLogRpcMethod != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> circularLogRpcMethod.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> circularLogRpcMethod = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 96</td> <td class="nbHitsUncovered"><a title="Line 96: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 96: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (circularLogRpcMethod != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> circularLogRpcMethod.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> circularLogRpcMethod = <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsUncovered"><a title="Line 100: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 100: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (scope != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> scope.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> scope = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsUncovered"><a title="Line 100: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 100: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (scope != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> scope.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> scope = <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
@@ -219,12 +219,12 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 118</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> HttpContext addFilters(HttpContext context) {</pre></td></tr>
-<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">return</span> gsaCommHandler.addFilters(context);</pre></td></tr>
+<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">return</span> gsaCommHandler.addFilters(context);</pre></td></tr>
<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> StartFeedPushRpcMethod <span class="keyword">implements</span> RpcHandler.RpcMethod {</pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> StartFeedPushRpcMethod <span class="keyword">implements</span> RpcHandler.RpcMethod {</pre></td></tr>
<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
@@ -236,7 +236,7 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> StartIncrementalFeedPushRpcMethod</pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> StartIncrementalFeedPushRpcMethod</pre></td></tr>
<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">implements</span> RpcHandler.RpcMethod {</pre></td></tr>
<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
@@ -256,7 +256,7 @@
<td class="src"><pre class="src"> <span class="keyword">static</span> <span class="keyword">class</span> CircularLogRpcMethod <span class="keyword">implements</span> RpcHandler.RpcMethod,</pre></td></tr>
<tr> <td class="numLine"> 139</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Closeable {</pre></td></tr>
-<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> CircularBufferHandler circularLog</pre></td></tr>
+<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> CircularBufferHandler circularLog</pre></td></tr>
<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> CircularBufferHandler();</pre></td></tr>
<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
@@ -267,9 +267,9 @@
<td class="src"><pre class="src"> <span class="comment"> * Installs a log handler; to uninstall handler, call {@link #close}.</span></pre></td></tr>
<tr> <td class="numLine"> 145</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CircularLogRpcMethod() {</pre></td></tr>
-<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> LogManager.getLogManager().getLogger(<span class="string">""</span>).addHandler(circularLog);</pre></td></tr>
-<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CircularLogRpcMethod() {</pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> LogManager.getLogManager().getLogger(<span class="string">""</span>).addHandler(circularLog);</pre></td></tr>
+<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
@@ -285,8 +285,8 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> close() {</pre></td></tr>
-<tr> <td class="numLineCover"> 157</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> LogManager.getLogManager().getLogger(<span class="string">""</span>).removeHandler(circularLog);</pre></td></tr>
-<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 157</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> LogManager.getLogManager().getLogger(<span class="string">""</span>).removeHandler(circularLog);</pre></td></tr>
+<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 160</td> <td class="nbHits"> </td>
@@ -297,9 +297,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Config config;</pre></td></tr>
<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> ConfigRpcMethod(Config config) {</pre></td></tr>
-<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
-<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> ConfigRpcMethod(Config config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
+<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
@@ -324,9 +324,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> StatusMonitor monitor;</pre></td></tr>
<tr> <td class="numLine"> 180</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> StatusRpcMethod(StatusMonitor monitor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.monitor = monitor;</pre></td></tr>
-<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> StatusRpcMethod(StatusMonitor monitor) {</pre></td></tr>
+<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.monitor = monitor;</pre></td></tr>
+<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 184</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 185</td> <td class="nbHits"> </td>
@@ -358,9 +358,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> GsaCommunicationHandler gsaComm;</pre></td></tr>
<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 205</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CheckForUpdatedConfigRpcMethod(GsaCommunicationHandler gsaComm) {</pre></td></tr>
-<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.gsaComm = gsaComm;</pre></td></tr>
-<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 205</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> CheckForUpdatedConfigRpcMethod(GsaCommunicationHandler gsaComm) {</pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.gsaComm = gsaComm;</pre></td></tr>
+<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 209</td> <td class="nbHits"> </td>
@@ -380,9 +380,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> SensitiveValueCodec secureValueCodec;</pre></td></tr>
<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">public</span> EncodeSensitiveValueMethod(SensitiveValueCodec secureValueCodec) {</pre></td></tr>
-<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.secureValueCodec = secureValueCodec;</pre></td></tr>
-<tr> <td class="numLineCover"> 220</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> EncodeSensitiveValueMethod(SensitiveValueCodec secureValueCodec) {</pre></td></tr>
+<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.secureValueCodec = secureValueCodec;</pre></td></tr>
+<tr> <td class="numLineCover"> 220</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
@@ -432,9 +432,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Journal journal;</pre></td></tr>
<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 252</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> LastPushStatusSource(Journal journal) {</pre></td></tr>
-<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
-<tr> <td class="numLineCover"> 254</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 252</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> LastPushStatusSource(Journal journal) {</pre></td></tr>
+<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
+<tr> <td class="numLineCover"> 254</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 256</td> <td class="nbHits"> </td>
@@ -486,9 +486,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Journal journal;</pre></td></tr>
<tr> <td class="numLine"> 282</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 283</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> RetrieverStatusSource(Journal journal) {</pre></td></tr>
-<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
-<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 283</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> RetrieverStatusSource(Journal journal) {</pre></td></tr>
+<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
+<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
@@ -531,9 +531,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Journal journal;</pre></td></tr>
<tr> <td class="numLine"> 310</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 311</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GsaCrawlingStatusSource(Journal journal) {</pre></td></tr>
-<tr> <td class="numLineCover"> 312</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
-<tr> <td class="numLineCover"> 313</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 311</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GsaCrawlingStatusSource(Journal journal) {</pre></td></tr>
+<tr> <td class="numLineCover"> 312</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
+<tr> <td class="numLineCover"> 313</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 314</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 315</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.DashboardHandler.html b/coverage/com.google.enterprise.adaptor.DashboardHandler.html
index ee72d06..a52851e 100644
--- a/coverage/com.google.enterprise.adaptor.DashboardHandler.html
+++ b/coverage/com.google.enterprise.adaptor.DashboardHandler.html
@@ -73,7 +73,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Serves class' resources like dashboard's html and jquery js. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">class</span> DashboardHandler <span class="keyword">implements</span> HttpHandler {</pre></td></tr>
+<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> <span class="keyword">class</span> DashboardHandler <span class="keyword">implements</span> HttpHandler {</pre></td></tr>
<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Logger.getLogger(DashboardHandler.<span class="keyword">class</span>.getName());</pre></td></tr>
diff --git a/coverage/com.google.enterprise.adaptor.DefaultGetDocIdsErrorHandler.html b/coverage/com.google.enterprise.adaptor.DefaultGetDocIdsErrorHandler.html
index d0baf79..cb7f43c 100644
--- a/coverage/com.google.enterprise.adaptor.DefaultGetDocIdsErrorHandler.html
+++ b/coverage/com.google.enterprise.adaptor.DefaultGetDocIdsErrorHandler.html
@@ -77,8 +77,8 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> DefaultGetDocIdsErrorHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 31</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(12, 5000);</pre></td></tr>
-<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 31</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(12, 5000);</pre></td></tr>
+<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
@@ -89,10 +89,10 @@
<td class="src"><pre class="src"> <span class="comment"> * sleeps {@code sleepTimeMillis * numberOfTries} before retrying.</span></pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DefaultGetDocIdsErrorHandler(<span class="keyword">int</span> maximumTries, <span class="keyword">long</span> sleepTimeMillis) {</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maximumTries = maximumTries;</pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sleepTimeMillis = sleepTimeMillis;</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DefaultGetDocIdsErrorHandler(<span class="keyword">int</span> maximumTries, <span class="keyword">long</span> sleepTimeMillis) {</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maximumTries = maximumTries;</pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sleepTimeMillis = sleepTimeMillis;</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
@@ -111,7 +111,7 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> handleFailedToGetDocIds(Exception ex, <span class="keyword">int</span> ntries)</pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> handleGeneric(ex, ntries);</pre></td></tr>
+<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> handleGeneric(ex, ntries);</pre></td></tr>
<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
@@ -130,11 +130,11 @@
<td class="src"><pre class="src"> <span class="keyword">protected</span> <span class="keyword">boolean</span> handleGeneric(Exception ex, <span class="keyword">int</span> ntries)</pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsUncovered"><a title="Line 61: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 61: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (ntries > maximumTries) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsUncovered"><a title="Line 61: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 61: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (ntries > maximumTries) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 62</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> Thread.sleep(sleepTimeMillis * ntries);</pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> Thread.sleep(sleepTimeMillis * ntries);</pre></td></tr>
<tr> <td class="numLineCover"> 65</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">true</span>;</span></pre></td></tr>
<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
diff --git a/coverage/com.google.enterprise.adaptor.DefaultPushErrorHandler.html b/coverage/com.google.enterprise.adaptor.DefaultPushErrorHandler.html
index ab8bc31..8506550 100644
--- a/coverage/com.google.enterprise.adaptor.DefaultPushErrorHandler.html
+++ b/coverage/com.google.enterprise.adaptor.DefaultPushErrorHandler.html
@@ -75,8 +75,8 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> DefaultPushErrorHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(12, 5000);</pre></td></tr>
-<tr> <td class="numLineCover"> 31</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(12, 5000);</pre></td></tr>
+<tr> <td class="numLineCover"> 31</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
@@ -87,10 +87,10 @@
<td class="src"><pre class="src"> <span class="comment"> * sleeps {@code sleepTimeMillis * numberOfTries} before retrying.</span></pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DefaultPushErrorHandler(<span class="keyword">int</span> maximumTries, <span class="keyword">long</span> sleepTimeMillis) {</pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maximumTries = maximumTries;</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sleepTimeMillis = sleepTimeMillis;</pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DefaultPushErrorHandler(<span class="keyword">int</span> maximumTries, <span class="keyword">long</span> sleepTimeMillis) {</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.maximumTries = maximumTries;</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sleepTimeMillis = sleepTimeMillis;</pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.DocId.html b/coverage/com.google.enterprise.adaptor.DocId.html
index c40fe18..f557524 100644
--- a/coverage/com.google.enterprise.adaptor.DocId.html
+++ b/coverage/com.google.enterprise.adaptor.DocId.html
@@ -90,13 +90,13 @@
<td class="src"><pre class="src"> <span class="comment"> * @param id non-{@code null} document identifier</span></pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 60459</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DocId(String id) {</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"><a title="Line 39: Conditional coverage 100% (2/2)."> 60459</a></td> <td class="src"><pre class="src"> <a title="Line 39: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (id == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 60399</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DocId(String id) {</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"><a title="Line 39: Conditional coverage 100% (2/2)."> 60399</a></td> <td class="src"><pre class="src"> <a title="Line 39: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (id == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 60458</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.uniqId = id;</pre></td></tr>
-<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 60458</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 60398</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.uniqId = id;</pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 60398</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
@@ -107,7 +107,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String getUniqueId() {</pre></td></tr>
-<tr> <td class="numLineCover"> 49</td> <td class="nbHitsCovered"> 30323</td> <td class="src"><pre class="src"> <span class="keyword">return</span> uniqId;</pre></td></tr>
+<tr> <td class="numLineCover"> 49</td> <td class="nbHitsCovered"> 30259</td> <td class="src"><pre class="src"> <span class="keyword">return</span> uniqId;</pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
@@ -133,12 +133,12 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> equals(Object o) {</pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"><a title="Line 63: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 30210</a></td> <td class="src"><pre class="src"> <a title="Line 63: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (<span class="keyword">null</span> == o || !getClass().equals(o.getClass())) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"><a title="Line 63: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 30196</a></td> <td class="src"><pre class="src"> <a title="Line 63: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (<span class="keyword">null</span> == o || !getClass().equals(o.getClass())) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 30208</td> <td class="src"><pre class="src"> DocId d = (DocId) o;</pre></td></tr>
-<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 30208</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">this</span>.uniqId.equals(d.uniqId);</pre></td></tr>
+<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 30194</td> <td class="src"><pre class="src"> DocId d = (DocId) o;</pre></td></tr>
+<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 30194</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">this</span>.uniqId.equals(d.uniqId);</pre></td></tr>
<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
@@ -153,7 +153,7 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 74</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> hashCode() {</pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 1410</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">this</span>.uniqId.hashCode();</pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 1398</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">this</span>.uniqId.hashCode();</pre></td></tr>
<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.DocIdCodec.html b/coverage/com.google.enterprise.adaptor.DocIdCodec.html
index 962c72d..14e0bee 100644
--- a/coverage/com.google.enterprise.adaptor.DocIdCodec.html
+++ b/coverage/com.google.enterprise.adaptor.DocIdCodec.html
@@ -65,9 +65,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> Config config;</pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdCodec(Config config) {</pre></td></tr>
-<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
-<tr> <td class="numLineCover"> 27</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdCodec(Config config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
+<tr> <td class="numLineCover"> 27</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
@@ -104,20 +104,20 @@
<td class="src"><pre class="src"> <span class="comment">/** Given a URI that was used in feed file, convert back to doc id. */</span></pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> DocId decodeDocId(URI uri) {</pre></td></tr>
-<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"><a title="Line 51: Conditional coverage 100% (2/2)."> 19</a></td> <td class="src"><pre class="src"> <a title="Line 51: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (config.isDocIdUrl()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"><a title="Line 51: Conditional coverage 100% (2/2)."> 21</a></td> <td class="src"><pre class="src"> <a title="Line 51: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (config.isDocIdUrl()) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> DocId(uri.toString());</pre></td></tr>
<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> String basePath = config.getServerBaseUri().getPath();</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> String id = uri.getPath().substring(basePath.length()</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> String basePath = config.getServerBaseUri().getPath();</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> String id = uri.getPath().substring(basePath.length()</pre></td></tr>
<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + config.getServerDocIdPath().length());</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Remove two dots from any sequence of only dots. This is to remove the</span></pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// addition we did in {@link #encodeDocId}.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> id = id.replaceAll(<span class="string">"(^|/)(\\.+)\\.\\.(?=$|/)"</span>, <span class="string">"$1$2"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> DocId(id);</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> id = id.replaceAll(<span class="string">"(^|/)(\\.+)\\.\\.(?=$|/)"</span>, <span class="string">"$1$2"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> DocId(id);</pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.DocIdPusher.html b/coverage/com.google.enterprise.adaptor.DocIdPusher.html
index e5d99da..ae1cff2 100644
--- a/coverage/com.google.enterprise.adaptor.DocIdPusher.html
+++ b/coverage/com.google.enterprise.adaptor.DocIdPusher.html
@@ -14,7 +14,7 @@
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
<tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher$Record</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">31/31</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">26/26</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher$Record</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:93px"><span class="text">29/31</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">26/26</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher$Record$Builder</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">38/38</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
</table>
@@ -276,7 +276,7 @@
<td class="src"><pre class="src"> <span class="comment"> * Immutable feed attributes for a document identified by its {@code DocId}.</span></pre></td></tr>
<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 30236</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">class</span> Record <span class="keyword">implements</span> DocIdSender.Item {</pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 30108</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">class</span> Record <span class="keyword">implements</span> DocIdSender.Item {</pre></td></tr>
<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> DocId id;</pre></td></tr>
<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
@@ -295,15 +295,15 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 138</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Record(DocId docid, <span class="keyword">boolean</span> delete, Date lastModified,</pre></td></tr>
-<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> URI link, <span class="keyword">boolean</span> crawlImmediately, <span class="keyword">boolean</span> crawlOnce, <span class="keyword">boolean</span> lock) {</pre></td></tr>
-<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.id = docid;</pre></td></tr>
-<tr> <td class="numLineCover"> 141</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delete = delete;</pre></td></tr>
-<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lastModified = lastModified;</pre></td></tr>
-<tr> <td class="numLineCover"> 143</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.link = link;</pre></td></tr>
-<tr> <td class="numLineCover"> 144</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlImmediately = crawlImmediately;</pre></td></tr>
-<tr> <td class="numLineCover"> 145</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlOnce = crawlOnce;</pre></td></tr>
-<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lock = lock;</pre></td></tr>
-<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> URI link, <span class="keyword">boolean</span> crawlImmediately, <span class="keyword">boolean</span> crawlOnce, <span class="keyword">boolean</span> lock) {</pre></td></tr>
+<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.id = docid;</pre></td></tr>
+<tr> <td class="numLineCover"> 141</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delete = delete;</pre></td></tr>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lastModified = lastModified;</pre></td></tr>
+<tr> <td class="numLineCover"> 143</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.link = link;</pre></td></tr>
+<tr> <td class="numLineCover"> 144</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlImmediately = crawlImmediately;</pre></td></tr>
+<tr> <td class="numLineCover"> 145</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlOnce = crawlOnce;</pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lock = lock;</pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
@@ -318,7 +318,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> DocId getDocId() {</pre></td></tr>
-<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 30068</td> <td class="src"><pre class="src"> <span class="keyword">return</span> id;</pre></td></tr>
+<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 30045</td> <td class="src"><pre class="src"> <span class="keyword">return</span> id;</pre></td></tr>
<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
@@ -331,7 +331,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isToBeDeleted() {</pre></td></tr>
-<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> delete;</pre></td></tr>
+<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> <span class="keyword">return</span> delete;</pre></td></tr>
<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 164</td> <td class="nbHits"> </td>
@@ -462,10 +462,10 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> hashCode() {</pre></td></tr>
-<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> Object members[] = <span class="keyword">new</span> Object[] { id, delete, lastModified, link,</pre></td></tr>
+<tr> <td class="numLineCover"> 233</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Object members[] = <span class="keyword">new</span> Object[] { id, delete, lastModified, link,</span></pre></td></tr>
<tr> <td class="numLine"> 234</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> crawlImmediately, crawlOnce, lock };</pre></td></tr>
-<tr> <td class="numLineCover"> 235</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Arrays.hashCode(members);</pre></td></tr>
+<tr> <td class="numLineCover"> 235</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Arrays.hashCode(members);</span></pre></td></tr>
<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
@@ -525,13 +525,13 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 268</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> Builder {</pre></td></tr>
-<tr> <td class="numLineCover"> 269</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">private</span> DocId docid = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 270</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> delete = <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Date lastModified = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">private</span> URI link = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 273</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> crawlImmediately = <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 274</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> crawlOnce = <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 275</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> lock = <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 269</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">private</span> DocId docid = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 270</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> delete = <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Date lastModified = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">private</span> URI link = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 273</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> crawlImmediately = <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 274</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> crawlOnce = <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 275</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> lock = <span class="keyword">false</span>;</pre></td></tr>
<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
@@ -544,13 +544,13 @@
<td class="src"><pre class="src"> <span class="comment"> * @param id non-{@code null} identifier for the document being described</span></pre></td></tr>
<tr> <td class="numLine"> 281</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 282</td> <td class="nbHitsCovered"> 30060</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Builder(DocId id) {</pre></td></tr>
-<tr> <td class="numLineCover"> 283</td> <td class="nbHitsCovered"><a title="Line 283: Conditional coverage 100% (2/2)."> 30060</a></td> <td class="src"><pre class="src"> <a title="Line 283: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == id) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 282</td> <td class="nbHitsCovered"> 30052</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Builder(DocId id) {</pre></td></tr>
+<tr> <td class="numLineCover"> 283</td> <td class="nbHitsCovered"><a title="Line 283: Conditional coverage 100% (2/2)."> 30052</a></td> <td class="src"><pre class="src"> <a title="Line 283: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == id) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 285</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 286</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> docid = id;</pre></td></tr>
-<tr> <td class="numLineCover"> 287</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 286</td> <td class="nbHitsCovered"> 30051</td> <td class="src"><pre class="src"> docid = id;</pre></td></tr>
+<tr> <td class="numLineCover"> 287</td> <td class="nbHitsCovered"> 30051</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
@@ -563,15 +563,15 @@
<td class="src"><pre class="src"> <span class="comment"> * Record}.</span></pre></td></tr>
<tr> <td class="numLine"> 293</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 294</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Builder(Record startPoint) {</pre></td></tr>
-<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docid = startPoint.id;</pre></td></tr>
-<tr> <td class="numLineCover"> 296</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delete = startPoint.delete;</pre></td></tr>
-<tr> <td class="numLineCover"> 297</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lastModified = startPoint.lastModified;</pre></td></tr>
-<tr> <td class="numLineCover"> 298</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.link = startPoint.link;</pre></td></tr>
-<tr> <td class="numLineCover"> 299</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlImmediately = startPoint.crawlImmediately;</pre></td></tr>
-<tr> <td class="numLineCover"> 300</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlOnce = startPoint.crawlOnce;</pre></td></tr>
-<tr> <td class="numLineCover"> 301</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lock = startPoint.lock;</pre></td></tr>
-<tr> <td class="numLineCover"> 302</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 294</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Builder(Record startPoint) {</pre></td></tr>
+<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docid = startPoint.id;</pre></td></tr>
+<tr> <td class="numLineCover"> 296</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delete = startPoint.delete;</pre></td></tr>
+<tr> <td class="numLineCover"> 297</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lastModified = startPoint.lastModified;</pre></td></tr>
+<tr> <td class="numLineCover"> 298</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.link = startPoint.link;</pre></td></tr>
+<tr> <td class="numLineCover"> 299</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlImmediately = startPoint.crawlImmediately;</pre></td></tr>
+<tr> <td class="numLineCover"> 300</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlOnce = startPoint.crawlOnce;</pre></td></tr>
+<tr> <td class="numLineCover"> 301</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lock = startPoint.lock;</pre></td></tr>
+<tr> <td class="numLineCover"> 302</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
@@ -590,12 +590,12 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 311</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Builder setDocId(DocId id) {</pre></td></tr>
-<tr> <td class="numLineCover"> 312</td> <td class="nbHitsCovered"><a title="Line 312: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 312: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == id) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 312</td> <td class="nbHitsCovered"><a title="Line 312: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 312: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == id) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 313</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 314</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 315</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docid = id;</pre></td></tr>
-<tr> <td class="numLineCover"> 316</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">this</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 315</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docid = id;</pre></td></tr>
+<tr> <td class="numLineCover"> 316</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">this</span>;</pre></td></tr>
<tr> <td class="numLine"> 317</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 318</td> <td class="nbHits"> </td>
@@ -738,7 +738,7 @@
<td class="src"><pre class="src"> <span class="comment">/** Creates single instance of Record. Does not reset builder. */</span></pre></td></tr>
<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Record build() {</pre></td></tr>
-<tr> <td class="numLineCover"> 394</td> <td class="nbHitsCovered"> 30082</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> Record(docid, delete, lastModified,</pre></td></tr>
+<tr> <td class="numLineCover"> 394</td> <td class="nbHitsCovered"> 30059</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> Record(docid, delete, lastModified,</pre></td></tr>
<tr> <td class="numLine"> 395</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> link, crawlImmediately, crawlOnce, lock);</pre></td></tr>
<tr> <td class="numLine"> 396</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.DocIdSender.html b/coverage/com.google.enterprise.adaptor.DocIdSender.html
index b8e5c15..39d7563 100644
--- a/coverage/com.google.enterprise.adaptor.DocIdSender.html
+++ b/coverage/com.google.enterprise.adaptor.DocIdSender.html
@@ -82,20 +82,20 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Config config;</pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Adaptor adaptor;</pre></td></tr>
-<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> PushErrorHandler defaultErrorHandler</pre></td></tr>
+<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> PushErrorHandler defaultErrorHandler</pre></td></tr>
<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> DefaultPushErrorHandler();</pre></td></tr>
<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> DocIdSender(GsaFeedFileMaker fileMaker, GsaFeedFileSender fileSender,</pre></td></tr>
-<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> Journal journal, Config config, Adaptor adaptor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.fileMaker = fileMaker;</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.fileSender = fileSender;</pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.adaptor = adaptor;</pre></td></tr>
-<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> Journal journal, Config config, Adaptor adaptor) {</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.fileMaker = fileMaker;</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.fileSender = fileSender;</pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.adaptor = adaptor;</pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
@@ -110,17 +110,17 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> pushFullDocIdsFromAdaptor(GetDocIdsErrorHandler handler)</pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"><a title="Line 51: Conditional coverage 100% (2/2)."> 5</a></td> <td class="src"><pre class="src"> <a title="Line 51: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (handler == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"><a title="Line 51: Conditional coverage 100% (2/2)."> 14</a></td> <td class="src"><pre class="src"> <a title="Line 51: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (handler == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.info(<span class="string">"Beginning full push of DocIds"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> journal.recordFullPushStarted();</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">for</span> (<span class="keyword">int</span> ntries = 1;; ntries++) {</pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> keepGoing = <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> log.info(<span class="string">"Beginning full push of DocIds"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> journal.recordFullPushStarted();</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">for</span> (<span class="keyword">int</span> ntries = 1;; ntries++) {</pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> keepGoing = <span class="keyword">true</span>;</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> adaptor.getDocIds(<span class="keyword">this</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> adaptor.getDocIds(<span class="keyword">this</span>);</pre></td></tr>
<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">break</span>; <span class="comment">// Success</span></pre></td></tr>
<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (InterruptedException ex) {</pre></td></tr>
<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
@@ -128,9 +128,9 @@
<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> journal.recordFullPushInterrupted();</pre></td></tr>
<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.info(<span class="string">"Interrupted. Aborted full push of DocIds"</span>);</pre></td></tr>
<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> ex;</pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (Exception ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Unable to retrieve DocIds from adaptor"</span>, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> keepGoing = handler.handleFailedToGetDocIds(ex, ntries);</pre></td></tr>
+<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (Exception ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Unable to retrieve DocIds from adaptor"</span>, ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> keepGoing = handler.handleFailedToGetDocIds(ex, ntries);</pre></td></tr>
<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLineCover"> 70</td> <td class="nbHitsCovered"><a title="Line 70: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 70: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (keepGoing) {</a></pre></td></tr>
diff --git a/coverage/com.google.enterprise.adaptor.DocumentHandler.html b/coverage/com.google.enterprise.adaptor.DocumentHandler.html
index 9f0df9d..84b720e 100644
--- a/coverage/com.google.enterprise.adaptor.DocumentHandler.html
+++ b/coverage/com.google.enterprise.adaptor.DocumentHandler.html
@@ -18,7 +18,7 @@
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$CountByteArrayOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$CountingOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">12/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:94px"><span class="text">160/169</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">11</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:89px"><span class="text">95/106</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">8</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:95px"><span class="text">161/169</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:90px"><span class="text">96/106</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentResponse$CantUseOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentResponse$LazyContentOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$MaxBufferOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:73px"><span class="text">17/23</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">8/12</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
@@ -110,7 +110,7 @@
<td class="src"><pre class="src"> <span class="keyword">import</span> javax.security.auth.x500.X500Principal;</pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 140</td> <td class="src"><pre class="src"> <span class="keyword">class</span> DocumentHandler <span class="keyword">implements</span> HttpHandler {</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 145</td> <td class="src"><pre class="src"> <span class="keyword">class</span> DocumentHandler <span class="keyword">implements</span> HttpHandler {</pre></td></tr>
<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Logger.getLogger(DocumentHandler.<span class="keyword">class</span>.getName());</pre></td></tr>
@@ -215,10 +215,10 @@
<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> initFullAccess(String gsaHostname, String[] fullAccessHosts) {</pre></td></tr>
<tr> <td class="numLineCover"> 105</td> <td class="nbHitsCovered"> 142</td> <td class="src"><pre class="src"> fullAccessCommonNames.add(gsaHostname.toLowerCase(Locale.ENGLISH));</pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"><a title="Line 106: Conditional coverage 100% (2/2)."> 177</a></td> <td class="src"><pre class="src"> <a title="Line 106: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String hostname : fullAccessHosts) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 107</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> hostname = hostname.trim();</pre></td></tr>
-<tr> <td class="numLineCover"> 108</td> <td class="nbHitsCovered"><a title="Line 108: Conditional coverage 100% (2/2)."> 35</a></td> <td class="src"><pre class="src"> <a title="Line 108: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">""</span>.equals(hostname)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 109</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"><a title="Line 106: Conditional coverage 100% (2/2)."> 178</a></td> <td class="src"><pre class="src"> <a title="Line 106: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String hostname : fullAccessHosts) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 107</td> <td class="nbHitsCovered"> 36</td> <td class="src"><pre class="src"> hostname = hostname.trim();</pre></td></tr>
+<tr> <td class="numLineCover"> 108</td> <td class="nbHitsCovered"><a title="Line 108: Conditional coverage 100% (2/2)."> 36</a></td> <td class="src"><pre class="src"> <a title="Line 108: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">""</span>.equals(hostname)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 109</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLineCover"> 111</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> fullAccessCommonNames.add(hostname.toLowerCase(Locale.ENGLISH));</pre></td></tr>
@@ -251,7 +251,7 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> requestIsFromFullyTrustedClient(HttpExchange ex) {</pre></td></tr>
<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">boolean</span> trust;</pre></td></tr>
-<tr> <td class="numLineCover"> 131</td> <td class="nbHitsCovered"><a title="Line 131: Conditional coverage 100% (2/2)."> 87</a></td> <td class="src"><pre class="src"> <a title="Line 131: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (ex <span class="keyword">instanceof</span> HttpsExchange) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 131</td> <td class="nbHitsCovered"><a title="Line 131: Conditional coverage 100% (2/2)."> 90</a></td> <td class="src"><pre class="src"> <a title="Line 131: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (ex <span class="keyword">instanceof</span> HttpsExchange) {</a></pre></td></tr>
<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> java.security.Principal principal;</pre></td></tr>
<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
@@ -315,13 +315,13 @@
<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 177</td> <td class="nbHitsCovered"> 81</td> <td class="src"><pre class="src"> InetAddress addr = ex.getRemoteAddress().getAddress();</pre></td></tr>
-<tr> <td class="numLineCover"> 178</td> <td class="nbHitsCovered"> 81</td> <td class="src"><pre class="src"> trust = fullAccessAddresses.contains(addr);</pre></td></tr>
-<tr> <td class="numLineCover"> 179</td> <td class="nbHitsCovered"><a title="Line 179: Conditional coverage 100% (2/2)."> 81</a></td> <td class="src"><pre class="src"> <a title="Line 179: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (trust) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 180</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Client is trusted in non-secure mode: {0}"</span>, addr);</pre></td></tr>
+<tr> <td class="numLineCover"> 177</td> <td class="nbHitsCovered"> 84</td> <td class="src"><pre class="src"> InetAddress addr = ex.getRemoteAddress().getAddress();</pre></td></tr>
+<tr> <td class="numLineCover"> 178</td> <td class="nbHitsCovered"> 84</td> <td class="src"><pre class="src"> trust = fullAccessAddresses.contains(addr);</pre></td></tr>
+<tr> <td class="numLineCover"> 179</td> <td class="nbHitsCovered"><a title="Line 179: Conditional coverage 100% (2/2)."> 84</a></td> <td class="src"><pre class="src"> <a title="Line 179: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (trust) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 180</td> <td class="nbHitsCovered"> 37</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Client is trusted in non-secure mode: {0}"</span>, addr);</pre></td></tr>
<tr> <td class="numLine"> 181</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Client is not trusted in non-secure mode: {0}"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 47</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Client is not trusted in non-secure mode: {0}"</span>,</pre></td></tr>
<tr> <td class="numLine"> 183</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> addr);</pre></td></tr>
<tr> <td class="numLine"> 184</td> <td class="nbHits"> </td>
@@ -330,7 +330,7 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"> 84</td> <td class="src"><pre class="src"> <span class="keyword">return</span> trust;</pre></td></tr>
+<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"> 87</td> <td class="src"><pre class="src"> <span class="keyword">return</span> trust;</pre></td></tr>
<tr> <td class="numLine"> 188</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
@@ -339,27 +339,27 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 191</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> handle(HttpExchange ex) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 192</td> <td class="nbHitsCovered"> 62</td> <td class="src"><pre class="src"> String requestMethod = ex.getRequestMethod();</pre></td></tr>
-<tr> <td class="numLineCover"> 193</td> <td class="nbHitsCovered"><a title="Line 193: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 62</a></td> <td class="src"><pre class="src"> <a title="Line 193: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (<span class="string">"GET"</span>.equals(requestMethod) || <span class="string">"HEAD"</span>.equals(requestMethod)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 192</td> <td class="nbHitsCovered"> 64</td> <td class="src"><pre class="src"> String requestMethod = ex.getRequestMethod();</pre></td></tr>
+<tr> <td class="numLineCover"> 193</td> <td class="nbHitsCovered"><a title="Line 193: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 64</a></td> <td class="src"><pre class="src"> <a title="Line 193: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (<span class="string">"GET"</span>.equals(requestMethod) || <span class="string">"HEAD"</span>.equals(requestMethod)) {</a></pre></td></tr>
<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/* Call into adaptor developer code to get document bytes. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 195</td> <td class="nbHitsCovered"> 61</td> <td class="src"><pre class="src"> DocId docId = docIdDecoder.decodeDocId(HttpExchanges.getRequestUri(ex));</pre></td></tr>
-<tr> <td class="numLineCover"> 196</td> <td class="nbHitsCovered"> 61</td> <td class="src"><pre class="src"> log.fine(<span class="string">"id: "</span> + docId.getUniqueId());</pre></td></tr>
+<tr> <td class="numLineCover"> 195</td> <td class="nbHitsCovered"> 63</td> <td class="src"><pre class="src"> DocId docId = docIdDecoder.decodeDocId(HttpExchanges.getRequestUri(ex));</pre></td></tr>
+<tr> <td class="numLineCover"> 196</td> <td class="nbHitsCovered"> 63</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"DocId: {0}"</span>, docId.getUniqueId());</pre></td></tr>
<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 198</td> <td class="nbHitsCovered"><a title="Line 198: Conditional coverage 100% (2/2)."> 61</a></td> <td class="src"><pre class="src"> <a title="Line 198: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!authzed(ex, docId)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 198</td> <td class="nbHitsCovered"><a title="Line 198: Conditional coverage 100% (2/2)."> 63</a></td> <td class="src"><pre class="src"> <a title="Line 198: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!authzed(ex, docId)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> DocumentRequest request = <span class="keyword">new</span> DocumentRequest(ex, docId);</pre></td></tr>
-<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> DocumentResponse response = <span class="keyword">new</span> DocumentResponse(ex, docId);</pre></td></tr>
-<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> journal.recordRequestProcessingStart();</pre></td></tr>
-<tr> <td class="numLineCover"> 205</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> watchdog.processingStarting();</pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> DocumentRequest request = <span class="keyword">new</span> DocumentRequest(ex, docId);</pre></td></tr>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> DocumentResponse response = <span class="keyword">new</span> DocumentResponse(ex, docId);</pre></td></tr>
+<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> journal.recordRequestProcessingStart();</pre></td></tr>
+<tr> <td class="numLineCover"> 205</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> watchdog.processingStarting();</pre></td></tr>
<tr> <td class="numLine"> 206</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> adaptor.getDocContent(request, response);</pre></td></tr>
+<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> adaptor.getDocContent(request, response);</pre></td></tr>
<tr> <td class="numLineCover"> 208</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (InterruptedException e) {</pre></td></tr>
<tr> <td class="numLineCover"> 209</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> journal.recordRequestProcessingFailure();</pre></td></tr>
<tr> <td class="numLineCover"> 210</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Retriever interrupted: "</span> + docId, e);</pre></td></tr>
@@ -371,19 +371,19 @@
<tr> <td class="numLineCover"> 216</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Exception in retriever: "</span> + docId, e);</pre></td></tr>
<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> watchdog.processingCompleted();</pre></td></tr>
-<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 220</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> journal.recordRequestProcessingEnd(response.getWrittenContentSize());</pre></td></tr>
+<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> watchdog.processingCompleted();</pre></td></tr>
+<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 220</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> journal.recordRequestProcessingEnd(response.getWrittenContentSize());</pre></td></tr>
<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> response.complete();</pre></td></tr>
-<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> response.complete();</pre></td></tr>
+<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
<tr> <td class="numLineCover"> 224</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpExchanges.cannedRespond(ex, HttpURLConnection.HTTP_BAD_METHOD,</pre></td></tr>
<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Translation.HTTP_BAD_METHOD);</pre></td></tr>
<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 227</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 227</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
@@ -400,7 +400,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> authzed(HttpExchange ex, DocId docId) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 236</td> <td class="nbHitsCovered"><a title="Line 236: Conditional coverage 100% (2/2)."> 61</a></td> <td class="src"><pre class="src"> <a title="Line 236: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"SecMgr"</span>.equals(ex.getRequestHeaders().getFirst(<span class="string">"User-Agent"</span>))) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 236</td> <td class="nbHitsCovered"><a title="Line 236: Conditional coverage 100% (2/2)."> 63</a></td> <td class="src"><pre class="src"> <a title="Line 236: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"SecMgr"</span>.equals(ex.getRequestHeaders().getFirst(<span class="string">"User-Agent"</span>))) {</a></pre></td></tr>
<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Assume that the SecMgr is performing a "HEAD" request to check authz.</span></pre></td></tr>
<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
@@ -413,18 +413,18 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"><a title="Line 244: Conditional coverage 100% (2/2)."> 60</a></td> <td class="src"><pre class="src"> <a title="Line 244: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (requestIsFromFullyTrustedClient(ex)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 245</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> journal.recordGsaContentRequest(docId);</pre></td></tr>
+<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"><a title="Line 244: Conditional coverage 100% (2/2)."> 62</a></td> <td class="src"><pre class="src"> <a title="Line 244: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (requestIsFromFullyTrustedClient(ex)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 245</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> journal.recordGsaContentRequest(docId);</pre></td></tr>
<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 247</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> journal.recordNonGsaContentRequest(docId);</pre></td></tr>
+<tr> <td class="numLineCover"> 247</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> journal.recordNonGsaContentRequest(docId);</pre></td></tr>
<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Default to anonymous.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 249</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> AuthnIdentity identity = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 249</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> AuthnIdentity identity = <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 251</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> Session session = sessionManager.getSession(ex, <span class="keyword">false</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 252</td> <td class="nbHitsCovered"><a title="Line 252: Conditional coverage 100% (2/2)."> 41</a></td> <td class="src"><pre class="src"> <a title="Line 252: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (session != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 251</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> Session session = sessionManager.getSession(ex, <span class="keyword">false</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 252</td> <td class="nbHitsCovered"><a title="Line 252: Conditional coverage 100% (2/2)."> 42</a></td> <td class="src"><pre class="src"> <a title="Line 252: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (session != <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> AuthnState authnState</pre></td></tr>
<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = (AuthnState) session.getAttribute(AuthnState.SESSION_ATTR_NAME);</pre></td></tr>
@@ -436,13 +436,13 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 259</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> Map<DocId, AuthzStatus> authzMap = adaptor.isUserAuthorized(identity,</pre></td></tr>
+<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> Map<DocId, AuthzStatus> authzMap = adaptor.isUserAuthorized(identity,</pre></td></tr>
<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Collections.singletonList(docId));</pre></td></tr>
<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 263</td> <td class="nbHitsCovered"><a title="Line 263: Conditional coverage 100% (2/2)."> 41</a></td> <td class="src"><pre class="src"> <a title="Line 263: Conditional coverage 100% (2/2)."> AuthzStatus status = authzMap != <span class="keyword">null</span> ? authzMap.get(docId) : <span class="keyword">null</span>;</a></pre></td></tr>
-<tr> <td class="numLineCover"> 264</td> <td class="nbHitsCovered"><a title="Line 264: Conditional coverage 100% (2/2)."> 41</a></td> <td class="src"><pre class="src"> <a title="Line 264: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (status == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 263</td> <td class="nbHitsCovered"><a title="Line 263: Conditional coverage 100% (2/2)."> 42</a></td> <td class="src"><pre class="src"> <a title="Line 263: Conditional coverage 100% (2/2)."> AuthzStatus status = authzMap != <span class="keyword">null</span> ? authzMap.get(docId) : <span class="keyword">null</span>;</a></pre></td></tr>
+<tr> <td class="numLineCover"> 264</td> <td class="nbHitsCovered"><a title="Line 264: Conditional coverage 100% (2/2)."> 42</a></td> <td class="src"><pre class="src"> <a title="Line 264: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (status == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 265</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> status = AuthzStatus.DENY;</pre></td></tr>
<tr> <td class="numLineCover"> 266</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Adaptor did not provide an authorization "</span></pre></td></tr>
<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
@@ -453,13 +453,13 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 270</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"><a title="Line 271: Conditional coverage 100% (2/2)."> 41</a></td> <td class="src"><pre class="src"> <a title="Line 271: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (status == AuthzStatus.INDETERMINATE) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"><a title="Line 271: Conditional coverage 100% (2/2)."> 42</a></td> <td class="src"><pre class="src"> <a title="Line 271: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (status == AuthzStatus.INDETERMINATE) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpExchanges.cannedRespond(ex, HttpURLConnection.HTTP_NOT_FOUND,</pre></td></tr>
<tr> <td class="numLine"> 273</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Translation.HTTP_NOT_FOUND);</pre></td></tr>
<tr> <td class="numLineCover"> 274</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 275</td> <td class="nbHitsCovered"><a title="Line 275: Conditional coverage 100% (2/2)."> 40</a></td> <td class="src"><pre class="src"> <a title="Line 275: Conditional coverage 100% (2/2)."> } <span class="keyword">else</span> <span class="keyword">if</span> (status == AuthzStatus.DENY) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 276</td> <td class="nbHitsCovered"><a title="Line 276: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 276: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (identity == <span class="keyword">null</span> && authnHandler != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 275</td> <td class="nbHitsCovered"><a title="Line 275: Conditional coverage 100% (2/2)."> 41</a></td> <td class="src"><pre class="src"> <a title="Line 275: Conditional coverage 100% (2/2)."> } <span class="keyword">else</span> <span class="keyword">if</span> (status == AuthzStatus.DENY) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 276</td> <td class="nbHitsCovered"><a title="Line 276: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 276: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (identity == <span class="keyword">null</span> && authnHandler != <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// User was anonymous and document is not public, so try to authn</span></pre></td></tr>
<tr> <td class="numLine"> 278</td> <td class="nbHits"> </td>
@@ -468,17 +468,17 @@
<tr> <td class="numLineCover"> 280</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
<tr> <td class="numLine"> 281</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 282</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> HttpExchanges.cannedRespond(ex, HttpURLConnection.HTTP_FORBIDDEN,</pre></td></tr>
+<tr> <td class="numLineCover"> 282</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> HttpExchanges.cannedRespond(ex, HttpURLConnection.HTTP_FORBIDDEN,</pre></td></tr>
<tr> <td class="numLine"> 283</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Translation.HTTP_FORBIDDEN);</pre></td></tr>
-<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
<tr> <td class="numLine"> 285</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 288</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 288</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
@@ -491,12 +491,12 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">static</span> String formMetadataHeader(Metadata metadata) {</pre></td></tr>
-<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> StringBuilder sb = <span class="keyword">new</span> StringBuilder();</pre></td></tr>
-<tr> <td class="numLineCover"> 296</td> <td class="nbHitsCovered"><a title="Line 296: Conditional coverage 100% (2/2)."> 20</a></td> <td class="src"><pre class="src"> <a title="Line 296: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Entry<String, String> item : metadata) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> StringBuilder sb = <span class="keyword">new</span> StringBuilder();</pre></td></tr>
+<tr> <td class="numLineCover"> 296</td> <td class="nbHitsCovered"><a title="Line 296: Conditional coverage 100% (2/2)."> 21</a></td> <td class="src"><pre class="src"> <a title="Line 296: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Entry<String, String> item : metadata) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 297</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> percentEncodeMapEntryPair(sb, item.getKey(), item.getValue());</pre></td></tr>
<tr> <td class="numLine"> 298</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 299</td> <td class="nbHitsCovered"><a title="Line 299: Conditional coverage 100% (2/2)."> 20</a></td> <td class="src"><pre class="src"> <a title="Line 299: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> (sb.length() == 0) ? <span class="string">""</span> : sb.substring(0, sb.length() - 1);</a></pre></td></tr>
+<tr> <td class="numLineCover"> 299</td> <td class="nbHitsCovered"><a title="Line 299: Conditional coverage 100% (2/2)."> 21</a></td> <td class="src"><pre class="src"> <a title="Line 299: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> (sb.length() == 0) ? <span class="string">""</span> : sb.substring(0, sb.length() - 1);</a></pre></td></tr>
<tr> <td class="numLine"> 300</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 301</td> <td class="nbHits"> </td>
@@ -505,8 +505,8 @@
<td class="src"><pre class="src"> @VisibleForTesting</pre></td></tr>
<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">static</span> String formUnqualifiedAclHeader(Acl acl, DocIdEncoder docIdEncoder) {</pre></td></tr>
-<tr> <td class="numLineCover"> 304</td> <td class="nbHitsCovered"><a title="Line 304: Conditional coverage 100% (2/2)."> 15</a></td> <td class="src"><pre class="src"> <a title="Line 304: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (acl == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 305</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="string">""</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 304</td> <td class="nbHitsCovered"><a title="Line 304: Conditional coverage 100% (2/2)."> 16</a></td> <td class="src"><pre class="src"> <a title="Line 304: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (acl == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 305</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="string">""</span>;</pre></td></tr>
<tr> <td class="numLine"> 306</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLineCover"> 307</td> <td class="nbHitsCovered"><a title="Line 307: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 307: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (Acl.EMPTY.equals(acl)) {</a></pre></td></tr>
@@ -690,53 +690,53 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 435</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">static</span> String percentEncode(String value) {</pre></td></tr>
-<tr> <td class="numLineCover"> 436</td> <td class="nbHitsCovered"> 318</td> <td class="src"><pre class="src"> <span class="keyword">final</span> Charset encoding = Charset.forName(<span class="string">"UTF-8"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 437</td> <td class="nbHitsCovered"> 318</td> <td class="src"><pre class="src"> StringBuilder sb = <span class="keyword">new</span> StringBuilder();</pre></td></tr>
-<tr> <td class="numLineCover"> 438</td> <td class="nbHitsCovered"> 318</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] bytes = value.getBytes(encoding);</pre></td></tr>
-<tr> <td class="numLineCover"> 439</td> <td class="nbHitsCovered"><a title="Line 439: Conditional coverage 100% (2/2)."> 1679</a></td> <td class="src"><pre class="src"> <a title="Line 439: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">byte</span> b : bytes) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 440</td> <td class="nbHitsCovered"><a title="Line 440: Conditional coverage 100% (20/20) [each condition: 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%]."> 1361</a></td> <td class="src"><pre class="src"> <a title="Line 440: Conditional coverage 100% (20/20) [each condition: 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%]."> <span class="keyword">if</span> ((b >= <span class="string">'a'</span> && b <= <span class="string">'z'</span>)</a></pre></td></tr>
+<tr> <td class="numLineCover"> 436</td> <td class="nbHitsCovered"> 62</td> <td class="src"><pre class="src"> <span class="keyword">final</span> Charset encoding = Charset.forName(<span class="string">"UTF-8"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 437</td> <td class="nbHitsCovered"> 62</td> <td class="src"><pre class="src"> StringBuilder sb = <span class="keyword">new</span> StringBuilder();</pre></td></tr>
+<tr> <td class="numLineCover"> 438</td> <td class="nbHitsCovered"> 62</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] bytes = value.getBytes(encoding);</pre></td></tr>
+<tr> <td class="numLineCover"> 439</td> <td class="nbHitsCovered"><a title="Line 439: Conditional coverage 100% (2/2)."> 1039</a></td> <td class="src"><pre class="src"> <a title="Line 439: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">byte</span> b : bytes) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 440</td> <td class="nbHitsCovered"><a title="Line 440: Conditional coverage 100% (20/20) [each condition: 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%]."> 977</a></td> <td class="src"><pre class="src"> <a title="Line 440: Conditional coverage 100% (20/20) [each condition: 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%, 100%]."> <span class="keyword">if</span> ((b >= <span class="string">'a'</span> && b <= <span class="string">'z'</span>)</a></pre></td></tr>
<tr> <td class="numLine"> 441</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> || (b >= <span class="string">'A'</span> && b <= <span class="string">'Z'</span>)</pre></td></tr>
<tr> <td class="numLine"> 442</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> || (b >= <span class="string">'0'</span> && b <= <span class="string">'9'</span>)</pre></td></tr>
<tr> <td class="numLine"> 443</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> || b == <span class="string">'-'</span> || b == <span class="string">'_'</span> || b == <span class="string">'.'</span> || b == <span class="string">'~'</span>) {</pre></td></tr>
-<tr> <td class="numLineCover"> 444</td> <td class="nbHitsCovered"> 924</td> <td class="src"><pre class="src"> sb.append((<span class="keyword">char</span>) b);</pre></td></tr>
+<tr> <td class="numLineCover"> 444</td> <td class="nbHitsCovered"> 858</td> <td class="src"><pre class="src"> sb.append((<span class="keyword">char</span>) b);</pre></td></tr>
<tr> <td class="numLine"> 445</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
<tr> <td class="numLine"> 446</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Make sure it is positive</span></pre></td></tr>
-<tr> <td class="numLineCover"> 447</td> <td class="nbHitsCovered"> 437</td> <td class="src"><pre class="src"> <span class="keyword">int</span> i = b & 0xff;</pre></td></tr>
-<tr> <td class="numLineCover"> 448</td> <td class="nbHitsCovered"> 437</td> <td class="src"><pre class="src"> String hex = Integer.toHexString(i).toUpperCase();</pre></td></tr>
-<tr> <td class="numLineCover"> 449</td> <td class="nbHitsUncovered"><a title="Line 449: Conditional coverage 50% (1/2)."> 437</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 449: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (hex.length() > 2) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 447</td> <td class="nbHitsCovered"> 119</td> <td class="src"><pre class="src"> <span class="keyword">int</span> i = b & 0xff;</pre></td></tr>
+<tr> <td class="numLineCover"> 448</td> <td class="nbHitsCovered"> 119</td> <td class="src"><pre class="src"> String hex = Integer.toHexString(i).toUpperCase();</pre></td></tr>
+<tr> <td class="numLineCover"> 449</td> <td class="nbHitsUncovered"><a title="Line 449: Conditional coverage 50% (1/2)."> 119</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 449: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (hex.length() > 2) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 450</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
<tr> <td class="numLine"> 451</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 452</td> <td class="nbHitsCovered"><a title="Line 452: Conditional coverage 100% (2/2)."> 454</a></td> <td class="src"><pre class="src"> <a title="Line 452: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (hex.length() != 2) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 453</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> hex = <span class="string">"0"</span> + hex;</pre></td></tr>
+<tr> <td class="numLineCover"> 452</td> <td class="nbHitsCovered"><a title="Line 452: Conditional coverage 100% (2/2)."> 120</a></td> <td class="src"><pre class="src"> <a title="Line 452: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (hex.length() != 2) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 453</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> hex = <span class="string">"0"</span> + hex;</pre></td></tr>
<tr> <td class="numLine"> 454</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 455</td> <td class="nbHitsCovered"> 437</td> <td class="src"><pre class="src"> sb.append(<span class="string">'%'</span>).append(hex);</pre></td></tr>
+<tr> <td class="numLineCover"> 455</td> <td class="nbHitsCovered"> 119</td> <td class="src"><pre class="src"> sb.append(<span class="string">'%'</span>).append(hex);</pre></td></tr>
<tr> <td class="numLine"> 456</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 457</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 458</td> <td class="nbHitsCovered"> 318</td> <td class="src"><pre class="src"> <span class="keyword">return</span> sb.toString();</pre></td></tr>
+<tr> <td class="numLineCover"> 458</td> <td class="nbHitsCovered"> 62</td> <td class="src"><pre class="src"> <span class="keyword">return</span> sb.toString();</pre></td></tr>
<tr> <td class="numLine"> 459</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 460</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 461</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> DocumentRequest <span class="keyword">implements</span> Request {</pre></td></tr>
+<tr> <td class="numLineCover"> 461</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> DocumentRequest <span class="keyword">implements</span> Request {</pre></td></tr>
<tr> <td class="numLine"> 462</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> HttpExchange ex;</pre></td></tr>
<tr> <td class="numLine"> 463</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> DocId docId;</pre></td></tr>
<tr> <td class="numLine"> 464</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 465</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">private</span> DocumentRequest(HttpExchange ex, DocId docId) {</pre></td></tr>
-<tr> <td class="numLineCover"> 466</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.ex = ex;</pre></td></tr>
-<tr> <td class="numLineCover"> 467</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docId = docId;</pre></td></tr>
-<tr> <td class="numLineCover"> 468</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 465</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">private</span> DocumentRequest(HttpExchange ex, DocId docId) {</pre></td></tr>
+<tr> <td class="numLineCover"> 466</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.ex = ex;</pre></td></tr>
+<tr> <td class="numLineCover"> 467</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docId = docId;</pre></td></tr>
+<tr> <td class="numLineCover"> 468</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 469</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 470</td> <td class="nbHits"> </td>
@@ -766,7 +766,7 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 485</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> DocId getDocId() {</pre></td></tr>
-<tr> <td class="numLineCover"> 486</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docId;</pre></td></tr>
+<tr> <td class="numLineCover"> 486</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docId;</pre></td></tr>
<tr> <td class="numLine"> 487</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 488</td> <td class="nbHits"> </td>
@@ -849,8 +849,8 @@
<td class="src"><pre class="src"> <span class="comment"> * need to be very aware of all the different possibilities.</span></pre></td></tr>
<tr> <td class="numLine"> 531</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 532</td> <td class="nbHitsCovered"> 131</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> DocumentResponse <span class="keyword">implements</span> Response {</pre></td></tr>
-<tr> <td class="numLineCover"> 533</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">private</span> State state = State.SETUP;</pre></td></tr>
+<tr> <td class="numLineCover"> 532</td> <td class="nbHitsCovered"> 136</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> DocumentResponse <span class="keyword">implements</span> Response {</pre></td></tr>
+<tr> <td class="numLineCover"> 533</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">private</span> State state = State.SETUP;</pre></td></tr>
<tr> <td class="numLine"> 534</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> HttpExchange ex;</pre></td></tr>
<tr> <td class="numLine"> 535</td> <td class="nbHits"> </td>
@@ -871,13 +871,13 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> String contentType;</pre></td></tr>
<tr> <td class="numLine"> 543</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Date lastModified;</pre></td></tr>
-<tr> <td class="numLineCover"> 544</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Metadata metadata = <span class="keyword">new</span> Metadata();</pre></td></tr>
+<tr> <td class="numLineCover"> 544</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Metadata metadata = <span class="keyword">new</span> Metadata();</pre></td></tr>
<tr> <td class="numLine"> 545</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Acl acl;</pre></td></tr>
<tr> <td class="numLine"> 546</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> secure;</pre></td></tr>
-<tr> <td class="numLineCover"> 547</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<URI> anchorUris = <span class="keyword">new</span> ArrayList<URI>();</pre></td></tr>
-<tr> <td class="numLineCover"> 548</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<String> anchorTexts = <span class="keyword">new</span> ArrayList<String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 547</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<URI> anchorUris = <span class="keyword">new</span> ArrayList<URI>();</pre></td></tr>
+<tr> <td class="numLineCover"> 548</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<String> anchorTexts = <span class="keyword">new</span> ArrayList<String>();</pre></td></tr>
<tr> <td class="numLine"> 549</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> DocId docId;</pre></td></tr>
<tr> <td class="numLine"> 550</td> <td class="nbHits"> </td>
@@ -894,10 +894,10 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> lock;</pre></td></tr>
<tr> <td class="numLine"> 556</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 557</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DocumentResponse(HttpExchange ex, DocId docId) {</pre></td></tr>
-<tr> <td class="numLineCover"> 558</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.ex = ex;</pre></td></tr>
-<tr> <td class="numLineCover"> 559</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docId = docId;</pre></td></tr>
-<tr> <td class="numLineCover"> 560</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 557</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DocumentResponse(HttpExchange ex, DocId docId) {</pre></td></tr>
+<tr> <td class="numLineCover"> 558</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.ex = ex;</pre></td></tr>
+<tr> <td class="numLineCover"> 559</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docId = docId;</pre></td></tr>
+<tr> <td class="numLineCover"> 560</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 561</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 562</td> <td class="nbHits"> </td>
@@ -928,12 +928,12 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 579</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> OutputStream getOutputStream() {</pre></td></tr>
-<tr> <td class="numLineCover"> 580</td> <td class="nbHitsUncovered"><a title="Line 580: Conditional coverage 42% (3/7)."> 45</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 580: Conditional coverage 42% (3/7)."> <span class="keyword">switch</span> (state) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 580</td> <td class="nbHitsUncovered"><a title="Line 580: Conditional coverage 42% (3/7)."> 46</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 580: Conditional coverage 42% (3/7)."> <span class="keyword">switch</span> (state) {</a></span></pre></td></tr>
<tr> <td class="numLine"> 581</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> SETUP:</pre></td></tr>
<tr> <td class="numLine"> 582</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// We will need to make an OutputStream.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 583</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 583</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLine"> 584</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> HEAD:</pre></td></tr>
<tr> <td class="numLine"> 585</td> <td class="nbHits"> </td>
@@ -954,12 +954,12 @@
<tr> <td class="numLineCover"> 594</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Already responded"</span>);</span></pre></td></tr>
<tr> <td class="numLine"> 595</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 596</td> <td class="nbHitsCovered"><a title="Line 596: Conditional coverage 100% (2/2)."> 41</a></td> <td class="src"><pre class="src"> <a title="Line 596: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"HEAD"</span>.equals(ex.getRequestMethod())) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 596</td> <td class="nbHitsCovered"><a title="Line 596: Conditional coverage 100% (2/2)."> 42</a></td> <td class="src"><pre class="src"> <a title="Line 596: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"HEAD"</span>.equals(ex.getRequestMethod())) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 597</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> state = State.HEAD;</pre></td></tr>
<tr> <td class="numLineCover"> 598</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> os = <span class="keyword">new</span> SinkOutputStream();</pre></td></tr>
<tr> <td class="numLine"> 599</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 600</td> <td class="nbHitsCovered"><a title="Line 600: Conditional coverage 100% (2/2)."> 39</a></td> <td class="src"><pre class="src"> <a title="Line 600: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (transform != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 600</td> <td class="nbHitsCovered"><a title="Line 600: Conditional coverage 100% (2/2)."> 40</a></td> <td class="src"><pre class="src"> <a title="Line 600: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (transform != <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 601</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> state = State.TRANSFORM;</pre></td></tr>
<tr> <td class="numLineCover"> 602</td> <td class="nbHitsCovered"><a title="Line 602: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 602: Conditional coverage 100% (2/2)."> OutputStream innerOs = transformRequired</a></pre></td></tr>
<tr> <td class="numLine"> 603</td> <td class="nbHits"> </td>
@@ -967,14 +967,14 @@
<tr> <td class="numLineCover"> 604</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> countingOs = <span class="keyword">new</span> CountingOutputStream(innerOs);</pre></td></tr>
<tr> <td class="numLineCover"> 605</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> os = <span class="keyword">new</span> MaxBufferOutputStream(countingOs, transformMaxBytes);</pre></td></tr>
<tr> <td class="numLineCover"> 606</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 607</td> <td class="nbHitsCovered"> 36</td> <td class="src"><pre class="src"> state = State.NO_TRANSFORM;</pre></td></tr>
-<tr> <td class="numLineCover"> 608</td> <td class="nbHitsCovered"> 36</td> <td class="src"><pre class="src"> countingOs = <span class="keyword">new</span> CountingOutputStream(<span class="keyword">new</span> LazyContentOutputStream());</pre></td></tr>
-<tr> <td class="numLineCover"> 609</td> <td class="nbHitsCovered"> 36</td> <td class="src"><pre class="src"> os = countingOs;</pre></td></tr>
+<tr> <td class="numLineCover"> 607</td> <td class="nbHitsCovered"> 37</td> <td class="src"><pre class="src"> state = State.NO_TRANSFORM;</pre></td></tr>
+<tr> <td class="numLineCover"> 608</td> <td class="nbHitsCovered"> 37</td> <td class="src"><pre class="src"> countingOs = <span class="keyword">new</span> CountingOutputStream(<span class="keyword">new</span> LazyContentOutputStream());</pre></td></tr>
+<tr> <td class="numLineCover"> 609</td> <td class="nbHitsCovered"> 37</td> <td class="src"><pre class="src"> os = countingOs;</pre></td></tr>
<tr> <td class="numLine"> 610</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 611</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 612</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> <span class="keyword">return</span> os;</pre></td></tr>
+<tr> <td class="numLineCover"> 612</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">return</span> os;</pre></td></tr>
<tr> <td class="numLine"> 613</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 614</td> <td class="nbHits"> </td>
@@ -1130,14 +1130,14 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 715</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">long</span> getWrittenContentSize() {</pre></td></tr>
-<tr> <td class="numLineCover"> 716</td> <td class="nbHitsCovered"><a title="Line 716: Conditional coverage 100% (2/2)."> 31</a></td> <td class="src"><pre class="src"> <a title="Line 716: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> countingOs == <span class="keyword">null</span> ? 0 : countingOs.getBytesWritten();</a></pre></td></tr>
+<tr> <td class="numLineCover"> 716</td> <td class="nbHitsCovered"><a title="Line 716: Conditional coverage 100% (2/2)."> 32</a></td> <td class="src"><pre class="src"> <a title="Line 716: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> countingOs == <span class="keyword">null</span> ? 0 : countingOs.getBytesWritten();</a></pre></td></tr>
<tr> <td class="numLine"> 717</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 718</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 719</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> complete() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 720</td> <td class="nbHitsUncovered"><a title="Line 720: Conditional coverage 85% (6/7)."> 31</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 720: Conditional coverage 85% (6/7)."> <span class="keyword">switch</span> (state) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 720</td> <td class="nbHitsUncovered"><a title="Line 720: Conditional coverage 85% (6/7)."> 32</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 720: Conditional coverage 85% (6/7)."> <span class="keyword">switch</span> (state) {</a></span></pre></td></tr>
<tr> <td class="numLine"> 721</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> SETUP:</pre></td></tr>
<tr> <td class="numLineCover"> 722</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"No response sent from adaptor"</span>);</pre></td></tr>
@@ -1180,7 +1180,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 749</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> NO_TRANSFORM:</pre></td></tr>
-<tr> <td class="numLineCover"> 750</td> <td class="nbHitsCovered"><a title="Line 750: Conditional coverage 100% (2/2)."> 23</a></td> <td class="src"><pre class="src"> <a title="Line 750: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!responseBodyClosed) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 750</td> <td class="nbHitsCovered"><a title="Line 750: Conditional coverage 100% (2/2)."> 24</a></td> <td class="src"><pre class="src"> <a title="Line 750: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!responseBodyClosed) {</a></pre></td></tr>
<tr> <td class="numLine"> 751</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// The Adaptor didn't close the stream, so close it for them, making</span></pre></td></tr>
<tr> <td class="numLine"> 752</td> <td class="nbHits"> </td>
@@ -1201,11 +1201,11 @@
<td class="src"><pre class="src"> <span class="comment">// were written). In using the OutputStream provided to the Adaptor</span></pre></td></tr>
<tr> <td class="numLine"> 760</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// for flush()ing we also trigger a call to startSending().</span></pre></td></tr>
-<tr> <td class="numLineCover"> 761</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> os.flush();</pre></td></tr>
-<tr> <td class="numLineCover"> 762</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> os.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 761</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> os.flush();</pre></td></tr>
+<tr> <td class="numLineCover"> 762</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> os.close();</pre></td></tr>
<tr> <td class="numLine"> 763</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 764</td> <td class="nbHitsUncovered"><a title="Line 764: Conditional coverage 50% (1/2)."> 22</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 764: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!responseBodyClosed) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 764</td> <td class="nbHitsUncovered"><a title="Line 764: Conditional coverage 50% (1/2)."> 23</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 764: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!responseBodyClosed) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 765</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
<tr> <td class="numLine"> 766</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
@@ -1228,21 +1228,21 @@
<tr> <td class="numLineCover"> 776</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException();</span></pre></td></tr>
<tr> <td class="numLine"> 777</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 778</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> ex.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 779</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 778</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> ex.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 779</td> <td class="nbHitsCovered"> 30</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 780</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 781</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> startSending(<span class="keyword">boolean</span> hasContent) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 782</td> <td class="nbHitsCovered"><a title="Line 782: Conditional coverage 100% (2/2)."> 27</a></td> <td class="src"><pre class="src"> <a title="Line 782: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (requestIsFromFullyTrustedClient(ex)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 782</td> <td class="nbHitsCovered"><a title="Line 782: Conditional coverage 100% (2/2)."> 28</a></td> <td class="src"><pre class="src"> <a title="Line 782: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (requestIsFromFullyTrustedClient(ex)) {</a></pre></td></tr>
<tr> <td class="numLine"> 783</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Always specify metadata and ACLs, even when empty, to replace</span></pre></td></tr>
<tr> <td class="numLine"> 784</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// previous values.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 785</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Gsa-External-Metadata"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 785</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Gsa-External-Metadata"</span>,</pre></td></tr>
<tr> <td class="numLine"> 786</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> formMetadataHeader(metadata));</pre></td></tr>
-<tr> <td class="numLineCover"> 787</td> <td class="nbHitsCovered"><a title="Line 787: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 787: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (sendDocControls) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 787</td> <td class="nbHitsCovered"><a title="Line 787: Conditional coverage 100% (2/2)."> 19</a></td> <td class="src"><pre class="src"> <a title="Line 787: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (sendDocControls) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 788</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Gsa-Doc-Controls"</span>, <span class="string">"acl="</span></pre></td></tr>
<tr> <td class="numLine"> 789</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + percentEncode(formNamespacedAclHeader(acl, docIdEncoder)));</pre></td></tr>
@@ -1257,11 +1257,11 @@
<tr> <td class="numLineCover"> 796</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Gsa-Doc-Controls"</span>, <span class="string">"lock="</span> + lock);</pre></td></tr>
<tr> <td class="numLine"> 797</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 798</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> acl = checkAndWorkaroundGsa70Acl(acl);</pre></td></tr>
-<tr> <td class="numLineCover"> 799</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Gsa-External-Metadata"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 798</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> acl = checkAndWorkaroundGsa70Acl(acl);</pre></td></tr>
+<tr> <td class="numLineCover"> 799</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Gsa-External-Metadata"</span>,</pre></td></tr>
<tr> <td class="numLine"> 800</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> formUnqualifiedAclHeader(acl, docIdEncoder));</pre></td></tr>
-<tr> <td class="numLineCover"> 801</td> <td class="nbHitsUncovered"><a title="Line 801: Conditional coverage 66% (4/6) [each condition: 100%, 50%, 50%]."> 12</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 801: Conditional coverage 66% (4/6) [each condition: 100%, 50%, 50%]."> <span class="keyword">if</span> (displayUrl != <span class="keyword">null</span> || crawlOnce || lock) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 801</td> <td class="nbHitsUncovered"><a title="Line 801: Conditional coverage 66% (4/6) [each condition: 100%, 50%, 50%]."> 13</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 801: Conditional coverage 66% (4/6) [each condition: 100%, 50%, 50%]."> <span class="keyword">if</span> (displayUrl != <span class="keyword">null</span> || crawlOnce || lock) {</a></span></pre></td></tr>
<tr> <td class="numLine"> 802</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Emulate these crawl-time values by sending them in feeds</span></pre></td></tr>
<tr> <td class="numLine"> 803</td> <td class="nbHits"> </td>
@@ -1277,7 +1277,7 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 809</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 810</td> <td class="nbHitsCovered"><a title="Line 810: Conditional coverage 100% (2/2)."> 17</a></td> <td class="src"><pre class="src"> <a title="Line 810: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!anchorUris.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 810</td> <td class="nbHitsCovered"><a title="Line 810: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 810: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!anchorUris.isEmpty()) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 811</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Gsa-External-Anchor"</span>,</pre></td></tr>
<tr> <td class="numLine"> 812</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> formAnchorHeader(anchorUris, anchorTexts));</pre></td></tr>
@@ -1295,43 +1295,43 @@
<td class="src"><pre class="src"> <span class="comment">// (2) If document has ACL, then send secure. That helps the GSA</span></pre></td></tr>
<tr> <td class="numLine"> 819</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// and prevents confusion of having ACLs and public label juxtaposed.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 820</td> <td class="nbHitsCovered"><a title="Line 820: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 17</a></td> <td class="src"><pre class="src"> <a title="Line 820: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> ex.getResponseHeaders().add(<span class="string">"X-Gsa-Serve-Security"</span>,</a></pre></td></tr>
+<tr> <td class="numLineCover"> 820</td> <td class="nbHitsCovered"><a title="Line 820: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 820: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> ex.getResponseHeaders().add(<span class="string">"X-Gsa-Serve-Security"</span>,</a></pre></td></tr>
<tr> <td class="numLine"> 821</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> (secure || (<span class="keyword">null</span> != acl)) ? <span class="string">"secure"</span> : <span class="string">"public"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 822</td> <td class="nbHitsCovered"><a title="Line 822: Conditional coverage 100% (2/2)."> 17</a></td> <td class="src"><pre class="src"> <a title="Line 822: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (noIndex) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 822</td> <td class="nbHitsCovered"><a title="Line 822: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 822: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (noIndex) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 823</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Robots-Tag"</span>, <span class="string">"noindex"</span>);</pre></td></tr>
<tr> <td class="numLine"> 824</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 825</td> <td class="nbHitsCovered"><a title="Line 825: Conditional coverage 100% (2/2)."> 17</a></td> <td class="src"><pre class="src"> <a title="Line 825: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (noFollow) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 825</td> <td class="nbHitsCovered"><a title="Line 825: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 825: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (noFollow) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 826</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Robots-Tag"</span>, <span class="string">"nofollow"</span>);</pre></td></tr>
<tr> <td class="numLine"> 827</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 828</td> <td class="nbHitsCovered"><a title="Line 828: Conditional coverage 100% (2/2)."> 17</a></td> <td class="src"><pre class="src"> <a title="Line 828: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (noArchive) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 828</td> <td class="nbHitsCovered"><a title="Line 828: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 828: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (noArchive) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 829</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ex.getResponseHeaders().add(<span class="string">"X-Robots-Tag"</span>, <span class="string">"noarchive"</span>);</pre></td></tr>
<tr> <td class="numLine"> 830</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 831</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 832</td> <td class="nbHitsUncovered"><a title="Line 832: Conditional coverage 50% (1/2)."> 26</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 832: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (useCompression) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 832</td> <td class="nbHitsCovered"><a title="Line 832: Conditional coverage 100% (2/2)."> 27</a></td> <td class="src"><pre class="src"> <a title="Line 832: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (useCompression) {</a></pre></td></tr>
<tr> <td class="numLine"> 833</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// TODO(ejona): decide when to use compression based on mime-type</span></pre></td></tr>
-<tr> <td class="numLineCover"> 834</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> HttpExchanges.enableCompressionIfSupported(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 834</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpExchanges.enableCompressionIfSupported(ex);</pre></td></tr>
<tr> <td class="numLine"> 835</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 836</td> <td class="nbHitsCovered"><a title="Line 836: Conditional coverage 100% (2/2)."> 26</a></td> <td class="src"><pre class="src"> <a title="Line 836: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (lastModified != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 836</td> <td class="nbHitsCovered"><a title="Line 836: Conditional coverage 100% (2/2)."> 27</a></td> <td class="src"><pre class="src"> <a title="Line 836: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (lastModified != <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 837</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> HttpExchanges.setLastModified(ex, lastModified);</pre></td></tr>
<tr> <td class="numLine"> 838</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 839</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> HttpExchanges.startResponse(</pre></td></tr>
+<tr> <td class="numLineCover"> 839</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> HttpExchanges.startResponse(</pre></td></tr>
<tr> <td class="numLine"> 840</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> ex, HttpURLConnection.HTTP_OK, contentType, hasContent);</pre></td></tr>
-<tr> <td class="numLineCover"> 841</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 841</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 842</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 843</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Acl checkAndWorkaroundGsa70Acl(Acl acl) {</pre></td></tr>
-<tr> <td class="numLineCover"> 844</td> <td class="nbHitsCovered"><a title="Line 844: Conditional coverage 100% (2/2)."> 13</a></td> <td class="src"><pre class="src"> <a title="Line 844: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (acl == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 845</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> acl;</pre></td></tr>
+<tr> <td class="numLineCover"> 844</td> <td class="nbHitsCovered"><a title="Line 844: Conditional coverage 100% (2/2)."> 14</a></td> <td class="src"><pre class="src"> <a title="Line 844: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (acl == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 845</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">return</span> acl;</pre></td></tr>
<tr> <td class="numLine"> 846</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 847</td> <td class="nbHits"> </td>
@@ -1432,13 +1432,13 @@
<td class="src"><pre class="src"> <span class="comment"> * Used when transform pipeline is circumvented.</span></pre></td></tr>
<tr> <td class="numLine"> 907</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 908</td> <td class="nbHitsCovered"> 76</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> LazyContentOutputStream <span class="keyword">extends</span> AbstractLazyOutputStream {</pre></td></tr>
+<tr> <td class="numLineCover"> 908</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> LazyContentOutputStream <span class="keyword">extends</span> AbstractLazyOutputStream {</pre></td></tr>
<tr> <td class="numLine"> 909</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 910</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">protected</span> OutputStream retrieveOs() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 911</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> startSending(<span class="keyword">true</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 912</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ex.getResponseBody();</pre></td></tr>
+<tr> <td class="numLineCover"> 911</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> startSending(<span class="keyword">true</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 912</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ex.getResponseBody();</pre></td></tr>
<tr> <td class="numLine"> 913</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 914</td> <td class="nbHits"> </td>
@@ -1447,9 +1447,9 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 916</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> close() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 917</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> responseBodyClosed = <span class="keyword">true</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 918</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 919</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 917</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> responseBodyClosed = <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 918</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 919</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 920</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 921</td> <td class="nbHits"> </td>
@@ -1503,26 +1503,26 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 948</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> CountingOutputStream(OutputStream out) {</pre></td></tr>
-<tr> <td class="numLineCover"> 949</td> <td class="nbHitsCovered"> 39</td> <td class="src"><pre class="src"> <span class="keyword">super</span>(out);</pre></td></tr>
-<tr> <td class="numLineCover"> 950</td> <td class="nbHitsCovered"> 39</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 949</td> <td class="nbHitsCovered"> 40</td> <td class="src"><pre class="src"> <span class="keyword">super</span>(out);</pre></td></tr>
+<tr> <td class="numLineCover"> 950</td> <td class="nbHitsCovered"> 40</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 951</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 952</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 953</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> write(<span class="keyword">byte</span>[] b, <span class="keyword">int</span> off, <span class="keyword">int</span> len) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 954</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.write(b, off, len);</pre></td></tr>
+<tr> <td class="numLineCover"> 954</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">super</span>.write(b, off, len);</pre></td></tr>
<tr> <td class="numLine"> 955</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Increment after write so that 'len' is known valid. If an exception is</span></pre></td></tr>
<tr> <td class="numLine"> 956</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// thrown then this is likely the better behavior as well.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 957</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> count += len;</pre></td></tr>
-<tr> <td class="numLineCover"> 958</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 957</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> count += len;</pre></td></tr>
+<tr> <td class="numLineCover"> 958</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 959</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 960</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">long</span> getBytesWritten() {</pre></td></tr>
-<tr> <td class="numLineCover"> 961</td> <td class="nbHitsCovered"> 25</td> <td class="src"><pre class="src"> <span class="keyword">return</span> count;</pre></td></tr>
+<tr> <td class="numLineCover"> 961</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> <span class="keyword">return</span> count;</pre></td></tr>
<tr> <td class="numLine"> 962</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 963</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.FakeMap.html b/coverage/com.google.enterprise.adaptor.FakeMap.html
index f8e510e..503edaa 100644
--- a/coverage/com.google.enterprise.adaptor.FakeMap.html
+++ b/coverage/com.google.enterprise.adaptor.FakeMap.html
@@ -59,12 +59,12 @@
<td class="src"><pre class="src"> <span class="comment"> * Fake modifiable map that doesn't store anything.</span></pre></td></tr>
<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 87</td> <td class="src"><pre class="src"> <span class="keyword">class</span> FakeMap<K, V> <span class="keyword">extends</span> AbstractMap<K, V> {</pre></td></tr>
+<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 99</td> <td class="src"><pre class="src"> <span class="keyword">class</span> FakeMap<K, V> <span class="keyword">extends</span> AbstractMap<K, V> {</pre></td></tr>
<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Set<Map.Entry<K, V>> entrySet() {</pre></td></tr>
-<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.emptySet();</pre></td></tr>
+<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.emptySet();</pre></td></tr>
<tr> <td class="numLine"> 26</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
@@ -73,7 +73,7 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> V put(K key, V value) {</pre></td></tr>
-<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.FastFilterOutputStream.html b/coverage/com.google.enterprise.adaptor.FastFilterOutputStream.html
index efa5db2..8c84da3 100644
--- a/coverage/com.google.enterprise.adaptor.FastFilterOutputStream.html
+++ b/coverage/com.google.enterprise.adaptor.FastFilterOutputStream.html
@@ -63,7 +63,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">class</span> FastFilterOutputStream <span class="keyword">extends</span> OutputStream {</pre></td></tr>
-<tr> <td class="numLineCover"> 24</td> <td class="nbHitsCovered"> 296</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">byte</span>[] singleByte = <span class="keyword">new</span> <span class="keyword">byte</span>[1];</pre></td></tr>
+<tr> <td class="numLineCover"> 24</td> <td class="nbHitsCovered"> 297</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">byte</span>[] singleByte = <span class="keyword">new</span> <span class="keyword">byte</span>[1];</pre></td></tr>
<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Protected to mimic FilterOutputStream.</span></pre></td></tr>
<tr> <td class="numLine"> 26</td> <td class="nbHits"> </td>
@@ -89,13 +89,13 @@
<td class="src"><pre class="src"> <span class="comment"> * to be {@code null} via this constructor.</span></pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 295</td> <td class="src"><pre class="src"> <span class="keyword">public</span> FastFilterOutputStream(OutputStream out) {</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"><a title="Line 39: Conditional coverage 100% (2/2)."> 295</a></td> <td class="src"><pre class="src"> <a title="Line 39: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (out == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 296</td> <td class="src"><pre class="src"> <span class="keyword">public</span> FastFilterOutputStream(OutputStream out) {</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"><a title="Line 39: Conditional coverage 100% (2/2)."> 296</a></td> <td class="src"><pre class="src"> <a title="Line 39: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (out == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 294</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.out = out;</pre></td></tr>
-<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 294</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 295</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.out = out;</pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 295</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
@@ -108,8 +108,8 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> close() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 50</td> <td class="nbHitsCovered"> 275</td> <td class="src"><pre class="src"> out.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 275</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 50</td> <td class="nbHitsCovered"> 278</td> <td class="src"><pre class="src"> out.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 278</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
@@ -122,8 +122,8 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> flush() <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 172</td> <td class="src"><pre class="src"> out.flush();</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 171</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 174</td> <td class="src"><pre class="src"> out.flush();</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 173</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
@@ -136,8 +136,8 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> write(<span class="keyword">byte</span>[] b, <span class="keyword">int</span> off, <span class="keyword">int</span> len) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 123</td> <td class="src"><pre class="src"> out.write(b, off, len);</pre></td></tr>
-<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 122</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 125</td> <td class="src"><pre class="src"> out.write(b, off, len);</pre></td></tr>
+<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 124</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
@@ -154,8 +154,8 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> write(<span class="keyword">byte</span>[] b) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 95</td> <td class="src"><pre class="src"> write(b, 0, b.length);</pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 95</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> write(b, 0, b.length);</pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.GsaCommunicationHandler.html b/coverage/com.google.enterprise.adaptor.GsaCommunicationHandler.html
index ffdee96..5633991 100644
--- a/coverage/com.google.enterprise.adaptor.GsaCommunicationHandler.html
+++ b/coverage/com.google.enterprise.adaptor.GsaCommunicationHandler.html
@@ -12,14 +12,14 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">41</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:80px"><span class="text">167/208</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">19</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:69px"><span class="text">43/62</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$AdaptorContextImpl</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">15</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:44px"><span class="text">12/27</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$AlreadyRunningRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:33px"><span class="text">1/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$BackgroundRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">5/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$GsaConfigModListener</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">23</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:4px"><span class="text">1/24</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$IncrementalPushRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:43px"><span class="text">7/16</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$PushRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">10/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">41</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:80px"><span class="text">171/212</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">19</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:70px"><span class="text">45/64</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$AdaptorContextImpl</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">15</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:44px"><span class="text">12/27</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$AlreadyRunningRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:33px"><span class="text">1/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$BackgroundRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">5/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$GsaConfigModListener</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">23</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:4px"><span class="text">1/24</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$IncrementalPushRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:43px"><span class="text">7/16</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$PushRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">10/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
</table>
<div class="separator"> </div>
@@ -104,7 +104,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** This class handles the communications with GSA. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">class</span> GsaCommunicationHandler {</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">class</span> GsaCommunicationHandler {</pre></td></tr>
<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Logger.getLogger(GsaCommunicationHandler.<span class="keyword">class</span>.getName());</pre></td></tr>
@@ -138,7 +138,7 @@
<td class="src"><pre class="src"> <span class="comment"> * occur, all but the first will log a warning and return immediately.</span></pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> OneAtATimeRunnable docIdFullPusher = <span class="keyword">new</span> OneAtATimeRunnable(</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> OneAtATimeRunnable docIdFullPusher = <span class="keyword">new</span> OneAtATimeRunnable(</pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> PushRunnable(), <span class="keyword">new</span> AlreadyRunningRunnable());</pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
@@ -231,10 +231,10 @@
<td class="src"><pre class="src"> <span class="comment"> * new start() calls before stop() is done processing.</span></pre></td></tr>
<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> AtomicInteger shutdownCount = <span class="keyword">new</span> AtomicInteger();</pre></td></tr>
+<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> AtomicInteger shutdownCount = <span class="keyword">new</span> AtomicInteger();</pre></td></tr>
<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> ShutdownWaiter waiter;</pre></td></tr>
-<tr> <td class="numLineCover"> 108</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> List<Filter> commonFilters = Arrays.asList(<span class="keyword">new</span> Filter[] {</pre></td></tr>
+<tr> <td class="numLineCover"> 108</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> List<Filter> commonFilters = Arrays.asList(<span class="keyword">new</span> Filter[] {</pre></td></tr>
<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> AbortImmediatelyFilter(),</pre></td></tr>
<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
@@ -245,14 +245,14 @@
<td class="src"><pre class="src"> });</pre></td></tr>
<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 114</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GsaCommunicationHandler(Adaptor adaptor, Config config) {</pre></td></tr>
-<tr> <td class="numLineCover"> 115</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.adaptor = adaptor;</pre></td></tr>
-<tr> <td class="numLineCover"> 116</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
+<tr> <td class="numLineCover"> 114</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GsaCommunicationHandler(Adaptor adaptor, Config config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 115</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.adaptor = adaptor;</pre></td></tr>
+<tr> <td class="numLineCover"> 116</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> journal = <span class="keyword">new</span> Journal(config.isJournalReducedMem());</pre></td></tr>
-<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> docIdCodec = <span class="keyword">new</span> DocIdCodec(config);</pre></td></tr>
-<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> journal = <span class="keyword">new</span> Journal(config.isJournalReducedMem());</pre></td></tr>
+<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> docIdCodec = <span class="keyword">new</span> DocIdCodec(config);</pre></td></tr>
+<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 122</td> <td class="nbHits"> </td>
@@ -261,15 +261,15 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> start(HttpServer server, HttpServer dashboardServer)</pre></td></tr>
<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> IOException, InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 125</td> <td class="nbHitsUncovered"><a title="Line 125: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 125: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="keyword">this</span>.scope != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 125</td> <td class="nbHitsUncovered"><a title="Line 125: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 125: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="keyword">this</span>.scope != <span class="keyword">null</span>) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 126</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Already listening"</span>);</span></pre></td></tr>
<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 128</td> <td class="nbHitsUncovered"><a title="Line 128: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 128: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> <span class="keyword">if</span> (server == <span class="keyword">null</span> || dashboardServer == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 128</td> <td class="nbHitsUncovered"><a title="Line 128: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 128: Conditional coverage 50% (2/4) [each condition: 50%, 50%]."> <span class="keyword">if</span> (server == <span class="keyword">null</span> || dashboardServer == <span class="keyword">null</span>) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 129</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 131</td> <td class="nbHitsUncovered"><a title="Line 131: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 131: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (server <span class="keyword">instanceof</span> HttpsServer</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 131</td> <td class="nbHitsUncovered"><a title="Line 131: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 131: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (server <span class="keyword">instanceof</span> HttpsServer</a></span></pre></td></tr>
<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> != dashboardServer <span class="keyword">instanceof</span> HttpsServer) {</pre></td></tr>
<tr> <td class="numLineCover"> 133</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(</span></pre></td></tr>
@@ -277,23 +277,23 @@
<td class="src"><pre class="src"> <span class="string">"Both servers must be HttpServers or both HttpsServers"</span>);</pre></td></tr>
<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 136</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> shuttingDownLatch = <span class="keyword">new</span> CountDownLatch(1);</pre></td></tr>
-<tr> <td class="numLineCover"> 137</td> <td class="nbHitsUncovered"><a title="Line 137: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 137: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (shutdownCount.get() > 0) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 136</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> shuttingDownLatch = <span class="keyword">new</span> CountDownLatch(1);</pre></td></tr>
+<tr> <td class="numLineCover"> 137</td> <td class="nbHitsUncovered"><a title="Line 137: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 137: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (shutdownCount.get() > 0) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 138</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> shuttingDownLatch = <span class="keyword">null</span>;</span></pre></td></tr>
<tr> <td class="numLineCover"> 139</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> secure = server <span class="keyword">instanceof</span> HttpsServer;</pre></td></tr>
-<tr> <td class="numLineCover"> 143</td> <td class="nbHitsUncovered"><a title="Line 143: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 143: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (secure != config.isServerSecure()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> secure = server <span class="keyword">instanceof</span> HttpsServer;</pre></td></tr>
+<tr> <td class="numLineCover"> 143</td> <td class="nbHitsUncovered"><a title="Line 143: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 143: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (secure != config.isServerSecure()) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 144</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> config.setValue(<span class="string">"server.secure"</span>, <span class="string">""</span> + secure);</span></pre></td></tr>
<tr> <td class="numLine"> 145</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> KeyPair key = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> KeyPair key = <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 147</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> key = getKeyPair(config.getServerKeyAlias());</pre></td></tr>
+<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> key = getKeyPair(config.getServerKeyAlias());</pre></td></tr>
<tr> <td class="numLineCover"> 149</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ex) {</span></pre></td></tr>
<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// The exception is only fatal if we are in secure mode.</span></pre></td></tr>
@@ -308,22 +308,22 @@
<tr> <td class="numLineCover"> 157</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> ex;</span></pre></td></tr>
<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 159</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> secureValueCodec = <span class="keyword">new</span> SensitiveValueCodec(key);</pre></td></tr>
+<tr> <td class="numLineCover"> 159</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> secureValueCodec = <span class="keyword">new</span> SensitiveValueCodec(key);</pre></td></tr>
<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">int</span> port = server.getAddress().getPort();</pre></td></tr>
-<tr> <td class="numLineCover"> 163</td> <td class="nbHitsCovered"><a title="Line 163: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 163: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (port != config.getServerPort()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> config.setValue(<span class="string">"server.port"</span>, <span class="string">""</span> + port);</pre></td></tr>
+<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">int</span> port = server.getAddress().getPort();</pre></td></tr>
+<tr> <td class="numLineCover"> 163</td> <td class="nbHitsCovered"><a title="Line 163: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 163: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (port != config.getServerPort()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> config.setValue(<span class="string">"server.port"</span>, <span class="string">""</span> + port);</pre></td></tr>
<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> scope = <span class="keyword">new</span> HttpServerScope(server);</pre></td></tr>
-<tr> <td class="numLineCover"> 168</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> waiter = <span class="keyword">new</span> ShutdownWaiter();</pre></td></tr>
+<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> scope = <span class="keyword">new</span> HttpServerScope(server);</pre></td></tr>
+<tr> <td class="numLineCover"> 168</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> waiter = <span class="keyword">new</span> ShutdownWaiter();</pre></td></tr>
<tr> <td class="numLine"> 169</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> scheduleExecutor = Executors.newSingleThreadScheduledExecutor(</pre></td></tr>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> scheduleExecutor = Executors.newSingleThreadScheduledExecutor(</pre></td></tr>
<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> ThreadFactoryBuilder().setDaemon(<span class="keyword">true</span>).setNameFormat(<span class="string">"schedule"</span>)</pre></td></tr>
<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
@@ -334,14 +334,14 @@
<td class="src"><pre class="src"> <span class="comment">// than using ThreadPoolExecutor. ThreadPoolExecutor does not create threads</span></pre></td></tr>
<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// as would be expected from a thread pool.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> backgroundExecutor = Executors.newCachedThreadPool(</pre></td></tr>
+<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> backgroundExecutor = Executors.newCachedThreadPool(</pre></td></tr>
<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> ThreadFactoryBuilder().setDaemon(<span class="keyword">true</span>).setNameFormat(<span class="string">"background"</span>)</pre></td></tr>
<tr> <td class="numLine"> 178</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> .build());</pre></td></tr>
<tr> <td class="numLine"> 179</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 180</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> sessionManager = <span class="keyword">new</span> SessionManager<HttpExchange>(</pre></td></tr>
+<tr> <td class="numLineCover"> 180</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> sessionManager = <span class="keyword">new</span> SessionManager<HttpExchange>(</pre></td></tr>
<tr> <td class="numLine"> 181</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> SessionManager.HttpExchangeClientStore(<span class="string">"sessid_"</span> + port, secure),</pre></td></tr>
<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
@@ -350,21 +350,21 @@
<td class="src"><pre class="src"> 5 * 60 * 1000 <span class="comment">/* max cleanup frequency: 5 minutes */</span>);</pre></td></tr>
<tr> <td class="numLine"> 184</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> config.addConfigModificationListener(<span class="keyword">new</span> GsaConfigModListener());</pre></td></tr>
+<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> config.addConfigModificationListener(<span class="keyword">new</span> GsaConfigModListener());</pre></td></tr>
<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> GsaFeedFileSender fileSender = <span class="keyword">new</span> GsaFeedFileSender(config);</pre></td></tr>
-<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> GsaFeedFileMaker fileMaker = <span class="keyword">new</span> GsaFeedFileMaker(docIdCodec,</pre></td></tr>
+<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> GsaFeedFileSender fileSender = <span class="keyword">new</span> GsaFeedFileSender(config);</pre></td></tr>
+<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> GsaFeedFileMaker fileMaker = <span class="keyword">new</span> GsaFeedFileMaker(docIdCodec,</pre></td></tr>
<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> config.isGsa614FeedWorkaroundEnabled(),</pre></td></tr>
<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> config.isGsa70AuthMethodWorkaroundEnabled());</pre></td></tr>
-<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> docIdSender</pre></td></tr>
+<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> docIdSender</pre></td></tr>
<tr> <td class="numLine"> 192</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> DocIdSender(fileMaker, fileSender, journal, config, adaptor);</pre></td></tr>
<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 194</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> dashboard = <span class="keyword">new</span> Dashboard(config, <span class="keyword">this</span>, journal, sessionManager,</pre></td></tr>
+<tr> <td class="numLineCover"> 194</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> dashboard = <span class="keyword">new</span> Dashboard(config, <span class="keyword">this</span>, journal, sessionManager,</pre></td></tr>
<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> secureValueCodec, adaptor);</pre></td></tr>
<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
@@ -379,10 +379,10 @@
<td class="src"><pre class="src"> <span class="comment">// ensure it doesn't call the adaptor until after Adaptor.init() completes.</span></pre></td></tr>
<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">long</span> sleepDurationMillis = 1000;</pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">long</span> sleepDurationMillis = 1000;</pre></td></tr>
<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// An hour.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">long</span> maxSleepDurationMillis = 60 * 60 * 1000;</pre></td></tr>
+<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">long</span> maxSleepDurationMillis = 60 * 60 * 1000;</pre></td></tr>
<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Loop until 1) the adaptor starts successfully, 2) stop() is called, or</span></pre></td></tr>
<tr> <td class="numLine"> 206</td> <td class="nbHits"> </td>
@@ -401,8 +401,8 @@
<td class="src"><pre class="src"> <span class="keyword">while</span> (<span class="keyword">true</span>) {</pre></td></tr>
<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> adaptor.init(<span class="keyword">new</span> AdaptorContextImpl());</pre></td></tr>
-<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> adaptor.init(<span class="keyword">new</span> AdaptorContextImpl());</pre></td></tr>
+<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
<tr> <td class="numLineCover"> 216</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
<tr> <td class="numLineCover"> 217</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> ex;</span></pre></td></tr>
<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (Exception ex) {</pre></td></tr>
@@ -444,714 +444,712 @@
<td class="src"><pre class="src"> <span class="comment"> }*/</span></pre></td></tr>
<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 241</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> AuthnHandler authnHandler = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 242</td> <td class="nbHitsCovered"><a title="Line 242: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 242: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (secure) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 241</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> AuthnHandler authnHandler = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 242</td> <td class="nbHitsCovered"><a title="Line 242: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 242: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (secure) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 243</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> bootstrapOpenSaml();</pre></td></tr>
<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> SamlMetadata metadata = <span class="keyword">new</span> SamlMetadata(config.getServerHostname(),</pre></td></tr>
<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.getServerPort(), config.getGsaHostname());</pre></td></tr>
+ <td class="src"><pre class="src"> config.getServerPort(), config.getGsaHostname(),</pre></td></tr>
<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> config.getGsaSamlEntityId(), config.getServerSamlEntityId());</pre></td></tr>
+<tr> <td class="numLine"> 247</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 247</td> <td class="nbHitsUncovered"><a title="Line 247: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 247: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (adaptor <span class="keyword">instanceof</span> AuthnAdaptor) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 248</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.config(<span class="string">"Adaptor is an AuthnAdaptor; enabling adaptor-based "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 249</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 248</td> <td class="nbHitsUncovered"><a title="Line 248: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 248: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (adaptor <span class="keyword">instanceof</span> AuthnAdaptor) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 249</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.config(<span class="string">"Adaptor is an AuthnAdaptor; enabling adaptor-based "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">"authentication"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 250</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> samlIdentityProvider = <span class="keyword">new</span> SamlIdentityProvider(</span></pre></td></tr>
-<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 251</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> samlIdentityProvider = <span class="keyword">new</span> SamlIdentityProvider(</span></pre></td></tr>
+<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> (AuthnAdaptor) adaptor, metadata, key);</pre></td></tr>
-<tr> <td class="numLineCover"> 252</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> addFilters(scope.createContext(<span class="string">"/samlip"</span>,</span></pre></td></tr>
-<tr> <td class="numLine"> 253</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> samlIdentityProvider.getSingleSignOnHandler()));</pre></td></tr>
+<tr> <td class="numLineCover"> 253</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> addFilters(scope.createContext(<span class="string">"/samlip"</span>,</span></pre></td></tr>
<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> samlIdentityProvider.getSingleSignOnHandler()));</pre></td></tr>
+<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 255</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.config(<span class="string">"Adaptor is not an AuthnAdaptor; not enabling adaptor-based "</span></pre></td></tr>
-<tr> <td class="numLine"> 256</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">"authentication"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.config(<span class="string">"Adaptor is not an AuthnAdaptor; not enabling adaptor-based "</span></pre></td></tr>
<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + <span class="string">"authentication"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 258</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 258</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/samlassertionconsumer"</span>,</pre></td></tr>
-<tr> <td class="numLine"> 259</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/samlassertionconsumer"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 260</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> SamlAssertionConsumerHandler(sessionManager)));</pre></td></tr>
-<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> authnHandler = <span class="keyword">new</span> AuthnHandler(sessionManager, metadata, key);</pre></td></tr>
-<tr> <td class="numLineCover"> 261</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/saml-authz"</span>, <span class="keyword">new</span> SamlBatchAuthzHandler(</pre></td></tr>
-<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> adaptor, docIdCodec, metadata)));</pre></td></tr>
+<tr> <td class="numLineCover"> 261</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> authnHandler = <span class="keyword">new</span> AuthnHandler(sessionManager, metadata, key);</pre></td></tr>
+<tr> <td class="numLineCover"> 262</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> addFilters(scope.createContext(<span class="string">"/saml-authz"</span>, <span class="keyword">new</span> SamlBatchAuthzHandler(</pre></td></tr>
<tr> <td class="numLine"> 263</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> adaptor, docIdCodec, metadata)));</pre></td></tr>
+<tr> <td class="numLine"> 264</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 264</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> Watchdog watchdog = <span class="keyword">new</span> Watchdog(config.getAdaptorDocContentTimeoutMillis(),</pre></td></tr>
-<tr> <td class="numLine"> 265</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 265</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> Watchdog watchdog = <span class="keyword">new</span> Watchdog(config.getAdaptorDocContentTimeoutMillis(),</pre></td></tr>
+<tr> <td class="numLine"> 266</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> scheduleExecutor);</pre></td></tr>
-<tr> <td class="numLineCover"> 266</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> AsyncDocIdSender asyncDocIdSender = <span class="keyword">new</span> AsyncDocIdSender(docIdSender,</pre></td></tr>
-<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.getFeedMaxUrls() <span class="comment">/* batch size */</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 267</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> AsyncDocIdSender asyncDocIdSender = <span class="keyword">new</span> AsyncDocIdSender(docIdSender,</pre></td></tr>
<tr> <td class="numLine"> 268</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> 5 <span class="comment">/* max latency */</span>, TimeUnit.MINUTES,</pre></td></tr>
+ <td class="src"><pre class="src"> config.getFeedMaxUrls() <span class="comment">/* batch size */</span>,</pre></td></tr>
<tr> <td class="numLine"> 269</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> 5 <span class="comment">/* max latency */</span>, TimeUnit.MINUTES,</pre></td></tr>
+<tr> <td class="numLine"> 270</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> 2 * config.getFeedMaxUrls() <span class="comment">/* queue size */</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 270</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> backgroundExecutor.execute(waiter.runnable(asyncDocIdSender.worker()));</pre></td></tr>
-<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> DocumentHandler docHandler = <span class="keyword">new</span> DocumentHandler(</pre></td></tr>
-<tr> <td class="numLine"> 272</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> docIdCodec, docIdCodec, journal, adaptor,</pre></td></tr>
+<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> backgroundExecutor.execute(waiter.runnable(asyncDocIdSender.worker()));</pre></td></tr>
+<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> DocumentHandler docHandler = <span class="keyword">new</span> DocumentHandler(</pre></td></tr>
<tr> <td class="numLine"> 273</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.getGsaHostname(),</pre></td></tr>
+ <td class="src"><pre class="src"> docIdCodec, docIdCodec, journal, adaptor,</pre></td></tr>
<tr> <td class="numLine"> 274</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.getServerFullAccessHosts(),</pre></td></tr>
+ <td class="src"><pre class="src"> config.getGsaHostname(),</pre></td></tr>
<tr> <td class="numLine"> 275</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> authnHandler, sessionManager,</pre></td></tr>
+ <td class="src"><pre class="src"> config.getServerFullAccessHosts(),</pre></td></tr>
<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> createTransformPipeline(),</pre></td></tr>
+ <td class="src"><pre class="src"> authnHandler, sessionManager,</pre></td></tr>
<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.getTransformMaxDocumentBytes(),</pre></td></tr>
+ <td class="src"><pre class="src"> createTransformPipeline(),</pre></td></tr>
<tr> <td class="numLine"> 278</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.isTransformRequired(),</pre></td></tr>
+ <td class="src"><pre class="src"> config.getTransformMaxDocumentBytes(),</pre></td></tr>
<tr> <td class="numLine"> 279</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.isServerToUseCompression(), watchdog,</pre></td></tr>
+ <td class="src"><pre class="src"> config.isTransformRequired(),</pre></td></tr>
<tr> <td class="numLine"> 280</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> asyncDocIdSender, </pre></td></tr>
+ <td class="src"><pre class="src"> config.isServerToUseCompression(), watchdog,</pre></td></tr>
<tr> <td class="numLine"> 281</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> asyncDocIdSender, </pre></td></tr>
+<tr> <td class="numLine"> 282</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> config.sendDocControlsHeader());</pre></td></tr>
-<tr> <td class="numLineCover"> 282</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> String handlerPath = config.getServerBaseUri().getPath()</pre></td></tr>
-<tr> <td class="numLine"> 283</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 283</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> String handlerPath = config.getServerBaseUri().getPath()</pre></td></tr>
+<tr> <td class="numLine"> 284</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + config.getServerDocIdPath();</pre></td></tr>
-<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> addFilters(scope.createContext(handlerPath, docHandler));</pre></td></tr>
-<tr> <td class="numLine"> 285</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> addFilters(scope.createContext(handlerPath, docHandler));</pre></td></tr>
<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Start communicating with other services. As a general rule, by this time</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// we want all services we provide to be up and running. However, note that</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// Start communicating with other services. As a general rule, by this time</span></pre></td></tr>
<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// the adaptor may have started sending feeds as soon as we called init(),</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// we want all services we provide to be up and running. However, note that</span></pre></td></tr>
<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// and that is "okay." In addition, the HttpServer we were provided may not</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// the adaptor may have started sending feeds as soon as we called init(),</span></pre></td></tr>
<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// have been started yet.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// and that is "okay." In addition, the HttpServer we were provided may not</span></pre></td></tr>
<tr> <td class="numLine"> 291</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// have been started yet.</span></pre></td></tr>
+<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 292</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> scheduler = <span class="keyword">new</span> CronScheduler(scheduleExecutor);</pre></td></tr>
-<tr> <td class="numLineCover"> 293</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> sendDocIdsFuture = scheduler.schedule(</pre></td></tr>
-<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.getAdaptorFullListingSchedule(),</pre></td></tr>
+<tr> <td class="numLineCover"> 293</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> scheduler = <span class="keyword">new</span> CronScheduler(scheduleExecutor);</pre></td></tr>
+<tr> <td class="numLineCover"> 294</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> sendDocIdsFuture = scheduler.schedule(</pre></td></tr>
<tr> <td class="numLine"> 295</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> waiter.runnable(<span class="keyword">new</span> BackgroundRunnable(docIdFullPusher)));</pre></td></tr>
+ <td class="src"><pre class="src"> config.getAdaptorFullListingSchedule(),</pre></td></tr>
<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 297</td> <td class="nbHitsCovered"><a title="Line 297: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 297: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (adaptor <span class="keyword">instanceof</span> PollingIncrementalAdaptor) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 298</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> docIdIncrementalPusher = <span class="keyword">new</span> OneAtATimeRunnable(</pre></td></tr>
-<tr> <td class="numLine"> 299</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">new</span> IncrementalPushRunnable((PollingIncrementalAdaptor) adaptor),</pre></td></tr>
+ <td class="src"><pre class="src"> waiter.runnable(<span class="keyword">new</span> BackgroundRunnable(docIdFullPusher)));</pre></td></tr>
+<tr> <td class="numLineCover"> 297</td> <td class="nbHitsCovered"><a title="Line 297: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 297: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (config.isAdaptorPushDocIdsOnStartup()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 298</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> log.info(<span class="string">"Pushing once at program start"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 299</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> checkAndScheduleImmediatePushOfDocIds();</pre></td></tr>
<tr> <td class="numLine"> 300</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">new</span> AlreadyRunningRunnable());</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 301</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 302</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> scheduleExecutor.scheduleAtFixedRate(</pre></td></tr>
-<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> waiter.runnable(<span class="keyword">new</span> BackgroundRunnable(docIdIncrementalPusher)),</pre></td></tr>
+<tr> <td class="numLineCover"> 302</td> <td class="nbHitsCovered"><a title="Line 302: Conditional coverage 100% (2/2)."> 11</a></td> <td class="src"><pre class="src"> <a title="Line 302: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (adaptor <span class="keyword">instanceof</span> PollingIncrementalAdaptor) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 303</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> docIdIncrementalPusher = <span class="keyword">new</span> OneAtATimeRunnable(</pre></td></tr>
<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> 0,</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> IncrementalPushRunnable((PollingIncrementalAdaptor) adaptor),</pre></td></tr>
<tr> <td class="numLine"> 305</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> config.getAdaptorIncrementalPollPeriodMillis(),</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> AlreadyRunningRunnable());</pre></td></tr>
<tr> <td class="numLine"> 306</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> TimeUnit.MILLISECONDS);</pre></td></tr>
-<tr> <td class="numLine"> 307</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 307</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> scheduleExecutor.scheduleAtFixedRate(</pre></td></tr>
<tr> <td class="numLine"> 308</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 309</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> dashboard.start(dashboardServer);</pre></td></tr>
+ <td class="src"><pre class="src"> waiter.runnable(<span class="keyword">new</span> BackgroundRunnable(docIdIncrementalPusher)),</pre></td></tr>
+<tr> <td class="numLine"> 309</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> 0,</pre></td></tr>
<tr> <td class="numLine"> 310</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 311</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> shuttingDownLatch = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 312</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> config.getAdaptorIncrementalPollPeriodMillis(),</pre></td></tr>
+<tr> <td class="numLine"> 311</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> TimeUnit.MILLISECONDS);</pre></td></tr>
+<tr> <td class="numLine"> 312</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 313</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 314</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> TransformPipeline createTransformPipeline() {</pre></td></tr>
-<tr> <td class="numLineCover"> 315</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> createTransformPipeline(config.getTransformPipelineSpec());</pre></td></tr>
-<tr> <td class="numLine"> 316</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 317</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 314</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> dashboard.start(dashboardServer);</pre></td></tr>
+<tr> <td class="numLine"> 315</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 316</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> shuttingDownLatch = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 317</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 318</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">static</span> TransformPipeline createTransformPipeline(</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 319</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> TransformPipeline createTransformPipeline() {</pre></td></tr>
+<tr> <td class="numLineCover"> 320</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> createTransformPipeline(config.getTransformPipelineSpec());</pre></td></tr>
+<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 322</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 323</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> TransformPipeline createTransformPipeline(</pre></td></tr>
+<tr> <td class="numLine"> 324</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> List<Map<String, String>> pipelineConfig) {</pre></td></tr>
-<tr> <td class="numLineCover"> 320</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> List<DocumentTransform> elements = <span class="keyword">new</span> LinkedList<DocumentTransform>();</pre></td></tr>
-<tr> <td class="numLineCover"> 321</td> <td class="nbHitsCovered"><a title="Line 321: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 321: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Map<String, String> element : pipelineConfig) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 322</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String name = element.get(<span class="string">"name"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 323</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String confPrefix = <span class="string">"transform.pipeline."</span> + name + <span class="string">"."</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 324</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> String factoryMethodName = element.get(<span class="string">"factoryMethod"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 325</td> <td class="nbHitsCovered"><a title="Line 325: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 325: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (factoryMethodName == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 326</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(</pre></td></tr>
-<tr> <td class="numLine"> 327</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"Missing "</span> + confPrefix + <span class="string">"factoryMethod configuration setting"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 329</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">int</span> sepIndex = factoryMethodName.lastIndexOf(<span class="string">"."</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 330</td> <td class="nbHitsCovered"><a title="Line 330: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 330: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (sepIndex == -1) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 331</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Could not separate method name from class "</span></pre></td></tr>
+<tr> <td class="numLineCover"> 325</td> <td class="nbHitsCovered"> 19</td> <td class="src"><pre class="src"> List<DocumentTransform> elements = <span class="keyword">new</span> LinkedList<DocumentTransform>();</pre></td></tr>
+<tr> <td class="numLineCover"> 326</td> <td class="nbHitsCovered"><a title="Line 326: Conditional coverage 100% (2/2)."> 19</a></td> <td class="src"><pre class="src"> <a title="Line 326: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Map<String, String> element : pipelineConfig) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 327</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String name = element.get(<span class="string">"name"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 328</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String confPrefix = <span class="string">"transform.pipeline."</span> + name + <span class="string">"."</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 329</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> String factoryMethodName = element.get(<span class="string">"factoryMethod"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 330</td> <td class="nbHitsCovered"><a title="Line 330: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 330: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (factoryMethodName == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 331</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(</pre></td></tr>
<tr> <td class="numLine"> 332</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">"name"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="string">"Missing "</span> + confPrefix + <span class="string">"factoryMethod configuration setting"</span>);</pre></td></tr>
<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 334</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> String className = factoryMethodName.substring(0, sepIndex);</pre></td></tr>
-<tr> <td class="numLineCover"> 335</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> String methodName = factoryMethodName.substring(sepIndex + 1);</pre></td></tr>
-<tr> <td class="numLineCover"> 336</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Split {0} into class {1} and method {2}"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 334</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">int</span> sepIndex = factoryMethodName.lastIndexOf(<span class="string">"."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 335</td> <td class="nbHitsCovered"><a title="Line 335: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 335: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (sepIndex == -1) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 336</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Could not separate method name from class "</span></pre></td></tr>
<tr> <td class="numLine"> 337</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {factoryMethodName, className, methodName});</pre></td></tr>
+ <td class="src"><pre class="src"> + <span class="string">"name"</span>);</pre></td></tr>
<tr> <td class="numLine"> 338</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Class<?> klass;</pre></td></tr>
-<tr> <td class="numLine"> 339</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 340</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> klass = Class.forName(className);</pre></td></tr>
-<tr> <td class="numLineCover"> 341</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (ClassNotFoundException ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 342</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 339</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> String className = factoryMethodName.substring(0, sepIndex);</pre></td></tr>
+<tr> <td class="numLineCover"> 340</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> String methodName = factoryMethodName.substring(sepIndex + 1);</pre></td></tr>
+<tr> <td class="numLineCover"> 341</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Split {0} into class {1} and method {2}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 342</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {factoryMethodName, className, methodName});</pre></td></tr>
<tr> <td class="numLine"> 343</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> Class<?> klass;</pre></td></tr>
+<tr> <td class="numLine"> 344</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 345</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> klass = Class.forName(className);</pre></td></tr>
+<tr> <td class="numLineCover"> 346</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (ClassNotFoundException ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 347</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(</pre></td></tr>
+<tr> <td class="numLine"> 348</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"Could not load class for transform "</span> + name, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 344</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 345</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Method method;</pre></td></tr>
-<tr> <td class="numLine"> 346</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 347</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> method = klass.getDeclaredMethod(methodName, Map.<span class="keyword">class</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 348</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (NoSuchMethodException ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 349</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Could not find method "</span> + methodName</pre></td></tr>
+<tr> <td class="numLineCover"> 349</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 350</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> Method method;</pre></td></tr>
+<tr> <td class="numLine"> 351</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 352</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> method = klass.getDeclaredMethod(methodName, Map.<span class="keyword">class</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 353</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (NoSuchMethodException ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 354</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Could not find method "</span> + methodName</pre></td></tr>
+<tr> <td class="numLine"> 355</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">" on class "</span> + className, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 351</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 352</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Found method {0}"</span>, <span class="keyword">new</span> Object[] {method});</pre></td></tr>
-<tr> <td class="numLine"> 353</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Object o;</pre></td></tr>
-<tr> <td class="numLine"> 354</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 355</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> o = method.invoke(<span class="keyword">null</span>, Collections.unmodifiableMap(element));</pre></td></tr>
-<tr> <td class="numLineCover"> 356</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (Exception ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 357</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Failure while running factory method "</span></pre></td></tr>
+<tr> <td class="numLineCover"> 356</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 357</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Found method {0}"</span>, <span class="keyword">new</span> Object[] {method});</pre></td></tr>
<tr> <td class="numLine"> 358</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + factoryMethodName, ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 359</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 360</td> <td class="nbHitsCovered"><a title="Line 360: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 360: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!(o <span class="keyword">instanceof</span> DocumentTransform)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 361</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> ClassCastException(o.getClass().getName()</pre></td></tr>
-<tr> <td class="numLine"> 362</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">" is not an instance of DocumentTransform"</span>);</pre></td></tr>
+ <td class="src"><pre class="src"> Object o;</pre></td></tr>
+<tr> <td class="numLine"> 359</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 360</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> o = method.invoke(<span class="keyword">null</span>, Collections.unmodifiableMap(element));</pre></td></tr>
+<tr> <td class="numLineCover"> 361</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (Exception ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 362</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"Failure while running factory method "</span></pre></td></tr>
<tr> <td class="numLine"> 363</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 364</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> DocumentTransform transform = (DocumentTransform) o;</pre></td></tr>
-<tr> <td class="numLineCover"> 365</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> elements.add(transform);</pre></td></tr>
-<tr> <td class="numLineCover"> 366</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> + factoryMethodName, ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 364</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 365</td> <td class="nbHitsCovered"><a title="Line 365: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 365: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!(o <span class="keyword">instanceof</span> DocumentTransform)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 366</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> ClassCastException(o.getClass().getName()</pre></td></tr>
<tr> <td class="numLine"> 367</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// If we created an empty pipeline, then we don't need the pipeline at all.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 368</td> <td class="nbHitsCovered"><a title="Line 368: Conditional coverage 100% (2/2)."> 12</a></td> <td class="src"><pre class="src"> <a title="Line 368: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> elements.size() > 0 ? <span class="keyword">new</span> TransformPipeline(elements) : <span class="keyword">null</span>;</a></pre></td></tr>
-<tr> <td class="numLine"> 369</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 370</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 371</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> + <span class="string">" is not an instance of DocumentTransform"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 368</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 369</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> DocumentTransform transform = (DocumentTransform) o;</pre></td></tr>
+<tr> <td class="numLineCover"> 370</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> elements.add(transform);</pre></td></tr>
+<tr> <td class="numLineCover"> 371</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 372</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Retrieve our default KeyPair from the default keystore. The key should have</span></pre></td></tr>
-<tr> <td class="numLine"> 373</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * the same password as the keystore.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// If we created an empty pipeline, then we don't need the pipeline at all.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 373</td> <td class="nbHitsCovered"><a title="Line 373: Conditional coverage 100% (2/2)."> 13</a></td> <td class="src"><pre class="src"> <a title="Line 373: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> elements.size() > 0 ? <span class="keyword">new</span> TransformPipeline(elements) : <span class="keyword">null</span>;</a></pre></td></tr>
<tr> <td class="numLine"> 374</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 375</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> KeyPair getKeyPair(String alias) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 376</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String keystoreKey = <span class="string">"javax.net.ssl.keyStore"</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 377</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String keystorePasswordKey = <span class="string">"javax.net.ssl.keyStorePassword"</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 378</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> String keystore = System.getProperty(keystoreKey);</pre></td></tr>
-<tr> <td class="numLineCover"> 379</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> String keystoreType = System.getProperty(<span class="string">"javax.net.ssl.keyStoreType"</span>,</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 376</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 377</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Retrieve our default KeyPair from the default keystore. The key should have</span></pre></td></tr>
+<tr> <td class="numLine"> 378</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * the same password as the keystore.</span></pre></td></tr>
+<tr> <td class="numLine"> 379</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 380</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> KeyStore.getDefaultType());</pre></td></tr>
-<tr> <td class="numLineCover"> 381</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> String keystorePassword = System.getProperty(keystorePasswordKey);</pre></td></tr>
-<tr> <td class="numLine"> 382</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 383</td> <td class="nbHitsUncovered"><a title="Line 383: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 383: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (keystore == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 384</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException(<span class="string">"You must set "</span> + keystoreKey);</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> KeyPair getKeyPair(String alias) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 381</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String keystoreKey = <span class="string">"javax.net.ssl.keyStore"</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 382</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">final</span> String keystorePasswordKey = <span class="string">"javax.net.ssl.keyStorePassword"</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 383</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> String keystore = System.getProperty(keystoreKey);</pre></td></tr>
+<tr> <td class="numLineCover"> 384</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> String keystoreType = System.getProperty(<span class="string">"javax.net.ssl.keyStoreType"</span>,</pre></td></tr>
<tr> <td class="numLine"> 385</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 386</td> <td class="nbHitsUncovered"><a title="Line 386: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 386: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (keystorePassword == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 387</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException(<span class="string">"You must set "</span> + keystorePasswordKey);</span></pre></td></tr>
-<tr> <td class="numLine"> 388</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 389</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> KeyStore.getDefaultType());</pre></td></tr>
+<tr> <td class="numLineCover"> 386</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> String keystorePassword = System.getProperty(keystorePasswordKey);</pre></td></tr>
+<tr> <td class="numLine"> 387</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 390</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getKeyPair(alias, keystore, keystoreType, keystorePassword);</pre></td></tr>
-<tr> <td class="numLine"> 391</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 392</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 388</td> <td class="nbHitsUncovered"><a title="Line 388: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 388: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (keystore == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 389</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException(<span class="string">"You must set "</span> + keystoreKey);</span></pre></td></tr>
+<tr> <td class="numLine"> 390</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 391</td> <td class="nbHitsUncovered"><a title="Line 391: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 391: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (keystorePassword == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 392</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException(<span class="string">"You must set "</span> + keystorePasswordKey);</span></pre></td></tr>
<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">static</span> KeyPair getKeyPair(String alias, String keystoreFile,</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 394</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> String keystoreType, String keystorePasswordStr) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLine"> 395</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> PrivateKey privateKey;</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 395</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> getKeyPair(alias, keystore, keystoreType, keystorePassword);</pre></td></tr>
<tr> <td class="numLine"> 396</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> PublicKey publicKey;</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 397</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 398</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> KeyStore ks = KeyStore.getInstance(keystoreType);</pre></td></tr>
-<tr> <td class="numLineCover"> 399</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> InputStream ksis = <span class="keyword">new</span> FileInputStream(keystoreFile);</pre></td></tr>
-<tr> <td class="numLineCover"> 400</td> <td class="nbHitsUncovered"><a title="Line 400: Conditional coverage 50% (1/2)."> 12</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 400: Conditional coverage 50% (1/2)."> <span class="keyword">char</span>[] keystorePassword = keystorePasswordStr == <span class="keyword">null</span> ? <span class="keyword">null</span></a></span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 398</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> KeyPair getKeyPair(String alias, String keystoreFile,</pre></td></tr>
+<tr> <td class="numLine"> 399</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String keystoreType, String keystorePasswordStr) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLine"> 400</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> PrivateKey privateKey;</pre></td></tr>
<tr> <td class="numLine"> 401</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> : keystorePasswordStr.toCharArray();</pre></td></tr>
+ <td class="src"><pre class="src"> PublicKey publicKey;</pre></td></tr>
<tr> <td class="numLine"> 402</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 403</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> KeyStore ks = KeyStore.getInstance(keystoreType);</pre></td></tr>
+<tr> <td class="numLineCover"> 404</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> InputStream ksis = <span class="keyword">new</span> FileInputStream(keystoreFile);</pre></td></tr>
+<tr> <td class="numLineCover"> 405</td> <td class="nbHitsUncovered"><a title="Line 405: Conditional coverage 50% (1/2)."> 13</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 405: Conditional coverage 50% (1/2)."> <span class="keyword">char</span>[] keystorePassword = keystorePasswordStr == <span class="keyword">null</span> ? <span class="keyword">null</span></a></span></pre></td></tr>
+<tr> <td class="numLine"> 406</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> : keystorePasswordStr.toCharArray();</pre></td></tr>
+<tr> <td class="numLine"> 407</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 403</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> ks.load(ksis, keystorePassword);</pre></td></tr>
-<tr> <td class="numLineCover"> 404</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NoSuchAlgorithmException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 405</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 406</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (CertificateException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 407</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLine"> 408</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 408</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> ks.load(ksis, keystorePassword);</pre></td></tr>
+<tr> <td class="numLineCover"> 409</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NoSuchAlgorithmException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 410</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 411</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (CertificateException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 412</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
+<tr> <td class="numLine"> 413</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 409</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> ksis.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 410</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 411</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> Key key = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLine"> 412</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 414</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> ksis.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 415</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 416</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> Key key = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLine"> 417</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 413</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> key = ks.getKey(alias, keystorePassword);</pre></td></tr>
-<tr> <td class="numLineCover"> 414</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NoSuchAlgorithmException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 415</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 416</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (UnrecoverableKeyException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 417</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 418</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 419</td> <td class="nbHitsCovered"><a title="Line 419: Conditional coverage 100% (2/2)."> 12</a></td> <td class="src"><pre class="src"> <a title="Line 419: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (key == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 420</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Could not find key for alias '"</span></pre></td></tr>
-<tr> <td class="numLine"> 421</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 418</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> key = ks.getKey(alias, keystorePassword);</pre></td></tr>
+<tr> <td class="numLineCover"> 419</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NoSuchAlgorithmException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 420</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 421</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (UnrecoverableKeyException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 422</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 423</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 424</td> <td class="nbHitsCovered"><a title="Line 424: Conditional coverage 100% (2/2)."> 13</a></td> <td class="src"><pre class="src"> <a title="Line 424: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (key == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 425</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Could not find key for alias '"</span></pre></td></tr>
+<tr> <td class="numLine"> 426</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + alias + <span class="string">"'"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 422</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 427</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 423</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> privateKey = (PrivateKey) key;</pre></td></tr>
-<tr> <td class="numLineCover"> 424</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> publicKey = ks.getCertificate(alias).getPublicKey();</pre></td></tr>
-<tr> <td class="numLineCover"> 425</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (KeyStoreException ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 426</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 427</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 428</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> KeyPair(publicKey, privateKey);</pre></td></tr>
-<tr> <td class="numLine"> 429</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 428</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> privateKey = (PrivateKey) key;</pre></td></tr>
+<tr> <td class="numLineCover"> 429</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> publicKey = ks.getCertificate(alias).getPublicKey();</pre></td></tr>
+<tr> <td class="numLineCover"> 430</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (KeyStoreException ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 431</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 432</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 433</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> KeyPair(publicKey, privateKey);</pre></td></tr>
+<tr> <td class="numLine"> 434</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 430</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 435</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 431</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 436</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Useful as a separate method during testing.</span></pre></td></tr>
-<tr> <td class="numLine"> 432</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 437</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">static</span> <span class="keyword">void</span> bootstrapOpenSaml() {</pre></td></tr>
-<tr> <td class="numLine"> 433</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 438</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 434</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> DefaultBootstrap.bootstrap();</pre></td></tr>
-<tr> <td class="numLineCover"> 435</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (ConfigurationException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 436</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 437</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 438</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 439</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 440</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 441</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Stop the current services, allowing up to {@code maxDelay} seconds for</span></pre></td></tr>
-<tr> <td class="numLine"> 442</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * things to shutdown.</span></pre></td></tr>
-<tr> <td class="numLine"> 443</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 439</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> DefaultBootstrap.bootstrap();</pre></td></tr>
+<tr> <td class="numLineCover"> 440</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (ConfigurationException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 441</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 442</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 443</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 444</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> stop(<span class="keyword">long</span> time, TimeUnit unit) {</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 445</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Prevent new start()s.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 446</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> shutdownCount.incrementAndGet();</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 446</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Stop the current services, allowing up to {@code maxDelay} seconds for</span></pre></td></tr>
<tr> <td class="numLine"> 447</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 448</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> CountDownLatch latch = shuttingDownLatch;</pre></td></tr>
-<tr> <td class="numLineCover"> 449</td> <td class="nbHitsCovered"><a title="Line 449: Conditional coverage 100% (2/2)."> 22</a></td> <td class="src"><pre class="src"> <a title="Line 449: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (latch != <span class="keyword">null</span>) {</a></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * things to shutdown.</span></pre></td></tr>
+<tr> <td class="numLine"> 448</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 449</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> stop(<span class="keyword">long</span> time, TimeUnit unit) {</pre></td></tr>
<tr> <td class="numLine"> 450</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Cause existing start() to begin cancelling.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 451</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> latch.countDown();</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// Prevent new start()s.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 451</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> shutdownCount.incrementAndGet();</pre></td></tr>
<tr> <td class="numLine"> 452</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 453</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> realStop(time, unit);</pre></td></tr>
-<tr> <td class="numLine"> 454</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 453</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> CountDownLatch latch = shuttingDownLatch;</pre></td></tr>
+<tr> <td class="numLineCover"> 454</td> <td class="nbHitsCovered"><a title="Line 454: Conditional coverage 100% (2/2)."> 23</a></td> <td class="src"><pre class="src"> <a title="Line 454: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (latch != <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLine"> 455</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Permit new start()s.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 456</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> shutdownCount.decrementAndGet();</pre></td></tr>
-<tr> <td class="numLineCover"> 457</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 458</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// Cause existing start() to begin cancelling.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 456</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> latch.countDown();</pre></td></tr>
+<tr> <td class="numLine"> 457</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 458</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> realStop(time, unit);</pre></td></tr>
<tr> <td class="numLine"> 459</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 460</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> realStop(<span class="keyword">long</span> time, TimeUnit unit) {</pre></td></tr>
-<tr> <td class="numLineCover"> 461</td> <td class="nbHitsCovered"><a title="Line 461: Conditional coverage 100% (2/2)."> 22</a></td> <td class="src"><pre class="src"> <a title="Line 461: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (scope != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 462</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> scope.close();</pre></td></tr>
-<tr> <td class="numLine"> 463</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 464</td> <td class="nbHitsCovered"><a title="Line 464: Conditional coverage 100% (2/2)."> 22</a></td> <td class="src"><pre class="src"> <a title="Line 464: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (dashboard != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 465</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> dashboard.stop();</pre></td></tr>
-<tr> <td class="numLine"> 466</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 467</td> <td class="nbHitsCovered"><a title="Line 467: Conditional coverage 100% (2/2)."> 22</a></td> <td class="src"><pre class="src"> <a title="Line 467: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (scheduleExecutor != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 468</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> scheduleExecutor.shutdownNow();</pre></td></tr>
-<tr> <td class="numLine"> 469</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 470</td> <td class="nbHitsCovered"><a title="Line 470: Conditional coverage 100% (2/2)."> 22</a></td> <td class="src"><pre class="src"> <a title="Line 470: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (backgroundExecutor != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 471</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> backgroundExecutor.shutdownNow();</pre></td></tr>
-<tr> <td class="numLine"> 472</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 473</td> <td class="nbHitsCovered"><a title="Line 473: Conditional coverage 100% (2/2)."> 22</a></td> <td class="src"><pre class="src"> <a title="Line 473: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (waiter != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLine"> 474</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 475</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> waiter.shutdown(time, unit);</pre></td></tr>
-<tr> <td class="numLineCover"> 476</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 477</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 478</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 479</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 480</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 481</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> adaptor.destroy();</pre></td></tr>
-<tr> <td class="numLine"> 482</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLine"> 483</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Wait until after adaptor.destroy() to set things to null, so that the</span></pre></td></tr>
+<tr> <td class="numLine"> 460</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Permit new start()s.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 461</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> shutdownCount.decrementAndGet();</pre></td></tr>
+<tr> <td class="numLineCover"> 462</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 463</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 464</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 465</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> realStop(<span class="keyword">long</span> time, TimeUnit unit) {</pre></td></tr>
+<tr> <td class="numLineCover"> 466</td> <td class="nbHitsCovered"><a title="Line 466: Conditional coverage 100% (2/2)."> 23</a></td> <td class="src"><pre class="src"> <a title="Line 466: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (scope != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 467</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> scope.close();</pre></td></tr>
+<tr> <td class="numLine"> 468</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 469</td> <td class="nbHitsCovered"><a title="Line 469: Conditional coverage 100% (2/2)."> 23</a></td> <td class="src"><pre class="src"> <a title="Line 469: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (dashboard != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 470</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> dashboard.stop();</pre></td></tr>
+<tr> <td class="numLine"> 471</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 472</td> <td class="nbHitsCovered"><a title="Line 472: Conditional coverage 100% (2/2)."> 23</a></td> <td class="src"><pre class="src"> <a title="Line 472: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (scheduleExecutor != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 473</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> scheduleExecutor.shutdownNow();</pre></td></tr>
+<tr> <td class="numLine"> 474</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 475</td> <td class="nbHitsCovered"><a title="Line 475: Conditional coverage 100% (2/2)."> 23</a></td> <td class="src"><pre class="src"> <a title="Line 475: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (backgroundExecutor != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 476</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> backgroundExecutor.shutdownNow();</pre></td></tr>
+<tr> <td class="numLine"> 477</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 478</td> <td class="nbHitsCovered"><a title="Line 478: Conditional coverage 100% (2/2)."> 23</a></td> <td class="src"><pre class="src"> <a title="Line 478: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (waiter != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLine"> 479</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 480</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> waiter.shutdown(time, unit);</pre></td></tr>
+<tr> <td class="numLineCover"> 481</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 482</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 483</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 484</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// AdaptorContext is usable until the very end.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 485</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> sendDocIdsFuture = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 486</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> scheduler = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 487</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> scope = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 488</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> dashboard = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 489</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> scheduleExecutor = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 490</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> backgroundExecutor = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 491</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> waiter = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 492</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> sessionManager = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 493</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 494</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 495</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 496</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 497</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Ensure there is a push running right now. This schedules a new push if one</span></pre></td></tr>
-<tr> <td class="numLine"> 498</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * is not already running. Returns {@code true} if it starts a new push, and</span></pre></td></tr>
-<tr> <td class="numLine"> 499</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * {@code false} otherwise.</span></pre></td></tr>
-<tr> <td class="numLine"> 500</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 501</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> checkAndScheduleImmediatePushOfDocIds() {</pre></td></tr>
-<tr> <td class="numLineCover"> 502</td> <td class="nbHitsUncovered"><a title="Line 502: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 502: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (docIdFullPusher.isRunning()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 503</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 504</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 505</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// This check-then-execute permits a race between checking and starting the</span></pre></td></tr>
-<tr> <td class="numLine"> 506</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// runnable, but it shouldn't be a major issue since the caller wanted a</span></pre></td></tr>
-<tr> <td class="numLine"> 507</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// push to start right now, and one "just started."</span></pre></td></tr>
-<tr> <td class="numLineCover"> 508</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> backgroundExecutor.execute(waiter.runnable(docIdFullPusher));</pre></td></tr>
-<tr> <td class="numLineCover"> 509</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
-<tr> <td class="numLine"> 510</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 511</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 512</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 513</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Perform an push of incremental changes. This works only for adaptors that</span></pre></td></tr>
-<tr> <td class="numLine"> 514</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * support incremental polling (implements {@link PollingIncrementalAdaptor}.</span></pre></td></tr>
-<tr> <td class="numLine"> 515</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 516</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">boolean</span> checkAndScheduleIncrementalPushOfDocIds() {</pre></td></tr>
-<tr> <td class="numLineCover"> 517</td> <td class="nbHitsUncovered"><a title="Line 517: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 517: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (docIdIncrementalPusher == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 518</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(</span></pre></td></tr>
-<tr> <td class="numLine"> 519</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"This adaptor does not support incremental push"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 520</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 521</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 522</td> <td class="nbHitsUncovered"><a title="Line 522: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 522: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (docIdIncrementalPusher.isRunning()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 523</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 524</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 525</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// This permits a race between checking and starting the runnable, but it</span></pre></td></tr>
-<tr> <td class="numLine"> 526</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// shouldn't be a major issue since the caller wanted a push to start right</span></pre></td></tr>
-<tr> <td class="numLine"> 527</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// now, and one "just started."</span></pre></td></tr>
-<tr> <td class="numLineCover"> 528</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> backgroundExecutor.execute(waiter.runnable(docIdIncrementalPusher));</span></pre></td></tr>
-<tr> <td class="numLineCover"> 529</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">true</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 530</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 531</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 532</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">boolean</span> ensureLatestConfigLoaded() {</pre></td></tr>
-<tr> <td class="numLine"> 533</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 485</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 534</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> config.ensureLatestConfigLoaded();</pre></td></tr>
-<tr> <td class="numLineCover"> 535</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 536</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Error while trying to reload configuration"</span>,</span></pre></td></tr>
+<tr> <td class="numLineCover"> 486</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> adaptor.destroy();</pre></td></tr>
+<tr> <td class="numLine"> 487</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
+<tr> <td class="numLine"> 488</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Wait until after adaptor.destroy() to set things to null, so that the</span></pre></td></tr>
+<tr> <td class="numLine"> 489</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// AdaptorContext is usable until the very end.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 490</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> sendDocIdsFuture = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 491</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> scheduler = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 492</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> scope = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 493</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> dashboard = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 494</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> scheduleExecutor = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 495</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> backgroundExecutor = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 496</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> waiter = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 497</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> sessionManager = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 498</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 499</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 500</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 501</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 502</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Ensure there is a push running right now. This schedules a new push if one</span></pre></td></tr>
+<tr> <td class="numLine"> 503</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * is not already running. Returns {@code true} if it starts a new push, and</span></pre></td></tr>
+<tr> <td class="numLine"> 504</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * {@code false} otherwise.</span></pre></td></tr>
+<tr> <td class="numLine"> 505</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 506</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> checkAndScheduleImmediatePushOfDocIds() {</pre></td></tr>
+<tr> <td class="numLineCover"> 507</td> <td class="nbHitsUncovered"><a title="Line 507: Conditional coverage 50% (1/2)."> 10</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 507: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (docIdFullPusher.isRunning()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 508</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 509</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 510</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// This check-then-execute permits a race between checking and starting the</span></pre></td></tr>
+<tr> <td class="numLine"> 511</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// runnable, but it shouldn't be a major issue since the caller wanted a</span></pre></td></tr>
+<tr> <td class="numLine"> 512</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// push to start right now, and one "just started."</span></pre></td></tr>
+<tr> <td class="numLineCover"> 513</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> backgroundExecutor.execute(waiter.runnable(docIdFullPusher));</pre></td></tr>
+<tr> <td class="numLineCover"> 514</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLine"> 515</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 516</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 517</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 518</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Perform an push of incremental changes. This works only for adaptors that</span></pre></td></tr>
+<tr> <td class="numLine"> 519</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * support incremental polling (implements {@link PollingIncrementalAdaptor}.</span></pre></td></tr>
+<tr> <td class="numLine"> 520</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 521</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">boolean</span> checkAndScheduleIncrementalPushOfDocIds() {</pre></td></tr>
+<tr> <td class="numLineCover"> 522</td> <td class="nbHitsUncovered"><a title="Line 522: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 522: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (docIdIncrementalPusher == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 523</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(</span></pre></td></tr>
+<tr> <td class="numLine"> 524</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"This adaptor does not support incremental push"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 525</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 526</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 527</td> <td class="nbHitsUncovered"><a title="Line 527: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 527: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (docIdIncrementalPusher.isRunning()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 528</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 529</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 530</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// This permits a race between checking and starting the runnable, but it</span></pre></td></tr>
+<tr> <td class="numLine"> 531</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// shouldn't be a major issue since the caller wanted a push to start right</span></pre></td></tr>
+<tr> <td class="numLine"> 532</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// now, and one "just started."</span></pre></td></tr>
+<tr> <td class="numLineCover"> 533</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> backgroundExecutor.execute(waiter.runnable(docIdIncrementalPusher));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 534</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">true</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 535</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 536</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 537</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 538</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 539</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 540</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 541</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">boolean</span> ensureLatestConfigLoaded() {</pre></td></tr>
+<tr> <td class="numLine"> 538</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 539</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> config.ensureLatestConfigLoaded();</pre></td></tr>
+<tr> <td class="numLineCover"> 540</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 541</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Error while trying to reload configuration"</span>,</span></pre></td></tr>
<tr> <td class="numLine"> 542</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> HttpContext addFilters(HttpContext context) {</pre></td></tr>
-<tr> <td class="numLineCover"> 543</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> context.getFilters().add(waiter.filter());</pre></td></tr>
-<tr> <td class="numLineCover"> 544</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> context.getFilters().addAll(commonFilters);</pre></td></tr>
-<tr> <td class="numLineCover"> 545</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">return</span> context;</pre></td></tr>
+ <td class="src"><pre class="src"> ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 543</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 544</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 545</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 546</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 547</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/** The adaptor instance being used. */</span></pre></td></tr>
<tr> <td class="numLine"> 548</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 549</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Runnable that calls {@link DocIdSender#pushDocIds}.</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Adaptor getAdaptor() {</pre></td></tr>
+<tr> <td class="numLineCover"> 549</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> adaptor;</pre></td></tr>
<tr> <td class="numLine"> 550</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 551</td> <td class="nbHitsCovered"> 54</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> PushRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
-<tr> <td class="numLineCover"> 552</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">volatile</span> GetDocIdsErrorHandler handler</pre></td></tr>
-<tr> <td class="numLine"> 553</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = <span class="keyword">new</span> DefaultGetDocIdsErrorHandler();</pre></td></tr>
-<tr> <td class="numLine"> 554</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 551</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 555</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 552</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> HttpContext addFilters(HttpContext context) {</pre></td></tr>
+<tr> <td class="numLineCover"> 553</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> context.getFilters().add(waiter.filter());</pre></td></tr>
+<tr> <td class="numLineCover"> 554</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> context.getFilters().addAll(commonFilters);</pre></td></tr>
+<tr> <td class="numLineCover"> 555</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">return</span> context;</pre></td></tr>
<tr> <td class="numLine"> 556</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 557</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 558</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> docIdSender.pushFullDocIdsFromAdaptor(handler);</pre></td></tr>
-<tr> <td class="numLineCover"> 559</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (InterruptedException ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 560</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> Thread.currentThread().interrupt();</pre></td></tr>
-<tr> <td class="numLineCover"> 561</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 562</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 558</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 559</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Runnable that calls {@link DocIdSender#pushDocIds}.</span></pre></td></tr>
+<tr> <td class="numLine"> 560</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 561</td> <td class="nbHitsCovered"> 62</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> PushRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
+<tr> <td class="numLineCover"> 562</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">volatile</span> GetDocIdsErrorHandler handler</pre></td></tr>
<tr> <td class="numLine"> 563</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 564</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsErrorHandler(GetDocIdsErrorHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 565</td> <td class="nbHitsUncovered"><a title="Line 565: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 565: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (handler == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 566</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
-<tr> <td class="numLine"> 567</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 568</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.handler = handler;</pre></td></tr>
-<tr> <td class="numLineCover"> 569</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 570</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 571</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsErrorHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 572</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> handler;</pre></td></tr>
-<tr> <td class="numLine"> 573</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 574</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 575</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 576</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 577</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Runnable that performs incremental feed push.</span></pre></td></tr>
-<tr> <td class="numLine"> 578</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 579</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> IncrementalPushRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
-<tr> <td class="numLineCover"> 580</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">volatile</span> GetDocIdsErrorHandler handler</pre></td></tr>
-<tr> <td class="numLine"> 581</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> DefaultGetDocIdsErrorHandler();</pre></td></tr>
-<tr> <td class="numLine"> 582</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> PollingIncrementalAdaptor adaptor;</pre></td></tr>
-<tr> <td class="numLine"> 583</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 564</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 584</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">public</span> IncrementalPushRunnable(PollingIncrementalAdaptor adaptor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 585</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.adaptor = adaptor;</pre></td></tr>
-<tr> <td class="numLineCover"> 586</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 587</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 588</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 565</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 589</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 566</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
-<tr> <td class="numLine"> 590</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 567</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 591</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> docIdSender.pushIncrementalDocIdsFromAdaptor(handler);</pre></td></tr>
-<tr> <td class="numLineCover"> 592</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 593</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 594</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 595</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Exception during incremental polling"</span>, ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 596</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 597</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 598</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 568</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> docIdSender.pushFullDocIdsFromAdaptor(handler);</pre></td></tr>
+<tr> <td class="numLineCover"> 569</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (InterruptedException ex) {</pre></td></tr>
+<tr> <td class="numLineCover"> 570</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> Thread.currentThread().interrupt();</pre></td></tr>
+<tr> <td class="numLineCover"> 571</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 572</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 573</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 599</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 574</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsErrorHandler(GetDocIdsErrorHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 600</td> <td class="nbHitsUncovered"><a title="Line 600: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 600: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (handler == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 601</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
-<tr> <td class="numLine"> 602</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 575</td> <td class="nbHitsUncovered"><a title="Line 575: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 575: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (handler == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 576</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
+<tr> <td class="numLine"> 577</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 603</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.handler = handler;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 604</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 605</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 578</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.handler = handler;</pre></td></tr>
+<tr> <td class="numLineCover"> 579</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 580</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 606</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 581</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsErrorHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 607</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> handler;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 582</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> handler;</pre></td></tr>
+<tr> <td class="numLine"> 583</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 584</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 585</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 586</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 587</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Runnable that performs incremental feed push.</span></pre></td></tr>
+<tr> <td class="numLine"> 588</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 589</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> IncrementalPushRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
+<tr> <td class="numLineCover"> 590</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">volatile</span> GetDocIdsErrorHandler handler</pre></td></tr>
+<tr> <td class="numLine"> 591</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = <span class="keyword">new</span> DefaultGetDocIdsErrorHandler();</pre></td></tr>
+<tr> <td class="numLine"> 592</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> PollingIncrementalAdaptor adaptor;</pre></td></tr>
+<tr> <td class="numLine"> 593</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 594</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">public</span> IncrementalPushRunnable(PollingIncrementalAdaptor adaptor) {</pre></td></tr>
+<tr> <td class="numLineCover"> 595</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.adaptor = adaptor;</pre></td></tr>
+<tr> <td class="numLineCover"> 596</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 597</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 598</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 599</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+<tr> <td class="numLine"> 600</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 601</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> docIdSender.pushIncrementalDocIdsFromAdaptor(handler);</pre></td></tr>
+<tr> <td class="numLineCover"> 602</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 603</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 604</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 605</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Exception during incremental polling"</span>, ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 606</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 607</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 608</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 609</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 610</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 611</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsErrorHandler(GetDocIdsErrorHandler handler) {</pre></td></tr>
+<tr> <td class="numLineCover"> 610</td> <td class="nbHitsUncovered"><a title="Line 610: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 610: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (handler == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 611</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
<tr> <td class="numLine"> 612</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Runnable that logs an error that {@link PushRunnable} is already executing.</span></pre></td></tr>
-<tr> <td class="numLine"> 613</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 614</td> <td class="nbHitsCovered"> 56</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> AlreadyRunningRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
-<tr> <td class="numLine"> 615</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 616</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
-<tr> <td class="numLineCover"> 617</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"Skipping scheduled push of docIds. The previous invocation "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 618</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">"is still running."</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 619</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 620</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 621</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 622</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 623</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Runnable that when invoked executes the delegate with {@link</span></pre></td></tr>
-<tr> <td class="numLine"> 624</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * #backgroundExecutor} and then returns before completion. That implies that</span></pre></td></tr>
-<tr> <td class="numLine"> 625</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * uses of this class must ensure they do not add an instance directly to</span></pre></td></tr>
-<tr> <td class="numLine"> 626</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * {@link #backgroundExecutor}, otherwise an odd infinite loop will occur.</span></pre></td></tr>
-<tr> <td class="numLine"> 627</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 628</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> BackgroundRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
-<tr> <td class="numLine"> 629</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Runnable delegate;</pre></td></tr>
-<tr> <td class="numLine"> 630</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 631</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> BackgroundRunnable(Runnable delegate) {</pre></td></tr>
-<tr> <td class="numLineCover"> 632</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delegate = delegate;</pre></td></tr>
-<tr> <td class="numLineCover"> 633</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 634</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 635</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 636</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
-<tr> <td class="numLine"> 637</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Wrap with waiter.runnable() every time instead of in constructor to aid</span></pre></td></tr>
-<tr> <td class="numLine"> 638</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// auditing the code for "ShutdownWaiter correctness."</span></pre></td></tr>
-<tr> <td class="numLineCover"> 639</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> backgroundExecutor.execute(waiter.runnable(delegate));</pre></td></tr>
-<tr> <td class="numLineCover"> 640</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 641</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 642</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 643</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> GsaConfigModListener <span class="keyword">implements</span> ConfigModificationListener {</pre></td></tr>
-<tr> <td class="numLine"> 644</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 645</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> configModified(ConfigModificationEvent ev) {</pre></td></tr>
-<tr> <td class="numLineCover"> 646</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Set<String> modifiedKeys = ev.getModifiedKeys();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 647</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">synchronized</span> (GsaCommunicationHandler.<span class="keyword">this</span>) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 648</td> <td class="nbHitsUncovered"><a title="Line 648: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 648: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> <span class="keyword">if</span> (modifiedKeys.contains(<span class="string">"adaptor.fullListingSchedule"</span>)</a></span></pre></td></tr>
-<tr> <td class="numLine"> 649</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> && sendDocIdsFuture != <span class="keyword">null</span>) {</pre></td></tr>
-<tr> <td class="numLineCover"> 650</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String schedule = ev.getNewConfig().getAdaptorFullListingSchedule();</span></pre></td></tr>
-<tr> <td class="numLine"> 651</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 652</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> scheduler.reschedule(sendDocIdsFuture, schedule);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 653</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalArgumentException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 654</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Invalid schedule pattern"</span>, ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 655</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 656</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 657</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 658</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 659</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// List of "safe" keys that can be updated without a restart.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 660</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> List<String> safeKeys = Arrays.asList(<span class="string">"adaptor.fullListingSchedule"</span>);</span></pre></td></tr>
-<tr> <td class="numLine"> 661</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Set of "unsafe" keys that have been modified.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 662</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Set<String> modifiedKeysRequiringRestart</span></pre></td></tr>
-<tr> <td class="numLine"> 663</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = <span class="keyword">new</span> HashSet<String>(modifiedKeys);</pre></td></tr>
-<tr> <td class="numLineCover"> 664</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> modifiedKeysRequiringRestart.removeAll(safeKeys);</span></pre></td></tr>
-<tr> <td class="numLine"> 665</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// If there are modified "unsafe" keys, then we restart things to make</span></pre></td></tr>
-<tr> <td class="numLine"> 666</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// sure all the code is up-to-date with the new values.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 667</td> <td class="nbHitsUncovered"><a title="Line 667: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 667: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!modifiedKeysRequiringRestart.isEmpty()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 668</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"Unsafe configuration keys modified. To ensure a sane "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 669</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + <span class="string">"state, the adaptor is restarting."</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 670</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> HttpServer existingServer = scope.getHttpServer();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 671</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> HttpServer existingDashboardServer</span></pre></td></tr>
-<tr> <td class="numLine"> 672</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> = dashboard.getScope().getHttpServer();</pre></td></tr>
-<tr> <td class="numLineCover"> 673</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> stop(3, TimeUnit.SECONDS);</span></pre></td></tr>
-<tr> <td class="numLine"> 674</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 675</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> start(existingServer, existingDashboardServer);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 676</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 677</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.SEVERE, <span class="string">"Automatic restart failed"</span>, ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 678</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 679</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 680</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 681</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 682</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 683</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 613</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.handler = handler;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 614</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 615</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 684</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 616</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsErrorHandler() {</pre></td></tr>
+<tr> <td class="numLineCover"> 617</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> handler;</span></pre></td></tr>
+<tr> <td class="numLine"> 618</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 619</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 620</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 621</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 685</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * This class is thread-safe.</span></pre></td></tr>
-<tr> <td class="numLine"> 686</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 622</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Runnable that logs an error that {@link PushRunnable} is already executing.</span></pre></td></tr>
+<tr> <td class="numLine"> 623</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 687</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> AdaptorContextImpl <span class="keyword">implements</span> AdaptorContext {</pre></td></tr>
-<tr> <td class="numLine"> 688</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 624</td> <td class="nbHitsCovered"> 64</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> AlreadyRunningRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
+<tr> <td class="numLine"> 625</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 689</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Config getConfig() {</pre></td></tr>
-<tr> <td class="numLineCover"> 690</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> config;</pre></td></tr>
-<tr> <td class="numLine"> 691</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 626</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+<tr> <td class="numLineCover"> 627</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"Skipping scheduled push of docIds. The previous invocation "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 628</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + <span class="string">"is still running."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 629</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 630</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 631</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 632</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 633</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Runnable that when invoked executes the delegate with {@link</span></pre></td></tr>
+<tr> <td class="numLine"> 634</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * #backgroundExecutor} and then returns before completion. That implies that</span></pre></td></tr>
+<tr> <td class="numLine"> 635</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * uses of this class must ensure they do not add an instance directly to</span></pre></td></tr>
+<tr> <td class="numLine"> 636</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * {@link #backgroundExecutor}, otherwise an odd infinite loop will occur.</span></pre></td></tr>
+<tr> <td class="numLine"> 637</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 638</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> BackgroundRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
+<tr> <td class="numLine"> 639</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Runnable delegate;</pre></td></tr>
+<tr> <td class="numLine"> 640</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 641</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> BackgroundRunnable(Runnable delegate) {</pre></td></tr>
+<tr> <td class="numLineCover"> 642</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delegate = delegate;</pre></td></tr>
+<tr> <td class="numLineCover"> 643</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 644</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 645</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 646</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+<tr> <td class="numLine"> 647</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Wrap with waiter.runnable() every time instead of in constructor to aid</span></pre></td></tr>
+<tr> <td class="numLine"> 648</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// auditing the code for "ShutdownWaiter correctness."</span></pre></td></tr>
+<tr> <td class="numLineCover"> 649</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> backgroundExecutor.execute(waiter.runnable(delegate));</pre></td></tr>
+<tr> <td class="numLineCover"> 650</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 651</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 652</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 653</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> GsaConfigModListener <span class="keyword">implements</span> ConfigModificationListener {</pre></td></tr>
+<tr> <td class="numLine"> 654</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 655</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> configModified(ConfigModificationEvent ev) {</pre></td></tr>
+<tr> <td class="numLineCover"> 656</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Set<String> modifiedKeys = ev.getModifiedKeys();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 657</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">synchronized</span> (GsaCommunicationHandler.<span class="keyword">this</span>) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 658</td> <td class="nbHitsUncovered"><a title="Line 658: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 658: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> <span class="keyword">if</span> (modifiedKeys.contains(<span class="string">"adaptor.fullListingSchedule"</span>)</a></span></pre></td></tr>
+<tr> <td class="numLine"> 659</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> && sendDocIdsFuture != <span class="keyword">null</span>) {</pre></td></tr>
+<tr> <td class="numLineCover"> 660</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String schedule = ev.getNewConfig().getAdaptorFullListingSchedule();</span></pre></td></tr>
+<tr> <td class="numLine"> 661</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 662</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> scheduler.reschedule(sendDocIdsFuture, schedule);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 663</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalArgumentException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 664</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"Invalid schedule pattern"</span>, ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 665</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 666</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 667</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 668</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 669</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// List of "safe" keys that can be updated without a restart.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 670</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> List<String> safeKeys = Arrays.asList(<span class="string">"adaptor.fullListingSchedule"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 671</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Set of "unsafe" keys that have been modified.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 672</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Set<String> modifiedKeysRequiringRestart</span></pre></td></tr>
+<tr> <td class="numLine"> 673</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = <span class="keyword">new</span> HashSet<String>(modifiedKeys);</pre></td></tr>
+<tr> <td class="numLineCover"> 674</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> modifiedKeysRequiringRestart.removeAll(safeKeys);</span></pre></td></tr>
+<tr> <td class="numLine"> 675</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// If there are modified "unsafe" keys, then we restart things to make</span></pre></td></tr>
+<tr> <td class="numLine"> 676</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// sure all the code is up-to-date with the new values.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 677</td> <td class="nbHitsUncovered"><a title="Line 677: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 677: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!modifiedKeysRequiringRestart.isEmpty()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 678</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"Unsafe configuration keys modified. To ensure a sane "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 679</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + <span class="string">"state, the adaptor is restarting."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 680</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> HttpServer existingServer = scope.getHttpServer();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 681</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> HttpServer existingDashboardServer</span></pre></td></tr>
+<tr> <td class="numLine"> 682</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = dashboard.getScope().getHttpServer();</pre></td></tr>
+<tr> <td class="numLineCover"> 683</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> stop(3, TimeUnit.SECONDS);</span></pre></td></tr>
+<tr> <td class="numLine"> 684</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 685</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> start(existingServer, existingDashboardServer);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 686</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Exception ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 687</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.SEVERE, <span class="string">"Automatic restart failed"</span>, ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 688</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 689</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 690</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 691</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 692</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 693</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 694</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher getDocIdPusher() {</pre></td></tr>
-<tr> <td class="numLineCover"> 695</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docIdSender;</pre></td></tr>
-<tr> <td class="numLine"> 696</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 697</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 694</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 695</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * This class is thread-safe.</span></pre></td></tr>
+<tr> <td class="numLine"> 696</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 697</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> AdaptorContextImpl <span class="keyword">implements</span> AdaptorContext {</pre></td></tr>
<tr> <td class="numLine"> 698</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 699</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdEncoder getDocIdEncoder() {</pre></td></tr>
-<tr> <td class="numLineCover"> 700</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docIdCodec;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Config getConfig() {</pre></td></tr>
+<tr> <td class="numLineCover"> 700</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> config;</pre></td></tr>
<tr> <td class="numLine"> 701</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 702</td> <td class="nbHits"> </td>
@@ -1159,77 +1157,77 @@
<tr> <td class="numLine"> 703</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 704</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> addStatusSource(StatusSource source) {</pre></td></tr>
-<tr> <td class="numLineCover"> 705</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> dashboard.addStatusSource(source);</pre></td></tr>
-<tr> <td class="numLineCover"> 706</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher getDocIdPusher() {</pre></td></tr>
+<tr> <td class="numLineCover"> 705</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docIdSender;</pre></td></tr>
+<tr> <td class="numLine"> 706</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 707</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 708</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 709</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> removeStatusSource(StatusSource source) {</pre></td></tr>
-<tr> <td class="numLineCover"> 710</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> dashboard.removeStatusSource(source);</pre></td></tr>
-<tr> <td class="numLineCover"> 711</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdEncoder getDocIdEncoder() {</pre></td></tr>
+<tr> <td class="numLineCover"> 710</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docIdCodec;</pre></td></tr>
+<tr> <td class="numLine"> 711</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 712</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 713</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 714</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsFullErrorHandler(GetDocIdsErrorHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 715</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ((PushRunnable) docIdFullPusher.getRunnable())</pre></td></tr>
-<tr> <td class="numLine"> 716</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> .setGetDocIdsErrorHandler(handler);</pre></td></tr>
-<tr> <td class="numLineCover"> 717</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> addStatusSource(StatusSource source) {</pre></td></tr>
+<tr> <td class="numLineCover"> 715</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> dashboard.addStatusSource(source);</pre></td></tr>
+<tr> <td class="numLineCover"> 716</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 717</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 718</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 719</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 720</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsFullErrorHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 721</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ((PushRunnable) docIdFullPusher.getRunnable())</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> removeStatusSource(StatusSource source) {</pre></td></tr>
+<tr> <td class="numLineCover"> 720</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> dashboard.removeStatusSource(source);</pre></td></tr>
+<tr> <td class="numLineCover"> 721</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 722</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> .getGetDocIdsErrorHandler();</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 723</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 724</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 725</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsFullErrorHandler(GetDocIdsErrorHandler handler) {</pre></td></tr>
+<tr> <td class="numLineCover"> 725</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ((PushRunnable) docIdFullPusher.getRunnable())</pre></td></tr>
<tr> <td class="numLine"> 726</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsIncrementalErrorHandler(</pre></td></tr>
-<tr> <td class="numLine"> 727</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> GetDocIdsErrorHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 728</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ((PushRunnable) docIdFullPusher.getRunnable())</span></pre></td></tr>
-<tr> <td class="numLine"> 729</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> .setGetDocIdsErrorHandler(handler);</pre></td></tr>
-<tr> <td class="numLineCover"> 730</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 731</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 727</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 728</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 729</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 730</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsFullErrorHandler() {</pre></td></tr>
+<tr> <td class="numLineCover"> 731</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ((PushRunnable) docIdFullPusher.getRunnable())</pre></td></tr>
<tr> <td class="numLine"> 732</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 733</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsIncrementalErrorHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 734</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> ((PushRunnable) docIdFullPusher.getRunnable())</span></pre></td></tr>
-<tr> <td class="numLine"> 735</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> .getGetDocIdsErrorHandler();</pre></td></tr>
+<tr> <td class="numLine"> 733</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 734</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 735</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 736</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsIncrementalErrorHandler(</pre></td></tr>
<tr> <td class="numLine"> 737</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 738</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
+ <td class="src"><pre class="src"> GetDocIdsErrorHandler handler) {</pre></td></tr>
+<tr> <td class="numLineCover"> 738</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ((PushRunnable) docIdFullPusher.getRunnable())</span></pre></td></tr>
<tr> <td class="numLine"> 739</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> SensitiveValueDecoder getSensitiveValueDecoder() {</pre></td></tr>
-<tr> <td class="numLineCover"> 740</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> secureValueCodec;</pre></td></tr>
+ <td class="src"><pre class="src"> .setGetDocIdsErrorHandler(handler);</pre></td></tr>
+<tr> <td class="numLineCover"> 740</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 741</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 742</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 743</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 742</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 744</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> HttpContext createHttpContext(String path, HttpHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 745</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> addFilters(scope.createContext(path, handler));</span></pre></td></tr>
+<tr> <td class="numLine"> 743</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsIncrementalErrorHandler() {</pre></td></tr>
+<tr> <td class="numLineCover"> 744</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> ((PushRunnable) docIdFullPusher.getRunnable())</span></pre></td></tr>
+<tr> <td class="numLine"> 745</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> .getGetDocIdsErrorHandler();</pre></td></tr>
<tr> <td class="numLine"> 746</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 747</td> <td class="nbHits"> </td>
@@ -1237,29 +1235,47 @@
<tr> <td class="numLine"> 748</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 749</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Session getUserSession(HttpExchange ex, <span class="keyword">boolean</span> create) {</pre></td></tr>
-<tr> <td class="numLineCover"> 750</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Session session = sessionManager.getSession(ex, create);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 751</td> <td class="nbHitsUncovered"><a title="Line 751: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 751: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (session == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 752</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">null</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 753</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 754</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">final</span> String wrappedSessionName = <span class="string">"wrapped-session"</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 755</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Session nsSession;</pre></td></tr>
-<tr> <td class="numLineCover"> 756</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">synchronized</span> (session) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 757</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> nsSession = (Session) session.getAttribute(wrappedSessionName);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 758</td> <td class="nbHitsUncovered"><a title="Line 758: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 758: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (nsSession == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 759</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> nsSession = <span class="keyword">new</span> NamespacedSession(session, <span class="string">"adaptor-impl-"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 760</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> session.setAttribute(wrappedSessionName, nsSession);</span></pre></td></tr>
-<tr> <td class="numLine"> 761</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 762</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 763</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> nsSession;</span></pre></td></tr>
-<tr> <td class="numLine"> 764</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> SensitiveValueDecoder getSensitiveValueDecoder() {</pre></td></tr>
+<tr> <td class="numLineCover"> 750</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> secureValueCodec;</pre></td></tr>
+<tr> <td class="numLine"> 751</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 752</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 753</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 754</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> HttpContext createHttpContext(String path, HttpHandler handler) {</pre></td></tr>
+<tr> <td class="numLineCover"> 755</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> addFilters(scope.createContext(path, handler));</span></pre></td></tr>
+<tr> <td class="numLine"> 756</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 757</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 758</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 759</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Session getUserSession(HttpExchange ex, <span class="keyword">boolean</span> create) {</pre></td></tr>
+<tr> <td class="numLineCover"> 760</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Session session = sessionManager.getSession(ex, create);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 761</td> <td class="nbHitsUncovered"><a title="Line 761: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 761: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (session == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 762</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">null</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 763</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 764</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">final</span> String wrappedSessionName = <span class="string">"wrapped-session"</span>;</span></pre></td></tr>
<tr> <td class="numLine"> 765</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> Session nsSession;</pre></td></tr>
+<tr> <td class="numLineCover"> 766</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">synchronized</span> (session) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 767</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> nsSession = (Session) session.getAttribute(wrappedSessionName);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 768</td> <td class="nbHitsUncovered"><a title="Line 768: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 768: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (nsSession == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 769</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> nsSession = <span class="keyword">new</span> NamespacedSession(session, <span class="string">"adaptor-impl-"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 770</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> session.setAttribute(wrappedSessionName, nsSession);</span></pre></td></tr>
+<tr> <td class="numLine"> 771</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 772</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 773</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> nsSession;</span></pre></td></tr>
+<tr> <td class="numLine"> 774</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 775</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 766</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 776</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.GsaFeedFileMaker.html b/coverage/com.google.enterprise.adaptor.GsaFeedFileMaker.html
index 122ab90..513e34a 100644
--- a/coverage/com.google.enterprise.adaptor.GsaFeedFileMaker.html
+++ b/coverage/com.google.enterprise.adaptor.GsaFeedFileMaker.html
@@ -125,13 +125,13 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> GsaFeedFileMaker(DocIdEncoder encoder,</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">boolean</span> separateClosingRecordTagWorkaround,</pre></td></tr>
-<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> useAuthMethodWorkaround) {</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.idEncoder = encoder;</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.separateClosingRecordTagWorkaround</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> useAuthMethodWorkaround) {</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.idEncoder = encoder;</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.separateClosingRecordTagWorkaround</pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = separateClosingRecordTagWorkaround;</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.useAuthMethodWorkaround = useAuthMethodWorkaround;</pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.useAuthMethodWorkaround = useAuthMethodWorkaround;</pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.GsaFeedFileSender.html b/coverage/com.google.enterprise.adaptor.GsaFeedFileSender.html
index 3a2fcc3..9341b5b 100644
--- a/coverage/com.google.enterprise.adaptor.GsaFeedFileSender.html
+++ b/coverage/com.google.enterprise.adaptor.GsaFeedFileSender.html
@@ -138,9 +138,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String CRLF = <span class="string">"\r\n"</span>;</pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GsaFeedFileSender(Config config) {</pre></td></tr>
-<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 39</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GsaFeedFileSender(Config config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 39</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.config = config;</pre></td></tr>
+<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 39</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.HttpExchanges.html b/coverage/com.google.enterprise.adaptor.HttpExchanges.html
index 3dd97a2..5078497 100644
--- a/coverage/com.google.enterprise.adaptor.HttpExchanges.html
+++ b/coverage/com.google.enterprise.adaptor.HttpExchanges.html
@@ -200,8 +200,8 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> URI getRequestUri(HttpExchange ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> String host = ex.getRequestHeaders().getFirst(<span class="string">"Host"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 105</td> <td class="nbHitsUncovered"><a title="Line 105: Conditional coverage 50% (1/2)."> 97</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 105: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (host == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 99</td> <td class="src"><pre class="src"> String host = ex.getRequestHeaders().getFirst(<span class="string">"Host"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 105</td> <td class="nbHitsUncovered"><a title="Line 105: Conditional coverage 50% (1/2)."> 99</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 105: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (host == <span class="keyword">null</span>) {</a></span></pre></td></tr>
<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Client must be using HTTP/1.0</span></pre></td></tr>
<tr> <td class="numLineCover"> 107</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(</span></pre></td></tr>
@@ -211,27 +211,27 @@
<tr> <td class="numLineCover"> 110</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> host = <span class="string">"localhost:"</span> + port;</span></pre></td></tr>
<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 112</td> <td class="nbHitsCovered"><a title="Line 112: Conditional coverage 100% (2/2)."> 97</a></td> <td class="src"><pre class="src"> <a title="Line 112: Conditional coverage 100% (2/2)."> String protocol = (ex.getHttpContext().getServer() <span class="keyword">instanceof</span> HttpsServer)</a></pre></td></tr>
+<tr> <td class="numLineCover"> 112</td> <td class="nbHitsCovered"><a title="Line 112: Conditional coverage 100% (2/2)."> 99</a></td> <td class="src"><pre class="src"> <a title="Line 112: Conditional coverage 100% (2/2)."> String protocol = (ex.getHttpContext().getServer() <span class="keyword">instanceof</span> HttpsServer)</a></pre></td></tr>
<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> ? <span class="string">"https"</span> : <span class="string">"http"</span>;</pre></td></tr>
<tr> <td class="numLine"> 114</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> URI base;</pre></td></tr>
<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 116</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> base = <span class="keyword">new</span> URI(protocol, host, <span class="string">"/"</span>, <span class="keyword">null</span>, <span class="keyword">null</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 116</td> <td class="nbHitsCovered"> 99</td> <td class="src"><pre class="src"> base = <span class="keyword">new</span> URI(protocol, host, <span class="string">"/"</span>, <span class="keyword">null</span>, <span class="keyword">null</span>);</pre></td></tr>
<tr> <td class="numLineCover"> 117</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (URISyntaxException e) {</span></pre></td></tr>
<tr> <td class="numLineCover"> 118</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> URI requestedUri = ex.getRequestURI();</pre></td></tr>
+<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 99</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 99</td> <td class="src"><pre class="src"> URI requestedUri = ex.getRequestURI();</pre></td></tr>
<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// If uri is already absolute (e.g., a proxy is involved), then this</span></pre></td></tr>
<tr> <td class="numLine"> 122</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// does nothing, otherwise it resolves the URI for us based on who we</span></pre></td></tr>
<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// think we are</span></pre></td></tr>
-<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> requestedUri = base.resolve(requestedUri);</pre></td></tr>
-<tr> <td class="numLineCover"> 125</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> log.log(Level.FINER, <span class="string">"Resolved original URI to: {0}"</span>, requestedUri);</pre></td></tr>
-<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> <span class="keyword">return</span> requestedUri;</pre></td></tr>
+<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 99</td> <td class="src"><pre class="src"> requestedUri = base.resolve(requestedUri);</pre></td></tr>
+<tr> <td class="numLineCover"> 125</td> <td class="nbHitsCovered"> 99</td> <td class="src"><pre class="src"> log.log(Level.FINER, <span class="string">"Resolved original URI to: {0}"</span>, requestedUri);</pre></td></tr>
+<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 99</td> <td class="src"><pre class="src"> <span class="keyword">return</span> requestedUri;</pre></td></tr>
<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
@@ -273,8 +273,8 @@
<td class="src"><pre class="src"> <span class="keyword">throws</span> IOException {</pre></td></tr>
<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// TODO(ejona): use exchange to decide on response language</span></pre></td></tr>
-<tr> <td class="numLineCover"> 149</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> cannedRespond(ex, code, <span class="string">"text/plain"</span>, response.toString());</pre></td></tr>
-<tr> <td class="numLineCover"> 150</td> <td class="nbHitsCovered"> 49</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 149</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> cannedRespond(ex, code, <span class="string">"text/plain"</span>, response.toString());</pre></td></tr>
+<tr> <td class="numLineCover"> 150</td> <td class="nbHitsCovered"> 50</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 151</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
@@ -305,14 +305,14 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> cannedRespond(HttpExchange ex, <span class="keyword">int</span> code,</pre></td></tr>
<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> String contentType, String response) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"><a title="Line 167: Conditional coverage 100% (2/2)."> 63</a></td> <td class="src"><pre class="src"> <a title="Line 167: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"HEAD"</span>.equals(ex.getRequestMethod())) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"><a title="Line 167: Conditional coverage 100% (2/2)."> 64</a></td> <td class="src"><pre class="src"> <a title="Line 167: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="string">"HEAD"</span>.equals(ex.getRequestMethod())) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 168</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> respondToHead(ex, code, contentType);</pre></td></tr>
<tr> <td class="numLine"> 169</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 62</td> <td class="src"><pre class="src"> respond(ex, code, contentType, response.getBytes(ENCODING));</pre></td></tr>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 63</td> <td class="src"><pre class="src"> respond(ex, code, contentType, response.getBytes(ENCODING));</pre></td></tr>
<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 172</td> <td class="nbHitsCovered"> 63</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 172</td> <td class="nbHitsCovered"> 64</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 173</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 174</td> <td class="nbHits"> </td>
@@ -327,12 +327,12 @@
<td class="src"><pre class="src"> <span class="keyword">static</span> <span class="keyword">void</span> startResponse(HttpExchange ex, <span class="keyword">int</span> code,</pre></td></tr>
<tr> <td class="numLine"> 179</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> String contentType, <span class="keyword">boolean</span> hasBody) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 180</td> <td class="nbHitsCovered"> 121</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Starting response"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"><a title="Line 181: Conditional coverage 100% (2/2)."> 121</a></td> <td class="src"><pre class="src"> <a title="Line 181: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (contentType != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 90</td> <td class="src"><pre class="src"> ex.getResponseHeaders().set(<span class="string">"Content-Type"</span>, contentType);</pre></td></tr>
+<tr> <td class="numLineCover"> 180</td> <td class="nbHitsCovered"> 127</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Starting response"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"><a title="Line 181: Conditional coverage 100% (2/2)."> 127</a></td> <td class="src"><pre class="src"> <a title="Line 181: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (contentType != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 95</td> <td class="src"><pre class="src"> ex.getResponseHeaders().set(<span class="string">"Content-Type"</span>, contentType);</pre></td></tr>
<tr> <td class="numLine"> 183</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"><a title="Line 184: Conditional coverage 100% (2/2)."> 121</a></td> <td class="src"><pre class="src"> <a title="Line 184: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!hasBody) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"><a title="Line 184: Conditional coverage 100% (2/2)."> 127</a></td> <td class="src"><pre class="src"> <a title="Line 184: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!hasBody) {</a></pre></td></tr>
<tr> <td class="numLine"> 185</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// No body. Required for HEAD requests</span></pre></td></tr>
<tr> <td class="numLineCover"> 186</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> ex.sendResponseHeaders(code, -1);</pre></td></tr>
@@ -340,10 +340,10 @@
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
<tr> <td class="numLine"> 188</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Chuncked encoding</span></pre></td></tr>
-<tr> <td class="numLineCover"> 189</td> <td class="nbHitsCovered"> 111</td> <td class="src"><pre class="src"> ex.sendResponseHeaders(code, 0);</pre></td></tr>
+<tr> <td class="numLineCover"> 189</td> <td class="nbHitsCovered"> 117</td> <td class="src"><pre class="src"> ex.sendResponseHeaders(code, 0);</pre></td></tr>
<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 121</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 127</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 192</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
@@ -358,21 +358,21 @@
<td class="src"><pre class="src"> <span class="keyword">static</span> <span class="keyword">void</span> respond(HttpExchange ex, <span class="keyword">int</span> code, String contentType,</pre></td></tr>
<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">byte</span> response[]) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"><a title="Line 199: Conditional coverage 100% (2/2)."> 95</a></td> <td class="src"><pre class="src"> <a title="Line 199: Conditional coverage 100% (2/2)."> startResponse(ex, code, contentType, response != <span class="keyword">null</span>);</a></pre></td></tr>
-<tr> <td class="numLineCover"> 200</td> <td class="nbHitsCovered"><a title="Line 200: Conditional coverage 100% (2/2)."> 95</a></td> <td class="src"><pre class="src"> <a title="Line 200: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (response != <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 201</td> <td class="nbHitsCovered"> 87</td> <td class="src"><pre class="src"> OutputStream responseBody = ex.getResponseBody();</pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 87</td> <td class="src"><pre class="src"> log.finest(<span class="string">"before writing response"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 87</td> <td class="src"><pre class="src"> responseBody.write(response);</pre></td></tr>
-<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 87</td> <td class="src"><pre class="src"> responseBody.flush();</pre></td></tr>
+<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"><a title="Line 199: Conditional coverage 100% (2/2)."> 100</a></td> <td class="src"><pre class="src"> <a title="Line 199: Conditional coverage 100% (2/2)."> startResponse(ex, code, contentType, response != <span class="keyword">null</span>);</a></pre></td></tr>
+<tr> <td class="numLineCover"> 200</td> <td class="nbHitsCovered"><a title="Line 200: Conditional coverage 100% (2/2)."> 100</a></td> <td class="src"><pre class="src"> <a title="Line 200: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (response != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 201</td> <td class="nbHitsCovered"> 92</td> <td class="src"><pre class="src"> OutputStream responseBody = ex.getResponseBody();</pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 92</td> <td class="src"><pre class="src"> log.finest(<span class="string">"before writing response"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 92</td> <td class="src"><pre class="src"> responseBody.write(response);</pre></td></tr>
+<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 92</td> <td class="src"><pre class="src"> responseBody.flush();</pre></td></tr>
<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// This shouldn't be needed, but without it one developer had trouble</span></pre></td></tr>
-<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 87</td> <td class="src"><pre class="src"> responseBody.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 87</td> <td class="src"><pre class="src"> log.finest(<span class="string">"after writing response"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 92</td> <td class="src"><pre class="src"> responseBody.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 92</td> <td class="src"><pre class="src"> log.finest(<span class="string">"after writing response"</span>);</pre></td></tr>
<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 209</td> <td class="nbHitsCovered"> 95</td> <td class="src"><pre class="src"> ex.close();</pre></td></tr>
-<tr> <td class="numLineCover"> 210</td> <td class="nbHitsCovered"> 95</td> <td class="src"><pre class="src"> log.finest(<span class="string">"after closing exchange"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 211</td> <td class="nbHitsCovered"> 95</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 209</td> <td class="nbHitsCovered"> 100</td> <td class="src"><pre class="src"> ex.close();</pre></td></tr>
+<tr> <td class="numLineCover"> 210</td> <td class="nbHitsCovered"> 100</td> <td class="src"><pre class="src"> log.finest(<span class="string">"after closing exchange"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 211</td> <td class="nbHitsCovered"> 100</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 212</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
@@ -412,9 +412,9 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> enableCompressionIfSupported(HttpExchange ex)</pre></td></tr>
<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> String encodingList = ex.getRequestHeaders().getFirst(<span class="string">"Accept-Encoding"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"><a title="Line 234: Conditional coverage 100% (2/2)."> 15</a></td> <td class="src"><pre class="src"> <a title="Line 234: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (encodingList == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 235</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> String encodingList = ex.getRequestHeaders().getFirst(<span class="string">"Accept-Encoding"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"><a title="Line 234: Conditional coverage 100% (2/2)."> 16</a></td> <td class="src"><pre class="src"> <a title="Line 234: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (encodingList == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 235</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLineCover"> 237</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> Collection<String> encodings = Arrays.asList(encodingList.split(<span class="string">","</span>));</pre></td></tr>
diff --git a/coverage/com.google.enterprise.adaptor.HttpServerScope.html b/coverage/com.google.enterprise.adaptor.HttpServerScope.html
index 7b11712..56a442c 100644
--- a/coverage/com.google.enterprise.adaptor.HttpServerScope.html
+++ b/coverage/com.google.enterprise.adaptor.HttpServerScope.html
@@ -83,27 +83,27 @@
<td class="src"><pre class="src"> <span class="keyword">class</span> HttpServerScope <span class="keyword">implements</span> Closeable {</pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> HttpServer server;</pre></td></tr>
-<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> List<HttpContext> contexts = <span class="keyword">new</span> ArrayList<HttpContext>();</pre></td></tr>
+<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> List<HttpContext> contexts = <span class="keyword">new</span> ArrayList<HttpContext>();</pre></td></tr>
<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> closed;</pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">public</span> HttpServerScope(HttpServer server) {</pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.server = server;</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">public</span> HttpServerScope(HttpServer server) {</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.server = server;</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> HttpContext createContext(</pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> String path, HttpHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 43</td> <td class="nbHitsUncovered"><a title="Line 43: Conditional coverage 50% (1/2)."> 42</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 43: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (closed) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsUncovered"><a title="Line 43: Conditional coverage 50% (1/2)."> 46</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 43: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (closed) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 44</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Closed"</span>);</span></pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> HttpContext context = server.createContext(path, handler);</pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> contexts.add(context);</pre></td></tr>
-<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">return</span> context;</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> HttpContext context = server.createContext(path, handler);</pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> contexts.add(context);</pre></td></tr>
+<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">return</span> context;</pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
@@ -120,13 +120,13 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> close() {</pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"><a title="Line 57: Conditional coverage 100% (2/2)."> 20</a></td> <td class="src"><pre class="src"> <a title="Line 57: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (HttpContext context : contexts) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> server.removeContext(context);</pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"><a title="Line 57: Conditional coverage 100% (2/2)."> 22</a></td> <td class="src"><pre class="src"> <a title="Line 57: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (HttpContext context : contexts) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> server.removeContext(context);</pre></td></tr>
<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> contexts.clear();</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> closed = <span class="keyword">true</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> contexts.clear();</pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> closed = <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.IOHelper.html b/coverage/com.google.enterprise.adaptor.IOHelper.html
index c654f5c..dbac05b 100644
--- a/coverage/com.google.enterprise.adaptor.IOHelper.html
+++ b/coverage/com.google.enterprise.adaptor.IOHelper.html
@@ -80,15 +80,15 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> copyStream(InputStream in, OutputStream out)</pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 74</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] buffer = <span class="keyword">new</span> <span class="keyword">byte</span>[1024];</pre></td></tr>
+<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 69</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] buffer = <span class="keyword">new</span> <span class="keyword">byte</span>[1024];</pre></td></tr>
<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">int</span> read;</pre></td></tr>
-<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"><a title="Line 35: Conditional coverage 100% (2/2)."> 214</a></td> <td class="src"><pre class="src"> <a title="Line 35: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> ((read = in.read(buffer)) != -1) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 141</td> <td class="src"><pre class="src"> out.write(buffer, 0, read);</pre></td></tr>
+<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"><a title="Line 35: Conditional coverage 100% (2/2)."> 168</a></td> <td class="src"><pre class="src"> <a title="Line 35: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> ((read = in.read(buffer)) != -1) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 100</td> <td class="src"><pre class="src"> out.write(buffer, 0, read);</pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 72</td> <td class="src"><pre class="src"> out.flush();</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 72</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 67</td> <td class="src"><pre class="src"> out.flush();</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 67</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
@@ -101,9 +101,9 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">byte</span>[] readInputStreamToByteArray(InputStream is)</pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ByteArrayOutputStream os = <span class="keyword">new</span> ByteArrayOutputStream();</pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> copyStream(is, os);</pre></td></tr>
-<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> <span class="keyword">return</span> os.toByteArray();</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 43</td> <td class="src"><pre class="src"> ByteArrayOutputStream os = <span class="keyword">new</span> ByteArrayOutputStream();</pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 43</td> <td class="src"><pre class="src"> copyStream(is, os);</pre></td></tr>
+<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">return</span> os.toByteArray();</pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
@@ -118,7 +118,7 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> String readInputStreamToString(InputStream is,</pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Charset charset) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> String(readInputStreamToByteArray(is), charset);</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> String(readInputStreamToByteArray(is), charset);</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.InternalErrorFilter.html b/coverage/com.google.enterprise.adaptor.InternalErrorFilter.html
index 79a9514..dc83f97 100644
--- a/coverage/com.google.enterprise.adaptor.InternalErrorFilter.html
+++ b/coverage/com.google.enterprise.adaptor.InternalErrorFilter.html
@@ -73,7 +73,7 @@
<td class="src"><pre class="src"> <span class="comment"> * connection, when possible.</span></pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">class</span> InternalErrorFilter <span class="keyword">extends</span> Filter {</pre></td></tr>
+<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 36</td> <td class="src"><pre class="src"> <span class="keyword">class</span> InternalErrorFilter <span class="keyword">extends</span> Filter {</pre></td></tr>
<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Logger.getLogger(InternalErrorFilter.<span class="keyword">class</span>.getName());</pre></td></tr>
@@ -94,7 +94,7 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> doFilter(HttpExchange ex, Filter.Chain chain) <span class="keyword">throws</span> IOException {</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> chain.doFilter(ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> chain.doFilter(ex);</pre></td></tr>
<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (Exception e) {</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// We want to send 500 Internal Error if the response headers have not</span></pre></td></tr>
@@ -122,8 +122,8 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.Journal.html b/coverage/com.google.enterprise.adaptor.Journal.html
index c2b4b76..fd8dbd5 100644
--- a/coverage/com.google.enterprise.adaptor.Journal.html
+++ b/coverage/com.google.enterprise.adaptor.Journal.html
@@ -114,7 +114,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Request processing start time storage until processing completion. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">private</span> ThreadLocal<Long> requestProcessingStart = <span class="keyword">new</span> ThreadLocal<Long>();</pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">private</span> ThreadLocal<Long> requestProcessingStart = <span class="keyword">new</span> ThreadLocal<Long>();</pre></td></tr>
<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
@@ -135,7 +135,7 @@
<td class="src"><pre class="src"> <span class="comment">/** Date in milliseconds. */</span></pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">long</span> lastSuccessfulFullPushEnd;</pre></td></tr>
-<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">private</span> CompletionStatus lastFullPushStatus = CompletionStatus.SUCCESS;</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">private</span> CompletionStatus lastFullPushStatus = CompletionStatus.SUCCESS;</pre></td></tr>
<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
@@ -144,7 +144,7 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">long</span> lastSuccessfulIncrementalPushStart;</pre></td></tr>
<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">long</span> lastSuccessfulIncrementalPushEnd;</pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">private</span> CompletionStatus lastIncrementalPushStatus = CompletionStatus.SUCCESS;</pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">private</span> CompletionStatus lastIncrementalPushStatus = CompletionStatus.SUCCESS;</pre></td></tr>
<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> enum CompletionStatus {</pre></td></tr>
@@ -165,8 +165,8 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Journal(<span class="keyword">boolean</span> reducedMem) {</pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 28</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(reducedMem, <span class="keyword">new</span> SystemTimeProvider());</pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 28</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(reducedMem, <span class="keyword">new</span> SystemTimeProvider());</pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
@@ -177,20 +177,20 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">protected</span> Journal(TimeProvider timeProvider) {</pre></td></tr>
-<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 167</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(<span class="keyword">false</span>, timeProvider);</pre></td></tr>
-<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"> 167</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 166</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(<span class="keyword">false</span>, timeProvider);</pre></td></tr>
+<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"> 166</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">protected</span> Journal(<span class="keyword">boolean</span> reducedMem, TimeProvider timeProvider) {</pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeProvider = timeProvider;</pre></td></tr>
-<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.startedAt = timeProvider.currentTimeMillis();</pre></td></tr>
-<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeResolution = determineTimeResolution();</pre></td></tr>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">protected</span> Journal(<span class="keyword">boolean</span> reducedMem, TimeProvider timeProvider) {</pre></td></tr>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeProvider = timeProvider;</pre></td></tr>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.startedAt = timeProvider.currentTimeMillis();</pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeResolution = determineTimeResolution();</pre></td></tr>
<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// We want data within the Stats to agree with each other, so we provide the</span></pre></td></tr>
<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// same time to each of them.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 92</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">long</span> time = startedAt;</pre></td></tr>
-<tr> <td class="numLineCover"> 93</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeStats = <span class="keyword">new</span> Stats[] {</pre></td></tr>
+<tr> <td class="numLineCover"> 92</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">long</span> time = startedAt;</pre></td></tr>
+<tr> <td class="numLineCover"> 93</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.timeStats = <span class="keyword">new</span> Stats[] {</pre></td></tr>
<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> Stats(60, 1000, time), <span class="comment">/* one minute, second granularity */</span></pre></td></tr>
<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
@@ -199,19 +199,19 @@
<td class="src"><pre class="src"> <span class="keyword">new</span> Stats(48, 1000 * 60 * 30, time), <span class="comment">/* one day, half-hour granularity */</span></pre></td></tr>
<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> };</pre></td></tr>
-<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.dayStatsByHalfHour = <span class="keyword">this</span>.timeStats[<span class="keyword">this</span>.timeStats.length - 1];</pre></td></tr>
-<tr> <td class="numLineCover"> 99</td> <td class="nbHitsCovered"><a title="Line 99: Conditional coverage 100% (2/2)."> 197</a></td> <td class="src"><pre class="src"> <a title="Line 99: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (reducedMem) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> timesPushed = <span class="keyword">new</span> NegSizeFakeMap<DocId, Integer>();</pre></td></tr>
-<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> timesGsaRequested = <span class="keyword">new</span> NegSizeFakeMap<DocId, Integer>();</pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> timesNonGsaRequested = <span class="keyword">new</span> NegSizeFakeMap<DocId, Integer>();</pre></td></tr>
+<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.dayStatsByHalfHour = <span class="keyword">this</span>.timeStats[<span class="keyword">this</span>.timeStats.length - 1];</pre></td></tr>
+<tr> <td class="numLineCover"> 99</td> <td class="nbHitsCovered"><a title="Line 99: Conditional coverage 100% (2/2)."> 200</a></td> <td class="src"><pre class="src"> <a title="Line 99: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (reducedMem) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> timesPushed = <span class="keyword">new</span> NegSizeFakeMap<DocId, Integer>();</pre></td></tr>
+<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> timesGsaRequested = <span class="keyword">new</span> NegSizeFakeMap<DocId, Integer>();</pre></td></tr>
+<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> timesNonGsaRequested = <span class="keyword">new</span> NegSizeFakeMap<DocId, Integer>();</pre></td></tr>
<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 168</td> <td class="src"><pre class="src"> timesPushed = <span class="keyword">new</span> HashMap<DocId, Integer>();</pre></td></tr>
-<tr> <td class="numLineCover"> 105</td> <td class="nbHitsCovered"> 168</td> <td class="src"><pre class="src"> timesGsaRequested = <span class="keyword">new</span> HashMap<DocId, Integer>();</pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 168</td> <td class="src"><pre class="src"> timesNonGsaRequested = <span class="keyword">new</span> HashMap<DocId, Integer>();</pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 167</td> <td class="src"><pre class="src"> timesPushed = <span class="keyword">new</span> HashMap<DocId, Integer>();</pre></td></tr>
+<tr> <td class="numLineCover"> 105</td> <td class="nbHitsCovered"> 167</td> <td class="src"><pre class="src"> timesGsaRequested = <span class="keyword">new</span> HashMap<DocId, Integer>();</pre></td></tr>
+<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 167</td> <td class="src"><pre class="src"> timesNonGsaRequested = <span class="keyword">new</span> HashMap<DocId, Integer>();</pre></td></tr>
<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 108</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 108</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
@@ -238,24 +238,24 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">void</span> recordGsaContentRequest(DocId docId) {</pre></td></tr>
-<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">long</span> time = timeProvider.currentTimeMillis();</pre></td></tr>
-<tr> <td class="numLineCover"> 127</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
-<tr> <td class="numLineCover"> 128</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> increment(timesGsaRequested, docId);</pre></td></tr>
-<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> totalGsaRequests++;</pre></td></tr>
-<tr> <td class="numLineCover"> 130</td> <td class="nbHitsCovered"><a title="Line 130: Conditional coverage 100% (2/2)."> 92</a></td> <td class="src"><pre class="src"> <a title="Line 130: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Stats stats : timeStats) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 131</td> <td class="nbHitsCovered"> 69</td> <td class="src"><pre class="src"> Stat stat = stats.getCurrentStat(time);</pre></td></tr>
-<tr> <td class="numLineCover"> 132</td> <td class="nbHitsCovered"> 69</td> <td class="src"><pre class="src"> stat.gsaRetrievedDocument = <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">long</span> time = timeProvider.currentTimeMillis();</pre></td></tr>
+<tr> <td class="numLineCover"> 127</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
+<tr> <td class="numLineCover"> 128</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> increment(timesGsaRequested, docId);</pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> totalGsaRequests++;</pre></td></tr>
+<tr> <td class="numLineCover"> 130</td> <td class="nbHitsCovered"><a title="Line 130: Conditional coverage 100% (2/2)."> 96</a></td> <td class="src"><pre class="src"> <a title="Line 130: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Stats stats : timeStats) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 131</td> <td class="nbHitsCovered"> 72</td> <td class="src"><pre class="src"> Stat stat = stats.getCurrentStat(time);</pre></td></tr>
+<tr> <td class="numLineCover"> 132</td> <td class="nbHitsCovered"> 72</td> <td class="src"><pre class="src"> stat.gsaRetrievedDocument = <span class="keyword">true</span>;</pre></td></tr>
<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 134</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 135</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 134</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 135</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> recordNonGsaContentRequest(DocId requested) {</pre></td></tr>
-<tr> <td class="numLineCover"> 138</td> <td class="nbHitsCovered"> 44</td> <td class="src"><pre class="src"> increment(timesNonGsaRequested, requested); </pre></td></tr>
-<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 44</td> <td class="src"><pre class="src"> totalNonGsaRequests++;</pre></td></tr>
-<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 44</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 138</td> <td class="nbHitsCovered"> 45</td> <td class="src"><pre class="src"> increment(timesNonGsaRequested, requested); </pre></td></tr>
+<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 45</td> <td class="src"><pre class="src"> totalNonGsaRequests++;</pre></td></tr>
+<tr> <td class="numLineCover"> 140</td> <td class="nbHitsCovered"> 45</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
@@ -268,8 +268,8 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 146</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">void</span> recordRequestProcessingStart() {</pre></td></tr>
-<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> requestProcessingStart.set(timeProvider.currentTimeMillis());</pre></td></tr>
-<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> requestProcessingStart.set(timeProvider.currentTimeMillis());</pre></td></tr>
+<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
@@ -282,26 +282,26 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">void</span> recordRequestProcessingEnd(<span class="keyword">long</span> responseSize) {</pre></td></tr>
-<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 53</td> <td class="src"><pre class="src"> recordRequestProcessingEnd(responseSize, timeProvider.currentTimeMillis());</pre></td></tr>
-<tr> <td class="numLineCover"> 156</td> <td class="nbHitsCovered"> 52</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 54</td> <td class="src"><pre class="src"> recordRequestProcessingEnd(responseSize, timeProvider.currentTimeMillis());</pre></td></tr>
+<tr> <td class="numLineCover"> 156</td> <td class="nbHitsCovered"> 53</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> recordRequestProcessingEnd(<span class="keyword">long</span> responseSize, <span class="keyword">long</span> time) {</pre></td></tr>
-<tr> <td class="numLineCover"> 159</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> <span class="keyword">long</span> duration = endDuration(requestProcessingStart, time);</pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
-<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"><a title="Line 161: Conditional coverage 100% (2/2)."> 312</a></td> <td class="src"><pre class="src"> <a title="Line 161: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Stats stats : timeStats) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 234</td> <td class="src"><pre class="src"> Stat stat = stats.getCurrentStat(time);</pre></td></tr>
-<tr> <td class="numLineCover"> 163</td> <td class="nbHitsCovered"> 234</td> <td class="src"><pre class="src"> stat.requestProcessingsCount++;</pre></td></tr>
-<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 234</td> <td class="src"><pre class="src"> stat.requestProcessingsDurationSum += duration;</pre></td></tr>
-<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"> 234</td> <td class="src"><pre class="src"> stat.requestProcessingsMaxDuration = Math.max(</pre></td></tr>
+<tr> <td class="numLineCover"> 159</td> <td class="nbHitsCovered"> 80</td> <td class="src"><pre class="src"> <span class="keyword">long</span> duration = endDuration(requestProcessingStart, time);</pre></td></tr>
+<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (<span class="keyword">this</span>) {</pre></td></tr>
+<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"><a title="Line 161: Conditional coverage 100% (2/2)."> 316</a></td> <td class="src"><pre class="src"> <a title="Line 161: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Stats stats : timeStats) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 237</td> <td class="src"><pre class="src"> Stat stat = stats.getCurrentStat(time);</pre></td></tr>
+<tr> <td class="numLineCover"> 163</td> <td class="nbHitsCovered"> 237</td> <td class="src"><pre class="src"> stat.requestProcessingsCount++;</pre></td></tr>
+<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 237</td> <td class="src"><pre class="src"> stat.requestProcessingsDurationSum += duration;</pre></td></tr>
+<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"> 237</td> <td class="src"><pre class="src"> stat.requestProcessingsMaxDuration = Math.max(</pre></td></tr>
<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> stat.requestProcessingsMaxDuration, duration);</pre></td></tr>
-<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 234</td> <td class="src"><pre class="src"> stat.requestProcessingsThroughput += responseSize;</pre></td></tr>
+<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 237</td> <td class="src"><pre class="src"> stat.requestProcessingsThroughput += responseSize;</pre></td></tr>
<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
@@ -328,15 +328,15 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">long</span> endDuration(ThreadLocal<Long> localStartTime, <span class="keyword">long</span> endTime) {</pre></td></tr>
-<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> Long startTime = localStartTime.get();</pre></td></tr>
-<tr> <td class="numLineCover"> 189</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> localStartTime.remove();</pre></td></tr>
-<tr> <td class="numLineCover"> 190</td> <td class="nbHitsCovered"><a title="Line 190: Conditional coverage 100% (2/2)."> 79</a></td> <td class="src"><pre class="src"> <a title="Line 190: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (startTime == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 80</td> <td class="src"><pre class="src"> Long startTime = localStartTime.get();</pre></td></tr>
+<tr> <td class="numLineCover"> 189</td> <td class="nbHitsCovered"> 80</td> <td class="src"><pre class="src"> localStartTime.remove();</pre></td></tr>
+<tr> <td class="numLineCover"> 190</td> <td class="nbHitsCovered"><a title="Line 190: Conditional coverage 100% (2/2)."> 80</a></td> <td class="src"><pre class="src"> <a title="Line 190: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (startTime == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Record start must be called before "</span></pre></td></tr>
<tr> <td class="numLine"> 192</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">"record end"</span>);</pre></td></tr>
<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 194</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> <span class="keyword">return</span> endTime - startTime;</pre></td></tr>
+<tr> <td class="numLineCover"> 194</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> <span class="keyword">return</span> endTime - startTime;</pre></td></tr>
<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
@@ -351,12 +351,12 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">long</span> determineTimeResolution() {</pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">long</span> resolution = Long.MAX_VALUE;</pre></td></tr>
-<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"><a title="Line 203: Conditional coverage 100% (2/2)."> 1182</a></td> <td class="src"><pre class="src"> <a title="Line 203: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < 5; i++) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 985</td> <td class="src"><pre class="src"> resolution = Math.min(resolution, determineTimeResolutionOnce());</pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">long</span> resolution = Long.MAX_VALUE;</pre></td></tr>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"><a title="Line 203: Conditional coverage 100% (2/2)."> 1200</a></td> <td class="src"><pre class="src"> <a title="Line 203: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < 5; i++) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 1000</td> <td class="src"><pre class="src"> resolution = Math.min(resolution, determineTimeResolutionOnce());</pre></td></tr>
<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 197</td> <td class="src"><pre class="src"> <span class="keyword">return</span> resolution;</pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">return</span> resolution;</pre></td></tr>
<tr> <td class="numLine"> 207</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
@@ -371,27 +371,27 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">long</span> determineTimeResolutionOnce() {</pre></td></tr>
-<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 985</td> <td class="src"><pre class="src"> <span class="keyword">long</span> time = timeProvider.currentTimeMillis();</pre></td></tr>
-<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 985</td> <td class="src"><pre class="src"> <span class="keyword">long</span> startTime = time;</pre></td></tr>
-<tr> <td class="numLineCover"> 216</td> <td class="nbHitsCovered"><a title="Line 216: Conditional coverage 100% (2/2)."> 318745</a></td> <td class="src"><pre class="src"> <a title="Line 216: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (startTime == time) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 217</td> <td class="nbHitsCovered"> 317760</td> <td class="src"><pre class="src"> time = timeProvider.currentTimeMillis();</pre></td></tr>
+<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 1000</td> <td class="src"><pre class="src"> <span class="keyword">long</span> time = timeProvider.currentTimeMillis();</pre></td></tr>
+<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 1000</td> <td class="src"><pre class="src"> <span class="keyword">long</span> startTime = time;</pre></td></tr>
+<tr> <td class="numLineCover"> 216</td> <td class="nbHitsCovered"><a title="Line 216: Conditional coverage 100% (2/2)."> 403465</a></td> <td class="src"><pre class="src"> <a title="Line 216: Conditional coverage 100% (2/2)."> <span class="keyword">while</span> (startTime == time) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 217</td> <td class="nbHitsCovered"> 402465</td> <td class="src"><pre class="src"> time = timeProvider.currentTimeMillis();</pre></td></tr>
<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 985</td> <td class="src"><pre class="src"> <span class="keyword">return</span> time - startTime;</pre></td></tr>
+<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 1000</td> <td class="src"><pre class="src"> <span class="keyword">return</span> time - startTime;</pre></td></tr>
<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> increment(Map<DocId, Integer> counts, DocId id) {</pre></td></tr>
-<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"><a title="Line 223: Conditional coverage 100% (2/2)."> 84</a></td> <td class="src"><pre class="src"> <a title="Line 223: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!counts.containsKey(id)) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 224</td> <td class="nbHitsCovered"> 71</td> <td class="src"><pre class="src"> counts.put(id, 1);</pre></td></tr>
+<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"><a title="Line 223: Conditional coverage 100% (2/2)."> 86</a></td> <td class="src"><pre class="src"> <a title="Line 223: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!counts.containsKey(id)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 224</td> <td class="nbHitsCovered"> 73</td> <td class="src"><pre class="src"> counts.put(id, 1);</pre></td></tr>
<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
<tr> <td class="numLineCover"> 226</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> counts.put(id, 1 + counts.get(id));</pre></td></tr>
<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 228</td> <td class="nbHitsCovered"> 84</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 228</td> <td class="nbHitsCovered"> 86</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
@@ -402,12 +402,12 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">synchronized</span> <span class="keyword">void</span> recordFullPushStarted() {</pre></td></tr>
-<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"><a title="Line 234: Conditional coverage 100% (2/2)."> 13</a></td> <td class="src"><pre class="src"> <a title="Line 234: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (currentFullPushStart != 0) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"><a title="Line 234: Conditional coverage 100% (2/2)."> 22</a></td> <td class="src"><pre class="src"> <a title="Line 234: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (currentFullPushStart != 0) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 235</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Full push already started"</span>);</pre></td></tr>
<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 237</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> currentFullPushStart = timeProvider.currentTimeMillis();</pre></td></tr>
-<tr> <td class="numLineCover"> 238</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 237</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> currentFullPushStart = timeProvider.currentTimeMillis();</pre></td></tr>
+<tr> <td class="numLineCover"> 238</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
@@ -738,26 +738,26 @@
<td class="src"><pre class="src"> <span class="keyword">long</span> pendingStatPeriodEnd;</pre></td></tr>
<tr> <td class="numLine"> 450</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 451</td> <td class="nbHitsCovered"> 592</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Stats(<span class="keyword">int</span> statCount, <span class="keyword">long</span> snapshotDuration, <span class="keyword">long</span> currentTime) {</pre></td></tr>
-<tr> <td class="numLineCover"> 452</td> <td class="nbHitsCovered"> 592</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.snapshotDurationMs = snapshotDuration;</pre></td></tr>
+<tr> <td class="numLineCover"> 451</td> <td class="nbHitsCovered"> 601</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Stats(<span class="keyword">int</span> statCount, <span class="keyword">long</span> snapshotDuration, <span class="keyword">long</span> currentTime) {</pre></td></tr>
+<tr> <td class="numLineCover"> 452</td> <td class="nbHitsCovered"> 601</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.snapshotDurationMs = snapshotDuration;</pre></td></tr>
<tr> <td class="numLine"> 453</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 454</td> <td class="nbHitsCovered"> 592</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.stats = <span class="keyword">new</span> Stat[statCount];</pre></td></tr>
+<tr> <td class="numLineCover"> 454</td> <td class="nbHitsCovered"> 601</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.stats = <span class="keyword">new</span> Stat[statCount];</pre></td></tr>
<tr> <td class="numLine"> 455</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Pre-allocate all Stat objects</span></pre></td></tr>
-<tr> <td class="numLineCover"> 456</td> <td class="nbHitsCovered"><a title="Line 456: Conditional coverage 100% (2/2)."> 33690</a></td> <td class="src"><pre class="src"> <a title="Line 456: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < <span class="keyword">this</span>.stats.length; i++) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 457</td> <td class="nbHitsCovered"> 33098</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.stats[i] = <span class="keyword">new</span> Stat();</pre></td></tr>
+<tr> <td class="numLineCover"> 456</td> <td class="nbHitsCovered"><a title="Line 456: Conditional coverage 100% (2/2)."> 34203</a></td> <td class="src"><pre class="src"> <a title="Line 456: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < <span class="keyword">this</span>.stats.length; i++) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 457</td> <td class="nbHitsCovered"> 33602</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.stats[i] = <span class="keyword">new</span> Stat();</pre></td></tr>
<tr> <td class="numLine"> 458</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 459</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 460</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Initialize expiration times for pendingStat objects</span></pre></td></tr>
-<tr> <td class="numLineCover"> 461</td> <td class="nbHitsCovered"> 592</td> <td class="src"><pre class="src"> <span class="keyword">long</span> duration = <span class="keyword">this</span>.snapshotDurationMs;</pre></td></tr>
-<tr> <td class="numLineCover"> 462</td> <td class="nbHitsCovered"> 592</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.pendingStatPeriodEnd = ((currentTime / duration) * duration)</pre></td></tr>
+<tr> <td class="numLineCover"> 461</td> <td class="nbHitsCovered"> 601</td> <td class="src"><pre class="src"> <span class="keyword">long</span> duration = <span class="keyword">this</span>.snapshotDurationMs;</pre></td></tr>
+<tr> <td class="numLineCover"> 462</td> <td class="nbHitsCovered"> 601</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.pendingStatPeriodEnd = ((currentTime / duration) * duration)</pre></td></tr>
<tr> <td class="numLine"> 463</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + duration;</pre></td></tr>
-<tr> <td class="numLineCover"> 464</td> <td class="nbHitsCovered"> 592</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 464</td> <td class="nbHitsCovered"> 601</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 465</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 466</td> <td class="nbHits"> </td>
@@ -776,8 +776,8 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> Stat getCurrentStat(<span class="keyword">long</span> currentTime) {</pre></td></tr>
<tr> <td class="numLine"> 473</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Check if the current Stat object is still valid to write to</span></pre></td></tr>
-<tr> <td class="numLineCover"> 474</td> <td class="nbHitsCovered"><a title="Line 474: Conditional coverage 100% (2/2)."> 462</a></td> <td class="src"><pre class="src"> <a title="Line 474: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (pendingStatPeriodEnd > currentTime) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 475</td> <td class="nbHitsCovered"> 447</td> <td class="src"><pre class="src"> <span class="keyword">return</span> stats[currentStat];</pre></td></tr>
+<tr> <td class="numLineCover"> 474</td> <td class="nbHitsCovered"><a title="Line 474: Conditional coverage 100% (2/2)."> 468</a></td> <td class="src"><pre class="src"> <a title="Line 474: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (pendingStatPeriodEnd > currentTime) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 475</td> <td class="nbHitsCovered"> 453</td> <td class="src"><pre class="src"> <span class="keyword">return</span> stats[currentStat];</pre></td></tr>
<tr> <td class="numLine"> 476</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 477</td> <td class="nbHits"> </td>
@@ -890,9 +890,9 @@
<td class="src"><pre class="src"> <span class="keyword">boolean</span> gsaRetrievedDocument;</pre></td></tr>
<tr> <td class="numLine"> 541</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 542</td> <td class="nbHitsCovered"> 33098</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Stat() {</pre></td></tr>
-<tr> <td class="numLineCover"> 543</td> <td class="nbHitsCovered"> 33098</td> <td class="src"><pre class="src"> reset();</pre></td></tr>
-<tr> <td class="numLineCover"> 544</td> <td class="nbHitsCovered"> 33098</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 542</td> <td class="nbHitsCovered"> 33602</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Stat() {</pre></td></tr>
+<tr> <td class="numLineCover"> 543</td> <td class="nbHitsCovered"> 33602</td> <td class="src"><pre class="src"> reset();</pre></td></tr>
+<tr> <td class="numLineCover"> 544</td> <td class="nbHitsCovered"> 33602</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 545</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 546</td> <td class="nbHits"> </td>
@@ -903,13 +903,13 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 549</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> reset() {</pre></td></tr>
-<tr> <td class="numLineCover"> 550</td> <td class="nbHitsCovered"> 33682</td> <td class="src"><pre class="src"> requestProcessingsCount = 0;</pre></td></tr>
-<tr> <td class="numLineCover"> 551</td> <td class="nbHitsCovered"> 33682</td> <td class="src"><pre class="src"> requestProcessingsFailureCount = 0;</pre></td></tr>
-<tr> <td class="numLineCover"> 552</td> <td class="nbHitsCovered"> 33682</td> <td class="src"><pre class="src"> requestProcessingsDurationSum = 0;</pre></td></tr>
-<tr> <td class="numLineCover"> 553</td> <td class="nbHitsCovered"> 33682</td> <td class="src"><pre class="src"> requestProcessingsMaxDuration = 0;</pre></td></tr>
-<tr> <td class="numLineCover"> 554</td> <td class="nbHitsCovered"> 33682</td> <td class="src"><pre class="src"> requestProcessingsThroughput = 0;</pre></td></tr>
-<tr> <td class="numLineCover"> 555</td> <td class="nbHitsCovered"> 33682</td> <td class="src"><pre class="src"> gsaRetrievedDocument = <span class="keyword">false</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 556</td> <td class="nbHitsCovered"> 33682</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 550</td> <td class="nbHitsCovered"> 34186</td> <td class="src"><pre class="src"> requestProcessingsCount = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 551</td> <td class="nbHitsCovered"> 34186</td> <td class="src"><pre class="src"> requestProcessingsFailureCount = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 552</td> <td class="nbHitsCovered"> 34186</td> <td class="src"><pre class="src"> requestProcessingsDurationSum = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 553</td> <td class="nbHitsCovered"> 34186</td> <td class="src"><pre class="src"> requestProcessingsMaxDuration = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 554</td> <td class="nbHitsCovered"> 34186</td> <td class="src"><pre class="src"> requestProcessingsThroughput = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 555</td> <td class="nbHitsCovered"> 34186</td> <td class="src"><pre class="src"> gsaRetrievedDocument = <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 556</td> <td class="nbHitsCovered"> 34186</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 557</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 558</td> <td class="nbHits"> </td>
@@ -927,7 +927,7 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 566</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 567</td> <td class="nbHitsCovered"> 174</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> NegSizeFakeMap<K, V> <span class="keyword">extends</span> FakeMap<K, V> {</pre></td></tr>
+<tr> <td class="numLineCover"> 567</td> <td class="nbHitsCovered"> 198</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> NegSizeFakeMap<K, V> <span class="keyword">extends</span> FakeMap<K, V> {</pre></td></tr>
<tr> <td class="numLine"> 568</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 569</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.LoggingFilter.html b/coverage/com.google.enterprise.adaptor.LoggingFilter.html
index 866b993..8145f40 100644
--- a/coverage/com.google.enterprise.adaptor.LoggingFilter.html
+++ b/coverage/com.google.enterprise.adaptor.LoggingFilter.html
@@ -73,7 +73,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Filter that logs requests and responses. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">class</span> LoggingFilter <span class="keyword">extends</span> Filter {</pre></td></tr>
+<tr> <td class="numLineCover"> 29</td> <td class="nbHitsCovered"> 36</td> <td class="src"><pre class="src"> <span class="keyword">class</span> LoggingFilter <span class="keyword">extends</span> Filter {</pre></td></tr>
<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger log</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Logger.getLogger(LoggingFilter.<span class="keyword">class</span>.getName());</pre></td></tr>
@@ -94,12 +94,12 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> doFilter(HttpExchange ex, Filter.Chain chain) <span class="keyword">throws</span> IOException {</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.fine(<span class="string">"beginning"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> logRequest(ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Processing context for request is {0}"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> log.fine(<span class="string">"beginning"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> logRequest(ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Processing context for request is {0}"</span>,</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> ex.getHttpContext().getHandler().getClass().getName());</pre></td></tr>
-<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> chain.doFilter(ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> chain.doFilter(ex);</pre></td></tr>
<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (RuntimeException e) {</pre></td></tr>
<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Unexpected exception during request"</span>, e);</pre></td></tr>
<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> e;</pre></td></tr>
@@ -108,15 +108,15 @@
<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> e;</pre></td></tr>
<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> logResponse(ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.fine(<span class="string">"ending"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> logResponse(ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> log.fine(<span class="string">"ending"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> logRequest(HttpExchange ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsUncovered"><a title="Line 59: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 59: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (log.isLoggable(Level.FINER)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsUncovered"><a title="Line 59: Conditional coverage 50% (1/2)."> 5</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 59: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (log.isLoggable(Level.FINER)) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 60</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.FINER, <span class="string">"Received {1} request to {0}. Headers: '{'{2}'}'"</span>,</span></pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {ex.getRequestURI(), ex.getRequestMethod(),</pre></td></tr>
@@ -124,12 +124,12 @@
<td class="src"><pre class="src"> getLoggableHeaders(ex.getRequestHeaders())});</pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> logResponse(HttpExchange ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 67</td> <td class="nbHitsUncovered"><a title="Line 67: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 67: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (log.isLoggable(Level.FINER)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 67</td> <td class="nbHitsUncovered"><a title="Line 67: Conditional coverage 50% (1/2)."> 5</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 67: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (log.isLoggable(Level.FINER)) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 68</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.FINER, <span class="string">"Responded to {1} request {0}. Headers: '{'{2}'}'"</span>,</span></pre></td></tr>
<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {ex.getRequestURI(), ex.getRequestMethod(),</pre></td></tr>
@@ -137,7 +137,7 @@
<td class="src"><pre class="src"> getLoggableHeaders(ex.getResponseHeaders())});</pre></td></tr>
<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 73</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 74</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.Metadata.html b/coverage/com.google.enterprise.adaptor.Metadata.html
index 5545508..58cd671 100644
--- a/coverage/com.google.enterprise.adaptor.Metadata.html
+++ b/coverage/com.google.enterprise.adaptor.Metadata.html
@@ -92,16 +92,16 @@
<td class="src"><pre class="src"> <span class="comment"> * This class is mutable and not thread-safe.</span></pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 69</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> Metadata <span class="keyword">implements</span> Iterable<Entry<String, String>> {</pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 188</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Map<String, Set<String>> mappings </pre></td></tr>
+<tr> <td class="numLineCover"> 37</td> <td class="nbHitsCovered"> 70</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> Metadata <span class="keyword">implements</span> Iterable<Entry<String, String>> {</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 175</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Map<String, Set<String>> mappings </pre></td></tr>
<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> TreeMap<String, Set<String>>();</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Create empty instance. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 156</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Metadata() {</pre></td></tr>
-<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 156</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 143</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Metadata() {</pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsCovered"> 143</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
@@ -264,20 +264,20 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Iterator<Entry<String, String>> iterator() {</pre></td></tr>
-<tr> <td class="numLineCover"> 150</td> <td class="nbHitsCovered"> 69</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> EntriesIterator();</pre></td></tr>
+<tr> <td class="numLineCover"> 150</td> <td class="nbHitsCovered"> 70</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> EntriesIterator();</pre></td></tr>
<tr> <td class="numLine"> 151</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 153</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Loops through keys and for each key all values. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 154</td> <td class="nbHitsCovered"> 198</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> EntriesIterator <span class="keyword">implements</span> Iterator<Entry<String, String>> {</pre></td></tr>
-<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 69</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Iterator<Entry<String, Set<String>>> byKey</pre></td></tr>
+<tr> <td class="numLineCover"> 154</td> <td class="nbHitsCovered"> 200</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> EntriesIterator <span class="keyword">implements</span> Iterator<Entry<String, String>> {</pre></td></tr>
+<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 70</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Iterator<Entry<String, Set<String>>> byKey</pre></td></tr>
<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = mappings.entrySet().iterator();</pre></td></tr>
<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> String currentKey;</pre></td></tr>
-<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 69</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Iterator<String> currentValues</pre></td></tr>
+<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 70</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Iterator<String> currentValues</pre></td></tr>
<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Collections.<String>emptyList().iterator();</pre></td></tr>
<tr> <td class="numLine"> 160</td> <td class="nbHits"> </td>
@@ -286,12 +286,12 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> hasNext() {</pre></td></tr>
-<tr> <td class="numLineCover"> 163</td> <td class="nbHitsCovered"><a title="Line 163: Conditional coverage 100% (2/2)."> 235</a></td> <td class="src"><pre class="src"> <a title="Line 163: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (currentValues.hasNext()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 163</td> <td class="nbHitsCovered"><a title="Line 163: Conditional coverage 100% (2/2)."> 236</a></td> <td class="src"><pre class="src"> <a title="Line 163: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (currentValues.hasNext()) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 112</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"><a title="Line 166: Conditional coverage 100% (2/2)."> 123</a></td> <td class="src"><pre class="src"> <a title="Line 166: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!byKey.hasNext()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 68</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"><a title="Line 166: Conditional coverage 100% (2/2)."> 124</a></td> <td class="src"><pre class="src"> <a title="Line 166: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!byKey.hasNext()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 69</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 55</td> <td class="src"><pre class="src"> Entry<String, Set<String>> currentEntry = byKey.next();</pre></td></tr>
diff --git a/coverage/com.google.enterprise.adaptor.OneAtATimeRunnable.html b/coverage/com.google.enterprise.adaptor.OneAtATimeRunnable.html
index 32a0040..e15214f 100644
--- a/coverage/com.google.enterprise.adaptor.OneAtATimeRunnable.html
+++ b/coverage/com.google.enterprise.adaptor.OneAtATimeRunnable.html
@@ -99,7 +99,7 @@
<td class="src"><pre class="src"> <span class="comment"> * running.</span></pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">private</span> AtomicReference<Thread> runningThread = <span class="keyword">new</span> AtomicReference<Thread>();</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 37</td> <td class="src"><pre class="src"> <span class="keyword">private</span> AtomicReference<Thread> runningThread = <span class="keyword">new</span> AtomicReference<Thread>();</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Runnable runnable;</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
@@ -118,42 +118,42 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> OneAtATimeRunnable(Runnable runnable,</pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> Runnable alreadyRunningRunnable) {</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"><a title="Line 53: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 33</a></td> <td class="src"><pre class="src"> <a title="Line 53: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (runnable == <span class="keyword">null</span> || alreadyRunningRunnable == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 37</td> <td class="src"><pre class="src"> Runnable alreadyRunningRunnable) {</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"><a title="Line 53: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 37</a></td> <td class="src"><pre class="src"> <a title="Line 53: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (runnable == <span class="keyword">null</span> || alreadyRunningRunnable == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.runnable = runnable;</pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.alreadyRunningRunnable = alreadyRunningRunnable;</pre></td></tr>
-<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 31</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.runnable = runnable;</pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.alreadyRunningRunnable = alreadyRunningRunnable;</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> Thread thisThread = Thread.currentThread();</pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> success = runningThread.compareAndSet(<span class="keyword">null</span>, thisThread);</pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"><a title="Line 64: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 64: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!success) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> Thread thisThread = Thread.currentThread();</pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> success = runningThread.compareAndSet(<span class="keyword">null</span>, thisThread);</pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"><a title="Line 64: Conditional coverage 100% (2/2)."> 15</a></td> <td class="src"><pre class="src"> <a title="Line 64: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!success) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> alreadyRunningRunnable.run();</pre></td></tr>
<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> runnable.run();</pre></td></tr>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> runnable.run();</pre></td></tr>
<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> runningThread.compareAndSet(thisThread, <span class="keyword">null</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> runningThread.compareAndSet(thisThread, <span class="keyword">null</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 74</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** {@code true} if the runnable is currently running. */</span></pre></td></tr>
<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isRunning() {</pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"><a title="Line 77: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 77: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> runningThread.get() != <span class="keyword">null</span>;</a></pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"><a title="Line 77: Conditional coverage 100% (2/2)."> 12</a></td> <td class="src"><pre class="src"> <a title="Line 77: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> runningThread.get() != <span class="keyword">null</span>;</a></pre></td></tr>
<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.Principal.html b/coverage/com.google.enterprise.adaptor.Principal.html
index 521f760..d26f9b9 100644
--- a/coverage/com.google.enterprise.adaptor.Principal.html
+++ b/coverage/com.google.enterprise.adaptor.Principal.html
@@ -59,7 +59,7 @@
<td class="src"><pre class="src"> <span class="comment"> * Represents either a user or a group.</span></pre></td></tr>
<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 466</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> Principal <span class="keyword">implements</span> Comparable<Principal> {</pre></td></tr>
+<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 467</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> Principal <span class="keyword">implements</span> Comparable<Principal> {</pre></td></tr>
<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> String DEFAULT_NAMESPACE = <span class="string">"Default"</span>;</pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
@@ -110,7 +110,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isUser() {</pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 1781</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">this</span> <span class="keyword">instanceof</span> UserPrincipal;</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 1805</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">this</span> <span class="keyword">instanceof</span> UserPrincipal;</pre></td></tr>
<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
@@ -168,24 +168,24 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> compareTo(Principal other) {</pre></td></tr>
-<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 466</td> <td class="src"><pre class="src"> <span class="keyword">int</span> spacecmp = namespace.compareTo(other.namespace);</pre></td></tr>
-<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"><a title="Line 90: Conditional coverage 100% (2/2)."> 466</a></td> <td class="src"><pre class="src"> <a title="Line 90: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (0 != spacecmp) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 63</td> <td class="src"><pre class="src"> <span class="keyword">return</span> spacecmp;</pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 467</td> <td class="src"><pre class="src"> <span class="keyword">int</span> spacecmp = namespace.compareTo(other.namespace);</pre></td></tr>
+<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"><a title="Line 90: Conditional coverage 100% (2/2)."> 467</a></td> <td class="src"><pre class="src"> <a title="Line 90: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (0 != spacecmp) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 53</td> <td class="src"><pre class="src"> <span class="keyword">return</span> spacecmp;</pre></td></tr>
<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// OK, same namespace</span></pre></td></tr>
<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"><a title="Line 95: Conditional coverage 100% (2/2)."> 403</a></td> <td class="src"><pre class="src"> <a title="Line 95: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (isUser() != other.isUser()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 96</td> <td class="nbHitsCovered"><a title="Line 96: Conditional coverage 100% (2/2)."> 33</a></td> <td class="src"><pre class="src"> <a title="Line 96: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> isUser() ? -1 : 1;</a></pre></td></tr>
+<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"><a title="Line 95: Conditional coverage 100% (2/2)."> 414</a></td> <td class="src"><pre class="src"> <a title="Line 95: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (isUser() != other.isUser()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 96</td> <td class="nbHitsCovered"><a title="Line 96: Conditional coverage 100% (2/2)."> 35</a></td> <td class="src"><pre class="src"> <a title="Line 96: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> isUser() ? -1 : 1;</a></pre></td></tr>
<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// OK, same namespace and same type</span></pre></td></tr>
<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 370</td> <td class="src"><pre class="src"> <span class="keyword">return</span> name.compareTo(other.name);</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 379</td> <td class="src"><pre class="src"> <span class="keyword">return</span> name.compareTo(other.name);</pre></td></tr>
<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.RedirectHandler.html b/coverage/com.google.enterprise.adaptor.RedirectHandler.html
index bd9bdc0..ce71022 100644
--- a/coverage/com.google.enterprise.adaptor.RedirectHandler.html
+++ b/coverage/com.google.enterprise.adaptor.RedirectHandler.html
@@ -83,9 +83,9 @@
<td class="src"><pre class="src"> <span class="comment"> * @param redirectPath relative or absolute path to redirect clients to</span></pre></td></tr>
<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">public</span> RedirectHandler(String redirectPath) {</pre></td></tr>
-<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.redirectPath = redirectPath;</pre></td></tr>
-<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> RedirectHandler(String redirectPath) {</pre></td></tr>
+<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.redirectPath = redirectPath;</pre></td></tr>
+<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.RpcHandler.html b/coverage/com.google.enterprise.adaptor.RpcHandler.html
index 994a7ca..c658b9f 100644
--- a/coverage/com.google.enterprise.adaptor.RpcHandler.html
+++ b/coverage/com.google.enterprise.adaptor.RpcHandler.html
@@ -97,17 +97,17 @@
<td class="src"><pre class="src"> = Logger.getLogger(RpcHandler.<span class="keyword">class</span>.getName());</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Charset charset = Charset.forName(<span class="string">"UTF-8"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Map<String, RpcMethod> methods</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Charset charset = Charset.forName(<span class="string">"UTF-8"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Map<String, RpcMethod> methods</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = <span class="keyword">new</span> HashMap<String, RpcMethod>();</pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> SessionManager<HttpExchange> sessionManager;</pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">public</span> RpcHandler(SessionManager<HttpExchange> sessionManager) {</pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sessionManager = sessionManager;</pre></td></tr>
-<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">public</span> RpcHandler(SessionManager<HttpExchange> sessionManager) {</pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sessionManager = sessionManager;</pre></td></tr>
+<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
@@ -122,14 +122,14 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> registerRpcMethod(String name, RpcMethod method) {</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"><a title="Line 56: Conditional coverage 100% (2/2)."> 87</a></td> <td class="src"><pre class="src"> <a title="Line 56: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (methods.containsKey(name)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"><a title="Line 56: Conditional coverage 100% (2/2)."> 95</a></td> <td class="src"><pre class="src"> <a title="Line 56: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (methods.containsKey(name)) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"Method by that name already registered"</span>);</pre></td></tr>
<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 86</td> <td class="src"><pre class="src"> methods.put(name, method);</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 86</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 94</td> <td class="src"><pre class="src"> methods.put(name, method);</pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 94</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.SamlMetadata.html b/coverage/com.google.enterprise.adaptor.SamlMetadata.html
index 3b22643..54d70b7 100644
--- a/coverage/com.google.enterprise.adaptor.SamlMetadata.html
+++ b/coverage/com.google.enterprise.adaptor.SamlMetadata.html
@@ -97,163 +97,161 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> EntityDescriptor localEntity;</pre></td></tr>
<tr> <td class="numLine"> 40</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> EntityDescriptor peerEntity;</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> XMLObjectBuilderFactory objectBuilderFactory =</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> XMLObjectBuilderFactory objectBuilderFactory =</pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Configuration.getBuilderFactory();</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">public</span> SamlMetadata(String hostname, <span class="keyword">int</span> port, String gsaHostname) {</pre></td></tr>
-<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> localEntity = createLocalEntity(hostname, port);</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> peerEntity = createPeerEntity(gsaHostname);</pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> SamlMetadata(String hostname, <span class="keyword">int</span> port, String gsaHostname,</pre></td></tr>
+<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> String gsaEntityId, String adaptorEntityId) {</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> localEntity = createLocalEntity(hostname, port, adaptorEntityId);</pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> peerEntity = createPeerEntity(gsaHostname, gsaEntityId);</pre></td></tr>
+<tr> <td class="numLineCover"> 48</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> EntityDescriptor createLocalEntity(String hostname, <span class="keyword">int</span> port) {</pre></td></tr>
-<tr> <td class="numLineCover"> 50</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> EntityDescriptor ed = makeSamlObject(EntityDescriptor.DEFAULT_ELEMENT_NAME);</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> EntityDescriptor createLocalEntity(String hostname, <span class="keyword">int</span> port,</pre></td></tr>
<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// TODO(ejona): It may be useful to make this instance-specific.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ed.setEntityID(<span class="string">"http://google.com/enterprise/gsa/adaptor"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String adaptorEntityId) {</pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> EntityDescriptor ed = makeSamlObject(EntityDescriptor.DEFAULT_ELEMENT_NAME);</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ed.setEntityID(adaptorEntityId);</pre></td></tr>
+<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> SPSSODescriptor spsso = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> SPSSODescriptor spsso = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> SPSSODescriptor.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ed.getRoleDescriptors().add(spsso);</pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> spsso.addSupportedProtocol(SAMLConstants.SAML20P_NS);</pre></td></tr>
-<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ed.getRoleDescriptors().add(spsso);</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> spsso.addSupportedProtocol(SAMLConstants.SAML20P_NS);</pre></td></tr>
+<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> AssertionConsumerService acs = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> AssertionConsumerService acs = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> AssertionConsumerService.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> spsso.getAssertionConsumerServices().add(acs);</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> acs.setBinding(SAMLConstants.SAML2_ARTIFACT_BINDING_URI);</pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> acs.setLocation(</pre></td></tr>
-<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"https://"</span> + hostname + <span class="string">":"</span> + port + <span class="string">"/samlassertionconsumer"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> spsso.getAssertionConsumerServices().add(acs);</pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> acs.setBinding(SAMLConstants.SAML2_ARTIFACT_BINDING_URI);</pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> acs.setLocation(</pre></td></tr>
<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"https://"</span> + hostname + <span class="string">":"</span> + port + <span class="string">"/samlassertionconsumer"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> IDPSSODescriptor idpsso = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> IDPSSODescriptor idpsso = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> IDPSSODescriptor.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ed.getRoleDescriptors().add(idpsso);</pre></td></tr>
-<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> idpsso.addSupportedProtocol(SAMLConstants.SAML20P_NS);</pre></td></tr>
-<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ed.getRoleDescriptors().add(idpsso);</pre></td></tr>
+<tr> <td class="numLineCover"> 70</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> idpsso.addSupportedProtocol(SAMLConstants.SAML20P_NS);</pre></td></tr>
+<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> SingleSignOnService ssos = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> SingleSignOnService ssos = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 73</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> SingleSignOnService.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> idpsso.getSingleSignOnServices().add(ssos);</pre></td></tr>
-<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ssos.setBinding(SAMLConstants.SAML2_REDIRECT_BINDING_URI);</pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ssos.setLocation(<span class="string">"https://"</span> + hostname + <span class="string">":"</span> + port + <span class="string">"/samlip"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> idpsso.getSingleSignOnServices().add(ssos);</pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ssos.setBinding(SAMLConstants.SAML2_REDIRECT_BINDING_URI);</pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ssos.setLocation(<span class="string">"https://"</span> + hostname + <span class="string">":"</span> + port + <span class="string">"/samlip"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ed;</pre></td></tr>
-<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ed;</pre></td></tr>
<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> EntityDescriptor createPeerEntity(String gsaHostname) {</pre></td></tr>
-<tr> <td class="numLineCover"> 81</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> EntityDescriptor ed = makeSamlObject(EntityDescriptor.DEFAULT_ELEMENT_NAME);</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> EntityDescriptor createPeerEntity(String gsaHostname,</pre></td></tr>
<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// This entity-id is in the form of the GSA's real id, but is just a filler,</span></pre></td></tr>
-<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// and should not be used for any verification.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ed.setEntityID(</pre></td></tr>
+ <td class="src"><pre class="src"> String gsaEntityId) {</pre></td></tr>
+<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> EntityDescriptor ed = makeSamlObject(EntityDescriptor.DEFAULT_ELEMENT_NAME);</pre></td></tr>
+<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ed.setEntityID(gsaEntityId);</pre></td></tr>
<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"http://google.com/enterprise/gsa/security-manager"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> IDPSSODescriptor idpsso = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> IDPSSODescriptor idpsso = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> IDPSSODescriptor.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ed.getRoleDescriptors().add(idpsso);</pre></td></tr>
-<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> idpsso.addSupportedProtocol(SAMLConstants.SAML20P_NS);</pre></td></tr>
-<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ed.getRoleDescriptors().add(idpsso);</pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> idpsso.addSupportedProtocol(SAMLConstants.SAML20P_NS);</pre></td></tr>
+<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 92</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> SingleSignOnService ssos = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> SingleSignOnService ssos = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> SingleSignOnService.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 94</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> idpsso.getSingleSignOnServices().add(ssos);</pre></td></tr>
-<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ssos.setBinding(SAMLConstants.SAML2_REDIRECT_BINDING_URI);</pre></td></tr>
-<tr> <td class="numLineCover"> 96</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ssos.setLocation(<span class="string">"https://"</span> + gsaHostname + <span class="string">"/security-manager/samlauthn"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 93</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> idpsso.getSingleSignOnServices().add(ssos);</pre></td></tr>
+<tr> <td class="numLineCover"> 94</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ssos.setBinding(SAMLConstants.SAML2_REDIRECT_BINDING_URI);</pre></td></tr>
+<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ssos.setLocation(<span class="string">"https://"</span> + gsaHostname + <span class="string">"/security-manager/samlauthn"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ArtifactResolutionService ars = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ArtifactResolutionService ars = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> ArtifactResolutionService.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> idpsso.getArtifactResolutionServices().add(ars);</pre></td></tr>
-<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ars.setBinding(SAMLConstants.SAML2_SOAP11_BINDING_URI);</pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ars.setLocation(</pre></td></tr>
-<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 99</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> idpsso.getArtifactResolutionServices().add(ars);</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ars.setBinding(SAMLConstants.SAML2_SOAP11_BINDING_URI);</pre></td></tr>
+<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ars.setLocation(</pre></td></tr>
+<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"https://"</span> + gsaHostname + <span class="string">"/security-manager/samlartifact"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 105</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> SPSSODescriptor spsso = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> SPSSODescriptor spsso = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> SPSSODescriptor.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 107</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> ed.getRoleDescriptors().add(spsso);</pre></td></tr>
-<tr> <td class="numLineCover"> 108</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> idpsso.addSupportedProtocol(SAMLConstants.SAML20P_NS);</pre></td></tr>
+<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> ed.getRoleDescriptors().add(spsso);</pre></td></tr>
+<tr> <td class="numLineCover"> 107</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> idpsso.addSupportedProtocol(SAMLConstants.SAML20P_NS);</pre></td></tr>
+<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// TODO(ejona): Loop through all full access hosts.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 111</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> AssertionConsumerService acs = makeSamlObject(</pre></td></tr>
-<tr> <td class="numLine"> 112</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 110</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> AssertionConsumerService acs = makeSamlObject(</pre></td></tr>
+<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> AssertionConsumerService.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 113</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> spsso.getAssertionConsumerServices().add(acs);</pre></td></tr>
-<tr> <td class="numLineCover"> 114</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> acs.setBinding(SAMLConstants.SAML2_ARTIFACT_BINDING_URI);</pre></td></tr>
-<tr> <td class="numLineCover"> 115</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> acs.setLocation(</pre></td></tr>
+<tr> <td class="numLineCover"> 112</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> spsso.getAssertionConsumerServices().add(acs);</pre></td></tr>
+<tr> <td class="numLineCover"> 113</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> acs.setBinding(SAMLConstants.SAML2_ARTIFACT_BINDING_URI);</pre></td></tr>
+<tr> <td class="numLineCover"> 114</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> acs.setLocation(</pre></td></tr>
+<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"https://"</span> + gsaHostname + <span class="string">"/security-manager/samlassertionconsumer"</span>);</pre></td></tr>
<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"https://"</span> + gsaHostname + <span class="string">"/security-manager/samlassertionconsumer"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> acs = makeSamlObject(AssertionConsumerService.DEFAULT_ELEMENT_NAME);</pre></td></tr>
-<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> spsso.getAssertionConsumerServices().add(acs);</pre></td></tr>
-<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> acs.setBinding(SAMLConstants.SAML2_POST_BINDING_URI);</pre></td></tr>
-<tr> <td class="numLineCover"> 121</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> acs.setLocation(</pre></td></tr>
+<tr> <td class="numLineCover"> 117</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> acs = makeSamlObject(AssertionConsumerService.DEFAULT_ELEMENT_NAME);</pre></td></tr>
+<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> spsso.getAssertionConsumerServices().add(acs);</pre></td></tr>
+<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> acs.setBinding(SAMLConstants.SAML2_POST_BINDING_URI);</pre></td></tr>
+<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> acs.setLocation(</pre></td></tr>
+<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"https://"</span> + gsaHostname + <span class="string">"/security-manager/samlassertionconsumer"</span>);</pre></td></tr>
<tr> <td class="numLine"> 122</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="string">"https://"</span> + gsaHostname + <span class="string">"/security-manager/samlassertionconsumer"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ed;</pre></td></tr>
+<tr> <td class="numLineCover"> 123</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ed;</pre></td></tr>
+<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 126</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @SuppressWarnings(<span class="string">"unchecked"</span>)</pre></td></tr>
-<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <T <span class="keyword">extends</span> SAMLObject> SAMLObjectBuilder<T> makeSamlObjectBuilder(</pre></td></tr>
-<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> QName name) {</pre></td></tr>
-<tr> <td class="numLineCover"> 130</td> <td class="nbHitsCovered"> 504</td> <td class="src"><pre class="src"> <span class="keyword">return</span> (SAMLObjectBuilder<T>) objectBuilderFactory.getBuilder(name);</pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 456</td> <td class="src"><pre class="src"> <span class="keyword">return</span> (SAMLObjectBuilder<T>) objectBuilderFactory.getBuilder(name);</pre></td></tr>
+<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <T <span class="keyword">extends</span> SAMLObject> T makeSamlObject(QName name) {</pre></td></tr>
-<tr> <td class="numLineCover"> 134</td> <td class="nbHitsCovered"> 504</td> <td class="src"><pre class="src"> SAMLObjectBuilder<T> builder = makeSamlObjectBuilder(name);</pre></td></tr>
-<tr> <td class="numLineCover"> 135</td> <td class="nbHitsCovered"> 504</td> <td class="src"><pre class="src"> <span class="keyword">return</span> builder.buildObject();</pre></td></tr>
+<tr> <td class="numLineCover"> 133</td> <td class="nbHitsCovered"> 456</td> <td class="src"><pre class="src"> SAMLObjectBuilder<T> builder = makeSamlObjectBuilder(name);</pre></td></tr>
+<tr> <td class="numLineCover"> 134</td> <td class="nbHitsCovered"> 456</td> <td class="src"><pre class="src"> <span class="keyword">return</span> builder.buildObject();</pre></td></tr>
+<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 138</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> EntityDescriptor getLocalEntity() {</pre></td></tr>
-<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">return</span> localEntity;</pre></td></tr>
+<tr> <td class="numLineCover"> 138</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> <span class="keyword">return</span> localEntity;</pre></td></tr>
+<tr> <td class="numLine"> 139</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> EntityDescriptor getPeerEntity() {</pre></td></tr>
-<tr> <td class="numLineCover"> 143</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">return</span> peerEntity;</pre></td></tr>
-<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 20</td> <td class="src"><pre class="src"> <span class="keyword">return</span> peerEntity;</pre></td></tr>
+<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 145</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.SensitiveValueCodec.html b/coverage/com.google.enterprise.adaptor.SensitiveValueCodec.html
index 094ea79..0a3028b 100644
--- a/coverage/com.google.enterprise.adaptor.SensitiveValueCodec.html
+++ b/coverage/com.google.enterprise.adaptor.SensitiveValueCodec.html
@@ -12,9 +12,9 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">22</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:67px"><span class="text">46/68</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:90px"><span class="text">18/20</span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.2;</span>5.2</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.2;</span>5.2</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec$SecurityLevel</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">8/8</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.2;</span>5.2</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">22</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:67px"><span class="text">45/67</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:88px"><span class="text">16/18</span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.0;</span>5</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.0;</span>5</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec$SecurityLevel</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">8/8</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.0;</span>5</td></tr>
</table>
<div class="separator"> </div>
@@ -99,7 +99,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> KeyPair encryptingKey;</pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Random random = <span class="keyword">new</span> Random();</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Random random = <span class="keyword">new</span> Random();</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
@@ -118,9 +118,9 @@
<td class="src"><pre class="src"> <span class="comment"> * @param encryptingKey key used when encryption is requested, or {@code null}</span></pre></td></tr>
<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">public</span> SensitiveValueCodec(KeyPair encryptingKey) {</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.encryptingKey = encryptingKey;</pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">public</span> SensitiveValueCodec(KeyPair encryptingKey) {</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.encryptingKey = encryptingKey;</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
@@ -174,262 +174,257 @@
<tr> <td class="numLineCover"> 85</td> <td class="nbHitsUncovered"><a title="Line 85: Conditional coverage 75% (3/4)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 85: Conditional coverage 75% (3/4)."> <span class="keyword">switch</span> (security) {</a></span></pre></td></tr>
<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> PLAIN_TEXT:</pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> encoded = readable;</pre></td></tr>
-<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"><a title="Line 88: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 88: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!encoded.contains(<span class="string">":"</span>)) {</a></pre></td></tr>
+<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// We always apply the prefix, even if it isn't strictly necessary. This</span></pre></td></tr>
+<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// is to make it obvious that the process actually did something to the</span></pre></td></tr>
<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// If the string contains something that may be a prefix, then we want</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// user and makes them more aware of the pl: prefix if they need to use</span></pre></td></tr>
<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// to go through the normal process of adding a the prefix. Otherwise,</span></pre></td></tr>
-<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// there should be little chance it will be mis-interpreted and the</span></pre></td></tr>
-<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// user gets to use a simplier format.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 93</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> encoded;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">// it.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> encoded = readable;</pre></td></tr>
+<tr> <td class="numLineCover"> 92</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> OBFUSCATED:</pre></td></tr>
-<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> encoded = encryptAndBase64(readable, createObfuscatingCipher(),</pre></td></tr>
-<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> encoded = encryptAndBase64(readable, createObfuscatingCipher(),</pre></td></tr>
+<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> OBFUSCATING_KEY);</pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> ENCRYPTED:</pre></td></tr>
-<tr> <td class="numLineCover"> 103</td> <td class="nbHitsCovered"><a title="Line 103: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 103: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (encryptingKey == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(</pre></td></tr>
-<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"><a title="Line 100: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 100: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (encryptingKey == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(</pre></td></tr>
+<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"No key provided to encrypt value"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 107</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> encoded = encryptAndBase64(readable, createEncryptingCipher(),</pre></td></tr>
-<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> encoded = encryptAndBase64(readable, createEncryptingCipher(),</pre></td></tr>
+<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> encryptingKey.getPublic());</pre></td></tr>
-<tr> <td class="numLineCover"> 109</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">default</span>:</pre></td></tr>
-<tr> <td class="numLineCover"> 112</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
-<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 109</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
+<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 114</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">return</span> security.getPrefix() + encoded;</pre></td></tr>
-<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 111</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> <span class="keyword">return</span> security.getPrefix() + encoded;</pre></td></tr>
+<tr> <td class="numLine"> 112</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 114</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 118</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Beware that the provided Cipher will be modified as part of encryption.</span></pre></td></tr>
-<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> String encryptAndBase64(String readable, Cipher cipher, Key key) {</pre></td></tr>
-<tr> <td class="numLineCover"> 121</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] bytes = readable.getBytes(CHARSET);</pre></td></tr>
-<tr> <td class="numLine"> 122</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] bytes = readable.getBytes(CHARSET);</pre></td></tr>
+<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> cipher.init(Cipher.ENCRYPT_MODE, key);</pre></td></tr>
-<tr> <td class="numLineCover"> 125</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InvalidKeyException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 126</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 127</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 121</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> cipher.init(Cipher.ENCRYPT_MODE, key);</pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InvalidKeyException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 123</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> bytes = cipher.doFinal(bytes);</pre></td></tr>
+<tr> <td class="numLineCover"> 127</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalBlockSizeException ex) {</span></pre></td></tr>
<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> bytes = cipher.doFinal(bytes);</pre></td></tr>
-<tr> <td class="numLineCover"> 130</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalBlockSizeException ex) {</span></pre></td></tr>
-<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// The algorithm does not seem suited for our use.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 132</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 133</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (BadPaddingException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 134</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 135</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 130</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (BadPaddingException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 131</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 132</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 134</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> DatatypeConverter.printBase64Binary(bytes);</pre></td></tr>
+<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 137</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> DatatypeConverter.printBase64Binary(bytes);</pre></td></tr>
+<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 138</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 139</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Determine what encode operation was used to produce {@code nonReadable}.</span></pre></td></tr>
-<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 139</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * @param nonReadable previously-encoded string</span></pre></td></tr>
-<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * @return security used</span></pre></td></tr>
-<tr> <td class="numLine"> 145</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 146</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> SecurityLevel determineSecurityLevelUsed(String nonReadable) {</pre></td></tr>
-<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> SecurityLevel security = SecurityLevel.PLAIN_TEXT;</pre></td></tr>
-<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"><a title="Line 148: Conditional coverage 100% (2/2)."> 32</a></td> <td class="src"><pre class="src"> <a title="Line 148: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (SecurityLevel trySecurityLevel : SecurityLevel.values()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 149</td> <td class="nbHitsCovered"><a title="Line 149: Conditional coverage 100% (2/2)."> 28</a></td> <td class="src"><pre class="src"> <a title="Line 149: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (nonReadable.startsWith(trySecurityLevel.getPrefix())) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 150</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> security = trySecurityLevel;</pre></td></tr>
-<tr> <td class="numLineCover"> 151</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 144</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> SecurityLevel security = SecurityLevel.PLAIN_TEXT;</pre></td></tr>
+<tr> <td class="numLineCover"> 145</td> <td class="nbHitsCovered"><a title="Line 145: Conditional coverage 100% (2/2)."> 26</a></td> <td class="src"><pre class="src"> <a title="Line 145: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (SecurityLevel trySecurityLevel : SecurityLevel.values()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"><a title="Line 146: Conditional coverage 100% (2/2)."> 24</a></td> <td class="src"><pre class="src"> <a title="Line 146: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (nonReadable.startsWith(trySecurityLevel.getPrefix())) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> security = trySecurityLevel;</pre></td></tr>
+<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 151</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> security;</pre></td></tr>
+<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 153</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 154</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">return</span> security;</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 155</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Reverse previous encode operation that produced {@code nonReadable}.</span></pre></td></tr>
-<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 160</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * @param nonReadable previously-encoded string</span></pre></td></tr>
-<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * @return non-encoded string</span></pre></td></tr>
-<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * @throws IllegalArgumentException if {@code nonReadable} is unable to be</span></pre></td></tr>
-<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 160</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * decoded</span></pre></td></tr>
-<tr> <td class="numLine"> 164</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String decodeValue(String nonReadable) {</pre></td></tr>
-<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> SecurityLevel security = determineSecurityLevelUsed(nonReadable);</pre></td></tr>
-<tr> <td class="numLineCover"> 168</td> <td class="nbHitsCovered"><a title="Line 168: Conditional coverage 100% (2/2)."> 9</a></td> <td class="src"><pre class="src"> <a title="Line 168: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (nonReadable.startsWith(security.getPrefix())) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> nonReadable = nonReadable.substring(security.getPrefix().length());</pre></td></tr>
-<tr> <td class="numLine"> 170</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> SecurityLevel security = determineSecurityLevelUsed(nonReadable);</pre></td></tr>
+<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"><a title="Line 165: Conditional coverage 100% (2/2)."> 9</a></td> <td class="src"><pre class="src"> <a title="Line 165: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (nonReadable.startsWith(security.getPrefix())) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> nonReadable = nonReadable.substring(security.getPrefix().length());</pre></td></tr>
+<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 171</td> <td class="nbHitsUncovered"><a title="Line 171: Conditional coverage 75% (3/4)."> 9</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 171: Conditional coverage 75% (3/4)."> <span class="keyword">switch</span> (security) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 168</td> <td class="nbHitsUncovered"><a title="Line 168: Conditional coverage 75% (3/4)."> 9</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 168: Conditional coverage 75% (3/4)."> <span class="keyword">switch</span> (security) {</a></span></pre></td></tr>
+<tr> <td class="numLine"> 169</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> PLAIN_TEXT:</pre></td></tr>
-<tr> <td class="numLineCover"> 173</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> nonReadable;</pre></td></tr>
-<tr> <td class="numLine"> 174</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> nonReadable;</pre></td></tr>
+<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> OBFUSCATED:</pre></td></tr>
-<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> base64AndDecrypt(nonReadable, createObfuscatingCipher(),</pre></td></tr>
-<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 173</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> base64AndDecrypt(nonReadable, createObfuscatingCipher(),</pre></td></tr>
+<tr> <td class="numLine"> 174</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> OBFUSCATING_KEY);</pre></td></tr>
-<tr> <td class="numLine"> 178</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 179</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 176</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">case</span> ENCRYPTED:</pre></td></tr>
-<tr> <td class="numLineCover"> 180</td> <td class="nbHitsCovered"><a title="Line 180: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 180: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (encryptingKey == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(</pre></td></tr>
-<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 177</td> <td class="nbHitsCovered"><a title="Line 177: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 177: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (encryptingKey == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 178</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(</pre></td></tr>
+<tr> <td class="numLine"> 179</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"No key provided to decrypt value"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 183</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 180</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> base64AndDecrypt(nonReadable, createEncryptingCipher(),</pre></td></tr>
-<tr> <td class="numLine"> 185</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> base64AndDecrypt(nonReadable, createEncryptingCipher(),</pre></td></tr>
+<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> encryptingKey.getPrivate());</pre></td></tr>
-<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 183</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 184</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">default</span>:</pre></td></tr>
-<tr> <td class="numLineCover"> 188</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
-<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 185</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
+<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 191</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 188</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 192</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Beware that the provided Cipher will be modified as part of decryption.</span></pre></td></tr>
-<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 191</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 192</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> String base64AndDecrypt(String nonReadable, Cipher cipher, Key key) {</pre></td></tr>
-<tr> <td class="numLineCover"> 196</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] bytes = DatatypeConverter.parseBase64Binary(nonReadable);</pre></td></tr>
-<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 193</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">byte</span>[] bytes = DatatypeConverter.parseBase64Binary(nonReadable);</pre></td></tr>
+<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> cipher.init(Cipher.DECRYPT_MODE, key);</pre></td></tr>
-<tr> <td class="numLineCover"> 200</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InvalidKeyException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 201</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 196</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> cipher.init(Cipher.DECRYPT_MODE, key);</pre></td></tr>
+<tr> <td class="numLineCover"> 197</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InvalidKeyException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 198</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 204</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> bytes = cipher.doFinal(bytes);</pre></td></tr>
-<tr> <td class="numLineCover"> 205</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalBlockSizeException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 206</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 207</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (BadPaddingException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 208</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 209</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 201</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> bytes = cipher.doFinal(bytes);</pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IllegalBlockSizeException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> AssertionError();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 204</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (BadPaddingException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 205</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 207</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 208</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> String(bytes, CHARSET);</pre></td></tr>
+<tr> <td class="numLine"> 209</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 210</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 211</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> String(bytes, CHARSET);</pre></td></tr>
-<tr> <td class="numLine"> 212</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 214</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 211</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 215</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 212</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Possible levels of security for storing value.</span></pre></td></tr>
-<tr> <td class="numLine"> 216</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 217</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">public</span> enum SecurityLevel {</pre></td></tr>
-<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">public</span> enum SecurityLevel {</pre></td></tr>
+<tr> <td class="numLine"> 215</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 219</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 216</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The value is prefixed with "pl:", but is otherwise left as-is.</span></pre></td></tr>
+<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 218</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> PLAIN_TEXT(<span class="string">"pl:"</span>),</pre></td></tr>
+<tr> <td class="numLine"> 219</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 221</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> PLAIN_TEXT(<span class="string">"pl:"</span>),</pre></td></tr>
-<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The value is prefixed with "obf:" and is obfuscated, but no real security</span></pre></td></tr>
-<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * is added. AES is used to encrypt the value, but the key is hard-coded.</span></pre></td></tr>
-<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 226</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> OBFUSCATED(<span class="string">"obf:"</span>),</pre></td></tr>
-<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> OBFUSCATED(<span class="string">"obf:"</span>),</pre></td></tr>
+<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * The value is prefixed with "pkc:" and is encrypted using the public key</span></pre></td></tr>
-<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * cryptography provided to the constructor.</span></pre></td></tr>
-<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 231</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ENCRYPTED(<span class="string">"pkc:"</span>),</pre></td></tr>
-<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 228</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ENCRYPTED(<span class="string">"pkc:"</span>),</pre></td></tr>
+<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> ;</pre></td></tr>
-<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 234</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 231</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> String prefix;</pre></td></tr>
-<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 236</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">private</span> SecurityLevel(String prefix) {</pre></td></tr>
-<tr> <td class="numLineCover"> 237</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.prefix = prefix;</pre></td></tr>
-<tr> <td class="numLineCover"> 238</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">private</span> SecurityLevel(String prefix) {</pre></td></tr>
+<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.prefix = prefix;</pre></td></tr>
+<tr> <td class="numLineCover"> 235</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> String getPrefix() {</pre></td></tr>
-<tr> <td class="numLineCover"> 241</td> <td class="nbHitsCovered"> 54</td> <td class="src"><pre class="src"> <span class="keyword">return</span> prefix;</pre></td></tr>
-<tr> <td class="numLine"> 242</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 238</td> <td class="nbHitsCovered"> 54</td> <td class="src"><pre class="src"> <span class="keyword">return</span> prefix;</pre></td></tr>
+<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 244</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.SessionManager.html b/coverage/com.google.enterprise.adaptor.SessionManager.html
index d094295..aced560 100644
--- a/coverage/com.google.enterprise.adaptor.SessionManager.html
+++ b/coverage/com.google.enterprise.adaptor.SessionManager.html
@@ -141,11 +141,11 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Session getSession(E clientState, <span class="keyword">boolean</span> create) {</pre></td></tr>
-<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 132</td> <td class="src"><pre class="src"> String value = clientStore.retrieve(clientState);</pre></td></tr>
-<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"><a title="Line 69: Conditional coverage 100% (2/2)."> 132</a></td> <td class="src"><pre class="src"> <a title="Line 69: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (value == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 133</td> <td class="src"><pre class="src"> String value = clientStore.retrieve(clientState);</pre></td></tr>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"><a title="Line 69: Conditional coverage 100% (2/2)."> 133</a></td> <td class="src"><pre class="src"> <a title="Line 69: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (value == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// No pre-existing session found.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"><a title="Line 71: Conditional coverage 100% (2/2)."> 74</a></td> <td class="src"><pre class="src"> <a title="Line 71: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> create ? createSession(clientState) : <span class="keyword">null</span>;</a></pre></td></tr>
+<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"><a title="Line 71: Conditional coverage 100% (2/2)."> 75</a></td> <td class="src"><pre class="src"> <a title="Line 71: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> create ? createSession(clientState) : <span class="keyword">null</span>;</a></pre></td></tr>
<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 73</td> <td class="nbHits"> </td>
@@ -279,7 +279,7 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 166</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> HttpExchangeClientStore</pre></td></tr>
+<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 167</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> HttpExchangeClientStore</pre></td></tr>
<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">implements</span> ClientStore<HttpExchange> {</pre></td></tr>
<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
@@ -295,14 +295,14 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> HttpExchangeClientStore() {</pre></td></tr>
-<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 98</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(<span class="string">"sessid"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 98</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(<span class="string">"sessid"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 97</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> HttpExchangeClientStore(String cookieName) {</pre></td></tr>
-<tr> <td class="numLineCover"> 173</td> <td class="nbHitsCovered"> 115</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(cookieName, <span class="keyword">false</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 174</td> <td class="nbHitsCovered"> 114</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 173</td> <td class="nbHitsCovered"> 114</td> <td class="src"><pre class="src"> <span class="keyword">this</span>(cookieName, <span class="keyword">false</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 174</td> <td class="nbHitsCovered"> 113</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 125</td> <td class="src"><pre class="src"> <span class="keyword">public</span> HttpExchangeClientStore(String cookieName, <span class="keyword">boolean</span> secure) {</pre></td></tr>
@@ -319,16 +319,16 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 185</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String retrieve(HttpExchange ex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 186</td> <td class="nbHitsCovered"> 134</td> <td class="src"><pre class="src"> String value = exchangeCookieMap.get(ex);</pre></td></tr>
-<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"><a title="Line 187: Conditional coverage 100% (2/2)."> 134</a></td> <td class="src"><pre class="src"> <a title="Line 187: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (value != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 186</td> <td class="nbHitsCovered"> 135</td> <td class="src"><pre class="src"> String value = exchangeCookieMap.get(ex);</pre></td></tr>
+<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"><a title="Line 187: Conditional coverage 100% (2/2)."> 135</a></td> <td class="src"><pre class="src"> <a title="Line 187: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (value != <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 188</td> <td class="nbHitsCovered"> 41</td> <td class="src"><pre class="src"> <span class="keyword">return</span> value;</pre></td></tr>
<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 93</td> <td class="src"><pre class="src"> String cookies = ex.getRequestHeaders().getFirst(<span class="string">"Cookie"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 192</td> <td class="nbHitsCovered"><a title="Line 192: Conditional coverage 100% (2/2)."> 93</a></td> <td class="src"><pre class="src"> <a title="Line 192: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (cookies == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 193</td> <td class="nbHitsCovered"> 64</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 94</td> <td class="src"><pre class="src"> String cookies = ex.getRequestHeaders().getFirst(<span class="string">"Cookie"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 192</td> <td class="nbHitsCovered"><a title="Line 192: Conditional coverage 100% (2/2)."> 94</a></td> <td class="src"><pre class="src"> <a title="Line 192: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (cookies == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 193</td> <td class="nbHitsCovered"> 65</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.ShutdownWaiter.html b/coverage/com.google.enterprise.adaptor.ShutdownWaiter.html
index 830b5ba..405ec61 100644
--- a/coverage/com.google.enterprise.adaptor.ShutdownWaiter.html
+++ b/coverage/com.google.enterprise.adaptor.ShutdownWaiter.html
@@ -14,7 +14,7 @@
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
<tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:82px"><span class="text">29/35</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">10/10</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$NotificationFilter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:9px"><span class="text">1/11</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$NotificationFilter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:72px"><span class="text">8/11</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$NotificationRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">10/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$ShutdownException</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
@@ -95,10 +95,10 @@
<td class="src"><pre class="src"> <span class="comment"> * <p>Once {@link #shutdown shutdown}, instance cannot be re-used.</span></pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">class</span> ShutdownWaiter {</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> ReadWriteLock lock = <span class="keyword">new</span> ReentrantReadWriteLock();</pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> NotificationFilter filter = <span class="keyword">new</span> NotificationFilter();</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Set<Thread> processingThreads</pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">class</span> ShutdownWaiter {</pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> ReadWriteLock lock = <span class="keyword">new</span> ReentrantReadWriteLock();</pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> NotificationFilter filter = <span class="keyword">new</span> NotificationFilter();</pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Set<Thread> processingThreads</pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> = Collections.synchronizedSet(<span class="keyword">new</span> HashSet<Thread>());</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
@@ -121,16 +121,16 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> shutdown(<span class="keyword">long</span> time, TimeUnit unit)</pre></td></tr>
<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> stopped = <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> stopped = <span class="keyword">true</span>;</pre></td></tr>
<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Inform processing requests to shut down.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"><a title="Line 55: Conditional coverage 100% (2/2)."> 27</a></td> <td class="src"><pre class="src"> <a title="Line 55: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Thread thread : processingThreads.toArray(<span class="keyword">new</span> Thread[0])) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> thread.interrupt();</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"><a title="Line 55: Conditional coverage 100% (2/2)."> 38</a></td> <td class="src"><pre class="src"> <a title="Line 55: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Thread thread : processingThreads.toArray(<span class="keyword">new</span> Thread[0])) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> thread.interrupt();</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Wait for all requests to complete processing.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"><a title="Line 59: Conditional coverage 100% (2/2)."> 14</a></td> <td class="src"><pre class="src"> <a title="Line 59: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!lock.writeLock().tryLock(time, unit)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"><a title="Line 59: Conditional coverage 100% (2/2)."> 15</a></td> <td class="src"><pre class="src"> <a title="Line 59: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!lock.writeLock().tryLock(time, unit)) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
@@ -138,8 +138,8 @@
<td class="src"><pre class="src"> <span class="comment">// stopped == true guarantees no future request processing and obtaining the</span></pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// lock guarantees no current request processing.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> lock.writeLock().unlock();</pre></td></tr>
-<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> lock.writeLock().unlock();</pre></td></tr>
+<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
@@ -176,31 +176,31 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> processingStarting(Thread thread) <span class="keyword">throws</span> ShutdownException {</pre></td></tr>
-<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"><a title="Line 84: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 84: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (thread == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"><a title="Line 84: Conditional coverage 100% (2/2)."> 30</a></td> <td class="src"><pre class="src"> <a title="Line 84: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (thread == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 85</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Locks can throw exceptions.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> lock.readLock().lock();</pre></td></tr>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> lock.readLock().lock();</pre></td></tr>
<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> processingThreads.add(thread);</pre></td></tr>
+<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> processingThreads.add(thread);</pre></td></tr>
<tr> <td class="numLineCover"> 91</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (RuntimeException e) {</span></pre></td></tr>
<tr> <td class="numLineCover"> 92</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> lock.readLock().unlock();</span></pre></td></tr>
<tr> <td class="numLineCover"> 93</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> e;</span></pre></td></tr>
<tr> <td class="numLineCover"> 94</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (Error e) {</span></pre></td></tr>
<tr> <td class="numLineCover"> 95</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> lock.readLock().unlock();</span></pre></td></tr>
<tr> <td class="numLineCover"> 96</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> e;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"><a title="Line 98: Conditional coverage 100% (2/2)."> 17</a></td> <td class="src"><pre class="src"> <a title="Line 98: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (stopped) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"><a title="Line 98: Conditional coverage 100% (2/2)."> 29</a></td> <td class="src"><pre class="src"> <a title="Line 98: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (stopped) {</a></pre></td></tr>
<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Cleanup.</span></pre></td></tr>
<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> processingCompleted(thread);</pre></td></tr>
<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> ShutdownException();</pre></td></tr>
<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 103</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 103</td> <td class="nbHitsCovered"> 28</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
@@ -211,7 +211,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> processingCompleted(Thread thread) {</pre></td></tr>
-<tr> <td class="numLineCover"> 109</td> <td class="nbHitsCovered"><a title="Line 109: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 109: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (thread == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 109</td> <td class="nbHitsCovered"><a title="Line 109: Conditional coverage 100% (2/2)."> 30</a></td> <td class="src"><pre class="src"> <a title="Line 109: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (thread == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 110</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</pre></td></tr>
<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
@@ -219,19 +219,19 @@
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Locks can throw exceptions.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 114</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> lock.readLock().unlock();</pre></td></tr>
+<tr> <td class="numLineCover"> 114</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> lock.readLock().unlock();</pre></td></tr>
<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 116</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> processingThreads.remove(Thread.currentThread());</pre></td></tr>
-<tr> <td class="numLineCover"> 117</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 116</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> processingThreads.remove(Thread.currentThread());</pre></td></tr>
+<tr> <td class="numLineCover"> 117</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 29</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Convenience filter that notifies this waiter of processing events. */</span></pre></td></tr>
<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Filter filter() {</pre></td></tr>
-<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 42</td> <td class="src"><pre class="src"> <span class="keyword">return</span> filter;</pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 46</td> <td class="src"><pre class="src"> <span class="keyword">return</span> filter;</pre></td></tr>
<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
@@ -246,7 +246,7 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Runnable runnable(Runnable runnable) {</pre></td></tr>
-<tr> <td class="numLineCover"> 130</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> NotificationRunnable(runnable);</pre></td></tr>
+<tr> <td class="numLineCover"> 130</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> NotificationRunnable(runnable);</pre></td></tr>
<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
@@ -265,7 +265,7 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 141</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> NotificationFilter <span class="keyword">extends</span> Filter {</pre></td></tr>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> NotificationFilter <span class="keyword">extends</span> Filter {</pre></td></tr>
<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 144</td> <td class="nbHits"> </td>
@@ -281,54 +281,54 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> doFilter(HttpExchange ex, Filter.Chain chain)</pre></td></tr>
<tr> <td class="numLine"> 150</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 151</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread thread = Thread.currentThread();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 151</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> Thread thread = Thread.currentThread();</pre></td></tr>
<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 153</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> processingStarting(thread);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 153</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> processingStarting(thread);</pre></td></tr>
<tr> <td class="numLineCover"> 154</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (ShutdownException e) {</span></pre></td></tr>
<tr> <td class="numLineCover"> 155</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 156</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 156</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 158</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> chain.doFilter(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> chain.doFilter(ex);</pre></td></tr>
<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> processingCompleted(thread);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 161</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 162</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> processingCompleted(thread);</pre></td></tr>
+<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 164</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> NotificationRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
+<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">class</span> NotificationRunnable <span class="keyword">implements</span> Runnable {</pre></td></tr>
<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Runnable delegate;</pre></td></tr>
<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 168</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">public</span> NotificationRunnable(Runnable delegate) {</pre></td></tr>
-<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delegate = delegate;</pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 168</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> <span class="keyword">public</span> NotificationRunnable(Runnable delegate) {</pre></td></tr>
+<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.delegate = delegate;</pre></td></tr>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 34</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 173</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
-<tr> <td class="numLineCover"> 174</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> Thread thread = Thread.currentThread();</pre></td></tr>
+<tr> <td class="numLineCover"> 174</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> Thread thread = Thread.currentThread();</pre></td></tr>
<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> processingStarting(thread);</pre></td></tr>
+<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> processingStarting(thread);</pre></td></tr>
<tr> <td class="numLineCover"> 177</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (ShutdownException ex) {</span></pre></td></tr>
<tr> <td class="numLineCover"> 178</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(ex);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 179</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 179</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 180</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> delegate.run();</pre></td></tr>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> delegate.run();</pre></td></tr>
<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> processingCompleted(thread);</pre></td></tr>
-<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 183</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> processingCompleted(thread);</pre></td></tr>
+<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 23</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.SleepHandler.html b/coverage/com.google.enterprise.adaptor.SleepHandler.html
index b8b9a0f..2830d13 100644
--- a/coverage/com.google.enterprise.adaptor.SleepHandler.html
+++ b/coverage/com.google.enterprise.adaptor.SleepHandler.html
@@ -74,28 +74,28 @@
<td class="src"><pre class="src"> = Logger.getLogger(SleepHandler.<span class="keyword">class</span>.getName());</pre></td></tr>
<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Charset charset = Charset.forName(<span class="string">"UTF-8"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 30</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> Charset charset = Charset.forName(<span class="string">"UTF-8"</span>);</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">long</span> sleepDurationMillis;</pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">public</span> SleepHandler(<span class="keyword">long</span> sleepDurationMillis) {</pre></td></tr>
-<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sleepDurationMillis = sleepDurationMillis;</pre></td></tr>
-<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">public</span> SleepHandler(<span class="keyword">long</span> sleepDurationMillis) {</pre></td></tr>
+<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.sleepDurationMillis = sleepDurationMillis;</pre></td></tr>
+<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 16</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> handle(HttpExchange ex) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"><a title="Line 39: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 39: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!<span class="string">"GET"</span>.equals(ex.getRequestMethod())) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsCovered"><a title="Line 39: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 39: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!<span class="string">"GET"</span>.equals(ex.getRequestMethod())) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpExchanges.cannedRespond(ex, HttpURLConnection.HTTP_BAD_METHOD,</pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Translation.HTTP_BAD_METHOD);</pre></td></tr>
<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"><a title="Line 44: Conditional coverage 100% (2/2)."> 5</a></td> <td class="src"><pre class="src"> <a title="Line 44: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!ex.getRequestURI().getPath().equals(ex.getHttpContext().getPath())) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 44</td> <td class="nbHitsCovered"><a title="Line 44: Conditional coverage 100% (2/2)."> 9</a></td> <td class="src"><pre class="src"> <a title="Line 44: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!ex.getRequestURI().getPath().equals(ex.getHttpContext().getPath())) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 45</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpExchanges.cannedRespond(ex, HttpURLConnection.HTTP_NOT_FOUND,</pre></td></tr>
<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Translation.HTTP_NOT_FOUND);</pre></td></tr>
@@ -104,18 +104,18 @@
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 50</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Thread.sleep(sleepDurationMillis);</pre></td></tr>
+<tr> <td class="numLineCover"> 50</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Thread.sleep(sleepDurationMillis);</pre></td></tr>
<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> } <span class="keyword">catch</span> (InterruptedException ie) {</pre></td></tr>
<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.log(Level.WARNING, <span class="string">"Request interrupted"</span>, ie);</pre></td></tr>
<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> HttpExchanges.respond(ex, HttpURLConnection.HTTP_INTERNAL_ERROR,</pre></td></tr>
<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"text/plain"</span>, <span class="string">"Interrupted"</span>.getBytes(charset));</pre></td></tr>
<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> HttpExchanges.respond(ex, HttpURLConnection.HTTP_OK, <span class="string">"text/plain"</span>,</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> HttpExchanges.respond(ex, HttpURLConnection.HTTP_OK, <span class="string">"text/plain"</span>,</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"Done"</span>.getBytes(charset));</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.StatRpcMethod.html b/coverage/com.google.enterprise.adaptor.StatRpcMethod.html
index dd1882c..8faafa6 100644
--- a/coverage/com.google.enterprise.adaptor.StatRpcMethod.html
+++ b/coverage/com.google.enterprise.adaptor.StatRpcMethod.html
@@ -71,24 +71,24 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">class</span> StatRpcMethod <span class="keyword">implements</span> RpcHandler.RpcMethod {</pre></td></tr>
-<tr> <td class="numLineCover"> 28</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">private</span> String adaptorVersion = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 28</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">private</span> String adaptorVersion = <span class="keyword">null</span>;</pre></td></tr>
<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Journal journal;</pre></td></tr>
<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> isAdaptorIncremental;</pre></td></tr>
<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">public</span> StatRpcMethod(Journal journal, Adaptor adaptor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
-<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.isAdaptorIncremental = adaptor <span class="keyword">instanceof</span> PollingIncrementalAdaptor;</pre></td></tr>
+<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> StatRpcMethod(Journal journal, Adaptor adaptor) {</pre></td></tr>
+<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.journal = journal;</pre></td></tr>
+<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.isAdaptorIncremental = adaptor <span class="keyword">instanceof</span> PollingIncrementalAdaptor;</pre></td></tr>
<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> Class adaptorClass = adaptor.getClass();</pre></td></tr>
-<tr> <td class="numLineCover"> 37</td> <td class="nbHitsUncovered"><a title="Line 37: Conditional coverage 50% (1/2)."> 11</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 37: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (adaptorClass.getPackage() != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> adaptorVersion = adaptorClass.getPackage().getImplementationVersion();</pre></td></tr>
+<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> Class adaptorClass = adaptor.getClass();</pre></td></tr>
+<tr> <td class="numLineCover"> 37</td> <td class="nbHitsUncovered"><a title="Line 37: Conditional coverage 50% (1/2)."> 12</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 37: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (adaptorClass.getPackage() != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 38</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> adaptorVersion = adaptorClass.getPackage().getImplementationVersion();</pre></td></tr>
<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.StatusMonitor.html b/coverage/com.google.enterprise.adaptor.StatusMonitor.html
index caa346f..82b4fc6 100644
--- a/coverage/com.google.enterprise.adaptor.StatusMonitor.html
+++ b/coverage/com.google.enterprise.adaptor.StatusMonitor.html
@@ -65,8 +65,8 @@
<td class="src"><pre class="src"> <span class="comment"> * <p>This class is thread-safe.</span></pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">class</span> StatusMonitor {</pre></td></tr>
-<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 11</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<StatusSource> sources = <span class="keyword">new</span> CopyOnWriteArrayList<StatusSource>();</pre></td></tr>
+<tr> <td class="numLineCover"> 25</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">class</span> StatusMonitor {</pre></td></tr>
+<tr> <td class="numLineCover"> 26</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<StatusSource> sources = <span class="keyword">new</span> CopyOnWriteArrayList<StatusSource>();</pre></td></tr>
<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
@@ -95,12 +95,12 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> addSource(StatusSource source) {</pre></td></tr>
-<tr> <td class="numLineCover"> 43</td> <td class="nbHitsUncovered"><a title="Line 43: Conditional coverage 50% (1/2)."> 32</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 43: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (source == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 43</td> <td class="nbHitsUncovered"><a title="Line 43: Conditional coverage 50% (1/2)."> 35</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 43: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (source == <span class="keyword">null</span>) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 44</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> sources.add(source);</pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 32</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> sources.add(source);</pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.SystemTimeProvider.html b/coverage/com.google.enterprise.adaptor.SystemTimeProvider.html
index 15b9931..f44544f 100644
--- a/coverage/com.google.enterprise.adaptor.SystemTimeProvider.html
+++ b/coverage/com.google.enterprise.adaptor.SystemTimeProvider.html
@@ -55,10 +55,10 @@
<td class="src"><pre class="src"> <span class="comment"> * A {@link TimeProvider} that uses {@link System#currentTimeMillis}</span></pre></td></tr>
<tr> <td class="numLine"> 19</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 20</td> <td class="nbHitsCovered"> 130</td> <td class="src"><pre class="src"> <span class="keyword">class</span> SystemTimeProvider <span class="keyword">implements</span> TimeProvider {</pre></td></tr>
+<tr> <td class="numLineCover"> 20</td> <td class="nbHitsCovered"> 135</td> <td class="src"><pre class="src"> <span class="keyword">class</span> SystemTimeProvider <span class="keyword">implements</span> TimeProvider {</pre></td></tr>
<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">long</span> currentTimeMillis() {</pre></td></tr>
-<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 317117</td> <td class="src"><pre class="src"> <span class="keyword">return</span> System.currentTimeMillis();</pre></td></tr>
+<tr> <td class="numLineCover"> 22</td> <td class="nbHitsCovered"> 401864</td> <td class="src"><pre class="src"> <span class="keyword">return</span> System.currentTimeMillis();</pre></td></tr>
<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.Translation.html b/coverage/com.google.enterprise.adaptor.Translation.html
index f59dcc8..124fdbd 100644
--- a/coverage/com.google.enterprise.adaptor.Translation.html
+++ b/coverage/com.google.enterprise.adaptor.Translation.html
@@ -103,7 +103,7 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String toString() {</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 54</td> <td class="src"><pre class="src"> <span class="keyword">return</span> toString(Locale.getDefault());</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 55</td> <td class="src"><pre class="src"> <span class="keyword">return</span> toString(Locale.getDefault());</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
@@ -118,8 +118,8 @@
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> String toString(Locale locale) {</pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> String localeClassStr = <span class="string">"com.google.enterprise.adaptor.TranslationStrings"</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 78</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ResourceBundle.getBundle(localeClassStr, locale)</pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> String localeClassStr = <span class="string">"com.google.enterprise.adaptor.TranslationStrings"</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 79</td> <td class="src"><pre class="src"> <span class="keyword">return</span> ResourceBundle.getBundle(localeClassStr, locale)</pre></td></tr>
<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> .getString(name());</pre></td></tr>
<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.Watchdog.html b/coverage/com.google.enterprise.adaptor.Watchdog.html
index 4ada4fc..7eef788 100644
--- a/coverage/com.google.enterprise.adaptor.Watchdog.html
+++ b/coverage/com.google.enterprise.adaptor.Watchdog.html
@@ -118,43 +118,43 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> processingStarting() {</pre></td></tr>
-<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"><a title="Line 54: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 54: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (inProcess.get() != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"><a title="Line 54: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 54: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (inProcess.get() != <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"Processing is already occuring on the "</span></pre></td></tr>
<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">"thread"</span>);</pre></td></tr>
<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> AtomicBoolean interruptNeeded = <span class="keyword">new</span> AtomicBoolean(<span class="keyword">true</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> Runnable task = <span class="keyword">new</span> Interrupter(Thread.currentThread(), interruptNeeded);</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> Future<?> future = executor.schedule(task, timeout, TimeUnit.MILLISECONDS);</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> inProcess.set(<span class="keyword">new</span> FutureInfo(future, interruptNeeded));</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> AtomicBoolean interruptNeeded = <span class="keyword">new</span> AtomicBoolean(<span class="keyword">true</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> Runnable task = <span class="keyword">new</span> Interrupter(Thread.currentThread(), interruptNeeded);</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> Future<?> future = executor.schedule(task, timeout, TimeUnit.MILLISECONDS);</pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> inProcess.set(<span class="keyword">new</span> FutureInfo(future, interruptNeeded));</pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> processingCompleted() {</pre></td></tr>
-<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> FutureInfo info = inProcess.get();</pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"><a title="Line 66: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 66: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (info == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> FutureInfo info = inProcess.get();</pre></td></tr>
+<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"><a title="Line 66: Conditional coverage 100% (2/2)."> 9</a></td> <td class="src"><pre class="src"> <a title="Line 66: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (info == <span class="keyword">null</span>) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(<span class="string">"No processing was started on the "</span></pre></td></tr>
<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">"thread"</span>);</pre></td></tr>
<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 70</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> inProcess.remove();</pre></td></tr>
+<tr> <td class="numLineCover"> 70</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> inProcess.remove();</pre></td></tr>
<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Prevent Interrupter from running if it hasn't started already. It may</span></pre></td></tr>
<tr> <td class="numLine"> 72</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// still be running after this call and Future doesn't tell us if it is</span></pre></td></tr>
<tr> <td class="numLine"> 73</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// currently running.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> info.future.cancel(<span class="keyword">false</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (info.interruptNeeded) {</pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"><a title="Line 76: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 76: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (info.interruptNeeded.get()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> info.future.cancel(<span class="keyword">false</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">synchronized</span> (info.interruptNeeded) {</pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"><a title="Line 76: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 76: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (info.interruptNeeded.get()) {</a></pre></td></tr>
<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Interrupter hasn't interrupted this thread.</span></pre></td></tr>
<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Prevent the Interrupter from interrupting this thread in the future.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 79</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> info.interruptNeeded.set(<span class="keyword">false</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 79</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> info.interruptNeeded.set(<span class="keyword">false</span>);</pre></td></tr>
<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
@@ -166,8 +166,8 @@
<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> Thread.currentThread().interrupted();</pre></td></tr>
<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
@@ -186,10 +186,10 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> AtomicBoolean interruptNeeded;</pre></td></tr>
<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Interrupter(Thread thread, AtomicBoolean interruptNeeded) {</pre></td></tr>
-<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.thread = thread;</pre></td></tr>
-<tr> <td class="numLineCover"> 99</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.interruptNeeded = interruptNeeded;</pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Interrupter(Thread thread, AtomicBoolean interruptNeeded) {</pre></td></tr>
+<tr> <td class="numLineCover"> 98</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.thread = thread;</pre></td></tr>
+<tr> <td class="numLineCover"> 99</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.interruptNeeded = interruptNeeded;</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
@@ -224,10 +224,10 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">final</span> AtomicBoolean interruptNeeded;</pre></td></tr>
<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 121</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">public</span> FutureInfo(Future<?> future, AtomicBoolean interruptNeeded) {</pre></td></tr>
-<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.future = future;</pre></td></tr>
-<tr> <td class="numLineCover"> 123</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.interruptNeeded = interruptNeeded;</pre></td></tr>
-<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 121</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">public</span> FutureInfo(Future<?> future, AtomicBoolean interruptNeeded) {</pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.future = future;</pre></td></tr>
+<tr> <td class="numLineCover"> 123</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.interruptNeeded = interruptNeeded;</pre></td></tr>
+<tr> <td class="numLineCover"> 124</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 126</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.WrapperAdaptor.html b/coverage/com.google.enterprise.adaptor.WrapperAdaptor.html
index f5d951c..71d3d70 100644
--- a/coverage/com.google.enterprise.adaptor.WrapperAdaptor.html
+++ b/coverage/com.google.enterprise.adaptor.WrapperAdaptor.html
@@ -12,13 +12,13 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:78px"><span class="text">11/14</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$GetContentsRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">4/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$GetContentsResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">35</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:28px"><span class="text">14/49</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">11</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:21px"><span class="text">3/14</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$GetContentsRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$GetContentsResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:82px"><span class="text">42/51</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperAdaptorContext</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">16</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:15px"><span class="text">3/19</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperDocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">3/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">29</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:9px"><span class="text">3/32</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">32</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/32</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
</table>
<div class="separator"> </div>
@@ -87,9 +87,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> Adaptor adaptor;</pre></td></tr>
<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">public</span> WrapperAdaptor(Adaptor adaptor) {</pre></td></tr>
-<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.adaptor = adaptor;</pre></td></tr>
-<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">public</span> WrapperAdaptor(Adaptor adaptor) {</pre></td></tr>
+<tr> <td class="numLineCover"> 34</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.adaptor = adaptor;</pre></td></tr>
+<tr> <td class="numLineCover"> 35</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
@@ -98,8 +98,8 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocContent(Request req, Response resp) <span class="keyword">throws</span> IOException,</pre></td></tr>
<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 40</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> adaptor.getDocContent(req, resp);</pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> adaptor.getDocContent(req, resp);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 41</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
@@ -108,24 +108,24 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocIds(DocIdPusher pusher) <span class="keyword">throws</span> IOException,</pre></td></tr>
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 46</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> adaptor.getDocIds(pusher);</pre></td></tr>
-<tr> <td class="numLineCover"> 47</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> adaptor.getDocIds(pusher);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> initConfig(Config config) {</pre></td></tr>
-<tr> <td class="numLineCover"> 51</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> adaptor.initConfig(config);</pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 51</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> adaptor.initConfig(config);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> init(AdaptorContext context) <span class="keyword">throws</span> Exception {</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> adaptor.init(context);</pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> adaptor.init(context);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
@@ -159,9 +159,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> Request request;</pre></td></tr>
<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">public</span> WrapperRequest(Request request) {</pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.request = request;</pre></td></tr>
-<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 12</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> WrapperRequest(Request request) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.request = request;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 78</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
@@ -205,9 +205,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> Response response;</pre></td></tr>
<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">public</span> WrapperResponse(Response response) {</pre></td></tr>
-<tr> <td class="numLineCover"> 103</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.response = response;</pre></td></tr>
-<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 102</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> WrapperResponse(Response response) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 103</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.response = response;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
@@ -349,9 +349,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> DocId docId;</pre></td></tr>
<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 190</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GetContentsRequest(DocId docId) {</pre></td></tr>
-<tr> <td class="numLineCover"> 191</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.docId = docId;</pre></td></tr>
-<tr> <td class="numLineCover"> 192</td> <td class="nbHitsCovered"> 14</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 190</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> GetContentsRequest(DocId docId) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 191</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.docId = docId;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 192</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
@@ -376,7 +376,7 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> DocId getDocId() {</pre></td></tr>
-<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">return</span> docId;</pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> docId;</span></pre></td></tr>
<tr> <td class="numLine"> 207</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
@@ -401,13 +401,13 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> String contentType;</pre></td></tr>
<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Date lastModified;</pre></td></tr>
-<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Metadata metadata = <span class="keyword">new</span> Metadata();</pre></td></tr>
+<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Metadata metadata = <span class="keyword">new</span> Metadata();</pre></td></tr>
<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Acl acl;</pre></td></tr>
<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> secure;</pre></td></tr>
-<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<URI> anchorUris = <span class="keyword">new</span> ArrayList<URI>();</pre></td></tr>
-<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<String> anchorTexts = <span class="keyword">new</span> ArrayList<String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<URI> anchorUris = <span class="keyword">new</span> ArrayList<URI>();</pre></td></tr>
+<tr> <td class="numLineCover"> 223</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">private</span> List<String> anchorTexts = <span class="keyword">new</span> ArrayList<String>();</pre></td></tr>
<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> notFound;</pre></td></tr>
<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
@@ -426,9 +426,9 @@
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> lock;</pre></td></tr>
<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GetContentsResponse(OutputStream os) {</pre></td></tr>
-<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.os = os;</pre></td></tr>
-<tr> <td class="numLineCover"> 235</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 233</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">public</span> GetContentsResponse(OutputStream os) {</pre></td></tr>
+<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.os = os;</pre></td></tr>
+<tr> <td class="numLineCover"> 235</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
@@ -451,7 +451,7 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> OutputStream getOutputStream() {</pre></td></tr>
-<tr> <td class="numLineCover"> 249</td> <td class="nbHitsCovered"> 17</td> <td class="src"><pre class="src"> <span class="keyword">return</span> os;</pre></td></tr>
+<tr> <td class="numLineCover"> 249</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">return</span> os;</pre></td></tr>
<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
@@ -468,8 +468,8 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 258</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setLastModified(Date lastModified) {</pre></td></tr>
-<tr> <td class="numLineCover"> 259</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.lastModified = lastModified;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 260</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lastModified = lastModified;</pre></td></tr>
+<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
@@ -492,65 +492,65 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 273</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setSecure(<span class="keyword">boolean</span> secure) {</pre></td></tr>
-<tr> <td class="numLineCover"> 274</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.secure = secure;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 275</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 274</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.secure = secure;</pre></td></tr>
+<tr> <td class="numLineCover"> 275</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 278</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> addAnchor(URI uri, String text) {</pre></td></tr>
-<tr> <td class="numLineCover"> 279</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> anchorUris.add(uri);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 280</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> anchorTexts.add(text);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 281</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 279</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> anchorUris.add(uri);</pre></td></tr>
+<tr> <td class="numLineCover"> 280</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> anchorTexts.add(text);</pre></td></tr>
+<tr> <td class="numLineCover"> 281</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 282</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 283</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 284</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setNoIndex(<span class="keyword">boolean</span> noIndex) {</pre></td></tr>
-<tr> <td class="numLineCover"> 285</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.noIndex = noIndex;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 286</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 285</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.noIndex = noIndex;</pre></td></tr>
+<tr> <td class="numLineCover"> 286</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setNoFollow(<span class="keyword">boolean</span> noFollow) {</pre></td></tr>
-<tr> <td class="numLineCover"> 290</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.noFollow = noFollow;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 291</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 290</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.noFollow = noFollow;</pre></td></tr>
+<tr> <td class="numLineCover"> 291</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 293</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setNoArchive(<span class="keyword">boolean</span> noArchive) {</pre></td></tr>
-<tr> <td class="numLineCover"> 295</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.noArchive = noArchive;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 296</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.noArchive = noArchive;</pre></td></tr>
+<tr> <td class="numLineCover"> 296</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 298</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 299</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setDisplayUrl(URI displayUrl) {</pre></td></tr>
-<tr> <td class="numLineCover"> 300</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.displayUrl = displayUrl;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 301</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 300</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.displayUrl = displayUrl;</pre></td></tr>
+<tr> <td class="numLineCover"> 301</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 302</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setCrawlOnce(<span class="keyword">boolean</span> crawlOnce) {</pre></td></tr>
-<tr> <td class="numLineCover"> 305</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.crawlOnce = crawlOnce;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 306</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 305</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.crawlOnce = crawlOnce;</pre></td></tr>
+<tr> <td class="numLineCover"> 306</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 307</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 308</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 309</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setLock(<span class="keyword">boolean</span> lock) {</pre></td></tr>
-<tr> <td class="numLineCover"> 310</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.lock = lock;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 311</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 310</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.lock = lock;</pre></td></tr>
+<tr> <td class="numLineCover"> 311</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 312</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 313</td> <td class="nbHits"> </td>
@@ -561,253 +561,267 @@
<tr> <td class="numLine"> 316</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 317</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/** Returns reference to modifiable accumulated metadata. */</span></pre></td></tr>
-<tr> <td class="numLine"> 318</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Metadata getMetadata() {</pre></td></tr>
-<tr> <td class="numLineCover"> 319</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> metadata;</pre></td></tr>
-<tr> <td class="numLine"> 320</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Date getLastModified() {</pre></td></tr>
+<tr> <td class="numLineCover"> 318</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> lastModified;</pre></td></tr>
+<tr> <td class="numLine"> 319</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 320</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Returns reference to modifiable accumulated metadata. */</span></pre></td></tr>
<tr> <td class="numLine"> 322</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Acl getAcl() {</pre></td></tr>
-<tr> <td class="numLineCover"> 323</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> acl;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Metadata getMetadata() {</pre></td></tr>
+<tr> <td class="numLineCover"> 323</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> metadata;</pre></td></tr>
<tr> <td class="numLine"> 324</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 325</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 326</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> List<URI> getAnchorUris() {</pre></td></tr>
-<tr> <td class="numLineCover"> 327</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> anchorUris;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Acl getAcl() {</pre></td></tr>
+<tr> <td class="numLineCover"> 327</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> acl;</span></pre></td></tr>
<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 329</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 330</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> List<String> getAnchorTexts() {</pre></td></tr>
-<tr> <td class="numLineCover"> 331</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> anchorTexts;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isSecure() {</pre></td></tr>
+<tr> <td class="numLineCover"> 331</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> secure;</pre></td></tr>
<tr> <td class="numLine"> 332</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 334</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNotFound() {</pre></td></tr>
-<tr> <td class="numLineCover"> 335</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">return</span> notFound;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> List<URI> getAnchorUris() {</pre></td></tr>
+<tr> <td class="numLineCover"> 335</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> anchorUris;</pre></td></tr>
<tr> <td class="numLine"> 336</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 337</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 338</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNotModified() {</pre></td></tr>
-<tr> <td class="numLineCover"> 339</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> notModified;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> List<String> getAnchorTexts() {</pre></td></tr>
+<tr> <td class="numLineCover"> 339</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> anchorTexts;</pre></td></tr>
<tr> <td class="numLine"> 340</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 341</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 342</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNoIndex() {</pre></td></tr>
-<tr> <td class="numLineCover"> 343</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> noIndex;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNotFound() {</pre></td></tr>
+<tr> <td class="numLineCover"> 343</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> notFound;</span></pre></td></tr>
<tr> <td class="numLine"> 344</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 345</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 346</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNoFollow() {</pre></td></tr>
-<tr> <td class="numLineCover"> 347</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> noFollow;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNotModified() {</pre></td></tr>
+<tr> <td class="numLineCover"> 347</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> notModified;</pre></td></tr>
<tr> <td class="numLine"> 348</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 349</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 350</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNoArchive() {</pre></td></tr>
-<tr> <td class="numLineCover"> 351</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> noArchive;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNoIndex() {</pre></td></tr>
+<tr> <td class="numLineCover"> 351</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> noIndex;</pre></td></tr>
<tr> <td class="numLine"> 352</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 353</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 354</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> URI getDisplayUrl() {</pre></td></tr>
-<tr> <td class="numLineCover"> 355</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> displayUrl;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNoFollow() {</pre></td></tr>
+<tr> <td class="numLineCover"> 355</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> noFollow;</pre></td></tr>
<tr> <td class="numLine"> 356</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 357</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 358</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isCrawlOnce() {</pre></td></tr>
-<tr> <td class="numLineCover"> 359</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> crawlOnce;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isNoArchive() {</pre></td></tr>
+<tr> <td class="numLineCover"> 359</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> noArchive;</pre></td></tr>
<tr> <td class="numLine"> 360</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 361</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 362</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isLock() {</pre></td></tr>
-<tr> <td class="numLineCover"> 363</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> lock;</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> URI getDisplayUrl() {</pre></td></tr>
+<tr> <td class="numLineCover"> 363</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> displayUrl;</pre></td></tr>
<tr> <td class="numLine"> 364</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 365</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 366</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 367</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isCrawlOnce() {</pre></td></tr>
+<tr> <td class="numLineCover"> 367</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> crawlOnce;</pre></td></tr>
<tr> <td class="numLine"> 368</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Passes through all operations to wrapped {@code DocIdPusher}.</span></pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 369</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 370</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> WrapperDocIdPusher <span class="keyword">extends</span> AbstractDocIdPusher {</span></pre></td></tr>
-<tr> <td class="numLine"> 371</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> DocIdPusher pusher;</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 370</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">boolean</span> isLock() {</pre></td></tr>
+<tr> <td class="numLineCover"> 371</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> lock;</pre></td></tr>
<tr> <td class="numLine"> 372</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 373</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 374</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 373</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> WrapperDocIdPusher(DocIdPusher pusher) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 374</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.pusher = pusher;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 375</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 375</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
<tr> <td class="numLine"> 376</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> * Passes through all operations to wrapped {@code DocIdPusher}.</span></pre></td></tr>
<tr> <td class="numLine"> 377</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 378</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher.Record pushRecords(</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 378</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> WrapperDocIdPusher <span class="keyword">extends</span> AbstractDocIdPusher {</span></pre></td></tr>
<tr> <td class="numLine"> 379</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Iterable<DocIdPusher.Record> records, PushErrorHandler handler)</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> DocIdPusher pusher;</pre></td></tr>
<tr> <td class="numLine"> 380</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 381</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> pusher.pushRecords(records, handler);</span></pre></td></tr>
-<tr> <td class="numLine"> 382</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 383</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 381</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> WrapperDocIdPusher(DocIdPusher pusher) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 382</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.pusher = pusher;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 383</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 384</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 385</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocId pushNamedResources(Map<DocId, Acl> resources,</pre></td></tr>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 386</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> PushErrorHandler handler) <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 387</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> pusher.pushNamedResources(resources, handler);</span></pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher.Record pushRecords(</pre></td></tr>
+<tr> <td class="numLine"> 387</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> Iterable<DocIdPusher.Record> records, PushErrorHandler handler)</pre></td></tr>
<tr> <td class="numLine"> 388</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 389</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
+<tr> <td class="numLineCover"> 389</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> pusher.pushRecords(records, handler);</span></pre></td></tr>
<tr> <td class="numLine"> 390</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 391</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> WrapperAdaptorContext <span class="keyword">implements</span> AdaptorContext {</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 392</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> AdaptorContext context;</pre></td></tr>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 394</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">public</span> WrapperAdaptorContext(AdaptorContext context) {</pre></td></tr>
-<tr> <td class="numLineCover"> 395</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.context = context;</pre></td></tr>
-<tr> <td class="numLineCover"> 396</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> DocId pushNamedResources(Map<DocId, Acl> resources,</pre></td></tr>
+<tr> <td class="numLine"> 394</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> PushErrorHandler handler) <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
+<tr> <td class="numLineCover"> 395</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> pusher.pushNamedResources(resources, handler);</span></pre></td></tr>
+<tr> <td class="numLine"> 396</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 397</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 398</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 399</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Config getConfig() {</pre></td></tr>
-<tr> <td class="numLineCover"> 400</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getConfig();</span></pre></td></tr>
-<tr> <td class="numLine"> 401</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 402</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 403</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 404</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher getDocIdPusher() {</pre></td></tr>
-<tr> <td class="numLineCover"> 405</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getDocIdPusher();</span></pre></td></tr>
-<tr> <td class="numLine"> 406</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 407</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 408</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 409</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdEncoder getDocIdEncoder() {</pre></td></tr>
-<tr> <td class="numLineCover"> 410</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getDocIdEncoder();</span></pre></td></tr>
-<tr> <td class="numLine"> 411</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 412</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 413</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 414</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> addStatusSource(StatusSource source) {</pre></td></tr>
-<tr> <td class="numLineCover"> 415</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> context.addStatusSource(source);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 416</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 417</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 418</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 419</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> removeStatusSource(StatusSource source) {</pre></td></tr>
-<tr> <td class="numLineCover"> 420</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> context.removeStatusSource(source);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 421</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 422</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 423</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 424</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsFullErrorHandler(GetDocIdsErrorHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 425</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> context.setGetDocIdsFullErrorHandler(handler);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 426</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 427</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 428</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 429</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsFullErrorHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 430</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getGetDocIdsFullErrorHandler();</span></pre></td></tr>
-<tr> <td class="numLine"> 431</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 432</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 433</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 434</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsIncrementalErrorHandler(</pre></td></tr>
-<tr> <td class="numLine"> 435</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> GetDocIdsErrorHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 436</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> context.setGetDocIdsIncrementalErrorHandler(handler);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 437</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 438</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 439</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 440</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsIncrementalErrorHandler() {</pre></td></tr>
-<tr> <td class="numLineCover"> 441</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getGetDocIdsIncrementalErrorHandler();</span></pre></td></tr>
-<tr> <td class="numLine"> 442</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 443</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 444</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 445</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> SensitiveValueDecoder getSensitiveValueDecoder() {</pre></td></tr>
-<tr> <td class="numLineCover"> 446</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getSensitiveValueDecoder();</span></pre></td></tr>
-<tr> <td class="numLine"> 447</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 448</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 449</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 450</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> HttpContext createHttpContext(String path, HttpHandler handler) {</pre></td></tr>
-<tr> <td class="numLineCover"> 451</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.createHttpContext(path, handler);</span></pre></td></tr>
-<tr> <td class="numLine"> 452</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 453</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 454</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 455</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> Session getUserSession(HttpExchange ex, <span class="keyword">boolean</span> create) {</pre></td></tr>
-<tr> <td class="numLineCover"> 456</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getUserSession(ex, create);</span></pre></td></tr>
-<tr> <td class="numLine"> 457</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 458</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 459</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 398</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 399</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> WrapperAdaptorContext <span class="keyword">implements</span> AdaptorContext {</pre></td></tr>
+<tr> <td class="numLine"> 400</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> AdaptorContext context;</pre></td></tr>
+<tr> <td class="numLine"> 401</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 402</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">public</span> WrapperAdaptorContext(AdaptorContext context) {</pre></td></tr>
+<tr> <td class="numLineCover"> 403</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.context = context;</pre></td></tr>
+<tr> <td class="numLineCover"> 404</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 405</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 406</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 407</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Config getConfig() {</pre></td></tr>
+<tr> <td class="numLineCover"> 408</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getConfig();</span></pre></td></tr>
+<tr> <td class="numLine"> 409</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 410</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 411</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 412</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdPusher getDocIdPusher() {</pre></td></tr>
+<tr> <td class="numLineCover"> 413</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getDocIdPusher();</span></pre></td></tr>
+<tr> <td class="numLine"> 414</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 415</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 416</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 417</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> DocIdEncoder getDocIdEncoder() {</pre></td></tr>
+<tr> <td class="numLineCover"> 418</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getDocIdEncoder();</span></pre></td></tr>
+<tr> <td class="numLine"> 419</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 420</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 421</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 422</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> addStatusSource(StatusSource source) {</pre></td></tr>
+<tr> <td class="numLineCover"> 423</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> context.addStatusSource(source);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 424</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 425</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 426</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 427</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> removeStatusSource(StatusSource source) {</pre></td></tr>
+<tr> <td class="numLineCover"> 428</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> context.removeStatusSource(source);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 429</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 430</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 431</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 432</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsFullErrorHandler(GetDocIdsErrorHandler handler) {</pre></td></tr>
+<tr> <td class="numLineCover"> 433</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> context.setGetDocIdsFullErrorHandler(handler);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 434</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 435</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 436</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 437</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsFullErrorHandler() {</pre></td></tr>
+<tr> <td class="numLineCover"> 438</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getGetDocIdsFullErrorHandler();</span></pre></td></tr>
+<tr> <td class="numLine"> 439</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 440</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 441</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 442</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setGetDocIdsIncrementalErrorHandler(</pre></td></tr>
+<tr> <td class="numLine"> 443</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> GetDocIdsErrorHandler handler) {</pre></td></tr>
+<tr> <td class="numLineCover"> 444</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> context.setGetDocIdsIncrementalErrorHandler(handler);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 445</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 446</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 447</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 448</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> GetDocIdsErrorHandler getGetDocIdsIncrementalErrorHandler() {</pre></td></tr>
+<tr> <td class="numLineCover"> 449</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getGetDocIdsIncrementalErrorHandler();</span></pre></td></tr>
+<tr> <td class="numLine"> 450</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 451</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 452</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 453</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> SensitiveValueDecoder getSensitiveValueDecoder() {</pre></td></tr>
+<tr> <td class="numLineCover"> 454</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getSensitiveValueDecoder();</span></pre></td></tr>
+<tr> <td class="numLine"> 455</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 456</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 457</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 458</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> HttpContext createHttpContext(String path, HttpHandler handler) {</pre></td></tr>
+<tr> <td class="numLineCover"> 459</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.createHttpContext(path, handler);</span></pre></td></tr>
+<tr> <td class="numLine"> 460</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 461</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 462</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 463</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> Session getUserSession(HttpExchange ex, <span class="keyword">boolean</span> create) {</pre></td></tr>
+<tr> <td class="numLineCover"> 464</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> context.getUserSession(ex, create);</span></pre></td></tr>
+<tr> <td class="numLine"> 465</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 466</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 467</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.examples.AdaptorWithCrawlTimeMetadataTemplate.html b/coverage/com.google.enterprise.adaptor.examples.AdaptorWithCrawlTimeMetadataTemplate.html
index 2d1ce98..ea45058 100644
--- a/coverage/com.google.enterprise.adaptor.examples.AdaptorWithCrawlTimeMetadataTemplate.html
+++ b/coverage/com.google.enterprise.adaptor.examples.AdaptorWithCrawlTimeMetadataTemplate.html
@@ -150,7 +150,7 @@
<tr> <td class="numLineCover"> 75</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.setAcl(makeAclFor7007Parent());</span></pre></td></tr>
<tr> <td class="numLine"> 76</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Add custom meta items.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.addMetadata(<span class="string">"my-day"</span>, <span class="string">"parent's day"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.addMetadata(<span class="string">"math is fun"</span>, <span class="string">"2 + 7 = 11"</span>);</span></pre></td></tr>
<tr> <td class="numLineCover"> 78</td> <td class="nbHitsUncovered"><a title="Line 78: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 78: Conditional coverage 0% (0/2)."> } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="string">"8008"</span>.equals(id.getUniqueId())) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 79</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> str = <span class="string">"Document 8008 says hello and banana strawberry"</span>;</span></pre></td></tr>
<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
diff --git a/coverage/com.google.enterprise.adaptor.examples.DbAdaptorTemplate.html b/coverage/com.google.enterprise.adaptor.examples.DbAdaptorTemplate.html
index 55a1cd8..ba45b81 100644
--- a/coverage/com.google.enterprise.adaptor.examples.DbAdaptorTemplate.html
+++ b/coverage/com.google.enterprise.adaptor.examples.DbAdaptorTemplate.html
@@ -133,292 +133,294 @@
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> init(AdaptorContext context) <span class="keyword">throws</span> Exception {</pre></td></tr>
<tr> <td class="numLineCover"> 60</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Class.forName(<span class="string">"org.gjt.mm.mysql.Driver"</span>);</span></pre></td></tr>
<tr> <td class="numLineCover"> 61</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"loaded driver"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> maxIdsPerFeedFile = context.getConfig().getFeedMaxUrls();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> dbname = context.getConfig().getValue(<span class="string">"db.name"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 64</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tablename = context.getConfig().getValue(<span class="string">"db.tablename"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 65</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> maxIdsPerFeedFile</span></pre></td></tr>
+<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = Integer.parseInt(context.getConfig().getValue(<span class="string">"feed.maxUrls"</span>));</pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> dbname = context.getConfig().getValue(<span class="string">"db.name"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 65</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tablename = context.getConfig().getValue(<span class="string">"db.tablename"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 66</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/** Get all doc ids from database. */</span></pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="comment">/** Get all doc ids from database. */</span></pre></td></tr>
<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocIds(DocIdPusher pusher) <span class="keyword">throws</span> IOException,</pre></td></tr>
-<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 71</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> BufferingPusher outstream = <span class="keyword">new</span> BufferingPusher(pusher);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 72</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Connection conn = <span class="keyword">null</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 73</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StatementAndResult statementAndResult = <span class="keyword">null</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 74</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> conn = makeNewConnection();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> statementAndResult = getStreamFromDb(conn, <span class="string">"select id from "</span> + tablename);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSet rs = statementAndResult.resultSet;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 78</td> <td class="nbHitsUncovered"><a title="Line 78: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 78: Conditional coverage 0% (0/2)."> <span class="keyword">while</span> (rs.next()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 79</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> DocId id = <span class="keyword">new</span> DocId(<span class="string">""</span> + rs.getInt(<span class="string">"id"</span>));</span></pre></td></tr>
-<tr> <td class="numLineCover"> 80</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> outstream.add(id);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 81</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 82</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException problem) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 83</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.SEVERE, <span class="string">"failed getting ids"</span>, problem);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 84</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(problem);</span></pre></td></tr>
-<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 86</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tryClosingStatementAndResult(statementAndResult);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tryClosingConnection(conn);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 88</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 89</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> outstream.forcePush();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 90</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/** Gives the bytes of a document referenced with id. */</span></pre></td></tr>
-<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocContent(Request req, Response resp) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 95</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> DocId id = req.getDocId();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 96</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Connection conn = <span class="keyword">null</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StatementAndResult statementAndResult = <span class="keyword">null</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocIds(DocIdPusher pusher) <span class="keyword">throws</span> IOException,</pre></td></tr>
+<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> InterruptedException {</pre></td></tr>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> BufferingPusher outstream = <span class="keyword">new</span> BufferingPusher(pusher);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Connection conn = <span class="keyword">null</span>;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StatementAndResult statementAndResult = <span class="keyword">null</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 75</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 99</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> conn = makeNewConnection();</span></pre></td></tr>
-<tr> <td class="numLine"> 100</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">int</span> primaryKey;</pre></td></tr>
-<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> primaryKey = Integer.parseInt(id.getUniqueId());</span></pre></td></tr>
-<tr> <td class="numLineCover"> 103</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NumberFormatException nfe) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 104</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
-<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 107</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String query = <span class="string">"select * from "</span> + tablename + <span class="string">" where id = "</span> + primaryKey;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 108</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> statementAndResult = getCollectionFromDb(conn, query);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 109</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSet rs = statementAndResult.resultSet;</span></pre></td></tr>
-<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// First handle cases with no data to return.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 112</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">boolean</span> hasResult = rs.next();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 113</td> <td class="nbHitsUncovered"><a title="Line 113: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 113: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!hasResult) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 114</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
-<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
-<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 117</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSetMetaData rsMetaData = rs.getMetaData();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 118</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> numberOfColumns = rsMetaData.getColumnCount();</span></pre></td></tr>
-<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// If we have data then create lines of resulting document.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 121</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StringBuilder line1 = <span class="keyword">new</span> StringBuilder();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 122</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StringBuilder line2 = <span class="keyword">new</span> StringBuilder();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 123</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StringBuilder line3 = <span class="keyword">new</span> StringBuilder();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 124</td> <td class="nbHitsUncovered"><a title="Line 124: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 124: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 1; i < (numberOfColumns + 1); i++) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 125</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String tableName = rsMetaData.getTableName(i);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 126</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String columnName = rsMetaData.getColumnName(i);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 127</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Object value = rs.getObject(i);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 128</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line1.append(<span class="string">","</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 129</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line1.append(makeIntoCsvField(tableName));</span></pre></td></tr>
-<tr> <td class="numLineCover"> 130</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line2.append(<span class="string">","</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 131</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line2.append(makeIntoCsvField(columnName));</span></pre></td></tr>
-<tr> <td class="numLineCover"> 132</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line3.append(<span class="string">","</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 133</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line3.append(makeIntoCsvField(<span class="string">""</span> + value));</span></pre></td></tr>
-<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 135</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String document = line1.substring(1) + <span class="string">"\n"</span></span></pre></td></tr>
-<tr> <td class="numLine"> 136</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + line2.substring(1) + <span class="string">"\n"</span> + line3.substring(1) + <span class="string">"\n"</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 137</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.setContentType(<span class="string">"text/plain"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 138</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.getOutputStream().write(document.getBytes(encoding));</span></pre></td></tr>
-<tr> <td class="numLineCover"> 139</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException problem) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 140</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.SEVERE, <span class="string">"failed getting content"</span>, problem);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 141</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"retrieval error"</span>, problem);</span></pre></td></tr>
-<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> conn = makeNewConnection();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> statementAndResult = getStreamFromDb(conn, <span class="string">"select id from "</span> + tablename);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 78</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSet rs = statementAndResult.resultSet;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 79</td> <td class="nbHitsUncovered"><a title="Line 79: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 79: Conditional coverage 0% (0/2)."> <span class="keyword">while</span> (rs.next()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 80</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> DocId id = <span class="keyword">new</span> DocId(<span class="string">""</span> + rs.getInt(<span class="string">"id"</span>));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 81</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> outstream.add(id);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 82</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 83</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException problem) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 84</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.SEVERE, <span class="string">"failed getting ids"</span>, problem);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 85</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(problem);</span></pre></td></tr>
+<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 143</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tryClosingStatementAndResult(statementAndResult);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 144</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tryClosingConnection(conn);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 145</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 146</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 147</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tryClosingStatementAndResult(statementAndResult);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tryClosingConnection(conn);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 90</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> outstream.forcePush();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Gives the bytes of a document referenced with id. */</span></pre></td></tr>
+<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocContent(Request req, Response resp) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 96</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> DocId id = req.getDocId();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Connection conn = <span class="keyword">null</span>;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 98</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StatementAndResult statementAndResult = <span class="keyword">null</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> conn = makeNewConnection();</span></pre></td></tr>
+<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> primaryKey;</pre></td></tr>
+<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 103</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> primaryKey = Integer.parseInt(id.getUniqueId());</span></pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NumberFormatException nfe) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 105</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
+<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 107</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 108</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String query = <span class="string">"select * from "</span> + tablename + <span class="string">" where id = "</span> + primaryKey;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 109</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> statementAndResult = getCollectionFromDb(conn, query);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 110</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSet rs = statementAndResult.resultSet;</span></pre></td></tr>
+<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 112</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// First handle cases with no data to return.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 113</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">boolean</span> hasResult = rs.next();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 114</td> <td class="nbHitsUncovered"><a title="Line 114: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 114: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!hasResult) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 115</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
+<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">return</span>;</pre></td></tr>
+<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 118</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSetMetaData rsMetaData = rs.getMetaData();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 119</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> numberOfColumns = rsMetaData.getColumnCount();</span></pre></td></tr>
+<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// If we have data then create lines of resulting document.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StringBuilder line1 = <span class="keyword">new</span> StringBuilder();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 123</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StringBuilder line2 = <span class="keyword">new</span> StringBuilder();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 124</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StringBuilder line3 = <span class="keyword">new</span> StringBuilder();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 125</td> <td class="nbHitsUncovered"><a title="Line 125: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 125: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 1; i < (numberOfColumns + 1); i++) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 126</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String tableName = rsMetaData.getTableName(i);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 127</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String columnName = rsMetaData.getColumnName(i);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 128</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Object value = rs.getObject(i);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line1.append(<span class="string">","</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 130</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line1.append(makeIntoCsvField(tableName));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 131</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line2.append(<span class="string">","</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 132</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line2.append(makeIntoCsvField(columnName));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 133</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line3.append(<span class="string">","</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 134</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> line3.append(makeIntoCsvField(<span class="string">""</span> + value));</span></pre></td></tr>
+<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 136</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String document = line1.substring(1) + <span class="string">"\n"</span></span></pre></td></tr>
+<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + line2.substring(1) + <span class="string">"\n"</span> + line3.substring(1) + <span class="string">"\n"</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 138</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.setContentType(<span class="string">"text/plain"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 139</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.getOutputStream().write(document.getBytes(encoding));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 140</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException problem) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 141</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.SEVERE, <span class="string">"failed getting content"</span>, problem);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"retrieval error"</span>, problem);</span></pre></td></tr>
+<tr> <td class="numLine"> 143</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 144</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tryClosingStatementAndResult(statementAndResult);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 145</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tryClosingConnection(conn);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> main(String[] args) {</pre></td></tr>
-<tr> <td class="numLineCover"> 149</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> AbstractAdaptor.main(<span class="keyword">new</span> DbAdaptorTemplate(), args);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 150</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 151</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 150</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> AbstractAdaptor.main(<span class="keyword">new</span> DbAdaptorTemplate(), args);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 151</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> StatementAndResult {</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 153</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> Statement statement;</pre></td></tr>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> StatementAndResult {</pre></td></tr>
<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> Statement statement;</pre></td></tr>
+<tr> <td class="numLine"> 155</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> ResultSet resultSet;</pre></td></tr>
-<tr> <td class="numLineCover"> 155</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StatementAndResult(Statement st, ResultSet rs) { </span></pre></td></tr>
-<tr> <td class="numLineCover"> 156</td> <td class="nbHitsUncovered"><a title="Line 156: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 156: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == st) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 157</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
-<tr> <td class="numLine"> 158</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 156</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> StatementAndResult(Statement st, ResultSet rs) { </span></pre></td></tr>
+<tr> <td class="numLineCover"> 157</td> <td class="nbHitsUncovered"><a title="Line 157: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 157: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == st) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 158</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
+<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 159</td> <td class="nbHitsUncovered"><a title="Line 159: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 159: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == rs) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
-<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 160</td> <td class="nbHitsUncovered"><a title="Line 160: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 160: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == rs) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 161</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</span></pre></td></tr>
+<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 162</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> statement = st;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 163</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resultSet = rs;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 164</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 163</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> statement = st;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 164</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resultSet = rs;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 165</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> Connection makeNewConnection() <span class="keyword">throws</span> SQLException {</pre></td></tr>
-<tr> <td class="numLineCover"> 168</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String url = <span class="string">"jdbc:mysql://127.0.0.1/"</span> + dbname;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 169</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"about to connect"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Connection conn = DriverManager.getConnection(url, <span class="string">"root"</span>, <span class="string">"test"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 171</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"connected"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 172</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> conn;</span></pre></td></tr>
-<tr> <td class="numLine"> 173</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 169</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String url = <span class="string">"jdbc:mysql://127.0.0.1/"</span> + dbname;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"about to connect"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 171</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Connection conn = DriverManager.getConnection(url, <span class="string">"root"</span>, <span class="string">"test"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 172</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"connected"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 173</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> conn;</span></pre></td></tr>
<tr> <td class="numLine"> 174</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> StatementAndResult getCollectionFromDb(Connection conn,</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 176</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> StatementAndResult getCollectionFromDb(Connection conn,</pre></td></tr>
+<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> String query) <span class="keyword">throws</span> SQLException {</pre></td></tr>
-<tr> <td class="numLineCover"> 177</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Statement st = conn.createStatement();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 178</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"about to query: "</span> + query);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 179</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSet rs = st.executeQuery(query);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 180</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"queried"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 181</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> StatementAndResult(st, rs); </span></pre></td></tr>
-<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 178</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Statement st = conn.createStatement();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 179</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"about to query: "</span> + query);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 180</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSet rs = st.executeQuery(query);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"queried"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 182</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> StatementAndResult(st, rs); </span></pre></td></tr>
<tr> <td class="numLine"> 183</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 184</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> StatementAndResult getStreamFromDb(Connection conn,</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 185</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> StatementAndResult getStreamFromDb(Connection conn,</pre></td></tr>
+<tr> <td class="numLine"> 186</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> String query) <span class="keyword">throws</span> SQLException {</pre></td></tr>
-<tr> <td class="numLineCover"> 186</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Statement st = conn.createStatement(</span></pre></td></tr>
-<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/* 1st streaming flag */</span> java.sql.ResultSet.TYPE_FORWARD_ONLY,</pre></td></tr>
+<tr> <td class="numLineCover"> 187</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Statement st = conn.createStatement(</span></pre></td></tr>
<tr> <td class="numLine"> 188</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/* 1st streaming flag */</span> java.sql.ResultSet.TYPE_FORWARD_ONLY,</pre></td></tr>
+<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/* 2nd streaming flag */</span> java.sql.ResultSet.CONCUR_READ_ONLY);</pre></td></tr>
-<tr> <td class="numLineCover"> 189</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> st.setFetchSize(<span class="comment">/*3rd streaming flag*/</span> Integer.MIN_VALUE);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 190</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"about to query for stream: "</span> + query);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 191</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSet rs = st.executeQuery(query);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 192</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"queried for stream"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 193</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> StatementAndResult(st, rs); </span></pre></td></tr>
-<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 190</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> st.setFetchSize(<span class="comment">/*3rd streaming flag*/</span> Integer.MIN_VALUE);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 191</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"about to query for stream: "</span> + query);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 192</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ResultSet rs = st.executeQuery(query);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 193</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"queried for stream"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 194</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> StatementAndResult(st, rs); </span></pre></td></tr>
<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+ <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> tryClosingStatementAndResult(StatementAndResult strs) {</pre></td></tr>
-<tr> <td class="numLineCover"> 197</td> <td class="nbHitsUncovered"><a title="Line 197: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 197: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> != strs) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 198</td> <td class="nbHitsUncovered"><a title="Line 198: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 198: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> != strs) {</a></span></pre></td></tr>
+<tr> <td class="numLine"> 199</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 199</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> strs.resultSet.close();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 200</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 201</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"result set close failed"</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 202</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 200</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> strs.resultSet.close();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 201</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"result set close failed"</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 204</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> strs.statement.close();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 205</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 206</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"statement close failed"</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 207</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 205</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> strs.statement.close();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 207</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"statement close failed"</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 208</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 209</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 209</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 210</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 210</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 211</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 212</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> tryClosingConnection(Connection conn) {</pre></td></tr>
-<tr> <td class="numLineCover"> 212</td> <td class="nbHitsUncovered"><a title="Line 212: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 212: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> != conn) {</a></span></pre></td></tr>
-<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 213</td> <td class="nbHitsUncovered"><a title="Line 213: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 213: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> != conn) {</a></span></pre></td></tr>
+<tr> <td class="numLine"> 214</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 214</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> conn.close();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 215</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 216</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"connection close failed"</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 217</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 215</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> conn.close();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 216</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SQLException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 217</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.log(Level.WARNING, <span class="string">"connection close failed"</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 218</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 219</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 219</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 220</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> String makeIntoCsvField(String s) {</pre></td></tr>
-<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/*</span></pre></td></tr>
-<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Fields that contain a special character (comma, newline,</span></pre></td></tr>
-<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * or double quote), must be enclosed in double quotes.</span></pre></td></tr>
-<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * <...> If a field's value contains a double quote character</span></pre></td></tr>
-<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * it is escaped by placing another double quote character next to it.</span></pre></td></tr>
-<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 228</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String doubleQuote = <span class="string">"\""</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 229</td> <td class="nbHitsUncovered"><a title="Line 229: Conditional coverage 0% (0/6) [each condition: 0%, 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 229: Conditional coverage 0% (0/6) [each condition: 0%, 0%, 0%]."> <span class="keyword">boolean</span> containsSpecialChar = s.contains(<span class="string">","</span>)</a></span></pre></td></tr>
-<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> || s.contains(<span class="string">"\n"</span>) || s.contains(doubleQuote);</pre></td></tr>
-<tr> <td class="numLineCover"> 231</td> <td class="nbHitsUncovered"><a title="Line 231: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 231: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (containsSpecialChar) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 232</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> s = s.replace(doubleQuote, doubleQuote + doubleQuote);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 233</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> s = doubleQuote + s + doubleQuote;</span></pre></td></tr>
-<tr> <td class="numLine"> 234</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 235</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> s;</span></pre></td></tr>
-<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * Mechanism that accepts stream of DocId instances, bufferes them,</span></pre></td></tr>
-<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * and sends them when it has accumulated maximum allowed amount per</span></pre></td></tr>
-<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> * feed file.</span></pre></td></tr>
-<tr> <td class="numLine"> 242</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 243</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> <span class="keyword">class</span> BufferingPusher {</span></pre></td></tr>
-<tr> <td class="numLine"> 244</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> DocIdPusher wrapped;</pre></td></tr>
-<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> ArrayList<DocId> saved;</pre></td></tr>
-<tr> <td class="numLineCover"> 246</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> BufferingPusher(DocIdPusher underlying) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 247</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> wrapped = underlying;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 248</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> saved = <span class="keyword">new</span> ArrayList<DocId>(maxIdsPerFeedFile);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 249</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">void</span> add(DocId id) <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 251</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> saved.add(id);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 252</td> <td class="nbHitsUncovered"><a title="Line 252: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 252: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (saved.size() >= maxIdsPerFeedFile) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 253</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> forcePush();</span></pre></td></tr>
-<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 255</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 256</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">void</span> forcePush() <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 257</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> wrapped.pushDocIds(saved);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 258</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"sent "</span> + saved.size() + <span class="string">" doc ids to pusher"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 259</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> saved.clear();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 260</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">protected</span> <span class="keyword">void</span> finalize() <span class="keyword">throws</span> Throwable {</pre></td></tr>
-<tr> <td class="numLineCover"> 262</td> <td class="nbHitsUncovered"><a title="Line 262: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 262: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (0 != saved.size()) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 263</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.severe(<span class="string">"still have saved ids that weren't sent"</span>);</span></pre></td></tr>
-<tr> <td class="numLine"> 264</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 265</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 266</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 222</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> String makeIntoCsvField(String s) {</pre></td></tr>
+<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/*</span></pre></td></tr>
+<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Fields that contain a special character (comma, newline,</span></pre></td></tr>
+<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * or double quote), must be enclosed in double quotes.</span></pre></td></tr>
+<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <...> If a field's value contains a double quote character</span></pre></td></tr>
+<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * it is escaped by placing another double quote character next to it.</span></pre></td></tr>
+<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 229</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String doubleQuote = <span class="string">"\""</span>;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 230</td> <td class="nbHitsUncovered"><a title="Line 230: Conditional coverage 0% (0/6) [each condition: 0%, 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 230: Conditional coverage 0% (0/6) [each condition: 0%, 0%, 0%]."> <span class="keyword">boolean</span> containsSpecialChar = s.contains(<span class="string">","</span>)</a></span></pre></td></tr>
+<tr> <td class="numLine"> 231</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> || s.contains(<span class="string">"\n"</span>) || s.contains(doubleQuote);</pre></td></tr>
+<tr> <td class="numLineCover"> 232</td> <td class="nbHitsUncovered"><a title="Line 232: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 232: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (containsSpecialChar) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 233</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> s = s.replace(doubleQuote, doubleQuote + doubleQuote);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 234</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> s = doubleQuote + s + doubleQuote;</span></pre></td></tr>
+<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 236</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> s;</span></pre></td></tr>
+<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Mechanism that accepts stream of DocId instances, bufferes them,</span></pre></td></tr>
+<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * and sends them when it has accumulated maximum allowed amount per</span></pre></td></tr>
+<tr> <td class="numLine"> 242</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * feed file.</span></pre></td></tr>
+<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 244</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> <span class="keyword">class</span> BufferingPusher {</span></pre></td></tr>
+<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> DocIdPusher wrapped;</pre></td></tr>
+<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> ArrayList<DocId> saved;</pre></td></tr>
+<tr> <td class="numLineCover"> 247</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> BufferingPusher(DocIdPusher underlying) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 248</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> wrapped = underlying;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 249</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> saved = <span class="keyword">new</span> ArrayList<DocId>(maxIdsPerFeedFile);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 250</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">void</span> add(DocId id) <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
+<tr> <td class="numLineCover"> 252</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> saved.add(id);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 253</td> <td class="nbHitsUncovered"><a title="Line 253: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 253: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (saved.size() >= maxIdsPerFeedFile) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 254</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> forcePush();</span></pre></td></tr>
+<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 256</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">void</span> forcePush() <span class="keyword">throws</span> InterruptedException {</pre></td></tr>
+<tr> <td class="numLineCover"> 258</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> wrapped.pushDocIds(saved);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.fine(<span class="string">"sent "</span> + saved.size() + <span class="string">" doc ids to pusher"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 260</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> saved.clear();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 261</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">protected</span> <span class="keyword">void</span> finalize() <span class="keyword">throws</span> Throwable {</pre></td></tr>
+<tr> <td class="numLineCover"> 263</td> <td class="nbHitsUncovered"><a title="Line 263: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 263: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (0 != saved.size()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 264</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.severe(<span class="string">"still have saved ids that weren't sent"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 265</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 266</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 268</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.examples.FileSystemAdaptor.html b/coverage/com.google.enterprise.adaptor.examples.FileSystemAdaptor.html
index 6fb73ac..7cd62bd 100644
--- a/coverage/com.google.enterprise.adaptor.examples.FileSystemAdaptor.html
+++ b/coverage/com.google.enterprise.adaptor.examples.FileSystemAdaptor.html
@@ -12,7 +12,7 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.examples.FileSystemAdaptor.html">FileSystemAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">43</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/43</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/10</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.0;</span>3</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.examples.FileSystemAdaptor.html">FileSystemAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">42</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/42</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/10</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.0;</span>3</td></tr>
</table>
<div class="separator"> </div>
@@ -106,111 +106,106 @@
<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// adaptor.</span></pre></td></tr>
<tr> <td class="numLineCover"> 46</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> config.addKey(<span class="string">"filesystemadaptor.src"</span>, <span class="string">"."</span>);</span></pre></td></tr>
-<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Change the default to automatically provide unzipped zip contents to the</span></pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// GSA.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 49</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> config.overrideKey(<span class="string">"adaptor.autoUnzip"</span>, <span class="string">"true"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 50</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> init(AdaptorContext context) <span class="keyword">throws</span> Exception {</pre></td></tr>
-<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Process configuration.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 55</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String source = context.getConfig().getValue(<span class="string">"filesystemadaptor.src"</span>);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> serveDir = <span class="keyword">new</span> File(source).getCanonicalFile();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 57</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String source = context.getConfig().getValue(<span class="string">"filesystemadaptor.src"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> serveDir = <span class="keyword">new</span> File(source).getCanonicalFile();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 59</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 56</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 60</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 57</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocIds(DocIdPusher pusher) <span class="keyword">throws</span> IOException,</pre></td></tr>
-<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 58</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> InterruptedException {</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ArrayList<DocId> mockDocIds = <span class="keyword">new</span> ArrayList<DocId>();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 63</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String parent = serveDir.toString();</span></pre></td></tr>
-<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ArrayList<DocId> mockDocIds = <span class="keyword">new</span> ArrayList<DocId>();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String parent = serveDir.toString();</span></pre></td></tr>
+<tr> <td class="numLine"> 61</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 65</td> <td class="nbHitsUncovered"><a title="Line 65: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 65: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (File file : <span class="keyword">new</span> RecursiveFileIterator(serveDir)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String name = file.toString();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 67</td> <td class="nbHitsUncovered"><a title="Line 67: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 67: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!name.startsWith(parent)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 68</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(</span></pre></td></tr>
-<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsUncovered"><a title="Line 62: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 62: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (File file : <span class="keyword">new</span> RecursiveFileIterator(serveDir)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String name = file.toString();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 64</td> <td class="nbHitsUncovered"><a title="Line 64: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 64: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!name.startsWith(parent)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 65</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalStateException(</span></pre></td></tr>
+<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="string">"Internal problem: the file's path does not begin with parent."</span>);</pre></td></tr>
-<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// +1 for slash</span></pre></td></tr>
-<tr> <td class="numLineCover"> 72</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> name = name.substring(parent.length() + 1);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 73</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> mockDocIds.add(<span class="keyword">new</span> DocId(name));</span></pre></td></tr>
-<tr> <td class="numLineCover"> 74</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (RecursiveFileIterator.WrappedIOException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> ex.getCause();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 78</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> pusher.pushDocIds(mockDocIds);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 79</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> name = name.substring(parent.length() + 1);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 70</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> mockDocIds.add(<span class="keyword">new</span> DocId(name));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 71</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (RecursiveFileIterator.WrappedIOException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> ex.getCause();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> pusher.pushDocIds(mockDocIds);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocContent(Request req, Response resp) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 83</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> DocId id = req.getDocId();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 84</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> File file = <span class="keyword">new</span> File(serveDir, id.getUniqueId()).getCanonicalFile();</span></pre></td></tr>
-<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 80</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> DocId id = req.getDocId();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 81</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> File file = <span class="keyword">new</span> File(serveDir, id.getUniqueId()).getCanonicalFile();</span></pre></td></tr>
+<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// The DocId provided by Request.getDocId() MUST NOT be trusted. Here we</span></pre></td></tr>
-<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// try to verify that this file is allowed to be served.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsUncovered"><a title="Line 87: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 87: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!isFileDescendantOfServeDir(file)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 88</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 89</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 84</td> <td class="nbHitsUncovered"><a title="Line 84: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 84: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!isFileDescendantOfServeDir(file)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 85</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> InputStream input;</pre></td></tr>
-<tr> <td class="numLine"> 92</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 93</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> input = <span class="keyword">new</span> FileInputStream(file);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 94</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (FileNotFoundException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 95</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 96</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 90</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> input = <span class="keyword">new</span> FileInputStream(file);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (FileNotFoundException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 92</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> resp.respondNotFound();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 93</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 94</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 99</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> IOHelper.copyStream(input, resp.getOutputStream());</span></pre></td></tr>
-<tr> <td class="numLine"> 100</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 96</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> IOHelper.copyStream(input, resp.getOutputStream());</span></pre></td></tr>
+<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">finally</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 101</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> input.close();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLineCover"> 103</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 98</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> input.close();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 99</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">boolean</span> isFileDescendantOfServeDir(File file) {</pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsUncovered"><a title="Line 106: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 106: Conditional coverage 0% (0/2)."> <span class="keyword">while</span> (file != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 107</td> <td class="nbHitsUncovered"><a title="Line 107: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 107: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (file.equals(serveDir)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 108</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">true</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 103</td> <td class="nbHitsUncovered"><a title="Line 103: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 103: Conditional coverage 0% (0/2)."> <span class="keyword">while</span> (file != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsUncovered"><a title="Line 104: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 104: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (file.equals(serveDir)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 105</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">true</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 110</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> file = file.getParentFile();</span></pre></td></tr>
-<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 107</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> file = file.getParentFile();</span></pre></td></tr>
+<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 112</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
-<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 109</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 114</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 112</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Call default main for adaptors. */</span></pre></td></tr>
-<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> main(String[] args) {</pre></td></tr>
-<tr> <td class="numLineCover"> 117</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> AbstractAdaptor.main(<span class="keyword">new</span> FileSystemAdaptor(), args);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 118</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 114</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> AbstractAdaptor.main(<span class="keyword">new</span> FileSystemAdaptor(), args);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 115</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/com.google.enterprise.adaptor.experimental.Sim.html b/coverage/com.google.enterprise.adaptor.experimental.Sim.html
new file mode 100644
index 0000000..5769b5c
--- /dev/null
+++ b/coverage/com.google.enterprise.adaptor.experimental.Sim.html
@@ -0,0 +1,620 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<title>Coverage Report</title>
+<link title="Style" type="text/css" rel="stylesheet" href="css/main.css"/>
+<script type="text/javascript" src="js/popup.js"></script>
+</head>
+<body>
+<h5>Coverage Report - com.google.enterprise.adaptor.experimental.Sim</h5>
+<div class="separator"> </div>
+<table class="report">
+<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">140</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/140</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">54</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/54</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$BadFeed</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$Crawler</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">52</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/52</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">21</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/21</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$FeedAcceptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/10</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$HttpExchangeUploadInfo</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$Index</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$NoXmlFound</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+
+</table>
+<div class="separator"> </div>
+<table cellspacing="0" cellpadding="0" class="src">
+<tr> <td class="numLine"> 1</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Copyright 2013 Google Inc. All Rights Reserved.</span></pre></td></tr>
+<tr> <td class="numLine"> 2</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
+<tr> <td class="numLine"> 3</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span></pre></td></tr>
+<tr> <td class="numLine"> 4</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// you may not use this file except in compliance with the License.</span></pre></td></tr>
+<tr> <td class="numLine"> 5</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// You may obtain a copy of the License at</span></pre></td></tr>
+<tr> <td class="numLine"> 6</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
+<tr> <td class="numLine"> 7</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></pre></td></tr>
+<tr> <td class="numLine"> 8</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">//</span></pre></td></tr>
+<tr> <td class="numLine"> 9</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Unless required by applicable law or agreed to in writing, software</span></pre></td></tr>
+<tr> <td class="numLine"> 10</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span></pre></td></tr>
+<tr> <td class="numLine"> 11</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></pre></td></tr>
+<tr> <td class="numLine"> 12</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// See the License for the specific language governing permissions and</span></pre></td></tr>
+<tr> <td class="numLine"> 13</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// limitations under the License.</span></pre></td></tr>
+<tr> <td class="numLine"> 14</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">package</span> com.google.enterprise.adaptor.experimental;</pre></td></tr>
+<tr> <td class="numLine"> 15</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 16</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> com.google.enterprise.adaptor.IOHelper;</pre></td></tr>
+<tr> <td class="numLine"> 17</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 18</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> com.sun.net.httpserver.*;</pre></td></tr>
+<tr> <td class="numLine"> 19</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 20</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> org.apache.commons.fileupload.*;</pre></td></tr>
+<tr> <td class="numLine"> 21</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> org.w3c.dom.Document;</pre></td></tr>
+<tr> <td class="numLine"> 22</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> org.w3c.dom.Element;</pre></td></tr>
+<tr> <td class="numLine"> 23</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> org.w3c.dom.Node;</pre></td></tr>
+<tr> <td class="numLine"> 24</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> org.w3c.dom.NodeList;</pre></td></tr>
+<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> org.xml.sax.SAXException;</pre></td></tr>
+<tr> <td class="numLine"> 26</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 27</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.io.*;</pre></td></tr>
+<tr> <td class="numLine"> 28</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.net.*;</pre></td></tr>
+<tr> <td class="numLine"> 29</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.nio.charset.Charset;</pre></td></tr>
+<tr> <td class="numLine"> 30</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.*;</pre></td></tr>
+<tr> <td class="numLine"> 31</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.logging.Logger;</pre></td></tr>
+<tr> <td class="numLine"> 32</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> java.util.zip.GZIPInputStream;</pre></td></tr>
+<tr> <td class="numLine"> 33</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 34</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> javax.xml.parsers.DocumentBuilder;</pre></td></tr>
+<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> javax.xml.parsers.DocumentBuilderFactory;</pre></td></tr>
+<tr> <td class="numLine"> 36</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">import</span> javax.xml.parsers.ParserConfigurationException;</pre></td></tr>
+<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Accepts adaptor feeds and issues requests for documents. */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 39</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">public</span> <span class="keyword">class</span> Sim <span class="keyword">implements</span> Runnable {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 40</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> <span class="keyword">static</span> Logger log</span></pre></td></tr>
+<tr> <td class="numLine"> 41</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = Logger.getLogger(Sim.<span class="keyword">class</span>.getName());</pre></td></tr>
+<tr> <td class="numLineCover"> 42</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">static</span> <span class="keyword">final</span> Charset UTF8 = Charset.forName(<span class="string">"UTF-8"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 44</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> Index {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 45</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Set<URL> urls = <span class="keyword">new</span> HashSet<URL>();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 46</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Map<URL, <span class="keyword">byte</span>[]> content = <span class="keyword">new</span> HashMap<URL, <span class="keyword">byte</span>[]>();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 47</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Map<URL, String> type = <span class="keyword">new</span> HashMap<URL, String>(); <span class="comment">// could be null</span></span></pre></td></tr>
+<tr> <td class="numLineCover"> 48</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Map<URL, Map<String, String>> meta</span></pre></td></tr>
+<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = <span class="keyword">new</span> HashMap<URL, Map<String, String>>();</pre></td></tr>
+<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> Index index = <span class="keyword">new</span> Index(); <span class="comment">// contains contents and metadata</span></span></pre></td></tr>
+<tr> <td class="numLine"> 53</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 54</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> startFeedAcceptor() <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"starting feed acceptor"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> HttpServer server = HttpServer.create();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> useDefaultBacklog = -1;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 58</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> server.bind(<span class="keyword">new</span> InetSocketAddress(19900), useDefaultBacklog);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> server.createContext(<span class="string">"/xmlfeed"</span>, <span class="keyword">new</span> FeedAcceptor());</span></pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> server.start();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"started feed acceptor"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> startCrawler() {</pre></td></tr>
+<tr> <td class="numLineCover"> 65</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"starting crawler"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 66</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">new</span> Thread(<span class="keyword">new</span> Crawler()).start();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 67</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"started crawler"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 68</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 70</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+<tr> <td class="numLine"> 71</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> startFeedAcceptor();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ie) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"failed to start feed acceptor"</span>, ie);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> startCrawler();</span></pre></td></tr>
+<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// TODO: add serving</span></pre></td></tr>
+<tr> <td class="numLine"> 78</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// TODO: add stops to exit</span></pre></td></tr>
+<tr> <td class="numLineCover"> 79</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> main(String args[]) {</pre></td></tr>
+<tr> <td class="numLineCover"> 82</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">new</span> Sim().run(); </span></pre></td></tr>
+<tr> <td class="numLineCover"> 83</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 84</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Takes multipart POST with metadata-and-url xml feed. */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> <span class="keyword">class</span> FeedAcceptor <span class="keyword">implements</span> HttpHandler {</span></pre></td></tr>
+<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> handle(HttpExchange ex) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"in feed acceptor"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 92</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String requestMethod = ex.getRequestMethod();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 93</td> <td class="nbHitsUncovered"><a title="Line 93: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 93: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!<span class="string">"POST"</span>.equals(requestMethod)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 94</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"received non-post method: "</span> + requestMethod);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 95</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> respond(ex, HttpURLConnection.HTTP_BAD_METHOD,</span></pre></td></tr>
+<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"text/plain"</span>, <span class="string">"server accepts POST only"</span>.getBytes(UTF8));</pre></td></tr>
+<tr> <td class="numLine"> 97</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 98</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> URI req = com.google.enterprise.adaptor.HttpExchanges.getRequestUri(ex);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 99</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"received post on path: "</span> + req.getPath());</span></pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> processMultipartPost(ex); </span></pre></td></tr>
+<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 102</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 103</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 105</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> NoXmlFound <span class="keyword">extends</span> Exception {}</span></pre></td></tr>
+<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> BadFeed <span class="keyword">extends</span> Exception {</pre></td></tr>
+<tr> <td class="numLine"> 107</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> BadFeed(String emsg) {</pre></td></tr>
+<tr> <td class="numLineCover"> 108</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">super</span>(emsg);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 109</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 112</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Periodically acquires new content and metadata for each URL. */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 113</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> <span class="keyword">class</span> Crawler <span class="keyword">implements</span> Runnable {</span></pre></td></tr>
+<tr> <td class="numLine"> 114</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> Set<URL> dupIndexUrls() {</pre></td></tr>
+<tr> <td class="numLineCover"> 115</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">synchronized</span> (index.urls) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 116</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> HashSet<URL>(index.urls); </span></pre></td></tr>
+<tr> <td class="numLineCover"> 117</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 118</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> run() {</pre></td></tr>
+<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">for</span> (;;) {</pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"crawler about to hibernate"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 124</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.sleep(1000 * 20);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 125</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException terup) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 126</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"crawler awoken early"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 127</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 128</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"crawler is awake"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 129</td> <td class="nbHitsUncovered"><a title="Line 129: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 129: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (URL doc : dupIndexUrls()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 130</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> crawl(doc);</span></pre></td></tr>
+<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 135</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> crawl(URL doc) {</pre></td></tr>
+<tr> <td class="numLineCover"> 136</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"about to crawl: "</span> + doc);</span></pre></td></tr>
+<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 138</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> URLConnection con = doc.openConnection();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 139</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">byte</span> content[]</span></pre></td></tr>
+<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = IOHelper.readInputStreamToByteArray(con.getInputStream());</pre></td></tr>
+<tr> <td class="numLineCover"> 141</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> index.content.put(doc, content);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Map<String, List<String>> headers = con.getHeaderFields();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 143</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> List<String> ct = headers.get(<span class="string">"Content-type"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 144</td> <td class="nbHitsUncovered"><a title="Line 144: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 144: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> index.type.put(doc, (<span class="keyword">null</span> != ct && ct.size() > 0) ? ct.get(0) : <span class="keyword">null</span>);</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 145</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> index.meta.put(doc, parseMeta(headers.get(<span class="string">"X-gsa-external-metadata"</span>)));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsUncovered"><a title="Line 146: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 146: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (String k : headers.keySet()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"header: "</span> + k + <span class="string">":"</span> + headers.get(k));</span></pre></td></tr>
+<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 149</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"crawled: "</span> + doc);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 150</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ie) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 151</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"failed getting: "</span> + doc);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 152</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 153</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 155</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> Map<String, String> parseMeta(List<String> metadata) {</pre></td></tr>
+<tr> <td class="numLineCover"> 156</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Map<String, String> map = <span class="keyword">new</span> HashMap<String, String>();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 157</td> <td class="nbHitsUncovered"><a title="Line 157: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 157: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> != metadata) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 158</td> <td class="nbHitsUncovered"><a title="Line 158: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 158: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (String m : metadata) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 159</td> <td class="nbHitsUncovered"><a title="Line 159: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 159: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> != m) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 160</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> parseMeta(map, m);</span></pre></td></tr>
+<tr> <td class="numLine"> 161</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } </pre></td></tr>
+<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 164</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> map;</span></pre></td></tr>
+<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 166</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 167</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> parseMeta(Map<String, String> map, String metadatum) {</pre></td></tr>
+<tr> <td class="numLineCover"> 168</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String metadatums[] = metadatum.split(<span class="string">","</span>, 0);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 169</td> <td class="nbHitsUncovered"><a title="Line 169: Conditional coverage 0% (0/3)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 169: Conditional coverage 0% (0/3)."> <span class="keyword">switch</span> (metadatums.length) {</a></span></pre></td></tr>
+<tr> <td class="numLine"> 170</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> 0:</pre></td></tr>
+<tr> <td class="numLineCover"> 171</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">case</span> 1: <span class="comment">// really have single metadatum</span></pre></td></tr>
+<tr> <td class="numLineCover"> 173</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String m = metadatums[0];</span></pre></td></tr>
+<tr> <td class="numLineCover"> 174</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> splitPoint = m.indexOf(<span class="string">'='</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 175</td> <td class="nbHitsUncovered"><a title="Line 175: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 175: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (-1 == splitPoint) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 176</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"skipping metadatum: "</span> + m);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 177</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 178</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 179</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String key = m.substring(0, splitPoint);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 180</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String value = m.substring(splitPoint + 1);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> key = percentDecode(key);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 182</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> value = percentDecode(value);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 183</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"key: "</span> + key);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 184</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"value: "</span> + value);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 185</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> map.put(key, value);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 186</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">break</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 187</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">default</span>: <span class="comment">// have multiple pieces split by comma</span></pre></td></tr>
+<tr> <td class="numLineCover"> 188</td> <td class="nbHitsUncovered"><a title="Line 188: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 188: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (String p : metadatums) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 189</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> parseMeta(map, p);</span></pre></td></tr>
+<tr> <td class="numLine"> 190</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 191</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 192</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> processMultipartPost(HttpExchange ex) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 196</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> InputStream inStream = ex.getRequestBody();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 197</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String encoding = ex.getRequestHeaders().getFirst(<span class="string">"Content-encoding"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 198</td> <td class="nbHitsUncovered"><a title="Line 198: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 198: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> <span class="keyword">if</span> (<span class="keyword">null</span> != encoding && <span class="string">"gzip"</span>.equals(encoding.toLowerCase())) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 199</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> inStream = <span class="keyword">new</span> GZIPInputStream(inStream);</span></pre></td></tr>
+<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 201</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String lens = ex.getRequestHeaders().getFirst(<span class="string">"Content-Length"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsUncovered"><a title="Line 202: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 202: Conditional coverage 0% (0/2)."> <span class="keyword">int</span> len = (<span class="keyword">null</span> != lens) ? Integer.parseInt(lens) : 0;</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String ct = ex.getRequestHeaders().getFirst(<span class="string">"Content-Type"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 205</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String xml = extractFeedFromMultipartPost(inStream, len, ct);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> processXml(xml);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 207</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> respond(ex, HttpURLConnection.HTTP_OK,</span></pre></td></tr>
+<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"text/plain"</span>, <span class="string">"Success"</span>.getBytes(UTF8));</pre></td></tr>
+<tr> <td class="numLineCover"> 209</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (NoXmlFound nox) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 210</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"failed to find xml"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 211</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> respond(ex, HttpURLConnection.HTTP_BAD_REQUEST,</span></pre></td></tr>
+<tr> <td class="numLine"> 212</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"text/plain"</span>, <span class="string">"xml beginning not found"</span>.getBytes(UTF8));</pre></td></tr>
+<tr> <td class="numLineCover"> 213</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (SAXException saxe) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 214</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"sax error: "</span> + saxe.getMessage());</span></pre></td></tr>
+<tr> <td class="numLineCover"> 215</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> respond(ex, HttpURLConnection.HTTP_BAD_REQUEST,</span></pre></td></tr>
+<tr> <td class="numLine"> 216</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"text/plain"</span>, <span class="string">"sax not liking the xml"</span>.getBytes(UTF8));</pre></td></tr>
+<tr> <td class="numLineCover"> 217</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (ParserConfigurationException confige) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 218</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"parser error: "</span> + confige.getMessage());</span></pre></td></tr>
+<tr> <td class="numLineCover"> 219</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> respond(ex, HttpURLConnection.HTTP_BAD_REQUEST,</span></pre></td></tr>
+<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"text/plain"</span>, <span class="string">"parser error"</span>.getBytes(UTF8));</pre></td></tr>
+<tr> <td class="numLineCover"> 221</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (BadFeed bad) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 222</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.warning(<span class="string">"error in feed: "</span> + bad.getMessage());</span></pre></td></tr>
+<tr> <td class="numLineCover"> 223</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> respond(ex, HttpURLConnection.HTTP_BAD_REQUEST,</span></pre></td></tr>
+<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"text/plain"</span>, bad.getMessage().getBytes(UTF8));</pre></td></tr>
+<tr> <td class="numLineCover"> 225</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 226</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">void</span> processXml(String xml) <span class="keyword">throws</span> SAXException,</pre></td></tr>
+<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> ParserConfigurationException, BadFeed {</pre></td></tr>
+<tr> <td class="numLineCover"> 230</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Set<URL> tmpUrls = extractUrls(xml);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 231</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">synchronized</span> (index.urls) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 232</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> index.urls.addAll(tmpUrls);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 233</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 234</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> String extractFeedFromMultipartPost(</pre></td></tr>
+<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> InputStream in, <span class="keyword">int</span> len, String contentType) <span class="keyword">throws</span> NoXmlFound {</pre></td></tr>
+<tr> <td class="numLineCover"> 238</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> HttpExchangeUploadInfo uploadInfo</span></pre></td></tr>
+<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = <span class="keyword">new</span> HttpExchangeUploadInfo(in, len, contentType);</pre></td></tr>
+<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 241</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Map<String, <span class="keyword">byte</span>[]> parts = splitMultipartRequest(uploadInfo);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 242</td> <td class="nbHitsUncovered"><a title="Line 242: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 242: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (!parts.containsKey(<span class="string">"data"</span>)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 243</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NoXmlFound();</span></pre></td></tr>
+<tr> <td class="numLine"> 244</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 245</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> String(parts.get(<span class="string">"data"</span>), UTF8);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 246</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ie) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 247</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> NoXmlFound();</span></pre></td></tr>
+<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 249</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Find all record urls in Adaptor created XML metadata-and-url feed file. */</span></pre></td></tr>
+<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> Set<URL> extractUrls(String xml) <span class="keyword">throws</span> SAXException,</pre></td></tr>
+<tr> <td class="numLine"> 253</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> ParserConfigurationException, BadFeed {</pre></td></tr>
+<tr> <td class="numLineCover"> 254</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();</span></pre></td></tr>
+<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/* to avoid blowing up on doctype line:</span></pre></td></tr>
+<tr> <td class="numLine"> 256</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * http://stackoverflow.com/questions/155101/make-documentbuilder-parse-ignore-dtd-references */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 257</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> dbf.setValidating(<span class="keyword">false</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 258</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> dbf.setFeature(<span class="string">"http://xml.org/sax/features/namespaces"</span>, <span class="keyword">false</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> dbf.setFeature(<span class="string">"http://xml.org/sax/features/validation"</span>, <span class="keyword">false</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 260</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> dbf.setFeature(</span></pre></td></tr>
+<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"http://apache.org/xml/features/nonvalidating/load-dtd-grammar"</span>, <span class="keyword">false</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 262</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> dbf.setFeature(</span></pre></td></tr>
+<tr> <td class="numLine"> 263</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"http://apache.org/xml/features/nonvalidating/load-external-dtd"</span>, <span class="keyword">false</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 264</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> DocumentBuilder db = dbf.newDocumentBuilder();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 265</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> InputStream xmlStream = <span class="keyword">new</span> ByteArrayInputStream(xml.getBytes(UTF8));</span></pre></td></tr>
+<tr> <td class="numLine"> 266</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> Document doc;</pre></td></tr>
+<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 268</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> doc = db.parse(xmlStream);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 269</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException ie) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 270</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> BadFeed(ie.getMessage());</span></pre></td></tr>
+<tr> <td class="numLineCover"> 271</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 272</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> doc.getDocumentElement().normalize();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 273</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> NodeList nodes = doc.getElementsByTagName(<span class="string">"record"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 274</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Set<URL> tmpUrls = <span class="keyword">new</span> HashSet<URL>();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 275</td> <td class="nbHitsUncovered"><a title="Line 275: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 275: Conditional coverage 0% (0/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < nodes.getLength(); i++) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 276</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Element element = (Element) nodes.item(i);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 277</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String url = element.getAttribute(<span class="string">"url"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 278</td> <td class="nbHitsUncovered"><a title="Line 278: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 278: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> <span class="keyword">if</span> (<span class="keyword">null</span> == url || url.trim().isEmpty()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 279</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> BadFeed(<span class="string">"record without url attribute"</span>); </span></pre></td></tr>
+<tr> <td class="numLine"> 280</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLine"> 281</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 282</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> tmpUrls.add(<span class="keyword">new</span> URL(url));</span></pre></td></tr>
+<tr> <td class="numLineCover"> 283</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (MalformedURLException male) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 284</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> BadFeed(<span class="string">"record with bad url attribute: "</span> + url);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 285</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 287</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.info(<span class="string">"accepting url: "</span> + url);</span></pre></td></tr>
+<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 289</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> tmpUrls;</span></pre></td></tr>
+<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 291</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Send some response body. */</span></pre></td></tr>
+<tr> <td class="numLine"> 293</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> respond(HttpExchange ex, <span class="keyword">int</span> code, String contentType,</pre></td></tr>
+<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">byte</span> response[]) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 295</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ex.getResponseHeaders().set(<span class="string">"Content-Type"</span>, contentType);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 296</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ex.sendResponseHeaders(code, 0);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 297</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> OutputStream responseBody = ex.getResponseBody();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 298</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.finest(<span class="string">"before writing response"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 299</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> responseBody.write(response);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 300</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> responseBody.flush();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 301</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> responseBody.close();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 302</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ex.close();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 303</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> log.finest(<span class="string">"after closing exchange"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 304</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 305</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 306</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">/** Intermediary from an HttpExchange to FileUpload input. */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 307</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> HttpExchangeUploadInfo <span class="keyword">implements</span> RequestContext {</span></pre></td></tr>
+<tr> <td class="numLine"> 308</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> InputStream inStream;</pre></td></tr>
+<tr> <td class="numLine"> 309</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> length;</pre></td></tr>
+<tr> <td class="numLine"> 310</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String contentType;</pre></td></tr>
+<tr> <td class="numLineCover"> 311</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> HttpExchangeUploadInfo(InputStream is, <span class="keyword">int</span> len, String ct) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 312</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.inStream = is;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 313</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.length = len;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 314</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.contentType = ct;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 315</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } </span></pre></td></tr>
+<tr> <td class="numLine"> 316</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 317</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> String getCharacterEncoding() {</pre></td></tr>
+<tr> <td class="numLine"> 318</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// TODO: get from exchange?</span></pre></td></tr>
+<tr> <td class="numLineCover"> 319</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="string">"UTF-8"</span>;</span></pre></td></tr>
+<tr> <td class="numLine"> 320</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } </pre></td></tr>
+<tr> <td class="numLine"> 321</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 322</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> String getContentType() {</pre></td></tr>
+<tr> <td class="numLineCover"> 323</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> contentType;</span></pre></td></tr>
+<tr> <td class="numLine"> 324</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } </pre></td></tr>
+<tr> <td class="numLine"> 325</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 326</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">int</span> getContentLength() {</pre></td></tr>
+<tr> <td class="numLineCover"> 327</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> length;</span></pre></td></tr>
+<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 329</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 330</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> InputStream getInputStream() <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 331</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> inStream; </span></pre></td></tr>
+<tr> <td class="numLine"> 332</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 333</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 334</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 335</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> Map<String, <span class="keyword">byte</span>[]> splitMultipartRequest(RequestContext req)</pre></td></tr>
+<tr> <td class="numLine"> 336</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLineCover"> 337</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Map<String, <span class="keyword">byte</span>[]> parts = <span class="keyword">new</span> HashMap<String, <span class="keyword">byte</span>[]>();</span></pre></td></tr>
+<tr> <td class="numLine"> 338</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 339</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> FileUpload upload = <span class="keyword">new</span> FileUpload();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 340</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> FileItemIterator iterator = upload.getItemIterator(req);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 341</td> <td class="nbHitsUncovered"><a title="Line 341: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 341: Conditional coverage 0% (0/2)."> <span class="keyword">while</span> (iterator.hasNext()) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 342</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> FileItemStream item = iterator.next();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 343</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String field = item.getFieldName(); </span></pre></td></tr>
+<tr> <td class="numLineCover"> 344</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">byte</span> value[] = </span></pre></td></tr>
+<tr> <td class="numLine"> 345</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> IOHelper.readInputStreamToByteArray(item.openStream());</pre></td></tr>
+<tr> <td class="numLineCover"> 346</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> parts.put(field, value);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 347</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 348</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> parts;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 349</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (FileUploadException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 350</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"caught FileUploadException"</span>, e);</span></pre></td></tr>
+<tr> <td class="numLine"> 351</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 352</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 353</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 354</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">int</span> hexToInt(<span class="keyword">byte</span> b) {</pre></td></tr>
+<tr> <td class="numLineCover"> 355</td> <td class="nbHitsUncovered"><a title="Line 355: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 355: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> <span class="keyword">if</span> (b >= <span class="string">'0'</span> && b <= <span class="string">'9'</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 356</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> (<span class="keyword">byte</span>)(b - <span class="string">'0'</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 357</td> <td class="nbHitsUncovered"><a title="Line 357: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 357: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> } <span class="keyword">else</span> <span class="keyword">if</span> (b >= <span class="string">'a'</span> && b <= <span class="string">'f'</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 358</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> (<span class="keyword">byte</span>)(b - <span class="string">'a'</span>) + 10;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 359</td> <td class="nbHitsUncovered"><a title="Line 359: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 359: Conditional coverage 0% (0/4) [each condition: 0%, 0%]."> } <span class="keyword">else</span> <span class="keyword">if</span> (b >= <span class="string">'A'</span> && b <= <span class="string">'F'</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 360</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> (<span class="keyword">byte</span>)(b - <span class="string">'A'</span>) + 10;</span></pre></td></tr>
+<tr> <td class="numLine"> 361</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 362</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"invalid hex byte: "</span> + b);</span></pre></td></tr>
+<tr> <td class="numLine"> 363</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 364</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 365</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 366</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> String percentDecode(String encoded) {</pre></td></tr>
+<tr> <td class="numLine"> 367</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 368</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">byte</span> bytes[] = encoded.getBytes(<span class="string">"ASCII"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 369</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ByteArrayOutputStream decoded = percentDecode(bytes);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 370</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> decoded.toString(<span class="string">"UTF-8"</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 371</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (UnsupportedEncodingException uee) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 372</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(uee);</span></pre></td></tr>
+<tr> <td class="numLine"> 373</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 374</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 375</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 376</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">static</span> ByteArrayOutputStream percentDecode(<span class="keyword">byte</span> encoded[]) {</pre></td></tr>
+<tr> <td class="numLineCover"> 377</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> ByteArrayOutputStream out = <span class="keyword">new</span> ByteArrayOutputStream();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 378</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> i = 0;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 379</td> <td class="nbHitsUncovered"><a title="Line 379: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 379: Conditional coverage 0% (0/2)."> <span class="keyword">while</span> (i < encoded.length) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 380</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">byte</span> b = encoded[i];</span></pre></td></tr>
+<tr> <td class="numLineCover"> 381</td> <td class="nbHitsUncovered"><a title="Line 381: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 381: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (b == <span class="string">'%'</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 382</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> iNeeded = i + 2; <span class="comment">// need two more bytes</span></span></pre></td></tr>
+<tr> <td class="numLineCover"> 383</td> <td class="nbHitsUncovered"><a title="Line 383: Conditional coverage 0% (0/2)."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 383: Conditional coverage 0% (0/2)."> <span class="keyword">if</span> (iNeeded >= encoded.length) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 384</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"ends too early"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 385</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 386</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> highOrder = hexToInt(encoded[i + 1]);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 387</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> lowOrder = hexToInt(encoded[i + 2]);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 388</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">int</span> byteInInt = (highOrder << 4) | lowOrder;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 389</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> b = (<span class="keyword">byte</span>) byteInInt; <span class="comment">// chops top bytes; could make negative</span></span></pre></td></tr>
+<tr> <td class="numLineCover"> 390</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> i += 3;</span></pre></td></tr>
+<tr> <td class="numLineCover"> 391</td> <td class="nbHitsUncovered"><a title="Line 391: Conditional coverage 0% (0/20) [each condition: 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%]."> 0</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 391: Conditional coverage 0% (0/20) [each condition: 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%, 0%]."> } <span class="keyword">else</span> <span class="keyword">if</span> ((b >= <span class="string">'a'</span> && b <= <span class="string">'z'</span>)</a></span></pre></td></tr>
+<tr> <td class="numLine"> 392</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> || (b >= <span class="string">'A'</span> && b <= <span class="string">'Z'</span>)</pre></td></tr>
+<tr> <td class="numLine"> 393</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> || (b >= <span class="string">'0'</span> && b <= <span class="string">'9'</span>)</pre></td></tr>
+<tr> <td class="numLine"> 394</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> || b == <span class="string">'-'</span> || b == <span class="string">'_'</span> || b == <span class="string">'.'</span> || b == <span class="string">'~'</span>) {</pre></td></tr>
+<tr> <td class="numLine"> 395</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// pass through</span></pre></td></tr>
+<tr> <td class="numLineCover"> 396</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> i++;</span></pre></td></tr>
+<tr> <td class="numLine"> 397</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 398</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"not percent encoded"</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 399</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 400</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> out.write(b);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 401</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLineCover"> 402</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> out;</span></pre></td></tr>
+<tr> <td class="numLine"> 403</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 404</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+</table>
+
+<div class="footer">Report generated by <a href="http://cobertura.sourceforge.net/" target="_top">Cobertura</a> 1.9.4.1.</div>
+</body>
+</html>
diff --git a/coverage/com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html b/coverage/com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html
index c0a2f49..1424bd0 100644
--- a/coverage/com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html
+++ b/coverage/com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html
@@ -12,7 +12,7 @@
<div class="separator"> </div>
<table class="report">
<thead><tr> <td class="heading">Classes in this File</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
- <tr><td><a href="com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html">CommandLineAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">37</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:68px"><span class="text">82/119</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">14</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:58px"><span class="text">20/34</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5625;</span>3.562</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html">CommandLineAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">37</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:68px"><span class="text">81/118</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">14</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:58px"><span class="text">20/34</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5625;</span>3.562</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html">CommandLineAdaptor$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">4/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5625;</span>3.562</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html">CommandLineAdaptor$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">3/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5625;</span>3.562</td></tr>
@@ -137,369 +137,364 @@
<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> config.addKey(<span class="string">"commandline.lister.cmd"</span>, <span class="keyword">null</span>);</pre></td></tr>
<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> config.addKey(<span class="string">"commandline.retriever.cmd"</span>, <span class="keyword">null</span>);</pre></td></tr>
<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> config.addKey(<span class="string">"commandline.authorizer.delimeter"</span>, <span class="string">"\0"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 63</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// Change the default to automatically provide unzipped zip contents to the</span></pre></td></tr>
+<tr> <td class="numLineCover"> 63</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="comment">// GSA.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 65</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> config.overrideKey(<span class="string">"adaptor.autoUnzip"</span>, <span class="string">"true"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 66</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 69</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">private</span> List<String> readCommandLineConfig(AdaptorContext context, String prefix) {</pre></td></tr>
-<tr> <td class="numLineCover"> 70</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> Map<String, String> config = context.getConfig().getValuesWithPrefix(prefix);</pre></td></tr>
-<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> String commandString = config.get(<span class="string">"cmd"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> List<String> command = <span class="keyword">null</span>;</pre></td></tr>
-<tr> <td class="numLineCover"> 73</td> <td class="nbHitsUncovered"><a title="Line 73: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 73: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (commandString != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> command = <span class="keyword">new</span> ArrayList<String>();</pre></td></tr>
-<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> command.add(commandString);</pre></td></tr>
-<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">for</span> (<span class="keyword">int</span> i = 1;; i++) {</pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> String argument = config.get(<span class="string">"arg"</span> + i);</pre></td></tr>
-<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"><a title="Line 78: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 78: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (argument == <span class="keyword">null</span>) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 79</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
-<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 67</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> Map<String, String> config = context.getConfig().getValuesWithPrefix(prefix);</pre></td></tr>
+<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> String commandString = config.get(<span class="string">"cmd"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> List<String> command = <span class="keyword">null</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 70</td> <td class="nbHitsUncovered"><a title="Line 70: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 70: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (commandString != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> command = <span class="keyword">new</span> ArrayList<String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> command.add(commandString);</pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">for</span> (<span class="keyword">int</span> i = 1;; i++) {</pre></td></tr>
+<tr> <td class="numLineCover"> 74</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> String argument = config.get(<span class="string">"arg"</span> + i);</pre></td></tr>
+<tr> <td class="numLineCover"> 75</td> <td class="nbHitsCovered"><a title="Line 75: Conditional coverage 100% (2/2)."> 7</a></td> <td class="src"><pre class="src"> <a title="Line 75: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (argument == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 76</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">break</span>;</pre></td></tr>
+<tr> <td class="numLine"> 77</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 81</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> command.add(argument);</pre></td></tr>
-<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 78</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> command.add(argument);</pre></td></tr>
+<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> command;</pre></td></tr>
-<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 81</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> command;</pre></td></tr>
+<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 84</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> init(AdaptorContext context) <span class="keyword">throws</span> Exception {</pre></td></tr>
<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 87</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 88</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> init(AdaptorContext context) <span class="keyword">throws</span> Exception {</pre></td></tr>
-<tr> <td class="numLine"> 89</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> listerCommand = readCommandLineConfig(context, <span class="string">"commandline.lister."</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 91</td> <td class="nbHitsUncovered"><a title="Line 91: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 91: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (listerCommand == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 92</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"commandline.lister.cmd configuration property must be set."</span>);</span></pre></td></tr>
-<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> listerCommand = readCommandLineConfig(context, <span class="string">"commandline.lister."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsUncovered"><a title="Line 88: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 88: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (listerCommand == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"commandline.lister.cmd configuration property must be set."</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 94</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 91</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 95</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> retrieverCommand = readCommandLineConfig(context, <span class="string">"commandline.retriever."</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 96</td> <td class="nbHitsUncovered"><a title="Line 96: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 96: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (retrieverCommand == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"commandline.retriever.cmd configuration property must be set."</span>);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 92</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> retrieverCommand = readCommandLineConfig(context, <span class="string">"commandline.retriever."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 93</td> <td class="nbHitsUncovered"><a title="Line 93: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 93: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (retrieverCommand == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 94</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"commandline.retriever.cmd configuration property must be set."</span>);</span></pre></td></tr>
+<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> authorizerCommand = readCommandLineConfig(context, <span class="string">"commandline.authorizer."</span>);</pre></td></tr>
<tr> <td class="numLine"> 98</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 99</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> authorizerCommand = readCommandLineConfig(context, <span class="string">"commandline.authorizer."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 99</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> authzDelimiter = context.getConfig().getValue(<span class="string">"commandline.authorizer.delimeter"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 101</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> authzDelimiter = context.getConfig().getValue(<span class="string">"commandline.authorizer.delimeter"</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 103</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 104</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 102</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setListerCommand(List<String> commandWithArgs) {</pre></td></tr>
-<tr> <td class="numLineCover"> 106</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.listerCommand = <span class="keyword">new</span> ArrayList<String>(commandWithArgs);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 107</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 103</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.listerCommand = <span class="keyword">new</span> ArrayList<String>(commandWithArgs);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 105</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 106</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> List<String> getListerCommand() {</pre></td></tr>
-<tr> <td class="numLineCover"> 110</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Collections.unmodifiableList(listerCommand);</span></pre></td></tr>
-<tr> <td class="numLine"> 111</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 107</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Collections.unmodifiableList(listerCommand);</span></pre></td></tr>
+<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 112</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 109</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 110</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> setRetrieverCommand(List<String> commandWithArgs) {</pre></td></tr>
-<tr> <td class="numLineCover"> 114</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.retrieverCommand = <span class="keyword">new</span> ArrayList<String>(commandWithArgs);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 115</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 111</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">this</span>.retrieverCommand = <span class="keyword">new</span> ArrayList<String>(commandWithArgs);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 112</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 113</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 114</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> List<String> getRetrieverCommand() {</pre></td></tr>
-<tr> <td class="numLineCover"> 118</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Collections.unmodifiableList(retrieverCommand);</span></pre></td></tr>
-<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 115</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> Collections.unmodifiableList(retrieverCommand);</span></pre></td></tr>
+<tr> <td class="numLine"> 116</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 117</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 118</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 122</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 119</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocIds(<span class="keyword">final</span> DocIdPusher pusher) <span class="keyword">throws</span> IOException,</pre></td></tr>
-<tr> <td class="numLine"> 123</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 120</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> InterruptedException {</pre></td></tr>
+<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> commandResult;</pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> StreamingCommand command = newListerCommand();</pre></td></tr>
+<tr> <td class="numLineCover"> 123</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ByteArrayOutputStream baos = <span class="keyword">new</span> ByteArrayOutputStream();</pre></td></tr>
<tr> <td class="numLine"> 124</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">int</span> commandResult;</pre></td></tr>
-<tr> <td class="numLineCover"> 125</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> StreamingCommand command = newListerCommand();</pre></td></tr>
-<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> ByteArrayOutputStream baos = <span class="keyword">new</span> ByteArrayOutputStream();</pre></td></tr>
-<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 125</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 129</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Command: "</span> + listerCommand);</pre></td></tr>
-<tr> <td class="numLineCover"> 130</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> String[] commandLine = listerCommand.toArray(<span class="keyword">new</span> String[0]);</pre></td></tr>
-<tr> <td class="numLineCover"> 131</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> StreamingCommand.OutputSink stdout = <span class="keyword">new</span> StreamingCommand.OutputSink() {</pre></td></tr>
-<tr> <td class="numLine"> 132</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Command: "</span> + listerCommand);</pre></td></tr>
+<tr> <td class="numLineCover"> 127</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> String[] commandLine = listerCommand.toArray(<span class="keyword">new</span> String[0]);</pre></td></tr>
+<tr> <td class="numLineCover"> 128</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> StreamingCommand.OutputSink stdout = <span class="keyword">new</span> StreamingCommand.OutputSink() {</pre></td></tr>
+<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 133</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 130</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> sink(InputStream in) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLine"> 134</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 131</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 135</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">new</span> CommandStreamParser(in).readFromLister(pusher, <span class="keyword">null</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 136</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 137</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
-<tr> <td class="numLineCover"> 138</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 140</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 132</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">new</span> CommandStreamParser(in).readFromLister(pusher, <span class="keyword">null</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 133</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException ex) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 134</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> Thread.currentThread().interrupt();</span></pre></td></tr>
+<tr> <td class="numLineCover"> 135</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 136</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 137</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> };</pre></td></tr>
-<tr> <td class="numLineCover"> 141</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> StreamingCommand.OutputSink stderr = <span class="keyword">new</span> StreamingCommand.StreamOutputSink(baos);</pre></td></tr>
-<tr> <td class="numLineCover"> 142</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> commandResult = command.exec(commandLine, <span class="keyword">null</span>, stdout, stderr);</pre></td></tr>
-<tr> <td class="numLineCover"> 143</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 144</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Thread interrupted while waiting for external command."</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 145</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 146</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command could not be executed."</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 148</td> <td class="nbHitsUncovered"><a title="Line 148: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 148: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (commandResult != 0) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 149</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String errorOutput = <span class="keyword">new</span> String(baos.toByteArray(), encoding);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 150</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command error. code = "</span> + commandResult + <span class="string">". Stderr: "</span></span></pre></td></tr>
+<tr> <td class="numLineCover"> 138</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> StreamingCommand.OutputSink stderr = <span class="keyword">new</span> StreamingCommand.StreamOutputSink(baos);</pre></td></tr>
+<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> commandResult = command.exec(commandLine, <span class="keyword">null</span>, stdout, stderr);</pre></td></tr>
+<tr> <td class="numLineCover"> 140</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 141</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Thread interrupted while waiting for external command."</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 142</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 143</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command could not be executed."</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 144</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 145</td> <td class="nbHitsUncovered"><a title="Line 145: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 145: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (commandResult != 0) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String errorOutput = <span class="keyword">new</span> String(baos.toByteArray(), encoding);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command error. code = "</span> + commandResult + <span class="string">". Stderr: "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 148</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + errorOutput);</pre></td></tr>
+<tr> <td class="numLine"> 149</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 150</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
<tr> <td class="numLine"> 151</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> + errorOutput);</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 153</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 155</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Gives the bytes of a document referenced with id. */</span></pre></td></tr>
-<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 153</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 154</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> getDocContent(Request req, <span class="keyword">final</span> Response resp) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">final</span> DocId id = req.getDocId();</pre></td></tr>
-<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">final</span> DocId id = req.getDocId();</pre></td></tr>
+<tr> <td class="numLine"> 156</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">int</span> commandResult;</pre></td></tr>
-<tr> <td class="numLineCover"> 160</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> StreamingCommand command = newRetrieverCommand();</pre></td></tr>
-<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> ByteArrayOutputStream baos = <span class="keyword">new</span> ByteArrayOutputStream();</pre></td></tr>
-<tr> <td class="numLine"> 162</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 157</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> StreamingCommand command = newRetrieverCommand();</pre></td></tr>
+<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> ByteArrayOutputStream baos = <span class="keyword">new</span> ByteArrayOutputStream();</pre></td></tr>
+<tr> <td class="numLine"> 159</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 163</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 160</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 164</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> Date lastCrawled = req.getLastAccessTime();</pre></td></tr>
-<tr> <td class="numLineCover"> 165</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">long</span> lastCrawledMillis = 0;</pre></td></tr>
-<tr> <td class="numLineCover"> 166</td> <td class="nbHitsUncovered"><a title="Line 166: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 166: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (lastCrawled != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 167</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> lastCrawledMillis = lastCrawled.getTime();</span></pre></td></tr>
-<tr> <td class="numLine"> 168</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> Date lastCrawled = req.getLastAccessTime();</pre></td></tr>
+<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">long</span> lastCrawledMillis = 0;</pre></td></tr>
+<tr> <td class="numLineCover"> 163</td> <td class="nbHitsUncovered"><a title="Line 163: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 163: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (lastCrawled != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 164</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> lastCrawledMillis = lastCrawled.getTime();</span></pre></td></tr>
+<tr> <td class="numLine"> 165</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> String[] commandLine = <span class="keyword">new</span> String[retrieverCommand.size() + 2];</pre></td></tr>
-<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> retrieverCommand.toArray(commandLine);</pre></td></tr>
-<tr> <td class="numLineCover"> 171</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> commandLine[retrieverCommand.size()] = id.getUniqueId();</pre></td></tr>
-<tr> <td class="numLineCover"> 172</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> commandLine[retrieverCommand.size() + 1] = Long.toString(lastCrawledMillis);</pre></td></tr>
-<tr> <td class="numLineCover"> 173</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> StreamingCommand.OutputSink stdin = <span class="keyword">new</span> StreamingCommand.OutputSink() {</pre></td></tr>
-<tr> <td class="numLine"> 174</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 166</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> String[] commandLine = <span class="keyword">new</span> String[retrieverCommand.size() + 2];</pre></td></tr>
+<tr> <td class="numLineCover"> 167</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> retrieverCommand.toArray(commandLine);</pre></td></tr>
+<tr> <td class="numLineCover"> 168</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> commandLine[retrieverCommand.size()] = id.getUniqueId();</pre></td></tr>
+<tr> <td class="numLineCover"> 169</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> commandLine[retrieverCommand.size() + 1] = Long.toString(lastCrawledMillis);</pre></td></tr>
+<tr> <td class="numLineCover"> 170</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> StreamingCommand.OutputSink stdin = <span class="keyword">new</span> StreamingCommand.OutputSink() {</pre></td></tr>
+<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 172</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> sink(InputStream in) <span class="keyword">throws</span> IOException {</pre></td></tr>
-<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">new</span> CommandStreamParser(in).readFromRetriever(id, resp);</pre></td></tr>
-<tr> <td class="numLineCover"> 177</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 178</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 173</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">new</span> CommandStreamParser(in).readFromRetriever(id, resp);</pre></td></tr>
+<tr> <td class="numLineCover"> 174</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 175</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> };</pre></td></tr>
-<tr> <td class="numLineCover"> 179</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> StreamingCommand.OutputSink stderr = <span class="keyword">new</span> StreamingCommand.StreamOutputSink(baos);</pre></td></tr>
-<tr> <td class="numLine"> 180</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 176</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> StreamingCommand.OutputSink stderr = <span class="keyword">new</span> StreamingCommand.StreamOutputSink(baos);</pre></td></tr>
+<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 181</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Command: "</span> + Arrays.asList(commandLine));</pre></td></tr>
-<tr> <td class="numLineCover"> 182</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> commandResult = command.exec(commandLine, <span class="keyword">null</span>, stdin, stderr);</pre></td></tr>
-<tr> <td class="numLineCover"> 183</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 184</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Thread intrupted while waiting for external command."</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 185</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 186</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command could not be executed."</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 188</td> <td class="nbHitsUncovered"><a title="Line 188: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 188: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (commandResult != 0) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 189</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String errorOutput = <span class="keyword">new</span> String(baos.toByteArray(), encoding);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 190</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command error. code="</span> + commandResult + <span class="string">". Stderr: "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 191</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 178</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Command: "</span> + Arrays.asList(commandLine));</pre></td></tr>
+<tr> <td class="numLineCover"> 179</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> commandResult = command.exec(commandLine, <span class="keyword">null</span>, stdin, stderr);</pre></td></tr>
+<tr> <td class="numLineCover"> 180</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 181</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Thread intrupted while waiting for external command."</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 182</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 183</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command could not be executed."</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 184</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 185</td> <td class="nbHitsUncovered"><a title="Line 185: Conditional coverage 50% (1/2)."> 3</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 185: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (commandResult != 0) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 186</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String errorOutput = <span class="keyword">new</span> String(baos.toByteArray(), encoding);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 187</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command error. code="</span> + commandResult + <span class="string">". Stderr: "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 188</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + errorOutput);</pre></td></tr>
+<tr> <td class="numLine"> 189</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 190</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 191</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 192</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 193</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/**</span></pre></td></tr>
-<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * {@inheritDoc}</span></pre></td></tr>
-<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 194</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
-<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 195</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * <p>This implementation provides access permissions for the {@code DocId}s in an \</span></pre></td></tr>
-<tr> <td class="numLine"> 199</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 196</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * unmodifiable map based upon data returned by a command line authorizer.</span></pre></td></tr>
-<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 197</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * Permissions can have one of three values:</span></pre></td></tr>
-<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * {@link com.google.enterprise.adaptor.AuthzStatus#PERMIT},</span></pre></td></tr>
-<tr> <td class="numLine"> 202</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 199</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * {@link com.google.enterprise.adaptor.AuthzStatus#DENY},</span></pre></td></tr>
-<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 200</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * {@link com.google.enterprise.adaptor.AuthzStatus#INDETERMINATE}</span></pre></td></tr>
-<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 201</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * If an authorizerCommand is not set then AbstractAdaptor.isUserAuthorized</span></pre></td></tr>
-<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 202</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> * is used.</span></pre></td></tr>
-<tr> <td class="numLine"> 206</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 203</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
-<tr> <td class="numLine"> 207</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 204</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
-<tr> <td class="numLine"> 208</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 205</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Map<DocId, AuthzStatus> isUserAuthorized(AuthnIdentity userIdentity,</pre></td></tr>
-<tr> <td class="numLine"> 209</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 206</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> Collection<DocId> ids) <span class="keyword">throws</span> IOException {</pre></td></tr>
+<tr> <td class="numLine"> 207</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 208</td> <td class="nbHitsUncovered"><a title="Line 208: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 208: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (authorizerCommand == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 209</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">super</span>.isUserAuthorized(userIdentity, ids);</span></pre></td></tr>
<tr> <td class="numLine"> 210</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 211</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 211</td> <td class="nbHitsUncovered"><a title="Line 211: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 211: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (authorizerCommand == <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 212</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">super</span>.isUserAuthorized(userIdentity, ids);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 212</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> StringBuilder stdinStringBuilder = <span class="keyword">new</span> StringBuilder();</pre></td></tr>
<tr> <td class="numLine"> 213</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> }</pre></td></tr>
+ <td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 214</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> StringBuilder stdinStringBuilder = <span class="keyword">new</span> StringBuilder();</pre></td></tr>
-<tr> <td class="numLine"> 216</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Write out the user name</span></pre></td></tr>
-<tr> <td class="numLineCover"> 218</td> <td class="nbHitsUncovered"><a title="Line 218: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 218: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (userIdentity.getUser().getName().contains(authzDelimiter)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 219</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Error - User '"</span> + userIdentity.getUser().getName()</span></pre></td></tr>
-<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 215</td> <td class="nbHitsUncovered"><a title="Line 215: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 215: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (userIdentity.getUser().getName().contains(authzDelimiter)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 216</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Error - User '"</span> + userIdentity.getUser().getName()</span></pre></td></tr>
+<tr> <td class="numLine"> 217</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + <span class="string">"' contains the delimiter '"</span> + authzDelimiter + <span class="string">"'"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"GSA Adaptor Data Version 1 ["</span> + authzDelimiter + <span class="string">"]"</span></pre></td></tr>
-<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"GSA Adaptor Data Version 1 ["</span> + authzDelimiter + <span class="string">"]"</span></pre></td></tr>
+<tr> <td class="numLine"> 220</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + authzDelimiter);</pre></td></tr>
+<tr> <td class="numLine"> 221</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 222</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"username="</span>).append(userIdentity.getUser().getName())</pre></td></tr>
+<tr> <td class="numLine"> 223</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> .append(authzDelimiter);</pre></td></tr>
<tr> <td class="numLine"> 224</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 225</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"username="</span>).append(userIdentity.getUser().getName())</pre></td></tr>
-<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> .append(authzDelimiter);</pre></td></tr>
-<tr> <td class="numLine"> 227</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 225</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Write out the user password</span></pre></td></tr>
-<tr> <td class="numLineCover"> 229</td> <td class="nbHitsUncovered"><a title="Line 229: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 229: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (userIdentity.getPassword() != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 230</td> <td class="nbHitsUncovered"><a title="Line 230: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 230: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (userIdentity.getPassword().contains(authzDelimiter)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 231</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Error - Password contains the delimiter '"</span></span></pre></td></tr>
-<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 226</td> <td class="nbHitsUncovered"><a title="Line 226: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 226: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (userIdentity.getPassword() != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 227</td> <td class="nbHitsUncovered"><a title="Line 227: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 227: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (userIdentity.getPassword().contains(authzDelimiter)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 228</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Error - Password contains the delimiter '"</span></span></pre></td></tr>
+<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + authzDelimiter + <span class="string">"'"</span>);</pre></td></tr>
-<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 230</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 234</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"password="</span>).append(userIdentity.getPassword())</pre></td></tr>
-<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 231</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"password="</span>).append(userIdentity.getPassword())</pre></td></tr>
+<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> .append(authzDelimiter);</pre></td></tr>
-<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 237</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 234</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 238</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Write out the list of groups that this user belongs to</span></pre></td></tr>
-<tr> <td class="numLineCover"> 239</td> <td class="nbHitsUncovered"><a title="Line 239: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 239: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (userIdentity.getGroups() != <span class="keyword">null</span>) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 240</td> <td class="nbHitsCovered"><a title="Line 240: Conditional coverage 100% (2/2)."> 1</a></td> <td class="src"><pre class="src"> <a title="Line 240: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (GroupPrincipal group : userIdentity.getGroups()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 241</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> String name = group.getName();</pre></td></tr>
-<tr> <td class="numLineCover"> 242</td> <td class="nbHitsUncovered"><a title="Line 242: Conditional coverage 50% (1/2)."> 2</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 242: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (name.contains(authzDelimiter)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 243</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Group cannot contain the delimiter: "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 244</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 236</td> <td class="nbHitsUncovered"><a title="Line 236: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 236: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (userIdentity.getGroups() != <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 237</td> <td class="nbHitsCovered"><a title="Line 237: Conditional coverage 100% (2/2)."> 1</a></td> <td class="src"><pre class="src"> <a title="Line 237: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (GroupPrincipal group : userIdentity.getGroups()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 238</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> String name = group.getName();</pre></td></tr>
+<tr> <td class="numLineCover"> 239</td> <td class="nbHitsUncovered"><a title="Line 239: Conditional coverage 50% (1/2)."> 2</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 239: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (name.contains(authzDelimiter)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 240</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Group cannot contain the delimiter: "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + authzDelimiter);</pre></td></tr>
-<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 242</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 246</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"group="</span>).append(name).append(authzDelimiter);</pre></td></tr>
-<tr> <td class="numLineCover"> 247</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 243</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"group="</span>).append(name).append(authzDelimiter);</pre></td></tr>
+<tr> <td class="numLineCover"> 244</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLine"> 245</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 249</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 247</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Write out the list of document ids that are to be checked</span></pre></td></tr>
-<tr> <td class="numLineCover"> 251</td> <td class="nbHitsCovered"><a title="Line 251: Conditional coverage 100% (2/2)."> 1</a></td> <td class="src"><pre class="src"> <a title="Line 251: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (DocId id : ids) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 252</td> <td class="nbHitsUncovered"><a title="Line 252: Conditional coverage 50% (1/2)."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 252: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (id.getUniqueId().contains(authzDelimiter)) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 253</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Document ID cannot contain the delimiter: "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 248</td> <td class="nbHitsCovered"><a title="Line 248: Conditional coverage 100% (2/2)."> 1</a></td> <td class="src"><pre class="src"> <a title="Line 248: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (DocId id : ids) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 249</td> <td class="nbHitsUncovered"><a title="Line 249: Conditional coverage 50% (1/2)."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 249: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (id.getUniqueId().contains(authzDelimiter)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 250</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"Document ID cannot contain the delimiter: "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + authzDelimiter);</pre></td></tr>
-<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"id="</span>).append(id.getUniqueId()).append(authzDelimiter);</pre></td></tr>
-<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> stdinStringBuilder.append(<span class="string">"id="</span>).append(id.getUniqueId()).append(authzDelimiter);</pre></td></tr>
+<tr> <td class="numLine"> 254</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 258</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> String stdin = stdinStringBuilder.toString();</pre></td></tr>
+<tr> <td class="numLineCover"> 255</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> String stdin = stdinStringBuilder.toString();</pre></td></tr>
+<tr> <td class="numLine"> 256</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">int</span> commandResult;</pre></td></tr>
+<tr> <td class="numLineCover"> 258</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> Command command = newAuthorizerCommand();</pre></td></tr>
<tr> <td class="numLine"> 259</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 260</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> <span class="keyword">int</span> commandResult;</pre></td></tr>
-<tr> <td class="numLineCover"> 261</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> Command command = newAuthorizerCommand();</pre></td></tr>
-<tr> <td class="numLine"> 262</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 263</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">try</span> {</pre></td></tr>
+<tr> <td class="numLine"> 261</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> </pre></td></tr>
+<tr> <td class="numLineCover"> 262</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> String[] commandLine = <span class="keyword">new</span> String[authorizerCommand.size()];</pre></td></tr>
+<tr> <td class="numLineCover"> 263</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> authorizerCommand.toArray(commandLine);</pre></td></tr>
<tr> <td class="numLine"> 264</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 265</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> String[] commandLine = <span class="keyword">new</span> String[authorizerCommand.size()];</pre></td></tr>
-<tr> <td class="numLineCover"> 266</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> authorizerCommand.toArray(commandLine);</pre></td></tr>
-<tr> <td class="numLine"> 267</td> <td class="nbHits"> </td>
- <td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 268</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Command: "</span> + Arrays.asList(commandLine));</pre></td></tr>
-<tr> <td class="numLineCover"> 269</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> commandResult = command.exec(commandLine, stdin.getBytes(encoding));</pre></td></tr>
-<tr> <td class="numLineCover"> 270</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 271</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Thread interrupted while waiting for external command."</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 272</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException e) {</span></pre></td></tr>
-<tr> <td class="numLineCover"> 273</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command could not be executed."</span>, e);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 274</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 275</td> <td class="nbHitsUncovered"><a title="Line 275: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 275: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (commandResult != 0) {</a></span></pre></td></tr>
-<tr> <td class="numLineCover"> 276</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String errorOutput = <span class="keyword">new</span> String(command.getStderr(), encoding);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 277</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command error. code = "</span> + commandResult + <span class="string">". Stderr: "</span></span></pre></td></tr>
-<tr> <td class="numLine"> 278</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 265</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Command: "</span> + Arrays.asList(commandLine));</pre></td></tr>
+<tr> <td class="numLineCover"> 266</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> commandResult = command.exec(commandLine, stdin.getBytes(encoding));</pre></td></tr>
+<tr> <td class="numLineCover"> 267</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (InterruptedException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 268</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"Thread interrupted while waiting for external command."</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 269</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> } <span class="keyword">catch</span> (IOException e) {</span></pre></td></tr>
+<tr> <td class="numLineCover"> 270</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command could not be executed."</span>, e);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 271</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 272</td> <td class="nbHitsUncovered"><a title="Line 272: Conditional coverage 50% (1/2)."> 1</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 272: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (commandResult != 0) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 273</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> String errorOutput = <span class="keyword">new</span> String(command.getStderr(), encoding);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 274</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">throw</span> <span class="keyword">new</span> IOException(<span class="string">"External command error. code = "</span> + commandResult + <span class="string">". Stderr: "</span></span></pre></td></tr>
+<tr> <td class="numLine"> 275</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> + errorOutput);</pre></td></tr>
-<tr> <td class="numLine"> 279</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 280</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 277</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLineCover"> 281</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> CommandStreamParser parser = <span class="keyword">new</span> CommandStreamParser(</pre></td></tr>
-<tr> <td class="numLine"> 282</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 278</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> CommandStreamParser parser = <span class="keyword">new</span> CommandStreamParser(</pre></td></tr>
+<tr> <td class="numLine"> 279</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">new</span> ByteArrayInputStream(command.getStdout()));</pre></td></tr>
-<tr> <td class="numLineCover"> 283</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Pushing Document IDs."</span>);</pre></td></tr>
-<tr> <td class="numLineCover"> 284</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> parser.readFromAuthorizer();</pre></td></tr>
-<tr> <td class="numLine"> 285</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 280</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.finest(<span class="string">"Pushing Document IDs."</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 281</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> parser.readFromAuthorizer();</pre></td></tr>
+<tr> <td class="numLine"> 282</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 283</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 284</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">protected</span> StreamingCommand newListerCommand() {</pre></td></tr>
-<tr> <td class="numLineCover"> 288</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> StreamingCommand();</span></pre></td></tr>
-<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 285</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> StreamingCommand();</span></pre></td></tr>
+<tr> <td class="numLine"> 286</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 287</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 291</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 288</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">protected</span> StreamingCommand newRetrieverCommand() {</pre></td></tr>
-<tr> <td class="numLineCover"> 292</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> StreamingCommand();</span></pre></td></tr>
-<tr> <td class="numLine"> 293</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 289</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> StreamingCommand();</span></pre></td></tr>
+<tr> <td class="numLine"> 290</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 291</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 295</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">protected</span> Command newAuthorizerCommand() {</pre></td></tr>
-<tr> <td class="numLineCover"> 296</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> Command();</span></pre></td></tr>
-<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 293</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">return</span> <span class="keyword">new</span> Command();</span></pre></td></tr>
+<tr> <td class="numLine"> 294</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLine"> 298</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 295</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 299</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 296</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Call default main for adaptors. */</span></pre></td></tr>
-<tr> <td class="numLine"> 300</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 297</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> main(String[] args) {</pre></td></tr>
-<tr> <td class="numLineCover"> 301</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> AbstractAdaptor.main(<span class="keyword">new</span> CommandLineAdaptor(), args);</span></pre></td></tr>
-<tr> <td class="numLineCover"> 302</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
-<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
+<tr> <td class="numLineCover"> 298</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> AbstractAdaptor.main(<span class="keyword">new</span> CommandLineAdaptor(), args);</span></pre></td></tr>
+<tr> <td class="numLineCover"> 299</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> }</span></pre></td></tr>
+<tr> <td class="numLine"> 300</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> </pre></td></tr>
-<tr> <td class="numLine"> 304</td> <td class="nbHits"> </td>
+<tr> <td class="numLine"> 301</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
</table>
diff --git a/coverage/frame-packages.html b/coverage/frame-packages.html
index 8ae57c3..df7a0bc 100644
--- a/coverage/frame-packages.html
+++ b/coverage/frame-packages.html
@@ -19,6 +19,9 @@
<td nowrap="nowrap"><a href="frame-summary-com.google.enterprise.adaptor.examples.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.examples.html"' target="summary">com.google.enterprise.adaptor.examples</a></td>
</tr>
<tr>
+<td nowrap="nowrap"><a href="frame-summary-com.google.enterprise.adaptor.experimental.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.experimental.html"' target="summary">com.google.enterprise.adaptor.experimental</a></td>
+</tr>
+<tr>
<td nowrap="nowrap"><a href="frame-summary-com.google.enterprise.adaptor.prebuilt.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html"' target="summary">com.google.enterprise.adaptor.prebuilt</a></td>
</tr>
</table>
diff --git a/coverage/frame-sourcefiles-com.google.enterprise.adaptor.experimental.html b/coverage/frame-sourcefiles-com.google.enterprise.adaptor.experimental.html
new file mode 100644
index 0000000..cd77179
--- /dev/null
+++ b/coverage/frame-sourcefiles-com.google.enterprise.adaptor.experimental.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<title>Coverage Report Classes</title>
+<link title="Style" type="text/css" rel="stylesheet" href="css/main.css"/>
+</head>
+<body>
+<h5>
+com.google.enterprise.adaptor.experimental
+</h5>
+<div class="separator"> </div>
+<h5>Classes</h5>
+<table width="100%">
+<tbody>
+<tr>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.experimental.Sim.html">Sim</a> <i>(0%)</i></td>
+</tr>
+</tbody>
+</table>
+</body>
+</html>
diff --git a/coverage/frame-sourcefiles-com.google.enterprise.adaptor.html b/coverage/frame-sourcefiles-com.google.enterprise.adaptor.html
index 760f717..bbacb84 100644
--- a/coverage/frame-sourcefiles-com.google.enterprise.adaptor.html
+++ b/coverage/frame-sourcefiles-com.google.enterprise.adaptor.html
@@ -18,10 +18,10 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbortImmediatelyFilter.html">AbortImmediatelyFilter</a> <i>(100%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractAdaptor.html">AbstractAdaptor</a> <i>(80%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractAdaptor.html">AbstractAdaptor</a> <i>(70%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractDocIdPusher.html">AbstractDocIdPusher</a> <i>(100%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractDocIdPusher.html">AbstractDocIdPusher</a> <i>(88%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractDocumentTransform.html">AbstractDocumentTransform</a> <i>(65%)</i></td>
@@ -42,7 +42,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AdministratorSecurityHandler.html">AdministratorSecurityHandler</a> <i>(83%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Application.html">Application</a> <i>(72%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Application.html">Application</a> <i>(79%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AsyncDocIdSender.html">AsyncDocIdSender</a> <i>(100%)</i></td>
@@ -66,16 +66,13 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AuthzStatus.html">AuthzStatus</a> <i>(87%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor</a> <i>(66%)</i></td>
-</tr>
-<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.BlockingQueueBatcher.html">BlockingQueueBatcher</a> <i>(95%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.CircularBufferHandler.html">CircularBufferHandler</a> <i>(75%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser</a> <i>(89%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser</a> <i>(90%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Config.html">Config</a> <i>(90%)</i></td>
@@ -93,6 +90,9 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.CustomFormatter.html">CustomFormatter</a> <i>(0%)</i></td>
</tr>
<tr>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Daemon.html">Daemon</a> <i>(89%)</i></td>
+</tr>
+<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Dashboard.html">Dashboard</a> <i>(85%)</i></td>
</tr>
<tr>
@@ -117,7 +117,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.DocIdEncoder.html">DocIdEncoder</a> <i>(N/A)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher</a> <i>(100%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher</a> <i>(97%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.DocIdSender.html">DocIdSender</a> <i>(89%)</i></td>
@@ -141,7 +141,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.GroupPrincipal.html">GroupPrincipal</a> <i>(62%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler</a> <i>(68%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler</a> <i>(69%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.GsaFeedFileMaker.html">GsaFeedFileMaker</a> <i>(92%)</i></td>
@@ -240,7 +240,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.SessionManager.html">SessionManager</a> <i>(98%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter</a> <i>(70%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter</a> <i>(82%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.SleepHandler.html">SleepHandler</a> <i>(100%)</i></td>
@@ -285,7 +285,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Watchdog.html">Watchdog</a> <i>(100%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor</a> <i>(28%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor</a> <i>(35%)</i></td>
</tr>
</tbody>
</table>
diff --git a/coverage/frame-sourcefiles.html b/coverage/frame-sourcefiles.html
index d82a545..b814e0b 100644
--- a/coverage/frame-sourcefiles.html
+++ b/coverage/frame-sourcefiles.html
@@ -18,10 +18,10 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbortImmediatelyFilter.html">AbortImmediatelyFilter</a> <i>(100%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractAdaptor.html">AbstractAdaptor</a> <i>(80%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractAdaptor.html">AbstractAdaptor</a> <i>(70%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractDocIdPusher.html">AbstractDocIdPusher</a> <i>(100%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractDocIdPusher.html">AbstractDocIdPusher</a> <i>(88%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AbstractDocumentTransform.html">AbstractDocumentTransform</a> <i>(65%)</i></td>
@@ -48,7 +48,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AdministratorSecurityHandler.html">AdministratorSecurityHandler</a> <i>(83%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Application.html">Application</a> <i>(72%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Application.html">Application</a> <i>(79%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AsyncDocIdSender.html">AsyncDocIdSender</a> <i>(100%)</i></td>
@@ -72,9 +72,6 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AuthzStatus.html">AuthzStatus</a> <i>(87%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor</a> <i>(66%)</i></td>
-</tr>
-<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.BlockingQueueBatcher.html">BlockingQueueBatcher</a> <i>(95%)</i></td>
</tr>
<tr>
@@ -93,7 +90,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.prebuilt.CommandLineTransform.html">CommandLineTransform</a> <i>(58%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser</a> <i>(89%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser</a> <i>(90%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Config.html">Config</a> <i>(90%)</i></td>
@@ -111,6 +108,9 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.CustomFormatter.html">CustomFormatter</a> <i>(0%)</i></td>
</tr>
<tr>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Daemon.html">Daemon</a> <i>(89%)</i></td>
+</tr>
+<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Dashboard.html">Dashboard</a> <i>(85%)</i></td>
</tr>
<tr>
@@ -138,7 +138,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.DocIdEncoder.html">DocIdEncoder</a> <i>(N/A)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher</a> <i>(100%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher</a> <i>(97%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.DocIdSender.html">DocIdSender</a> <i>(89%)</i></td>
@@ -168,7 +168,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.GroupPrincipal.html">GroupPrincipal</a> <i>(62%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler</a> <i>(68%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler</a> <i>(69%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.GsaFeedFileMaker.html">GsaFeedFileMaker</a> <i>(92%)</i></td>
@@ -273,7 +273,10 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.SessionManager.html">SessionManager</a> <i>(98%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter</a> <i>(70%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter</a> <i>(82%)</i></td>
+</tr>
+<tr>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.experimental.Sim.html">Sim</a> <i>(0%)</i></td>
</tr>
<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.SleepHandler.html">SleepHandler</a> <i>(100%)</i></td>
@@ -324,7 +327,7 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Watchdog.html">Watchdog</a> <i>(100%)</i></td>
</tr>
<tr>
-<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor</a> <i>(28%)</i></td>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor</a> <i>(35%)</i></td>
</tr>
</tbody>
</table>
diff --git a/coverage/frame-summary-com.google.enterprise.adaptor.examples.html b/coverage/frame-summary-com.google.enterprise.adaptor.examples.html
index 7a7c130..a915377 100644
--- a/coverage/frame-summary-com.google.enterprise.adaptor.examples.html
+++ b/coverage/frame-summary-com.google.enterprise.adaptor.examples.html
@@ -16,7 +16,7 @@
<table class="report" id="packageResults">
<thead><tr> <td class="heading">Package</td> <td class="heading"># Classes</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
<tbody>
- <tr><td><a href="frame-summary-com.google.enterprise.adaptor.examples.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.examples.html"'>com.google.enterprise.adaptor.examples</a></td><td class="value">12</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">287</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:20px"><span class="text">72/359</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">66</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:28px"><span class="text">26/92</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.375;</span>2.375</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.examples.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.examples.html"'>com.google.enterprise.adaptor.examples</a></td><td class="value">12</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">286</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:20px"><span class="text">72/358</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">66</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:28px"><span class="text">26/92</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.375;</span>2.375</td></tr>
</tbody>
</table>
<script type="text/javascript">
@@ -39,7 +39,7 @@
<tr><td><a href="com.google.enterprise.adaptor.examples.DbAdaptorTemplate.html">DbAdaptorTemplate$BufferingPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">15</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/15</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.5;</span>2.5</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.examples.DbAdaptorTemplate.html">DbAdaptorTemplate$StatementAndResult</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">8</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/8</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.5;</span>2.5</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.examples.FileSystemAdaptor.html">FileSystemAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">43</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/43</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/10</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.0;</span>3</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.examples.FileSystemAdaptor.html">FileSystemAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">42</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/42</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/10</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.0;</span>3</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.examples.MetaTaggerTransform.html">MetaTaggerTransform</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">7</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:79px"><span class="text">27/34</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:71px"><span class="text">10/14</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.0;</span>2</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.examples.MetaTaggerTransform.html">MetaTaggerTransform$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.0;</span>2</td></tr>
diff --git a/coverage/frame-summary-com.google.enterprise.adaptor.experimental.html b/coverage/frame-summary-com.google.enterprise.adaptor.experimental.html
new file mode 100644
index 0000000..9488092
--- /dev/null
+++ b/coverage/frame-summary-com.google.enterprise.adaptor.experimental.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<title>Coverage Report</title>
+<link title="Style" type="text/css" rel="stylesheet" href="css/main.css"/>
+<link title="Style" type="text/css" rel="stylesheet" href="css/sortabletable.css"/>
+<script type="text/javascript" src="js/popup.js"></script>
+<script type="text/javascript" src="js/sortabletable.js"></script>
+<script type="text/javascript" src="js/customsorttypes.js"></script>
+</head>
+<body>
+<h5>Coverage Report - com.google.enterprise.adaptor.experimental</h5>
+<div class="separator"> </div>
+<table class="report" id="packageResults">
+<thead><tr> <td class="heading">Package</td> <td class="heading"># Classes</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
+<tbody>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.experimental.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.experimental.html"'>com.google.enterprise.adaptor.experimental</a></td><td class="value">8</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">219</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/219</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">77</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/77</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+</tbody>
+</table>
+<script type="text/javascript">
+var packageTable = new SortableTable(document.getElementById("packageResults"),
+ ["String", "Number", "Percentage", "Percentage", "FormattedNumber"]);
+packageTable.sort(0);
+</script>
+<div class="separator"> </div>
+<table class="report" id="classResults">
+<thead><tr> <td class="heading">Classes in this Package</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
+<tbody>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">140</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/140</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">54</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/54</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$BadFeed</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$Crawler</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">52</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/52</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">21</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/21</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$FeedAcceptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/10</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$HttpExchangeUploadInfo</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$Index</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.experimental.Sim.html">Sim$NoXmlFound</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+
+</tbody>
+</table>
+<script type="text/javascript">
+var classTable = new SortableTable(document.getElementById("classResults"),
+ ["String", "Percentage", "Percentage", "FormattedNumber"]);
+classTable.sort(0);
+</script>
+<div class="footer">Report generated by <a href="http://cobertura.sourceforge.net/" target="_top">Cobertura</a> 1.9.4.1.</div>
+</body>
+</html>
diff --git a/coverage/frame-summary-com.google.enterprise.adaptor.html b/coverage/frame-summary-com.google.enterprise.adaptor.html
index a8531b6..5d64833 100644
--- a/coverage/frame-summary-com.google.enterprise.adaptor.html
+++ b/coverage/frame-summary-com.google.enterprise.adaptor.html
@@ -16,9 +16,10 @@
<table class="report" id="packageResults">
<thead><tr> <td class="heading">Package</td> <td class="heading"># Classes</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
<tbody>
- <tr><td><a href="frame-summary-com.google.enterprise.adaptor.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.html"'>com.google.enterprise.adaptor</a></td><td class="value">215</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">729</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:84px"><span class="text">3944/4673</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">251</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">1255/1506</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.372093023255814;</span>2.372</td></tr>
- <tr><td><a href="frame-summary-com.google.enterprise.adaptor.examples.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.examples.html"'>com.google.enterprise.adaptor.examples</a></td><td class="value">12</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">287</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:20px"><span class="text">72/359</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">66</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:28px"><span class="text">26/92</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.375;</span>2.375</td></tr>
- <tr><td><a href="frame-summary-com.google.enterprise.adaptor.prebuilt.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html"'>com.google.enterprise.adaptor.prebuilt</a></td><td class="value">18</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">145</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">253/398</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">52</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">56/108</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4305555555555554;</span>2.431</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.html"'>com.google.enterprise.adaptor</a></td><td class="value">208</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">659</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:85px"><span class="text">3915/4574</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">241</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">1251/1492</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.3664529914529915;</span>2.366</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.examples.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.examples.html"'>com.google.enterprise.adaptor.examples</a></td><td class="value">12</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">286</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:20px"><span class="text">72/358</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">66</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:28px"><span class="text">26/92</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.375;</span>2.375</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.experimental.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.experimental.html"'>com.google.enterprise.adaptor.experimental</a></td><td class="value">8</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">219</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/219</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">77</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/77</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.prebuilt.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html"'>com.google.enterprise.adaptor.prebuilt</a></td><td class="value">18</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">145</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">252/397</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">52</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">56/108</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4305555555555554;</span>2.431</td></tr>
</tbody>
</table>
<script type="text/javascript">
@@ -32,9 +33,9 @@
<tbody>
<tr><td><a href="com.google.enterprise.adaptor.AbortImmediatelyFilter.html">AbortImmediatelyFilter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.0;</span>2</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AbstractAdaptor.html">AbstractAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:80px"><span class="text">8/10</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.2;</span>1.2</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.AbstractAdaptor.html">AbstractAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:70px"><span class="text">7/10</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.2;</span>1.2</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AbstractDocIdPusher.html">AbstractDocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">9/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5;</span>1.5</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.AbstractDocIdPusher.html">AbstractDocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:88px"><span class="text">8/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5;</span>1.5</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.AbstractDocumentTransform.html">AbstractDocumentTransform</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">8</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:65px"><span class="text">15/23</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:37px"><span class="text">3/8</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.7142857142857142;</span>1.714</td></tr>
@@ -61,11 +62,11 @@
<tr><td><a href="com.google.enterprise.adaptor.AdministratorSecurityHandler.html">AdministratorSecurityHandler$AuthnClient</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.875;</span>4.875</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.AdministratorSecurityHandler.html">AdministratorSecurityHandler$GsaAuthnClient</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">12</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:25px"><span class="text">4/16</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">8</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/8</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.875;</span>4.875</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">29</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:73px"><span class="text">80/109</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:62px"><span class="text">10/16</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">7/7</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">5/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$ShutdownHook</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:33px"><span class="text">1/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$SuggestHandlerAbortPolicy</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:44px"><span class="text">4/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.923076923076923;</span>2.923</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">25</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:81px"><span class="text">108/133</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:79px"><span class="text">19/24</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">7/7</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">5/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$ShutdownHook</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:33px"><span class="text">1/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Application.html">Application$SuggestHandlerAbortPolicy</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:44px"><span class="text">4/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.409090909090909;</span>2.409</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.AsyncDocIdSender.html">AsyncDocIdSender</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">18/18</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">8/8</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.6;</span>2.6</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.AsyncDocIdSender.html">AsyncDocIdSender$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.6;</span>2.6</td></tr>
@@ -87,30 +88,20 @@
<tr><td><a href="com.google.enterprise.adaptor.AuthzStatus.html">AuthzStatus</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:87px"><span class="text">7/8</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">47</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">94/141</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">16</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:54px"><span class="text">19/35</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$AutoUnzipRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$AutoUnzipResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:53px"><span class="text">7/13</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$AutoUnzipResponse$State</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$InnerAdaptorContext</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$InnerDocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">2/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$LazyOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.AutoUnzipAdaptor.html">AutoUnzipAdaptor$NoContentsResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.2962962962962963;</span>2.296</td></tr>
-
<tr><td><a href="com.google.enterprise.adaptor.BlockingQueueBatcher.html">BlockingQueueBatcher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:95px"><span class="text">19/20</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.0;</span>3</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.CircularBufferHandler.html">CircularBufferHandler</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">5</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">15/20</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">4/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">20</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:88px"><span class="text">161/181</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">33</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:73px"><span class="text">90/123</span></div></div></td></tr></table></td><td class="value"><span class="hidden">6.875;</span>6.875</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">6.875;</span>6.875</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$Command</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:85px"><span class="text">6/7</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">6.875;</span>6.875</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$Operation</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">19/19</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">6.875;</span>6.875</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">21</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:89px"><span class="text">182/203</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">41</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:71px"><span class="text">101/142</span></div></div></td></tr></table></td><td class="value"><span class="hidden">7.625;</span>7.625</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">7.625;</span>7.625</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$Command</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:85px"><span class="text">6/7</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">7.625;</span>7.625</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.CommandStreamParser.html">CommandStreamParser$Operation</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">26/26</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">7.625;</span>7.625</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">19</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:91px"><span class="text">197/216</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">12</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">60/72</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$3</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$ValueComputer</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.9152542372881356;</span>1.915</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">18</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:90px"><span class="text">178/196</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">11</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:81px"><span class="text">49/60</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$3</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Config.html">Config$ValueComputer</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.793103448275862;</span>1.793</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.ConfigModificationEvent.html">ConfigModificationEvent</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:62px"><span class="text">5/8</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
@@ -128,6 +119,9 @@
<tr><td><a href="com.google.enterprise.adaptor.CustomFormatter.html">CustomFormatter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">36</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/36</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">12</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/12</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.0;</span>2</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.CustomFormatter.html">CustomFormatter$StringBufferWriter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">12</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.0;</span>2</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Daemon.html">Daemon</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">28/28</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.1666666666666665;</span>2.167</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.Daemon.html">Daemon$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:55px"><span class="text">5/9</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.1666666666666665;</span>2.167</td></tr>
+
<tr><td><a href="com.google.enterprise.adaptor.Dashboard.html">Dashboard</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:95px"><span class="text">44/46</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">4/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.7333333333333334;</span>1.733</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.Dashboard.html">Dashboard$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.7333333333333334;</span>1.733</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.Dashboard.html">Dashboard$CheckForUpdatedConfigRpcMethod</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.7333333333333334;</span>1.733</td></tr>
@@ -157,7 +151,7 @@
<tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher$Record</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">31/31</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">26/26</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher$Record</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:93px"><span class="text">29/31</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">26/26</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocIdPusher.html">DocIdPusher$Record$Builder</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">38/38</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.5714285714285714;</span>1.571</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocIdSender.html">DocIdSender</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">13</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:87px"><span class="text">94/107</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:90px"><span class="text">27/30</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8333333333333335;</span>3.833</td></tr>
@@ -170,7 +164,7 @@
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$CountByteArrayOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$CountingOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">12/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:94px"><span class="text">160/169</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">11</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:89px"><span class="text">95/106</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">8</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:95px"><span class="text">161/169</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:90px"><span class="text">96/106</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentResponse$CantUseOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">2/2</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$DocumentResponse$LazyContentOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.DocumentHandler.html">DocumentHandler$MaxBufferOutputStream</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:73px"><span class="text">17/23</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">8/12</span></div></div></td></tr></table></td><td class="value"><span class="hidden">4.472727272727273;</span>4.473</td></tr>
@@ -187,14 +181,14 @@
<tr><td><a href="com.google.enterprise.adaptor.GroupPrincipal.html">GroupPrincipal</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:62px"><span class="text">10/16</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">4/8</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.5;</span>2.5</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">41</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:80px"><span class="text">167/208</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">19</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:69px"><span class="text">43/62</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$AdaptorContextImpl</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">15</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:44px"><span class="text">12/27</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$AlreadyRunningRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:33px"><span class="text">1/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$BackgroundRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">5/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$GsaConfigModListener</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">23</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:4px"><span class="text">1/24</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$IncrementalPushRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:43px"><span class="text">7/16</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$PushRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">10/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4722222222222223;</span>3.472</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">41</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:80px"><span class="text">171/212</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">19</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:70px"><span class="text">45/64</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$AdaptorContextImpl</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">15</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:44px"><span class="text">12/27</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">4</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/4</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$AlreadyRunningRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:33px"><span class="text">1/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$BackgroundRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">5/5</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$GsaConfigModListener</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">23</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:4px"><span class="text">1/24</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$IncrementalPushRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:43px"><span class="text">7/16</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.GsaCommunicationHandler.html">GsaCommunicationHandler$PushRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">10/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.4324324324324325;</span>3.432</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.GsaFeedFileMaker.html">GsaFeedFileMaker</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:91px"><span class="text">112/122</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">40/40</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.909090909090909;</span>3.909</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.GsaFeedFileMaker.html">GsaFeedFileMaker$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.909090909090909;</span>3.909</td></tr>
@@ -278,9 +272,9 @@
<tr><td><a href="com.google.enterprise.adaptor.SecurityManagerConfig.html">SecurityManagerConfig</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">3/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.SecurityManagerConfig.html">SecurityManagerConfig$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">6/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">22</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:67px"><span class="text">46/68</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:90px"><span class="text">18/20</span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.2;</span>5.2</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.2;</span>5.2</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec$SecurityLevel</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">8/8</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.2;</span>5.2</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">22</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:67px"><span class="text">45/67</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:88px"><span class="text">16/18</span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.0;</span>5</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">1/1</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.0;</span>5</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.SensitiveValueCodec.html">SensitiveValueCodec$SecurityLevel</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">8/8</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">5.0;</span>5</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.SensitiveValueDecoder.html">SensitiveValueDecoder</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
@@ -292,7 +286,7 @@
<tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:82px"><span class="text">29/35</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">10/10</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$NotificationFilter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">10</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:9px"><span class="text">1/11</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$NotificationFilter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:72px"><span class="text">8/11</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$NotificationRunnable</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">10/12</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.ShutdownWaiter.html">ShutdownWaiter$ShutdownException</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.7;</span>2.7</td></tr>
@@ -328,13 +322,13 @@
<tr><td><a href="com.google.enterprise.adaptor.Watchdog.html">Watchdog$FutureInfo</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">4/4</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.3333333333333335;</span>2.333</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.Watchdog.html">Watchdog$Interrupter</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">10/10</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">1/2</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.3333333333333335;</span>2.333</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:78px"><span class="text">11/14</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$GetContentsRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">4/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$GetContentsResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">35</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:28px"><span class="text">14/49</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">11</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:21px"><span class="text">3/14</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$GetContentsRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$GetContentsResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">9</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:82px"><span class="text">42/51</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperAdaptorContext</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">16</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:15px"><span class="text">3/19</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperDocIdPusher</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">3</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:50px"><span class="text">3/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">29</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:9px"><span class="text">3/32</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperRequest</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">6</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.WrapperAdaptor.html">WrapperAdaptor$WrapperResponse</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">32</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/32</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
</tbody>
</table>
diff --git a/coverage/frame-summary-com.google.enterprise.adaptor.prebuilt.html b/coverage/frame-summary-com.google.enterprise.adaptor.prebuilt.html
index 77837d7..0e2bfe3 100644
--- a/coverage/frame-summary-com.google.enterprise.adaptor.prebuilt.html
+++ b/coverage/frame-summary-com.google.enterprise.adaptor.prebuilt.html
@@ -16,7 +16,7 @@
<table class="report" id="packageResults">
<thead><tr> <td class="heading">Package</td> <td class="heading"># Classes</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
<tbody>
- <tr><td><a href="frame-summary-com.google.enterprise.adaptor.prebuilt.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html"'>com.google.enterprise.adaptor.prebuilt</a></td><td class="value">18</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">145</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">253/398</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">52</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">56/108</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4305555555555554;</span>2.431</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.prebuilt.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html"'>com.google.enterprise.adaptor.prebuilt</a></td><td class="value">18</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">145</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">252/397</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">52</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">56/108</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4305555555555554;</span>2.431</td></tr>
</tbody>
</table>
<script type="text/javascript">
@@ -30,7 +30,7 @@
<tbody>
<tr><td><a href="com.google.enterprise.adaptor.prebuilt.Command.html">Command</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:94px"><span class="text">17/18</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">1.0;</span>1</td></tr>
- <tr><td><a href="com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html">CommandLineAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">37</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:68px"><span class="text">82/119</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">14</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:58px"><span class="text">20/34</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5625;</span>3.562</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html">CommandLineAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">37</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:68px"><span class="text">81/118</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">14</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:58px"><span class="text">20/34</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5625;</span>3.562</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html">CommandLineAdaptor$1</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">2</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:66px"><span class="text">4/6</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5625;</span>3.562</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.prebuilt.CommandLineAdaptor.html">CommandLineAdaptor$2</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">0</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:100px"><span class="text">3/3</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></td><td class="percentgraph"><div class="percentgraph"><div class="na" style="width:100px"><span class="text"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">N/A</a></span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5625;</span>3.562</td></tr>
diff --git a/coverage/frame-summary.html b/coverage/frame-summary.html
index a350197..c124b62 100644
--- a/coverage/frame-summary.html
+++ b/coverage/frame-summary.html
@@ -16,10 +16,11 @@
<table class="report" id="packageResults">
<thead><tr> <td class="heading">Package</td> <td class="heading"># Classes</td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Line Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Branch Coverage</a></td> <td class="heading"><a class="dfn" href="help.html" onclick="popupwindow('help.html'); return false;">Complexity</a></td></tr></thead>
<tbody>
- <tr><td><b>All Packages</b></td><td class="value">245</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1161</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:78px"><span class="text">4269/5430</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">369</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:78px"><span class="text">1337/1706</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.376172607879925;</span>2.376</td></tr>
- <tr><td><a href="frame-summary-com.google.enterprise.adaptor.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.html"'>com.google.enterprise.adaptor</a></td><td class="value">215</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">729</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:84px"><span class="text">3944/4673</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">251</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">1255/1506</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.372093023255814;</span>2.372</td></tr>
- <tr><td><a href="frame-summary-com.google.enterprise.adaptor.examples.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.examples.html"'>com.google.enterprise.adaptor.examples</a></td><td class="value">12</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">287</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:20px"><span class="text">72/359</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">66</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:28px"><span class="text">26/92</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.375;</span>2.375</td></tr>
- <tr><td><a href="frame-summary-com.google.enterprise.adaptor.prebuilt.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html"'>com.google.enterprise.adaptor.prebuilt</a></td><td class="value">18</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">145</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">253/398</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">52</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">56/108</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4305555555555554;</span>2.431</td></tr>
+ <tr><td><b>All Packages</b></td><td class="value">246</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1309</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:76px"><span class="text">4239/5548</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">436</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">1333/1769</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.404255319148936;</span>2.404</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.html"'>com.google.enterprise.adaptor</a></td><td class="value">208</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">659</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:85px"><span class="text">3915/4574</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">241</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:83px"><span class="text">1251/1492</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.3664529914529915;</span>2.366</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.examples.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.examples.html"'>com.google.enterprise.adaptor.examples</a></td><td class="value">12</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">286</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:20px"><span class="text">72/358</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">66</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:28px"><span class="text">26/92</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.375;</span>2.375</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.experimental.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.experimental.html"'>com.google.enterprise.adaptor.experimental</a></td><td class="value">8</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">219</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/219</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">77</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/77</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.8;</span>3.8</td></tr>
+ <tr><td><a href="frame-summary-com.google.enterprise.adaptor.prebuilt.html" onclick='parent.sourceFileList.location.href="frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html"'>com.google.enterprise.adaptor.prebuilt</a></td><td class="value">18</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">145</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">252/397</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">52</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">56/108</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4305555555555554;</span>2.431</td></tr>
</tbody>
</table>
<script type="text/javascript">
diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html
index 86b4748..085a09c 100644
--- a/javadoc/allclasses-frame.html
+++ b/javadoc/allclasses-frame.html
@@ -63,6 +63,8 @@
<BR>
<A HREF="com/google/enterprise/adaptor/CustomFormatter.html" title="class in com.google.enterprise.adaptor" target="classFrame">CustomFormatter</A>
<BR>
+<A HREF="com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor" target="classFrame">Daemon</A>
+<BR>
<A HREF="com/google/enterprise/adaptor/examples/DbAdaptorTemplate.html" title="class in com.google.enterprise.adaptor.examples" target="classFrame">DbAdaptorTemplate</A>
<BR>
<A HREF="com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor" target="classFrame">DefaultGetDocIdsErrorHandler</A>
@@ -115,6 +117,8 @@
<BR>
<A HREF="com/google/enterprise/adaptor/Session.html" title="interface in com.google.enterprise.adaptor" target="classFrame"><I>Session</I></A>
<BR>
+<A HREF="com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental" target="classFrame">Sim</A>
+<BR>
<A HREF="com/google/enterprise/adaptor/Status.html" title="interface in com.google.enterprise.adaptor" target="classFrame"><I>Status</I></A>
<BR>
<A HREF="com/google/enterprise/adaptor/Status.Code.html" title="enum in com.google.enterprise.adaptor" target="classFrame">Status.Code</A>
diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html
index 25e36b3..4588591 100644
--- a/javadoc/allclasses-noframe.html
+++ b/javadoc/allclasses-noframe.html
@@ -63,6 +63,8 @@
<BR>
<A HREF="com/google/enterprise/adaptor/CustomFormatter.html" title="class in com.google.enterprise.adaptor">CustomFormatter</A>
<BR>
+<A HREF="com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor">Daemon</A>
+<BR>
<A HREF="com/google/enterprise/adaptor/examples/DbAdaptorTemplate.html" title="class in com.google.enterprise.adaptor.examples">DbAdaptorTemplate</A>
<BR>
<A HREF="com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor">DefaultGetDocIdsErrorHandler</A>
@@ -115,6 +117,8 @@
<BR>
<A HREF="com/google/enterprise/adaptor/Session.html" title="interface in com.google.enterprise.adaptor"><I>Session</I></A>
<BR>
+<A HREF="com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental">Sim</A>
+<BR>
<A HREF="com/google/enterprise/adaptor/Status.html" title="interface in com.google.enterprise.adaptor"><I>Status</I></A>
<BR>
<A HREF="com/google/enterprise/adaptor/Status.Code.html" title="enum in com.google.enterprise.adaptor">Status.Code</A>
diff --git a/javadoc/com/google/enterprise/adaptor/AbstractAdaptor.html b/javadoc/com/google/enterprise/adaptor/AbstractAdaptor.html
index 2e01783..98c0c62 100644
--- a/javadoc/com/google/enterprise/adaptor/AbstractAdaptor.html
+++ b/javadoc/com/google/enterprise/adaptor/AbstractAdaptor.html
@@ -258,7 +258,7 @@
<p>If you experience a fatal error, feel free to throw an <A HREF="http://download.oracle.com/javase/6/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io"><CODE>IOException</CODE></A> or <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang"><CODE>RuntimeException</CODE></A>. In the case of an error, the
users will be denied access to the resources.
- <p>This implementation provides <A HREF="../../../../com/google/enterprise/adaptor/AuthzStatus.html#PERMIT"><CODE>AuthzStatus.PERMIT</CODE></A> for all <code>DocId</code>s in an unmodifiable map.
+ <p>This implementation provides <A HREF="../../../../com/google/enterprise/adaptor/AuthzStatus.html#DENY"><CODE>AuthzStatus.DENY</CODE></A> for all <code>DocId</code>s in an unmodifiable map.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../com/google/enterprise/adaptor/Adaptor.html#isUserAuthorized(com.google.enterprise.adaptor.AuthnIdentity, java.util.Collection)">isUserAuthorized</A></CODE> in interface <CODE><A HREF="../../../../com/google/enterprise/adaptor/Adaptor.html" title="interface in com.google.enterprise.adaptor">Adaptor</A></CODE></DL>
diff --git a/javadoc/com/google/enterprise/adaptor/Application.html b/javadoc/com/google/enterprise/adaptor/Application.html
index 5e97e75..b09aa68 100644
--- a/javadoc/com/google/enterprise/adaptor/Application.html
+++ b/javadoc/com/google/enterprise/adaptor/Application.html
@@ -135,6 +135,14 @@
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Application.html#getConfig()">getConfig</A></B>()</CODE>
+
+<BR>
+ Returns the <A HREF="../../../../com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><CODE>Config</CODE></A> used by this instance.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> <A HREF="../../../../com/google/enterprise/adaptor/GsaCommunicationHandler.html" title="class in com.google.enterprise.adaptor">GsaCommunicationHandler</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Application.html#getGsaCommunicationHandler()">getGsaCommunicationHandler</A></B>()</CODE>
@@ -259,6 +267,19 @@
</DL>
<HR>
+<A NAME="getConfig()"><!-- --></A><H3>
+getConfig</H3>
+<PRE>
+public <A HREF="../../../../com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A> <B>getConfig</B>()</PRE>
+<DL>
+<DD>Returns the <A HREF="../../../../com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><CODE>Config</CODE></A> used by this instance.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
<A NAME="main(com.google.enterprise.adaptor.Adaptor, java.lang.String[])"><!-- --></A><H3>
main</H3>
<PRE>
diff --git a/javadoc/com/google/enterprise/adaptor/CommandStreamParser.html b/javadoc/com/google/enterprise/adaptor/CommandStreamParser.html
index 610a49a..38c1fec 100644
--- a/javadoc/com/google/enterprise/adaptor/CommandStreamParser.html
+++ b/javadoc/com/google/enterprise/adaptor/CommandStreamParser.html
@@ -187,12 +187,44 @@
"mime-type=" -- specifies the document's mime-type. If unspecified then the GSA will
automatically assign a type to the document. <p>
+ "meta-name=" -- specifies a metadata key, to be followed by a metadata-value<p>
+
"meta-value=" -- specifies a metadata value associated with
immediately preceding metadata-name<p>
"content" -- signals the beginning of binary content which
continues to the end of the file or stream<p>
+ "last-modified=" -- specifies the last time the document or its metadata has changed.
+ The argument is a number representing the number of seconds since the standard base
+ time known as the epoch", namely January 1, 1970, 00:00:00 GMT.<p>
+
+ "secure=" -- specifies whether the document is non-public. The argument is either 'true' or
+ 'false'.<p>
+
+ "anchor-uri=" -- specifies an anchor URI, to be followed by anchor-text.<p>
+
+ "anchor-text=" -- specifies the text associated with an anchor-uri.<p>
+
+ "no-index=" -- specifies whether the document should be indexed by the GSA. The argument is
+ either 'true' or 'false'.<p>
+
+ "no-follow=" -- specifies whether the document's links should be followed by the GSA. The
+ argument is either 'true' or 'false'.<p>
+
+ "no-archive=" -- specifies whether GSA document will allow the user to see a cached version of
+ the document. The argument is either 'true' or 'false'.<p>
+
+ "display-url=" -- specifies an alternative link to be displayed in the search results.
+ This must be a properly formed URL.<p>
+
+ "crawl-once=" -- specifies that the document will be crawled by the
+ GSA one time but then never re-crawled. The argument should be 'true' or 'false'.<p>
+
+ "lock=" -- Causes the document to remain in the index unless explicitly removed.
+ If every document in the GSA is locked then locked document may be forced out when maximum
+ capacity is reached.<p>
+
<h1>Authorizer Commands:</h1>
"authz-status=" -- specifies whether a document is visible to a
diff --git a/javadoc/com/google/enterprise/adaptor/Config.html b/javadoc/com/google/enterprise/adaptor/Config.html
index 4a2349b..9cd0938 100644
--- a/javadoc/com/google/enterprise/adaptor/Config.html
+++ b/javadoc/com/google/enterprise/adaptor/Config.html
@@ -105,8 +105,6 @@
<table>
<tr><td align=center><b>required?</b></td>
<td><b>name</b></td><td><b>meaning</b></td>
- <tr><td> </td><td>adaptor.autoUnzip </td><td> expand zip files and send
- each file inside separatly. Defaults to false
<tr><td> </td><td>adaptor.sendDocControlsHeader </td><td>use
X-Gsa-Doc-Controls HTTP header with namespaced ACLs.
Otherwise ACLs are sent without namespace and as metadata.
@@ -142,6 +140,9 @@
in feed files. Defaults to UTF-8
<tr><td align="center"> yes </td><td>gsa.hostname </td><td> machine to
send feed files to. Process errors if not provided
+ <tr><td> </td><td>gsa.samlEntityId </td><td> The SAML Entity ID that
+ identifies the GSA. Defaults to
+ http://google.com/enterprise/gsa/security-manager
<tr><td> </td><td>journal.reducedMem </td><td> avoid tracking per URL
information in RAM; suggested with over five hundred thousand documents.
Defaults to true
@@ -171,6 +172,9 @@
<tr><td> </td><td>server.reverseProxyProtocol </td><td> either http or https,
depending on proxy traffic. Defaults to https in secure
mode and http otherwise
+ <tr><td> </td><td>server.samlEntityId </td><td> The SAML Entity ID that the
+ Adaptor will use to identity itself. Defaults to
+ http://google.com/enterprise/gsa/adaptor
<tr><td> </td><td>server.secure </td><td> enables https and certificate
checking. Defaults to false
<tr><td> </td><td>server.useCompression </td><td> compress retrieval
@@ -224,14 +228,6 @@
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[]</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#autoConfig(java.lang.String[])">autoConfig</A></B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[] args)</CODE>
-
-<BR>
- Load default configuration file and parse command line options.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> boolean</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#ensureLatestConfigLoaded()">ensureLatestConfigLoaded</A></B>()</CODE>
@@ -240,31 +236,6 @@
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> long</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getAdaptorDocContentTimeoutMillis()">getAdaptorDocContentTimeoutMillis</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getAdaptorFullListingSchedule()">getAdaptorFullListingSchedule</A></B>()</CODE>
-
-<BR>
- Cron-style format for describing when the adaptor should perform full
- listings of <code>DocId</code>s.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> long</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getAdaptorIncrementalPollPeriodMillis()">getAdaptorIncrementalPollPeriodMillis</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</A><<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getAllKeys()">getAllKeys</A></B>()</CODE>
@@ -273,39 +244,6 @@
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> int</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getFeedMaxUrls()">getFeedMaxUrls</A></B>()</CODE>
-
-<BR>
- Provides max number of URLs (equal to number of document ids) that are sent
- to the GSA per feed file.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getFeedName()">getFeedName</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html?is-external=true" title="class or interface in java.nio.charset">Charset</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getGsaCharacterEncoding()">getGsaCharacterEncoding</A></B>()</CODE>
-
-<BR>
- Provides the character encoding the GSA prefers.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getGsaHostname()">getGsaHostname</A></B>()</CODE>
-
-<BR>
- Required to be set: GSA machine to send document ids to.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getRawValue(java.lang.String)">getRawValue</A></B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> key)</CODE>
@@ -314,126 +252,6 @@
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/net/URI.html?is-external=true" title="class or interface in java.net">URI</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerBaseUri()">getServerBaseUri</A></B>()</CODE>
-
-<BR>
- Optional: Returns this host's base URI which other paths will be resolved
- against.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/net/URI.html?is-external=true" title="class or interface in java.net">URI</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerBaseUri(com.google.enterprise.adaptor.DocId)">getServerBaseUri</A></B>(<A HREF="../../../../com/google/enterprise/adaptor/DocId.html" title="class in com.google.enterprise.adaptor">DocId</A> docId)</CODE>
-
-<BR>
- Optional: Returns the host's base URI which GSA will contact for document
- information, including document contents.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> int</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerDashboardPort()">getServerDashboardPort</A></B>()</CODE>
-
-<BR>
- Local port, on this computer, from which the dashboard is served.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerDocIdPath()">getServerDocIdPath</A></B>()</CODE>
-
-<BR>
- Optional: Path below <A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerBaseUri(com.google.enterprise.adaptor.DocId)"><CODE>getServerBaseUri(DocId)</CODE></A> where documents are
- namespaced.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[]</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerFullAccessHosts()">getServerFullAccessHosts</A></B>()</CODE>
-
-<BR>
- Comma-separated list of IPs or hostnames that can retrieve content without
- authentication checks.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerHostname()">getServerHostname</A></B>()</CODE>
-
-<BR>
- Without changes contains InetAddress.getLocalHost().getHostName().</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerKeyAlias()">getServerKeyAlias</A></B>()</CODE>
-
-<BR>
- The alias in the keystore that has the key to use for encryption.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> int</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerMaxWorkerThreads()">getServerMaxWorkerThreads</A></B>()</CODE>
-
-<BR>
- The maximum number of worker threads to use to respond to document
- requests.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> int</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerPort()">getServerPort</A></B>()</CODE>
-
-<BR>
- Suggested to be set: Local port, on this computer, onto which requests from
- GSA come in on.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> int</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerQueueCapacity()">getServerQueueCapacity</A></B>()</CODE>
-
-<BR>
- The maximum request queue length.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> int</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerReverseProxyPort()">getServerReverseProxyPort</A></B>()</CODE>
-
-<BR>
- The port that should be used in feed file and other references to the
- adaptor.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerReverseProxyProtocol()">getServerReverseProxyProtocol</A></B>()</CODE>
-
-<BR>
- The protocol that should be used in feed files and other references to the
- adaptor.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> int</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getTransformMaxDocumentBytes()">getTransformMaxDocumentBytes</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</A><<A HREF="http://download.oracle.com/javase/6/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</A><<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>,<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>>></CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getTransformPipelineSpec()">getTransformPipelineSpec</A></B>()</CODE>
-
-<BR>
- Returns a list of maps correspending to each transform in the pipeline.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#getValue(java.lang.String)">getValue</A></B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> key)</CODE>
@@ -451,90 +269,6 @@
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isAdaptorPushDocIdsOnStartup()">isAdaptorPushDocIdsOnStartup</A></B>()</CODE>
-
-<BR>
- Whether the default <code>main()</code> should automatically start pushing all
- document ids on startup.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isCrawlImmediatelyBitEnabled()">isCrawlImmediatelyBitEnabled</A></B>()</CODE>
-
-<BR>
- Optional (default false): Adds crawl-immediately bit with sent records in
- feed file.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isDocIdUrl()">isDocIdUrl</A></B>()</CODE>
-
-<BR>
- Optional (default false): If your DocIds are already valid URLs you can
- have this method return true and they will be sent to GSA unmodified.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isFeedNoRecrawlBitEnabled()">isFeedNoRecrawlBitEnabled</A></B>()</CODE>
-
-<BR>
- Optional (default false): Adds no-recrawl bit with sent records in feed
- file.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isGsa614FeedWorkaroundEnabled()">isGsa614FeedWorkaroundEnabled</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isGsa70AuthMethodWorkaroundEnabled()">isGsa70AuthMethodWorkaroundEnabled</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isJournalReducedMem()">isJournalReducedMem</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isServerSecure()">isServerSecure</A></B>()</CODE>
-
-<BR>
- Whether full security should be enabled.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isServerToUseCompression()">isServerToUseCompression</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#isTransformRequired()">isTransformRequired</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#load(java.io.File)">load</A></B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/io/File.html?is-external=true" title="class or interface in java.io">File</A> configFile)</CODE>
@@ -552,15 +286,6 @@
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> void</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#loadDefaultConfigFile()">loadDefaultConfigFile</A></B>()</CODE>
-
-<BR>
- Loads <code>adaptor-config.properties</code> in the current directory, if it
- exists.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#overrideKey(java.lang.String, java.lang.String)">overrideKey</A></B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> key,
<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> defaultValue)</CODE>
@@ -569,23 +294,6 @@
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#sendDocControlsHeader()">sendDocControlsHeader</A></B>()</CODE>
-
-<BR>
- </TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE> boolean</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#useAdaptorAutoUnzip()">useAdaptorAutoUnzip</A></B>()</CODE>
-
-<BR>
- Automatically unzips and <code>DocId</code>s ending in <code>.zip</code> and provides
- them to the GSA.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Config.html#validate()">validate</A></B>()</CODE>
@@ -643,488 +351,6 @@
</DL>
<HR>
-<A NAME="getGsaHostname()"><!-- --></A><H3>
-getGsaHostname</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getGsaHostname</B>()</PRE>
-<DL>
-<DD>Required to be set: GSA machine to send document ids to. This is the
- hostname of your GSA on your network.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getFeedName()"><!-- --></A><H3>
-getFeedName</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getFeedName</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerPort()"><!-- --></A><H3>
-getServerPort</H3>
-<PRE>
-public int <B>getServerPort</B>()</PRE>
-<DL>
-<DD>Suggested to be set: Local port, on this computer, onto which requests from
- GSA come in on.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerReverseProxyPort()"><!-- --></A><H3>
-getServerReverseProxyPort</H3>
-<PRE>
-public int <B>getServerReverseProxyPort</B>()</PRE>
-<DL>
-<DD>The port that should be used in feed file and other references to the
- adaptor. This does not affect the actual port the adaptor uses.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerReverseProxyProtocol()"><!-- --></A><H3>
-getServerReverseProxyProtocol</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getServerReverseProxyProtocol</B>()</PRE>
-<DL>
-<DD>The protocol that should be used in feed files and other references to the
- adaptor. This does not affect the actual protocol the adaptor uses.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerDashboardPort()"><!-- --></A><H3>
-getServerDashboardPort</H3>
-<PRE>
-public int <B>getServerDashboardPort</B>()</PRE>
-<DL>
-<DD>Local port, on this computer, from which the dashboard is served.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isDocIdUrl()"><!-- --></A><H3>
-isDocIdUrl</H3>
-<PRE>
-public boolean <B>isDocIdUrl</B>()</PRE>
-<DL>
-<DD>Optional (default false): If your DocIds are already valid URLs you can
- have this method return true and they will be sent to GSA unmodified. If
- your DocId is like http://procurement.corp.company.com/internal/011212.html
- you can turn this true and that URL will be handed to the GSA.
-
- <p>By default DocIds are URL encoded and prefixed with http:// and this
- host's name and port.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerHostname()"><!-- --></A><H3>
-getServerHostname</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getServerHostname</B>()</PRE>
-<DL>
-<DD>Without changes contains InetAddress.getLocalHost().getHostName().
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerFullAccessHosts()"><!-- --></A><H3>
-getServerFullAccessHosts</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[] <B>getServerFullAccessHosts</B>()</PRE>
-<DL>
-<DD>Comma-separated list of IPs or hostnames that can retrieve content without
- authentication checks. The GSA's hostname is implicitly in this list.
-
- <p>When in secure mode, clients are requested to provide a client
- certificate. If the provided client certificate is valid and the Common
- Name (CN) of the Subject is in this list (case-insensitively), then it is
- given access.
-
- <p>In non-secure mode, the hostnames in this list are resolved to IPs at
- startup and when a request is made from one of those IPs the client is
- given access.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerBaseUri()"><!-- --></A><H3>
-getServerBaseUri</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/net/URI.html?is-external=true" title="class or interface in java.net">URI</A> <B>getServerBaseUri</B>()</PRE>
-<DL>
-<DD>Optional: Returns this host's base URI which other paths will be resolved
- against. It is used to construct URIs to provide to the GSA for it to
- contact this server for various services. For documents (which is probably
- what you care about), the <A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerBaseUri(com.google.enterprise.adaptor.DocId)"><CODE>getServerBaseUri(DocId)</CODE></A> version is used
- instead.
-
- <p>It must contain the protocol, hostname, and port, but may optionally
- contain a path like <code>/yourfavoritepath</code>. By default, the protocol,
- hostname, and port are retrieved automatically and no path is set.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerDocIdPath()"><!-- --></A><H3>
-getServerDocIdPath</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getServerDocIdPath</B>()</PRE>
-<DL>
-<DD>Optional: Path below <A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerBaseUri(com.google.enterprise.adaptor.DocId)"><CODE>getServerBaseUri(DocId)</CODE></A> where documents are
- namespaced. Generally, should be at least <code>"/"</code> and end with a slash.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerBaseUri(com.google.enterprise.adaptor.DocId)"><!-- --></A><H3>
-getServerBaseUri</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/net/URI.html?is-external=true" title="class or interface in java.net">URI</A> <B>getServerBaseUri</B>(<A HREF="../../../../com/google/enterprise/adaptor/DocId.html" title="class in com.google.enterprise.adaptor">DocId</A> docId)</PRE>
-<DL>
-<DD>Optional: Returns the host's base URI which GSA will contact for document
- information, including document contents. By default it returns <A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerBaseUri()"><CODE>getServerBaseUri()</CODE></A>. However, if you would like to direct GSA's queries
- for contents to go to other computers/binaries then you can change this
- method.
-
- <p>For example, imagine that you want five binaries to serve the contents
- of files to the GSA. In this case you could split the document ids into
- five categories using something like:
-
- <pre>String urlBeginnings[] = new String[] {
- "http://content-server-A:5678",
- "http://content-server-B:5678",
- "http://backup-server-A:5678",
- "http://backup-server-B:5678",
- "http://new-server:7878"
- };
- int shard = docId.getUniqueId().hashCode() % 5;
- return URI.create(urlBeginnings[shard]);</pre>
-
- <p>Note that this URI is used in conjunction with <A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerDocIdPath()"><CODE>getServerDocIdPath()</CODE></A> and the document ID to form the full URL. In addition,
- by using <A HREF="../../../../com/google/enterprise/adaptor/Config.html#getServerBaseUri()"><CODE>getServerBaseUri()</CODE></A> and <code>getDocIdPath()</code>, we have to
- be able to parse back the original document ID when a request comes to this
- server.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isServerSecure()"><!-- --></A><H3>
-isServerSecure</H3>
-<PRE>
-public boolean <B>isServerSecure</B>()</PRE>
-<DL>
-<DD>Whether full security should be enabled. When <code>true</code>, the adaptor is
- locked down using HTTPS, checks certificates, and generally behaves in a
- fully-secure manner. When <code>false</code> (default), the adaptor serves
- content over HTTP and is unable to authenticate users (all users are
- treated as anonymous).
-
- <p>The need for this setting is because when enabled, security requires a
- reasonable amount of configuration and know-how. To provide easy
- out-of-the-box execution, this is disabled by default.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerKeyAlias()"><!-- --></A><H3>
-getServerKeyAlias</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getServerKeyAlias</B>()</PRE>
-<DL>
-<DD>The alias in the keystore that has the key to use for encryption.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerMaxWorkerThreads()"><!-- --></A><H3>
-getServerMaxWorkerThreads</H3>
-<PRE>
-public int <B>getServerMaxWorkerThreads</B>()</PRE>
-<DL>
-<DD>The maximum number of worker threads to use to respond to document
- requests. The main reason to limit the number of threads is that each can
- be using a transform pipeline and will have multiple complete copies of the
- response in memory at the same time.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getServerQueueCapacity()"><!-- --></A><H3>
-getServerQueueCapacity</H3>
-<PRE>
-public int <B>getServerQueueCapacity</B>()</PRE>
-<DL>
-<DD>The maximum request queue length.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isServerToUseCompression()"><!-- --></A><H3>
-isServerToUseCompression</H3>
-<PRE>
-public boolean <B>isServerToUseCompression</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="sendDocControlsHeader()"><!-- --></A><H3>
-sendDocControlsHeader</H3>
-<PRE>
-public boolean <B>sendDocControlsHeader</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isFeedNoRecrawlBitEnabled()"><!-- --></A><H3>
-isFeedNoRecrawlBitEnabled</H3>
-<PRE>
-public boolean <B>isFeedNoRecrawlBitEnabled</B>()</PRE>
-<DL>
-<DD>Optional (default false): Adds no-recrawl bit with sent records in feed
- file. If connector handles updates and deletes then GSA does not have to
- recrawl periodically to notice that a document is changed or deleted.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isCrawlImmediatelyBitEnabled()"><!-- --></A><H3>
-isCrawlImmediatelyBitEnabled</H3>
-<PRE>
-public boolean <B>isCrawlImmediatelyBitEnabled</B>()</PRE>
-<DL>
-<DD>Optional (default false): Adds crawl-immediately bit with sent records in
- feed file. This bit makes the sent URL get crawl priority.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isAdaptorPushDocIdsOnStartup()"><!-- --></A><H3>
-isAdaptorPushDocIdsOnStartup</H3>
-<PRE>
-public boolean <B>isAdaptorPushDocIdsOnStartup</B>()</PRE>
-<DL>
-<DD>Whether the default <code>main()</code> should automatically start pushing all
- document ids on startup. Defaults to <code>true</code>.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="useAdaptorAutoUnzip()"><!-- --></A><H3>
-useAdaptorAutoUnzip</H3>
-<PRE>
-public boolean <B>useAdaptorAutoUnzip</B>()</PRE>
-<DL>
-<DD>Automatically unzips and <code>DocId</code>s ending in <code>.zip</code> and provides
- them to the GSA.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getAdaptorFullListingSchedule()"><!-- --></A><H3>
-getAdaptorFullListingSchedule</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getAdaptorFullListingSchedule</B>()</PRE>
-<DL>
-<DD>Cron-style format for describing when the adaptor should perform full
- listings of <code>DocId</code>s. Multiple times can be specified by separating
- them with a '|' (vertical bar).
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getAdaptorIncrementalPollPeriodMillis()"><!-- --></A><H3>
-getAdaptorIncrementalPollPeriodMillis</H3>
-<PRE>
-public long <B>getAdaptorIncrementalPollPeriodMillis</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getAdaptorDocContentTimeoutMillis()"><!-- --></A><H3>
-getAdaptorDocContentTimeoutMillis</H3>
-<PRE>
-public long <B>getAdaptorDocContentTimeoutMillis</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getTransformPipelineSpec()"><!-- --></A><H3>
-getTransformPipelineSpec</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</A><<A HREF="http://download.oracle.com/javase/6/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</A><<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>,<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>>> <B>getTransformPipelineSpec</B>()</PRE>
-<DL>
-<DD>Returns a list of maps correspending to each transform in the pipeline.
- Each map is the configuration entries for that transform. The 'name'
- configuration entry is added in each map based on the name provided by the
- user.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getTransformMaxDocumentBytes()"><!-- --></A><H3>
-getTransformMaxDocumentBytes</H3>
-<PRE>
-public int <B>getTransformMaxDocumentBytes</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isTransformRequired()"><!-- --></A><H3>
-isTransformRequired</H3>
-<PRE>
-public boolean <B>isTransformRequired</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isJournalReducedMem()"><!-- --></A><H3>
-isJournalReducedMem</H3>
-<PRE>
-public boolean <B>isJournalReducedMem</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getGsaCharacterEncoding()"><!-- --></A><H3>
-getGsaCharacterEncoding</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html?is-external=true" title="class or interface in java.nio.charset">Charset</A> <B>getGsaCharacterEncoding</B>()</PRE>
-<DL>
-<DD>Provides the character encoding the GSA prefers.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isGsa614FeedWorkaroundEnabled()"><!-- --></A><H3>
-isGsa614FeedWorkaroundEnabled</H3>
-<PRE>
-public boolean <B>isGsa614FeedWorkaroundEnabled</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="isGsa70AuthMethodWorkaroundEnabled()"><!-- --></A><H3>
-isGsa70AuthMethodWorkaroundEnabled</H3>
-<PRE>
-public boolean <B>isGsa70AuthMethodWorkaroundEnabled</B>()</PRE>
-<DL>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
-<A NAME="getFeedMaxUrls()"><!-- --></A><H3>
-getFeedMaxUrls</H3>
-<PRE>
-public int <B>getFeedMaxUrls</B>()</PRE>
-<DL>
-<DD>Provides max number of URLs (equal to number of document ids) that are sent
- to the GSA per feed file.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
<A NAME="load(java.lang.String)"><!-- --></A><H3>
load</H3>
<PRE>
@@ -1172,21 +398,6 @@
</DL>
<HR>
-<A NAME="loadDefaultConfigFile()"><!-- --></A><H3>
-loadDefaultConfigFile</H3>
-<PRE>
-public void <B>loadDefaultConfigFile</B>()</PRE>
-<DL>
-<DD>Loads <code>adaptor-config.properties</code> in the current directory, if it
- exists. It squelches any errors so that you are free to call it without
- error handling, since this is typically non-fatal.
-<P>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
<A NAME="validate()"><!-- --></A><H3>
validate</H3>
<PRE>
@@ -1198,22 +409,6 @@
</DL>
<HR>
-<A NAME="autoConfig(java.lang.String[])"><!-- --></A><H3>
-autoConfig</H3>
-<PRE>
-public <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[] <B>autoConfig</B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[] args)</PRE>
-<DL>
-<DD>Load default configuration file and parse command line options.
-<P>
-<DD><DL>
-
-<DT><B>Returns:</B><DD>unused command line arguments
-<DT><B>Throws:</B>
-<DD><CODE><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/IllegalStateException.html?is-external=true" title="class or interface in java.lang">IllegalStateException</A></CODE> - when not all configuration keys have values</DL>
-</DD>
-</DL>
-<HR>
-
<A NAME="getRawValue(java.lang.String)"><!-- --></A><H3>
getRawValue</H3>
<PRE>
diff --git a/javadoc/com/google/enterprise/adaptor/CustomFormatter.html b/javadoc/com/google/enterprise/adaptor/CustomFormatter.html
index f2839e9..1bd17fb 100644
--- a/javadoc/com/google/enterprise/adaptor/CustomFormatter.html
+++ b/javadoc/com/google/enterprise/adaptor/CustomFormatter.html
@@ -53,7 +53,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><B>PREV CLASS</B></A>
- <A HREF="../../../../com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>NEXT CLASS</B></A></FONT></TD>
+ <A HREF="../../../../com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/google/enterprise/adaptor/CustomFormatter.html" target="_top"><B>FRAMES</B></A>
<A HREF="CustomFormatter.html" target="_top"><B>NO FRAMES</B></A>
@@ -270,7 +270,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><B>PREV CLASS</B></A>
- <A HREF="../../../../com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>NEXT CLASS</B></A></FONT></TD>
+ <A HREF="../../../../com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/google/enterprise/adaptor/CustomFormatter.html" target="_top"><B>FRAMES</B></A>
<A HREF="CustomFormatter.html" target="_top"><B>NO FRAMES</B></A>
diff --git a/javadoc/com/google/enterprise/adaptor/Daemon.html b/javadoc/com/google/enterprise/adaptor/Daemon.html
new file mode 100644
index 0000000..1fdf6fa
--- /dev/null
+++ b/javadoc/com/google/enterprise/adaptor/Daemon.html
@@ -0,0 +1,338 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+Daemon
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Daemon";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../com/google/enterprise/adaptor/CustomFormatter.html" title="class in com.google.enterprise.adaptor"><B>PREV CLASS</B></A>
+ <A HREF="../../../../com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/enterprise/adaptor/Daemon.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Daemon.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.enterprise.adaptor</FONT>
+<BR>
+Class Daemon</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+ <IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.google.enterprise.adaptor.Daemon</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>org.apache.commons.daemon.Daemon</DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public class <B>Daemon</B><DT>extends <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A><DT>implements org.apache.commons.daemon.Daemon</DL>
+</PRE>
+
+<P>
+Allows running an adaptor as a daemon when used in conjunction with procrun
+ or jsvc.
+
+ <p>Example execution with jsvc:
+ <pre>jsvc -pidfile adaptor.pid -cp someadaptor-withlib.jar \
+ com.google.enterprise.adaptor.Daemon package.SomeAdaptor</pre>
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Daemon.html#Daemon()">Daemon</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Daemon.html#destroy()">destroy</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Daemon.html#init(org.apache.commons.daemon.DaemonContext)">init</A></B>(org.apache.commons.daemon.DaemonContext context)</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Daemon.html#start()">start</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/Daemon.html#stop()">stop</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#clone()" title="class or interface in java.lang">clone</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#finalize()" title="class or interface in java.lang">finalize</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang">notify</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="class or interface in java.lang">notifyAll</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="class or interface in java.lang">wait</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="class or interface in java.lang">wait</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="class or interface in java.lang">wait</A></CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="Daemon()"><!-- --></A><H3>
+Daemon</H3>
+<PRE>
+public <B>Daemon</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="init(org.apache.commons.daemon.DaemonContext)"><!-- --></A><H3>
+init</H3>
+<PRE>
+public void <B>init</B>(org.apache.commons.daemon.DaemonContext context)
+ throws <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE>init</CODE> in interface <CODE>org.apache.commons.daemon.Daemon</CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="destroy()"><!-- --></A><H3>
+destroy</H3>
+<PRE>
+public void <B>destroy</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE>destroy</CODE> in interface <CODE>org.apache.commons.daemon.Daemon</CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="start()"><!-- --></A><H3>
+start</H3>
+<PRE>
+public void <B>start</B>()
+ throws <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE>start</CODE> in interface <CODE>org.apache.commons.daemon.Daemon</CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="stop()"><!-- --></A><H3>
+stop</H3>
+<PRE>
+public void <B>stop</B>()
+ throws <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE>stop</CODE> in interface <CODE>org.apache.commons.daemon.Daemon</CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../com/google/enterprise/adaptor/CustomFormatter.html" title="class in com.google.enterprise.adaptor"><B>PREV CLASS</B></A>
+ <A HREF="../../../../com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../index.html?com/google/enterprise/adaptor/Daemon.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Daemon.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/javadoc/com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html b/javadoc/com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html
index 2f7fcba..c666b7d 100644
--- a/javadoc/com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html
+++ b/javadoc/com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html
@@ -52,7 +52,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="../../../../com/google/enterprise/adaptor/CustomFormatter.html" title="class in com.google.enterprise.adaptor"><B>PREV CLASS</B></A>
+ <A HREF="../../../../com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor"><B>PREV CLASS</B></A>
<A HREF="../../../../com/google/enterprise/adaptor/DefaultPushErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" target="_top"><B>FRAMES</B></A>
@@ -291,7 +291,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="../../../../com/google/enterprise/adaptor/CustomFormatter.html" title="class in com.google.enterprise.adaptor"><B>PREV CLASS</B></A>
+ <A HREF="../../../../com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor"><B>PREV CLASS</B></A>
<A HREF="../../../../com/google/enterprise/adaptor/DefaultPushErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" target="_top"><B>FRAMES</B></A>
diff --git a/javadoc/com/google/enterprise/adaptor/GsaCommunicationHandler.html b/javadoc/com/google/enterprise/adaptor/GsaCommunicationHandler.html
index d2a4da6..153e0f5 100644
--- a/javadoc/com/google/enterprise/adaptor/GsaCommunicationHandler.html
+++ b/javadoc/com/google/enterprise/adaptor/GsaCommunicationHandler.html
@@ -149,6 +149,14 @@
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../com/google/enterprise/adaptor/Adaptor.html" title="interface in com.google.enterprise.adaptor">Adaptor</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/GsaCommunicationHandler.html#getAdaptor()">getAdaptor</A></B>()</CODE>
+
+<BR>
+ The adaptor instance being used.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE> void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/google/enterprise/adaptor/GsaCommunicationHandler.html#start(com.sun.net.httpserver.HttpServer, com.sun.net.httpserver.HttpServer)">start</A></B>(<A HREF="http://download.oracle.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html?is-external=true" title="class or interface in com.sun.net.httpserver">HttpServer</A> server,
<A HREF="http://download.oracle.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html?is-external=true" title="class or interface in com.sun.net.httpserver">HttpServer</A> dashboardServer)</CODE>
@@ -268,6 +276,19 @@
</DL>
</DD>
</DL>
+<HR>
+
+<A NAME="getAdaptor()"><!-- --></A><H3>
+getAdaptor</H3>
+<PRE>
+public <A HREF="../../../../com/google/enterprise/adaptor/Adaptor.html" title="interface in com.google.enterprise.adaptor">Adaptor</A> <B>getAdaptor</B>()</PRE>
+<DL>
+<DD>The adaptor instance being used.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
diff --git a/javadoc/com/google/enterprise/adaptor/examples/AdaptorWithCrawlTimeMetadataTemplate.html b/javadoc/com/google/enterprise/adaptor/examples/AdaptorWithCrawlTimeMetadataTemplate.html
index 6eb37c0..13165b5 100644
--- a/javadoc/com/google/enterprise/adaptor/examples/AdaptorWithCrawlTimeMetadataTemplate.html
+++ b/javadoc/com/google/enterprise/adaptor/examples/AdaptorWithCrawlTimeMetadataTemplate.html
@@ -296,7 +296,7 @@
<p>If you experience a fatal error, feel free to throw an <A HREF="http://download.oracle.com/javase/6/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io"><CODE>IOException</CODE></A> or <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang"><CODE>RuntimeException</CODE></A>. In the case of an error, the
users will be denied access to the resources.
- <p>This implementation provides <A HREF="../../../../../com/google/enterprise/adaptor/AuthzStatus.html#PERMIT"><CODE>AuthzStatus.PERMIT</CODE></A> for all <code>DocId</code>s in an unmodifiable map.
+ <p>This implementation provides <A HREF="../../../../../com/google/enterprise/adaptor/AuthzStatus.html#DENY"><CODE>AuthzStatus.DENY</CODE></A> for all <code>DocId</code>s in an unmodifiable map.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../../com/google/enterprise/adaptor/Adaptor.html#isUserAuthorized(com.google.enterprise.adaptor.AuthnIdentity, java.util.Collection)">isUserAuthorized</A></CODE> in interface <CODE><A HREF="../../../../../com/google/enterprise/adaptor/Adaptor.html" title="interface in com.google.enterprise.adaptor">Adaptor</A></CODE><DT><B>Overrides:</B><DD><CODE><A HREF="../../../../../com/google/enterprise/adaptor/AbstractAdaptor.html#isUserAuthorized(com.google.enterprise.adaptor.AuthnIdentity, java.util.Collection)">isUserAuthorized</A></CODE> in class <CODE><A HREF="../../../../../com/google/enterprise/adaptor/AbstractAdaptor.html" title="class in com.google.enterprise.adaptor">AbstractAdaptor</A></CODE></DL>
diff --git a/javadoc/com/google/enterprise/adaptor/examples/package-summary.html b/javadoc/com/google/enterprise/adaptor/examples/package-summary.html
index e5a1d24..d6173d5 100644
--- a/javadoc/com/google/enterprise/adaptor/examples/package-summary.html
+++ b/javadoc/com/google/enterprise/adaptor/examples/package-summary.html
@@ -53,7 +53,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../com/google/enterprise/adaptor/package-summary.html"><B>PREV PACKAGE</B></A>
- <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/package-summary.html"><B>NEXT PACKAGE</B></A></FONT></TD>
+ <A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-summary.html"><B>NEXT PACKAGE</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/examples/package-summary.html" target="_top"><B>FRAMES</B></A>
<A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>
@@ -154,7 +154,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../com/google/enterprise/adaptor/package-summary.html"><B>PREV PACKAGE</B></A>
- <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/package-summary.html"><B>NEXT PACKAGE</B></A></FONT></TD>
+ <A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-summary.html"><B>NEXT PACKAGE</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/examples/package-summary.html" target="_top"><B>FRAMES</B></A>
<A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>
diff --git a/javadoc/com/google/enterprise/adaptor/examples/package-tree.html b/javadoc/com/google/enterprise/adaptor/examples/package-tree.html
index 96ec16c..c88a1e1 100644
--- a/javadoc/com/google/enterprise/adaptor/examples/package-tree.html
+++ b/javadoc/com/google/enterprise/adaptor/examples/package-tree.html
@@ -53,7 +53,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../com/google/enterprise/adaptor/package-tree.html"><B>PREV</B></A>
- <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/package-tree.html"><B>NEXT</B></A></FONT></TD>
+ <A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-tree.html"><B>NEXT</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/examples/package-tree.html" target="_top"><B>FRAMES</B></A>
<A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>
@@ -127,7 +127,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../com/google/enterprise/adaptor/package-tree.html"><B>PREV</B></A>
- <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/package-tree.html"><B>NEXT</B></A></FONT></TD>
+ <A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-tree.html"><B>NEXT</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/examples/package-tree.html" target="_top"><B>FRAMES</B></A>
<A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>
diff --git a/javadoc/com/google/enterprise/adaptor/experimental/Sim.html b/javadoc/com/google/enterprise/adaptor/experimental/Sim.html
new file mode 100644
index 0000000..0ede2bc
--- /dev/null
+++ b/javadoc/com/google/enterprise/adaptor/experimental/Sim.html
@@ -0,0 +1,302 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+Sim
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="Sim";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV CLASS
+ NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/enterprise/adaptor/experimental/Sim.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Sim.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+com.google.enterprise.adaptor.experimental</FONT>
+<BR>
+Class Sim</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+ <IMG SRC="../../../../../resources/inherit.gif" ALT="extended by "><B>com.google.enterprise.adaptor.experimental.Sim</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</A></DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public class <B>Sim</B><DT>extends <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A><DT>implements <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</A></DL>
+</PRE>
+
+<P>
+Accepts adaptor feeds and issues requests for documents.
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../../com/google/enterprise/adaptor/experimental/Sim.html#Sim()">Sim</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/enterprise/adaptor/experimental/Sim.html#main(java.lang.String[])">main</A></B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[] args)</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/enterprise/adaptor/experimental/Sim.html#percentDecode(java.lang.String)">percentDecode</A></B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> encoded)</CODE>
+
+<BR>
+ </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/enterprise/adaptor/experimental/Sim.html#run()">run</A></B>()</CODE>
+
+<BR>
+ </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#clone()" title="class or interface in java.lang">clone</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#finalize()" title="class or interface in java.lang">finalize</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang">notify</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="class or interface in java.lang">notifyAll</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="class or interface in java.lang">wait</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="class or interface in java.lang">wait</A>, <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="class or interface in java.lang">wait</A></CODE></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="Sim()"><!-- --></A><H3>
+Sim</H3>
+<PRE>
+public <B>Sim</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="run()"><!-- --></A><H3>
+run</H3>
+<PRE>
+public void <B>run</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</A></CODE> in interface <CODE><A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</A></CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="main(java.lang.String[])"><!-- --></A><H3>
+main</H3>
+<PRE>
+public static void <B>main</B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[] args)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="percentDecode(java.lang.String)"><!-- --></A><H3>
+percentDecode</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>percentDecode</B>(<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> encoded)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV CLASS
+ NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/enterprise/adaptor/experimental/Sim.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="Sim.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/javadoc/com/google/enterprise/adaptor/experimental/package-frame.html b/javadoc/com/google/enterprise/adaptor/experimental/package-frame.html
new file mode 100644
index 0000000..786bf3d
--- /dev/null
+++ b/javadoc/com/google/enterprise/adaptor/experimental/package-frame.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+com.google.enterprise.adaptor.experimental
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameTitleFont">
+<A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-summary.html" target="classFrame">com.google.enterprise.adaptor.experimental</A></FONT>
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Classes</FONT>
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="Sim.html" title="class in com.google.enterprise.adaptor.experimental" target="classFrame">Sim</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+</BODY>
+</HTML>
diff --git a/javadoc/com/google/enterprise/adaptor/experimental/package-summary.html b/javadoc/com/google/enterprise/adaptor/experimental/package-summary.html
new file mode 100644
index 0000000..5732c08
--- /dev/null
+++ b/javadoc/com/google/enterprise/adaptor/experimental/package-summary.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+com.google.enterprise.adaptor.experimental
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="com.google.enterprise.adaptor.experimental";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Package</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/enterprise/adaptor/examples/package-summary.html"><B>PREV PACKAGE</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/package-summary.html"><B>NEXT PACKAGE</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/enterprise/adaptor/experimental/package-summary.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<H2>
+Package com.google.enterprise.adaptor.experimental
+</H2>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental">Sim</A></B></TD>
+<TD>Accepts adaptor feeds and issues requests for documents.</TD>
+</TR>
+</TABLE>
+
+
+<P>
+<DL>
+</DL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Package</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/enterprise/adaptor/examples/package-summary.html"><B>PREV PACKAGE</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/package-summary.html"><B>NEXT PACKAGE</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/enterprise/adaptor/experimental/package-summary.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/javadoc/com/google/enterprise/adaptor/experimental/package-tree.html b/javadoc/com/google/enterprise/adaptor/experimental/package-tree.html
new file mode 100644
index 0000000..920c97a
--- /dev/null
+++ b/javadoc/com/google/enterprise/adaptor/experimental/package-tree.html
@@ -0,0 +1,150 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+com.google.enterprise.adaptor.experimental Class Hierarchy
+</TITLE>
+
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+ if (location.href.indexOf('is-external=true') == -1) {
+ parent.document.title="com.google.enterprise.adaptor.experimental Class Hierarchy";
+ }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/enterprise/adaptor/examples/package-tree.html"><B>PREV</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/package-tree.html"><B>NEXT</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/enterprise/adaptor/experimental/package-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For Package com.google.enterprise.adaptor.experimental
+</H2>
+</CENTER>
+<DL>
+<DT><B>Package Hierarchies:</B><DD><A HREF="../../../../../overview-tree.html">All Packages</A></DL>
+<HR>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><B>Object</B></A><UL>
+<LI TYPE="circle">com.google.enterprise.adaptor.experimental.<A HREF="../../../../../com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental"><B>Sim</B></A> (implements java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</A>)
+</UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../com/google/enterprise/adaptor/examples/package-tree.html"><B>PREV</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/package-tree.html"><B>NEXT</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/enterprise/adaptor/experimental/package-tree.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>
+ <SCRIPT type="text/javascript">
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+ <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/javadoc/com/google/enterprise/adaptor/package-frame.html b/javadoc/com/google/enterprise/adaptor/package-frame.html
index ffa24f7..4df3de7 100644
--- a/javadoc/com/google/enterprise/adaptor/package-frame.html
+++ b/javadoc/com/google/enterprise/adaptor/package-frame.html
@@ -82,6 +82,8 @@
<BR>
<A HREF="CustomFormatter.html" title="class in com.google.enterprise.adaptor" target="classFrame">CustomFormatter</A>
<BR>
+<A HREF="Daemon.html" title="class in com.google.enterprise.adaptor" target="classFrame">Daemon</A>
+<BR>
<A HREF="DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor" target="classFrame">DefaultGetDocIdsErrorHandler</A>
<BR>
<A HREF="DefaultPushErrorHandler.html" title="class in com.google.enterprise.adaptor" target="classFrame">DefaultPushErrorHandler</A>
diff --git a/javadoc/com/google/enterprise/adaptor/package-summary.html b/javadoc/com/google/enterprise/adaptor/package-summary.html
index ac05d1d..8d349c6 100644
--- a/javadoc/com/google/enterprise/adaptor/package-summary.html
+++ b/javadoc/com/google/enterprise/adaptor/package-summary.html
@@ -214,6 +214,11 @@
<TD>Custom log formatter for ease of development.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor">Daemon</A></B></TD>
+<TD>Allows running an adaptor as a daemon when used in conjunction with procrun
+ or jsvc.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor">DefaultGetDocIdsErrorHandler</A></B></TD>
<TD>Default handler of errors during <A HREF="../../../../com/google/enterprise/adaptor/Adaptor.html#getDocIds(com.google.enterprise.adaptor.DocIdPusher)"><CODE>Adaptor.getDocIds(DocIdPusher)</CODE></A>.</TD>
</TR>
diff --git a/javadoc/com/google/enterprise/adaptor/package-tree.html b/javadoc/com/google/enterprise/adaptor/package-tree.html
index 4be6d0e..88fdef1 100644
--- a/javadoc/com/google/enterprise/adaptor/package-tree.html
+++ b/javadoc/com/google/enterprise/adaptor/package-tree.html
@@ -91,7 +91,8 @@
<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><B>Object</B></A><UL>
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/AbstractAdaptor.html" title="class in com.google.enterprise.adaptor"><B>AbstractAdaptor</B></A> (implements com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Adaptor.html" title="interface in com.google.enterprise.adaptor">Adaptor</A>)
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/AbstractDocumentTransform.html" title="class in com.google.enterprise.adaptor"><B>AbstractDocumentTransform</B></A> (implements com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A>)
-<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Acl.html" title="class in com.google.enterprise.adaptor"><B>Acl</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Acl.Builder.html" title="class in com.google.enterprise.adaptor"><B>Acl.Builder</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Application.html" title="class in com.google.enterprise.adaptor"><B>Application</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/CommandStreamParser.html" title="class in com.google.enterprise.adaptor"><B>CommandStreamParser</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><B>Config</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>DefaultGetDocIdsErrorHandler</B></A> (implements com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/GetDocIdsErrorHandler.html" title="interface in com.google.enterprise.adaptor">GetDocIdsErrorHandler</A>)
+<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Acl.html" title="class in com.google.enterprise.adaptor"><B>Acl</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Acl.Builder.html" title="class in com.google.enterprise.adaptor"><B>Acl.Builder</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Application.html" title="class in com.google.enterprise.adaptor"><B>Application</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/CommandStreamParser.html" title="class in com.google.enterprise.adaptor"><B>CommandStreamParser</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><B>Config</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor"><B>Daemon</B></A> (implements org.apache.commons.daemon.Daemon)
+<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>DefaultGetDocIdsErrorHandler</B></A> (implements com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/GetDocIdsErrorHandler.html" title="interface in com.google.enterprise.adaptor">GetDocIdsErrorHandler</A>)
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/DefaultPushErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>DefaultPushErrorHandler</B></A> (implements com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/PushErrorHandler.html" title="interface in com.google.enterprise.adaptor">PushErrorHandler</A>)
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/DocId.html" title="class in com.google.enterprise.adaptor"><B>DocId</B></A> (implements java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</A><T>)
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/DocIdPusher.Record.html" title="class in com.google.enterprise.adaptor"><B>DocIdPusher.Record</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="../../../../com/google/enterprise/adaptor/DocIdPusher.Record.Builder.html" title="class in com.google.enterprise.adaptor"><B>DocIdPusher.Record.Builder</B></A><LI TYPE="circle">java.util.logging.<A HREF="http://download.oracle.com/javase/6/docs/api/java/util/logging/Formatter.html?is-external=true" title="class or interface in java.util.logging"><B>Formatter</B></A><UL>
diff --git a/javadoc/com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html b/javadoc/com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html
index 49dfc83..2a36dd5 100644
--- a/javadoc/com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html
@@ -464,7 +464,7 @@
<p>If you experience a fatal error, feel free to throw an <A HREF="http://download.oracle.com/javase/6/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io"><CODE>IOException</CODE></A> or <A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang"><CODE>RuntimeException</CODE></A>. In the case of an error, the
users will be denied access to the resources.
- <p>This implementation provides <A HREF="../../../../../com/google/enterprise/adaptor/AuthzStatus.html#PERMIT"><CODE>AuthzStatus.PERMIT</CODE></A> for all <code>DocId</code>s in an unmodifiable map.
+ <p>This implementation provides <A HREF="../../../../../com/google/enterprise/adaptor/AuthzStatus.html#DENY"><CODE>AuthzStatus.DENY</CODE></A> for all <code>DocId</code>s in an unmodifiable map.
<p>This implementation provides access permissions for the <code>DocId</code>s in an \
unmodifiable map based upon data returned by a command line authorizer.
diff --git a/javadoc/com/google/enterprise/adaptor/prebuilt/package-summary.html b/javadoc/com/google/enterprise/adaptor/prebuilt/package-summary.html
index 0a8041f..2bbf45c 100644
--- a/javadoc/com/google/enterprise/adaptor/prebuilt/package-summary.html
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/package-summary.html
@@ -52,7 +52,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="../../../../../com/google/enterprise/adaptor/examples/package-summary.html"><B>PREV PACKAGE</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-summary.html"><B>PREV PACKAGE</B></A>
NEXT PACKAGE</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/package-summary.html" target="_top"><B>FRAMES</B></A>
@@ -181,7 +181,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="../../../../../com/google/enterprise/adaptor/examples/package-summary.html"><B>PREV PACKAGE</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-summary.html"><B>PREV PACKAGE</B></A>
NEXT PACKAGE</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/package-summary.html" target="_top"><B>FRAMES</B></A>
diff --git a/javadoc/com/google/enterprise/adaptor/prebuilt/package-tree.html b/javadoc/com/google/enterprise/adaptor/prebuilt/package-tree.html
index c398672..14bfcc8 100644
--- a/javadoc/com/google/enterprise/adaptor/prebuilt/package-tree.html
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/package-tree.html
@@ -52,7 +52,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="../../../../../com/google/enterprise/adaptor/examples/package-tree.html"><B>PREV</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-tree.html"><B>PREV</B></A>
NEXT</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/package-tree.html" target="_top"><B>FRAMES</B></A>
@@ -141,7 +141,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="../../../../../com/google/enterprise/adaptor/examples/package-tree.html"><B>PREV</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/experimental/package-tree.html"><B>PREV</B></A>
NEXT</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/package-tree.html" target="_top"><B>FRAMES</B></A>
diff --git a/javadoc/index-all.html b/javadoc/index-all.html
index 2e2d5f3..5ec01cf 100644
--- a/javadoc/index-all.html
+++ b/javadoc/index-all.html
@@ -127,10 +127,7 @@
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/AuthnAdaptor.html" title="interface in com.google.enterprise.adaptor">AuthnAdaptor</A>
<DD>Authenticate the user connected via <code>ex</code>.
<DT><A HREF="./com/google/enterprise/adaptor/AuthnAdaptor.html" title="interface in com.google.enterprise.adaptor"><B>AuthnAdaptor</B></A> - Interface in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Interface for adaptors capable of authenticating users.<DT><A HREF="./com/google/enterprise/adaptor/AuthnAdaptor.Callback.html" title="interface in com.google.enterprise.adaptor"><B>AuthnAdaptor.Callback</B></A> - Interface in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Interface for replying to <A HREF="./com/google/enterprise/adaptor/AuthnAdaptor.html#authenticateUser(com.sun.net.httpserver.HttpExchange, com.google.enterprise.adaptor.AuthnAdaptor.Callback)"><CODE>AuthnAdaptor.authenticateUser(HttpExchange, Callback)</CODE></A>.<DT><A HREF="./com/google/enterprise/adaptor/AuthnIdentity.html" title="interface in com.google.enterprise.adaptor"><B>AuthnIdentity</B></A> - Interface in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>User identification information for understanding who a user is or if they
- are allowed to access a resource.<DT><A HREF="./com/google/enterprise/adaptor/AuthzStatus.html" title="enum in com.google.enterprise.adaptor"><B>AuthzStatus</B></A> - Enum in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Authorization status codes.<DT><A HREF="./com/google/enterprise/adaptor/Config.html#autoConfig(java.lang.String[])"><B>autoConfig(String[])</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Load default configuration file and parse command line options.
-</DL>
+ are allowed to access a resource.<DT><A HREF="./com/google/enterprise/adaptor/AuthzStatus.html" title="enum in com.google.enterprise.adaptor"><B>AuthzStatus</B></A> - Enum in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Authorization status codes.</DL>
<HR>
<A NAME="_B_"><!-- --></A><H2>
<B>B</B></H2>
@@ -156,7 +153,7 @@
<DT><A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html#checkAndScheduleIncrementalPushOfDocIds()"><B>checkAndScheduleIncrementalPushOfDocIds()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html" title="class in com.google.enterprise.adaptor">GsaCommunicationHandler</A>
<DD>Perform an push of incremental changes.
-<DT><A HREF="./com/google/enterprise/adaptor/package-summary.html"><B>com.google.enterprise.adaptor</B></A> - package com.google.enterprise.adaptor<DD>Adaptor interfaces and implementation.<DT><A HREF="./com/google/enterprise/adaptor/examples/package-summary.html"><B>com.google.enterprise.adaptor.examples</B></A> - package com.google.enterprise.adaptor.examples<DD> <DT><A HREF="./com/google/enterprise/adaptor/prebuilt/package-summary.html"><B>com.google.enterprise.adaptor.prebuilt</B></A> - package com.google.enterprise.adaptor.prebuilt<DD> <DT><A HREF="./com/google/enterprise/adaptor/prebuilt/Command.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>Command</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/prebuilt/package-summary.html">com.google.enterprise.adaptor.prebuilt</A><DD>Exec helper that allows easy handling of stdin, stdout, and stderr.<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/Command.html#Command()"><B>Command()</B></A> -
+<DT><A HREF="./com/google/enterprise/adaptor/package-summary.html"><B>com.google.enterprise.adaptor</B></A> - package com.google.enterprise.adaptor<DD>Adaptor interfaces and implementation.<DT><A HREF="./com/google/enterprise/adaptor/examples/package-summary.html"><B>com.google.enterprise.adaptor.examples</B></A> - package com.google.enterprise.adaptor.examples<DD> <DT><A HREF="./com/google/enterprise/adaptor/experimental/package-summary.html"><B>com.google.enterprise.adaptor.experimental</B></A> - package com.google.enterprise.adaptor.experimental<DD> <DT><A HREF="./com/google/enterprise/adaptor/prebuilt/package-summary.html"><B>com.google.enterprise.adaptor.prebuilt</B></A> - package com.google.enterprise.adaptor.prebuilt<DD> <DT><A HREF="./com/google/enterprise/adaptor/prebuilt/Command.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>Command</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/prebuilt/package-summary.html">com.google.enterprise.adaptor.prebuilt</A><DD>Exec helper that allows easy handling of stdin, stdout, and stderr.<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/Command.html#Command()"><B>Command()</B></A> -
Constructor for class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/Command.html" title="class in com.google.enterprise.adaptor.prebuilt">Command</A>
<DD>
<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>CommandLineAdaptor</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/prebuilt/package-summary.html">com.google.enterprise.adaptor.prebuilt</A><DD>Command Line Adaptor<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html#CommandLineAdaptor()"><B>CommandLineAdaptor()</B></A> -
@@ -211,6 +208,10 @@
<A NAME="_D_"><!-- --></A><H2>
<B>D</B></H2>
<DL>
+<DT><A HREF="./com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor"><B>Daemon</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Allows running an adaptor as a daemon when used in conjunction with procrun
+ or jsvc.<DT><A HREF="./com/google/enterprise/adaptor/Daemon.html#Daemon()"><B>Daemon()</B></A> -
+Constructor for class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor">Daemon</A>
+<DD>
<DT><A HREF="./com/google/enterprise/adaptor/examples/DbAdaptorTemplate.html" title="class in com.google.enterprise.adaptor.examples"><B>DbAdaptorTemplate</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/examples/package-summary.html">com.google.enterprise.adaptor.examples</A><DD>Demonstrates what code is necessary for putting DB
content onto a GSA.<DT><A HREF="./com/google/enterprise/adaptor/examples/DbAdaptorTemplate.html#DbAdaptorTemplate()"><B>DbAdaptorTemplate()</B></A> -
Constructor for class com.google.enterprise.adaptor.examples.<A HREF="./com/google/enterprise/adaptor/examples/DbAdaptorTemplate.html" title="class in com.google.enterprise.adaptor.examples">DbAdaptorTemplate</A>
@@ -241,6 +242,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/Adaptor.html#destroy()"><B>destroy()</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Adaptor.html" title="interface in com.google.enterprise.adaptor">Adaptor</A>
<DD>Shutdown and release resources of adaptor.
+<DT><A HREF="./com/google/enterprise/adaptor/Daemon.html#destroy()"><B>destroy()</B></A> -
+Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor">Daemon</A>
+<DD>
<DT><A HREF="./com/google/enterprise/adaptor/DocId.html" title="class in com.google.enterprise.adaptor"><B>DocId</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Refers to a unique document in repository.<DT><A HREF="./com/google/enterprise/adaptor/DocId.html#DocId(java.lang.String)"><B>DocId(String)</B></A> -
Constructor for class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/DocId.html" title="class in com.google.enterprise.adaptor">DocId</A>
<DD>Construct an identifier based on <code>id</code>.
@@ -323,16 +327,9 @@
<A NAME="_G_"><!-- --></A><H2>
<B>G</B></H2>
<DL>
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getAdaptorDocContentTimeoutMillis()"><B>getAdaptorDocContentTimeoutMillis()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getAdaptorFullListingSchedule()"><B>getAdaptorFullListingSchedule()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Cron-style format for describing when the adaptor should perform full
- listings of <code>DocId</code>s.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getAdaptorIncrementalPollPeriodMillis()"><B>getAdaptorIncrementalPollPeriodMillis()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
+<DT><A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html#getAdaptor()"><B>getAdaptor()</B></A> -
+Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html" title="class in com.google.enterprise.adaptor">GsaCommunicationHandler</A>
+<DD>The adaptor instance being used.
<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getAllKeys()"><B>getAllKeys()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
<DD>
@@ -355,6 +352,9 @@
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/AdaptorContext.html" title="interface in com.google.enterprise.adaptor">AdaptorContext</A>
<DD>Configuration instance for the adaptor and all things within the adaptor
library.
+<DT><A HREF="./com/google/enterprise/adaptor/Application.html#getConfig()"><B>getConfig()</B></A> -
+Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Application.html" title="class in com.google.enterprise.adaptor">Application</A>
+<DD>Returns the <A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><CODE>Config</CODE></A> used by this instance.
<DT><A HREF="./com/google/enterprise/adaptor/Acl.html#getDenyGroups()"><B>getDenyGroups()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Acl.html" title="class in com.google.enterprise.adaptor">Acl</A>
<DD>Returns immutable set of denied groups.
@@ -421,13 +421,6 @@
<DT><A HREF="./com/google/enterprise/adaptor/GetDocIdsErrorHandler.html" title="interface in com.google.enterprise.adaptor"><B>GetDocIdsErrorHandler</B></A> - Interface in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Interface for handling errors encountered during scheduled pushing of <code>DocId</code>s.<DT><A HREF="./com/google/enterprise/adaptor/TransformPipeline.html#getDocumentTransforms()"><B>getDocumentTransforms()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/TransformPipeline.html" title="class in com.google.enterprise.adaptor">TransformPipeline</A>
<DD>Retrieve transforms in the order they are processed in the pipeline.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getFeedMaxUrls()"><B>getFeedMaxUrls()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Provides max number of URLs (equal to number of document ids) that are sent
- to the GSA per feed file.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getFeedName()"><B>getFeedName()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
<DT><A HREF="./com/google/enterprise/adaptor/AdaptorContext.html#getGetDocIdsFullErrorHandler()"><B>getGetDocIdsFullErrorHandler()</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/AdaptorContext.html" title="interface in com.google.enterprise.adaptor">AdaptorContext</A>
<DD>Retrieve the current <A HREF="./com/google/enterprise/adaptor/GetDocIdsErrorHandler.html" title="interface in com.google.enterprise.adaptor"><CODE>GetDocIdsErrorHandler</CODE></A> for full push.
@@ -437,15 +430,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/AuthnIdentity.html#getGroups()"><B>getGroups()</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/AuthnIdentity.html" title="interface in com.google.enterprise.adaptor">AuthnIdentity</A>
<DD>Gets all the groups a user belongs to in an immutable set.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getGsaCharacterEncoding()"><B>getGsaCharacterEncoding()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Provides the character encoding the GSA prefers.
<DT><A HREF="./com/google/enterprise/adaptor/Application.html#getGsaCommunicationHandler()"><B>getGsaCommunicationHandler()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Application.html" title="class in com.google.enterprise.adaptor">Application</A>
<DD>Returns the <A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html" title="class in com.google.enterprise.adaptor"><CODE>GsaCommunicationHandler</CODE></A> used by this instance.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getGsaHostname()"><B>getGsaHostname()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Required to be set: GSA machine to send document ids to.
<DT><A HREF="./com/google/enterprise/adaptor/HttpExchanges.html#getIfModifiedSince(com.sun.net.httpserver.HttpExchange)"><B>getIfModifiedSince(HttpExchange)</B></A> -
Static method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/HttpExchanges.html" title="class in com.google.enterprise.adaptor">HttpExchanges</A>
<DD>Retrieves and parses the If-Modified-Since from the request, returning null
@@ -525,50 +512,6 @@
<DT><A HREF="./com/google/enterprise/adaptor/AdaptorContext.html#getSensitiveValueDecoder()"><B>getSensitiveValueDecoder()</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/AdaptorContext.html" title="interface in com.google.enterprise.adaptor">AdaptorContext</A>
<DD>Retrieve decoder for sensitive values, like passwords.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerBaseUri()"><B>getServerBaseUri()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Optional: Returns this host's base URI which other paths will be resolved
- against.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerBaseUri(com.google.enterprise.adaptor.DocId)"><B>getServerBaseUri(DocId)</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Optional: Returns the host's base URI which GSA will contact for document
- information, including document contents.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerDashboardPort()"><B>getServerDashboardPort()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Local port, on this computer, from which the dashboard is served.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerDocIdPath()"><B>getServerDocIdPath()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Optional: Path below <A HREF="./com/google/enterprise/adaptor/Config.html#getServerBaseUri(com.google.enterprise.adaptor.DocId)"><CODE>Config.getServerBaseUri(DocId)</CODE></A> where documents are
- namespaced.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerFullAccessHosts()"><B>getServerFullAccessHosts()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Comma-separated list of IPs or hostnames that can retrieve content without
- authentication checks.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerHostname()"><B>getServerHostname()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Without changes contains InetAddress.getLocalHost().getHostName().
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerKeyAlias()"><B>getServerKeyAlias()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>The alias in the keystore that has the key to use for encryption.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerMaxWorkerThreads()"><B>getServerMaxWorkerThreads()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>The maximum number of worker threads to use to respond to document
- requests.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerPort()"><B>getServerPort()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Suggested to be set: Local port, on this computer, onto which requests from
- GSA come in on.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerQueueCapacity()"><B>getServerQueueCapacity()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>The maximum request queue length.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerReverseProxyPort()"><B>getServerReverseProxyPort()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>The port that should be used in feed file and other references to the
- adaptor.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getServerReverseProxyProtocol()"><B>getServerReverseProxyProtocol()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>The protocol that should be used in feed files and other references to the
- adaptor.
<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/Command.html#getStderr()"><B>getStderr()</B></A> -
Method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/Command.html" title="class in com.google.enterprise.adaptor.prebuilt">Command</A>
<DD>Returns internal byte array without copying.
@@ -578,12 +521,6 @@
<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/CommandLineTransform.html#getTransformCommand()"><B>getTransformCommand()</B></A> -
Method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/CommandLineTransform.html" title="class in com.google.enterprise.adaptor.prebuilt">CommandLineTransform</A>
<DD>
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getTransformMaxDocumentBytes()"><B>getTransformMaxDocumentBytes()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#getTransformPipelineSpec()"><B>getTransformPipelineSpec()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Returns a list of maps correspending to each transform in the pipeline.
<DT><A HREF="./com/google/enterprise/adaptor/DocId.html#getUniqueId()"><B>getUniqueId()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/DocId.html" title="class in com.google.enterprise.adaptor">DocId</A>
<DD>Returns the string identifier provided to the constructor.
@@ -688,6 +625,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/Adaptor.html#init(com.google.enterprise.adaptor.AdaptorContext)"><B>init(AdaptorContext)</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Adaptor.html" title="interface in com.google.enterprise.adaptor">Adaptor</A>
<DD>Initialize adaptor with the current context.
+<DT><A HREF="./com/google/enterprise/adaptor/Daemon.html#init(org.apache.commons.daemon.DaemonContext)"><B>init(DaemonContext)</B></A> -
+Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor">Daemon</A>
+<DD>
<DT><A HREF="./com/google/enterprise/adaptor/examples/DbAdaptorTemplate.html#init(com.google.enterprise.adaptor.AdaptorContext)"><B>init(AdaptorContext)</B></A> -
Method in class com.google.enterprise.adaptor.examples.<A HREF="./com/google/enterprise/adaptor/examples/DbAdaptorTemplate.html" title="class in com.google.enterprise.adaptor.examples">DbAdaptorTemplate</A>
<DD>
@@ -721,11 +661,7 @@
Method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt">FileSystemAdaptor</A>
<DD>
<DT><A HREF="./com/google/enterprise/adaptor/IOHelper.html" title="class in com.google.enterprise.adaptor"><B>IOHelper</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Utility class for providing useful methods when handling streams or other
- forms of I/O.<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isAdaptorPushDocIdsOnStartup()"><B>isAdaptorPushDocIdsOnStartup()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Whether the default <code>main()</code> should automatically start pushing all
- document ids on startup.
-<DT><A HREF="./com/google/enterprise/adaptor/Acl.html#isAuthorized(com.google.enterprise.adaptor.AuthnIdentity, java.util.List)"><B>isAuthorized(AuthnIdentity, List<Acl>)</B></A> -
+ forms of I/O.<DT><A HREF="./com/google/enterprise/adaptor/Acl.html#isAuthorized(com.google.enterprise.adaptor.AuthnIdentity, java.util.List)"><B>isAuthorized(AuthnIdentity, List<Acl>)</B></A> -
Static method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Acl.html" title="class in com.google.enterprise.adaptor">Acl</A>
<DD>Determine if the provided <code>userIdentity</code> belonging to <code>groups</code> is authorized for the provided <code>aclChain</code>.
<DT><A HREF="./com/google/enterprise/adaptor/Acl.html#isAuthorizedBatch(com.google.enterprise.adaptor.AuthnIdentity, java.util.Collection, com.google.enterprise.adaptor.Acl.BatchRetriever)"><B>isAuthorizedBatch(AuthnIdentity, Collection<DocId>, Acl.BatchRetriever)</B></A> -
@@ -734,14 +670,6 @@
<DT><A HREF="./com/google/enterprise/adaptor/Acl.html#isAuthorizedLocal(com.google.enterprise.adaptor.AuthnIdentity)"><B>isAuthorizedLocal(AuthnIdentity)</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Acl.html" title="class in com.google.enterprise.adaptor">Acl</A>
<DD>Determine if the provided <code>userIdentifier</code> belonging to <code>groups</code> is authorized, ignoring inheritance.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isCrawlImmediatelyBitEnabled()"><B>isCrawlImmediatelyBitEnabled()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Optional (default false): Adds crawl-immediately bit with sent records in
- feed file.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isDocIdUrl()"><B>isDocIdUrl()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Optional (default false): If your DocIds are already valid URLs you can
- have this method return true and they will be sent to GSA unmodified.
<DT><A HREF="./com/google/enterprise/adaptor/Metadata.html#isEmpty()"><B>isEmpty()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Metadata.html" title="class in com.google.enterprise.adaptor">Metadata</A>
<DD>True with 0 entries.
@@ -751,22 +679,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/Acl.html#isEverythingCaseSensitive()"><B>isEverythingCaseSensitive()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Acl.html" title="class in com.google.enterprise.adaptor">Acl</A>
<DD>Says whether letter casing differentiates names during authorization.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isFeedNoRecrawlBitEnabled()"><B>isFeedNoRecrawlBitEnabled()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Optional (default false): Adds no-recrawl bit with sent records in feed
- file.
<DT><A HREF="./com/google/enterprise/adaptor/Principal.html#isGroup()"><B>isGroup()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Principal.html" title="class in com.google.enterprise.adaptor">Principal</A>
<DD>
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isGsa614FeedWorkaroundEnabled()"><B>isGsa614FeedWorkaroundEnabled()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isGsa70AuthMethodWorkaroundEnabled()"><B>isGsa70AuthMethodWorkaroundEnabled()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isJournalReducedMem()"><B>isJournalReducedMem()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
<DT><A HREF="./com/google/enterprise/adaptor/AbstractDocumentTransform.html#isRequired()"><B>isRequired()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/AbstractDocumentTransform.html" title="class in com.google.enterprise.adaptor">AbstractDocumentTransform</A>
<DD>
@@ -774,12 +689,6 @@
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A>
<DD>If this property is true, a failure of this transform will cause the entire
transform pipeline to abort.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isServerSecure()"><B>isServerSecure()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Whether full security should be enabled.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isServerToUseCompression()"><B>isServerToUseCompression()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
<DT><A HREF="./com/google/enterprise/adaptor/DocIdPusher.Record.html#isToBeCrawledImmediately()"><B>isToBeCrawledImmediately()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/DocIdPusher.Record.html" title="class in com.google.enterprise.adaptor">DocIdPusher.Record</A>
<DD>Informs the GSA that the document has been modified, and the GSA should
@@ -793,9 +702,6 @@
<DT><A HREF="./com/google/enterprise/adaptor/DocIdPusher.Record.html#isToBeLocked()"><B>isToBeLocked()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/DocIdPusher.Record.html" title="class in com.google.enterprise.adaptor">DocIdPusher.Record</A>
<DD>Locks the document into the GSA's index.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#isTransformRequired()"><B>isTransformRequired()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
<DT><A HREF="./com/google/enterprise/adaptor/CustomFormatter.html#isUseColor()"><B>isUseColor()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/CustomFormatter.html" title="class in com.google.enterprise.adaptor">CustomFormatter</A>
<DD>
@@ -832,10 +738,6 @@
<DT><A HREF="./com/google/enterprise/adaptor/Config.html#load(java.io.File)"><B>load(File)</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
<DD>Load user-provided configuration file.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#loadDefaultConfigFile()"><B>loadDefaultConfigFile()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Loads <code>adaptor-config.properties</code> in the current directory, if it
- exists.
</DL>
<HR>
<A NAME="_M_"><!-- --></A><H2>
@@ -860,6 +762,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/examples/FileSystemAdaptor.html#main(java.lang.String[])"><B>main(String[])</B></A> -
Static method in class com.google.enterprise.adaptor.examples.<A HREF="./com/google/enterprise/adaptor/examples/FileSystemAdaptor.html" title="class in com.google.enterprise.adaptor.examples">FileSystemAdaptor</A>
<DD>Call default main for adaptors.
+<DT><A HREF="./com/google/enterprise/adaptor/experimental/Sim.html#main(java.lang.String[])"><B>main(String[])</B></A> -
+Static method in class com.google.enterprise.adaptor.experimental.<A HREF="./com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental">Sim</A>
+<DD>
<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html#main(java.lang.String[])"><B>main(String[])</B></A> -
Static method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt">CommandLineAdaptor</A>
<DD>Call default main for adaptors.
@@ -912,6 +817,9 @@
Static method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/HttpExchanges.html" title="class in com.google.enterprise.adaptor">HttpExchanges</A>
<DD>Parse request GET query parameters of <code>ex</code> into its parts, correctly
taking into account <code>charset</code>.
+<DT><A HREF="./com/google/enterprise/adaptor/experimental/Sim.html#percentDecode(java.lang.String)"><B>percentDecode(String)</B></A> -
+Static method in class com.google.enterprise.adaptor.experimental.<A HREF="./com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental">Sim</A>
+<DD>
<DT><A HREF="./com/google/enterprise/adaptor/PollingIncrementalAdaptor.html" title="interface in com.google.enterprise.adaptor"><B>PollingIncrementalAdaptor</B></A> - Interface in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Interface for library-assisted polling incremental adaptors.<DT><A HREF="./com/google/enterprise/adaptor/Principal.html" title="class in com.google.enterprise.adaptor"><B>Principal</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Represents either a user or a group.<DT><A HREF="./com/google/enterprise/adaptor/DocIdPusher.html#pushDocIds(java.lang.Iterable)"><B>pushDocIds(Iterable<DocId>)</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/DocIdPusher.html" title="interface in com.google.enterprise.adaptor">DocIdPusher</A>
<DD>Push <code>DocId</code>s immediately and block until they are successfully
@@ -992,14 +900,14 @@
<DT><A HREF="./com/google/enterprise/adaptor/StatusSource.html#retrieveStatus()"><B>retrieveStatus()</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/StatusSource.html" title="interface in com.google.enterprise.adaptor">StatusSource</A>
<DD>Retrieve the current status.
+<DT><A HREF="./com/google/enterprise/adaptor/experimental/Sim.html#run()"><B>run()</B></A> -
+Method in class com.google.enterprise.adaptor.experimental.<A HREF="./com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental">Sim</A>
+<DD>
</DL>
<HR>
<A NAME="_S_"><!-- --></A><H2>
<B>S</B></H2>
<DL>
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#sendDocControlsHeader()"><B>sendDocControlsHeader()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>
<DT><A HREF="./com/google/enterprise/adaptor/HttpExchanges.html#sendRedirect(com.sun.net.httpserver.HttpExchange, java.net.URI)"><B>sendRedirect(HttpExchange, URI)</B></A> -
Static method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/HttpExchanges.html" title="class in com.google.enterprise.adaptor">HttpExchanges</A>
<DD>Redirect client to <code>location</code>.
@@ -1141,6 +1049,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/CommandLineTransform.html#setWorkingDirectory(java.io.File)"><B>setWorkingDirectory(File)</B></A> -
Method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/CommandLineTransform.html" title="class in com.google.enterprise.adaptor.prebuilt">CommandLineTransform</A>
<DD>Sets the working directory.
+<DT><A HREF="./com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental"><B>Sim</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/experimental/package-summary.html">com.google.enterprise.adaptor.experimental</A><DD>Accepts adaptor feeds and issues requests for documents.<DT><A HREF="./com/google/enterprise/adaptor/experimental/Sim.html#Sim()"><B>Sim()</B></A> -
+Constructor for class com.google.enterprise.adaptor.experimental.<A HREF="./com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental">Sim</A>
+<DD>
<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/StreamingCommand.OutputSink.html#sink(java.io.InputStream)"><B>sink(InputStream)</B></A> -
Method in interface com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/StreamingCommand.OutputSink.html" title="interface in com.google.enterprise.adaptor.prebuilt">StreamingCommand.OutputSink</A>
<DD>Consume content from <code>in</code>.
@@ -1157,6 +1068,9 @@
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Application.html" title="class in com.google.enterprise.adaptor">Application</A>
<DD>Start necessary services for receiving requests and managing background
tasks.
+<DT><A HREF="./com/google/enterprise/adaptor/Daemon.html#start()"><B>start()</B></A> -
+Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor">Daemon</A>
+<DD>
<DT><A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html#start(com.sun.net.httpserver.HttpServer, com.sun.net.httpserver.HttpServer)"><B>start(HttpServer, HttpServer)</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html" title="class in com.google.enterprise.adaptor">GsaCommunicationHandler</A>
<DD>Starts listening for communications from GSA.
@@ -1165,6 +1079,9 @@
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Application.html" title="class in com.google.enterprise.adaptor">Application</A>
<DD>Stop processing incoming requests and background tasks, allowing graceful
shutdown.
+<DT><A HREF="./com/google/enterprise/adaptor/Daemon.html#stop()"><B>stop()</B></A> -
+Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor">Daemon</A>
+<DD>
<DT><A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html#stop(long, java.util.concurrent.TimeUnit)"><B>stop(long, TimeUnit)</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/GsaCommunicationHandler.html" title="class in com.google.enterprise.adaptor">GsaCommunicationHandler</A>
<DD>Stop the current services, allowing up to <code>maxDelay</code> seconds for
@@ -1250,10 +1167,6 @@
<DT><A HREF="./com/google/enterprise/adaptor/Metadata.html#unmodifiableView()"><B>unmodifiableView()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Metadata.html" title="class in com.google.enterprise.adaptor">Metadata</A>
<DD>Get a reference to an unmodifiable view of this object.
-<DT><A HREF="./com/google/enterprise/adaptor/Config.html#useAdaptorAutoUnzip()"><B>useAdaptorAutoUnzip()</B></A> -
-Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor">Config</A>
-<DD>Automatically unzips and <code>DocId</code>s ending in <code>.zip</code> and provides
- them to the GSA.
<DT><A HREF="./com/google/enterprise/adaptor/AuthnAdaptor.Callback.html#userAuthenticated(com.sun.net.httpserver.HttpExchange, com.google.enterprise.adaptor.AuthnIdentity)"><B>userAuthenticated(HttpExchange, AuthnIdentity)</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/AuthnAdaptor.Callback.html" title="interface in com.google.enterprise.adaptor">AuthnAdaptor.Callback</A>
<DD>Respond with authentication information discovered during <A HREF="./com/google/enterprise/adaptor/AuthnAdaptor.html#authenticateUser(com.sun.net.httpserver.HttpExchange, com.google.enterprise.adaptor.AuthnAdaptor.Callback)"><CODE>AuthnAdaptor.authenticateUser(HttpExchange, Callback)</CODE></A>.
diff --git a/javadoc/overview-frame.html b/javadoc/overview-frame.html
index 52d394b..03569e0 100644
--- a/javadoc/overview-frame.html
+++ b/javadoc/overview-frame.html
@@ -32,6 +32,8 @@
<BR>
<FONT CLASS="FrameItemFont"><A HREF="com/google/enterprise/adaptor/examples/package-frame.html" target="packageFrame">com.google.enterprise.adaptor.examples</A></FONT>
<BR>
+<FONT CLASS="FrameItemFont"><A HREF="com/google/enterprise/adaptor/experimental/package-frame.html" target="packageFrame">com.google.enterprise.adaptor.experimental</A></FONT>
+<BR>
<FONT CLASS="FrameItemFont"><A HREF="com/google/enterprise/adaptor/prebuilt/package-frame.html" target="packageFrame">com.google.enterprise.adaptor.prebuilt</A></FONT>
<BR>
</TD>
diff --git a/javadoc/overview-summary.html b/javadoc/overview-summary.html
index a5f43c6..5c22dc3 100644
--- a/javadoc/overview-summary.html
+++ b/javadoc/overview-summary.html
@@ -97,6 +97,10 @@
<TD> </TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="20%"><B><A HREF="com/google/enterprise/adaptor/experimental/package-summary.html">com.google.enterprise.adaptor.experimental</A></B></TD>
+<TD> </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="20%"><B><A HREF="com/google/enterprise/adaptor/prebuilt/package-summary.html">com.google.enterprise.adaptor.prebuilt</A></B></TD>
<TD> </TD>
</TR>
@@ -183,6 +187,15 @@
GSA.
</ol>
+ <h3>Testing Tip</h3>
+ <p>An adaptor, by default, will deny all document accesses, except from the
+ GSA. To allow debugging and testing an adaptor without a GSA, you can add a
+ hostname to the <code>server.fullAccessHosts</code> config key to allow that
+ computer full access to all adaptor content. In addition, this setting
+ allows that computer to see metadata and other GSA-specific information as
+ HTTP headers. This can be very useful when combined with Firebug or the Web
+ Inspector in your browser to observe an Adaptor's behavior.
+
<h3>Advanced</h3>
<p>You can set configuration variables on the command line instead of in
<code>adaptor-config.properties</code>. You are allowed multiple arguments
diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html
index 170cab6..8cc0e1d 100644
--- a/javadoc/overview-tree.html
+++ b/javadoc/overview-tree.html
@@ -81,7 +81,7 @@
Hierarchy For All Packages</H2>
</CENTER>
<DL>
-<DT><B>Package Hierarchies:</B><DD><A HREF="com/google/enterprise/adaptor/package-tree.html">com.google.enterprise.adaptor</A>, <A HREF="com/google/enterprise/adaptor/examples/package-tree.html">com.google.enterprise.adaptor.examples</A>, <A HREF="com/google/enterprise/adaptor/prebuilt/package-tree.html">com.google.enterprise.adaptor.prebuilt</A></DL>
+<DT><B>Package Hierarchies:</B><DD><A HREF="com/google/enterprise/adaptor/package-tree.html">com.google.enterprise.adaptor</A>, <A HREF="com/google/enterprise/adaptor/examples/package-tree.html">com.google.enterprise.adaptor.examples</A>, <A HREF="com/google/enterprise/adaptor/experimental/package-tree.html">com.google.enterprise.adaptor.experimental</A>, <A HREF="com/google/enterprise/adaptor/prebuilt/package-tree.html">com.google.enterprise.adaptor.prebuilt</A></DL>
<HR>
<H2>
Class Hierarchy
@@ -94,7 +94,8 @@
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/AbstractDocumentTransform.html" title="class in com.google.enterprise.adaptor"><B>AbstractDocumentTransform</B></A> (implements com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A>)
<UL>
<LI TYPE="circle">com.google.enterprise.adaptor.examples.<A HREF="com/google/enterprise/adaptor/examples/CalaisNERTransform.html" title="class in com.google.enterprise.adaptor.examples"><B>CalaisNERTransform</B></A><LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/CommandLineTransform.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>CommandLineTransform</B></A><LI TYPE="circle">com.google.enterprise.adaptor.examples.<A HREF="com/google/enterprise/adaptor/examples/MetaTaggerTransform.html" title="class in com.google.enterprise.adaptor.examples"><B>MetaTaggerTransform</B></A><LI TYPE="circle">com.google.enterprise.adaptor.examples.<A HREF="com/google/enterprise/adaptor/examples/TableGeneratorTransform.html" title="class in com.google.enterprise.adaptor.examples"><B>TableGeneratorTransform</B></A></UL>
-<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Acl.html" title="class in com.google.enterprise.adaptor"><B>Acl</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Acl.Builder.html" title="class in com.google.enterprise.adaptor"><B>Acl.Builder</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Application.html" title="class in com.google.enterprise.adaptor"><B>Application</B></A><LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/Command.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>Command</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/CommandStreamParser.html" title="class in com.google.enterprise.adaptor"><B>CommandStreamParser</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><B>Config</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>DefaultGetDocIdsErrorHandler</B></A> (implements com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/GetDocIdsErrorHandler.html" title="interface in com.google.enterprise.adaptor">GetDocIdsErrorHandler</A>)
+<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Acl.html" title="class in com.google.enterprise.adaptor"><B>Acl</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Acl.Builder.html" title="class in com.google.enterprise.adaptor"><B>Acl.Builder</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Application.html" title="class in com.google.enterprise.adaptor"><B>Application</B></A><LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/Command.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>Command</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/CommandStreamParser.html" title="class in com.google.enterprise.adaptor"><B>CommandStreamParser</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><B>Config</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Daemon.html" title="class in com.google.enterprise.adaptor"><B>Daemon</B></A> (implements org.apache.commons.daemon.Daemon)
+<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/DefaultGetDocIdsErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>DefaultGetDocIdsErrorHandler</B></A> (implements com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/GetDocIdsErrorHandler.html" title="interface in com.google.enterprise.adaptor">GetDocIdsErrorHandler</A>)
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/DefaultPushErrorHandler.html" title="class in com.google.enterprise.adaptor"><B>DefaultPushErrorHandler</B></A> (implements com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/PushErrorHandler.html" title="interface in com.google.enterprise.adaptor">PushErrorHandler</A>)
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/DocId.html" title="class in com.google.enterprise.adaptor"><B>DocId</B></A> (implements java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</A><T>)
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/DocIdPusher.Record.html" title="class in com.google.enterprise.adaptor"><B>DocIdPusher.Record</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/DocIdPusher.Record.Builder.html" title="class in com.google.enterprise.adaptor"><B>DocIdPusher.Record.Builder</B></A><LI TYPE="circle">java.util.logging.<A HREF="http://download.oracle.com/javase/6/docs/api/java/util/logging/Formatter.html?is-external=true" title="class or interface in java.util.logging"><B>Formatter</B></A><UL>
@@ -104,6 +105,7 @@
<UL>
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/GroupPrincipal.html" title="class in com.google.enterprise.adaptor"><B>GroupPrincipal</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/UserPrincipal.html" title="class in com.google.enterprise.adaptor"><B>UserPrincipal</B></A></UL>
<LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>RecursiveFileIterator</B></A> (implements java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</A><T>, java.util.<A HREF="http://download.oracle.com/javase/6/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</A><E>)
+<LI TYPE="circle">com.google.enterprise.adaptor.experimental.<A HREF="com/google/enterprise/adaptor/experimental/Sim.html" title="class in com.google.enterprise.adaptor.experimental"><B>Sim</B></A> (implements java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</A>)
<LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/StreamingCommand.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>StreamingCommand</B></A><LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/StreamingCommand.StreamInputSource.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>StreamingCommand.StreamInputSource</B></A> (implements com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/StreamingCommand.InputSource.html" title="interface in com.google.enterprise.adaptor.prebuilt">StreamingCommand.InputSource</A>)
<LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/StreamingCommand.StreamOutputSink.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>StreamingCommand.StreamOutputSink</B></A> (implements com.google.enterprise.adaptor.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/StreamingCommand.OutputSink.html" title="interface in com.google.enterprise.adaptor.prebuilt">StreamingCommand.OutputSink</A>)
<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang"><B>Throwable</B></A> (implements java.io.<A HREF="http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</A>)
diff --git a/javadoc/package-list b/javadoc/package-list
index b4adb14..c005e57 100644
--- a/javadoc/package-list
+++ b/javadoc/package-list
@@ -1,3 +1,4 @@
com.google.enterprise.adaptor
com.google.enterprise.adaptor.examples
+com.google.enterprise.adaptor.experimental
com.google.enterprise.adaptor.prebuilt