Regeneration from plexi 159babc
diff --git a/coverage/com.google.enterprise.adaptor.CircularBufferHandler.html b/coverage/com.google.enterprise.adaptor.CircularBufferHandler.html
index 1da7d8f..620f5a0 100644
--- a/coverage/com.google.enterprise.adaptor.CircularBufferHandler.html
+++ b/coverage/com.google.enterprise.adaptor.CircularBufferHandler.html
@@ -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)."> 120</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)."> 121</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"> 120</td> <td class="src"><pre class="src"> buffer[tail] = record;</pre></td></tr>
-<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 120</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)."> 120</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"> 121</td> <td class="src"><pre class="src"> buffer[tail] = record;</pre></td></tr>
+<tr> <td class="numLineCover"> 52</td> <td class="nbHitsCovered"> 121</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)."> 121</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"> 120</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"> 121</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.GroupPrincipal.html b/coverage/com.google.enterprise.adaptor.GroupPrincipal.html
index 32d95f7..9af2215 100644
--- a/coverage/com.google.enterprise.adaptor.GroupPrincipal.html
+++ b/coverage/com.google.enterprise.adaptor.GroupPrincipal.html
@@ -83,7 +83,7 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 35</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"> 36</td> <td class="nbHitsCovered"> 760</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 768</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">false</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>
diff --git a/coverage/com.google.enterprise.adaptor.IOHelper.html b/coverage/com.google.enterprise.adaptor.IOHelper.html
index e1e915d..ceb14de 100644
--- a/coverage/com.google.enterprise.adaptor.IOHelper.html
+++ b/coverage/com.google.enterprise.adaptor.IOHelper.html
@@ -83,8 +83,8 @@
<tr> <td class="numLineCover"> 33</td> <td class="nbHitsCovered"> 72</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)."> 174</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"> 103</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)."> 207</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"> 136</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"> 70</td> <td class="src"><pre class="src"> out.flush();</pre></td></tr>
diff --git a/coverage/com.google.enterprise.adaptor.Journal.html b/coverage/com.google.enterprise.adaptor.Journal.html
index 3ba3e77..fcd8f20 100644
--- a/coverage/com.google.enterprise.adaptor.Journal.html
+++ b/coverage/com.google.enterprise.adaptor.Journal.html
@@ -373,8 +373,8 @@
<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"> 975</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"> 975</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)."> 446246</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"> 445271</td> <td class="src"><pre class="src"> time = timeProvider.currentTimeMillis();</pre></td></tr>
+<tr> <td class="numLineCover"> 216</td> <td class="nbHitsCovered"><a title="Line 216: Conditional coverage 100% (2/2)."> 420646</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"> 419671</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"> 975</td> <td class="src"><pre class="src"> <span class="keyword">return</span> time - startTime;</pre></td></tr>
diff --git a/coverage/com.google.enterprise.adaptor.Metadata.html b/coverage/com.google.enterprise.adaptor.Metadata.html
index fa58e98..87ff32c 100644
--- a/coverage/com.google.enterprise.adaptor.Metadata.html
+++ b/coverage/com.google.enterprise.adaptor.Metadata.html
@@ -91,15 +91,15 @@
<tr> <td class="numLine"> 35</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
<tr> <td class="numLineCover"> 36</td> <td class="nbHitsCovered"> 43</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"> 37</td> <td class="nbHitsCovered"> 135</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"> 150</td> <td class="src"><pre class="src"> <span class="keyword">private</span> Map<String, Set<String>> mappings </pre></td></tr>
<tr> <td class="numLine"> 38</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"> 39</td> <td class="nbHits"> </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"> <span class="comment">/** Create empty instance. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 41</td> <td class="nbHitsCovered"> 128</td> <td class="src"><pre class="src"> <span class="keyword">public</span> Metadata() {</pre></td></tr>
-<tr> <td class="numLineCover"> 42</td> <td class="nbHitsCovered"> 128</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 41</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"> 42</td> <td class="nbHitsCovered"> 143</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>
@@ -116,18 +116,18 @@
<td class="src"><pre class="src"> <span class="comment">/** Make v be only value associated with key. */</span></pre></td></tr>
<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> set(String k, String v) {</pre></td></tr>
-<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"><a title="Line 53: Conditional coverage 100% (2/2)."> 76</a></td> <td class="src"><pre class="src"> <a title="Line 53: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == k) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"><a title="Line 53: Conditional coverage 100% (2/2)."> 106</a></td> <td class="src"><pre class="src"> <a title="Line 53: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == k) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 54</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"> 55</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"><a title="Line 56: Conditional coverage 100% (2/2)."> 75</a></td> <td class="src"><pre class="src"> <a title="Line 56: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == v) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"><a title="Line 56: Conditional coverage 100% (2/2)."> 105</a></td> <td class="src"><pre class="src"> <a title="Line 56: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == v) {</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> NullPointerException();</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"> 74</td> <td class="src"><pre class="src"> TreeSet<String> single = <span class="keyword">new</span> TreeSet<String>();</pre></td></tr>
-<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 74</td> <td class="src"><pre class="src"> single.add(v);</pre></td></tr>
-<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 74</td> <td class="src"><pre class="src"> mappings.put(k, single);</pre></td></tr>
-<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 74</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 59</td> <td class="nbHitsCovered"> 104</td> <td class="src"><pre class="src"> TreeSet<String> single = <span class="keyword">new</span> TreeSet<String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 60</td> <td class="nbHitsCovered"> 104</td> <td class="src"><pre class="src"> single.add(v);</pre></td></tr>
+<tr> <td class="numLineCover"> 61</td> <td class="nbHitsCovered"> 104</td> <td class="src"><pre class="src"> mappings.put(k, single);</pre></td></tr>
+<tr> <td class="numLineCover"> 62</td> <td class="nbHitsCovered"> 104</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>
@@ -138,61 +138,61 @@
<td class="src"><pre class="src"> <span class="comment">// Can't use items.contains(null) because Set is permitted to throw NPE in</span></pre></td></tr>
<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// such a case.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"><a title="Line 68: Conditional coverage 100% (2/2)."> 33</a></td> <td class="src"><pre class="src"> <a title="Line 68: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String s : items) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 69</td> <td class="nbHitsUncovered"><a title="Line 69: Conditional coverage 50% (1/2)."> 53</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 69: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (s == <span class="keyword">null</span>) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 68</td> <td class="nbHitsCovered"><a title="Line 68: Conditional coverage 100% (2/2)."> 48</a></td> <td class="src"><pre class="src"> <a title="Line 68: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String s : items) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsUncovered"><a title="Line 69: Conditional coverage 50% (1/2)."> 69</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 69: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (s == <span class="keyword">null</span>) {</a></span></pre></td></tr>
<tr> <td class="numLineCover"> 70</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"> 71</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</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"> 33</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 73</td> <td class="nbHitsCovered"> 48</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">/** Make copy of v be the values associated with key. */</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">void</span> set(String k, Set<String> v) {</pre></td></tr>
-<tr> <td class="numLineCover"> 77</td> <td class="nbHitsUncovered"><a title="Line 77: Conditional coverage 50% (1/2)."> 34</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 77: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == k) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 77</td> <td class="nbHitsUncovered"><a title="Line 77: Conditional coverage 50% (1/2)."> 49</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 77: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == k) {</a></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 class="keyword">throw</span> <span class="keyword">new</span> NullPointerException();</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="numLineCover"> 80</td> <td class="nbHitsCovered"><a title="Line 80: Conditional coverage 100% (2/2)."> 34</a></td> <td class="src"><pre class="src"> <a title="Line 80: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == v) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 80</td> <td class="nbHitsCovered"><a title="Line 80: Conditional coverage 100% (2/2)."> 49</a></td> <td class="src"><pre class="src"> <a title="Line 80: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == v) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 81</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"> 82</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 33</td> <td class="src"><pre class="src"> assureNoNulls(v);</pre></td></tr>
-<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"><a title="Line 84: Conditional coverage 100% (2/2)."> 33</a></td> <td class="src"><pre class="src"> <a title="Line 84: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (v.isEmpty()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 85</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> mappings.remove(k);</pre></td></tr>
+<tr> <td class="numLineCover"> 83</td> <td class="nbHitsCovered"> 48</td> <td class="src"><pre class="src"> assureNoNulls(v);</pre></td></tr>
+<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"><a title="Line 84: Conditional coverage 100% (2/2)."> 48</a></td> <td class="src"><pre class="src"> <a title="Line 84: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (v.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 85</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> mappings.remove(k);</pre></td></tr>
<tr> <td class="numLine"> 86</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 28</td> <td class="src"><pre class="src"> v = <span class="keyword">new</span> TreeSet<String>(v);</pre></td></tr>
-<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"> 28</td> <td class="src"><pre class="src"> mappings.put(k, v);</pre></td></tr>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> v = <span class="keyword">new</span> TreeSet<String>(v);</pre></td></tr>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"> 38</td> <td class="src"><pre class="src"> mappings.put(k, v);</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"> 33</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 90</td> <td class="nbHitsCovered"> 48</td> <td class="src"><pre class="src"> }</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">/** Increases values mapped to k with v. */</span></pre></td></tr>
<tr> <td class="numLine"> 93</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> add(String k, String v) {</pre></td></tr>
-<tr> <td class="numLineCover"> 94</td> <td class="nbHitsCovered"><a title="Line 94: Conditional coverage 100% (2/2)."> 68</a></td> <td class="src"><pre class="src"> <a title="Line 94: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == k) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 94</td> <td class="nbHitsCovered"><a title="Line 94: Conditional coverage 100% (2/2)."> 110</a></td> <td class="src"><pre class="src"> <a title="Line 94: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == k) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 95</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"> 96</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"><a title="Line 97: Conditional coverage 100% (2/2)."> 67</a></td> <td class="src"><pre class="src"> <a title="Line 97: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == v) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"><a title="Line 97: Conditional coverage 100% (2/2)."> 109</a></td> <td class="src"><pre class="src"> <a title="Line 97: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == v) {</a></pre></td></tr>
<tr> <td class="numLineCover"> 98</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"> 99</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 65</td> <td class="src"><pre class="src"> Set<String> found = mappings.get(k);</pre></td></tr>
-<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"><a title="Line 101: Conditional coverage 100% (2/2)."> 65</a></td> <td class="src"><pre class="src"> <a title="Line 101: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == found) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 53</td> <td class="src"><pre class="src"> set(k, v);</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 107</td> <td class="src"><pre class="src"> Set<String> found = mappings.get(k);</pre></td></tr>
+<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"><a title="Line 101: Conditional coverage 100% (2/2)."> 107</a></td> <td class="src"><pre class="src"> <a title="Line 101: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == found) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 83</td> <td class="src"><pre class="src"> set(k, v);</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"> 12</td> <td class="src"><pre class="src"> found.add(v);</pre></td></tr>
+<tr> <td class="numLineCover"> 104</td> <td class="nbHitsCovered"> 24</td> <td class="src"><pre class="src"> found.add(v);</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="numLineCover"> 106</td> <td class="nbHitsCovered"> 65</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 107</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>
<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
@@ -211,12 +211,12 @@
<td class="src"><pre class="src"> <span class="comment">/** Gives unmodifiable reference to inserted values for key, empty if none. */</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> Set<String> getAllValues(String key) {</pre></td></tr>
-<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 15</td> <td class="src"><pre class="src"> Set<String> found = mappings.get(key);</pre></td></tr>
-<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"><a title="Line 119: Conditional coverage 100% (2/2)."> 15</a></td> <td class="src"><pre class="src"> <a title="Line 119: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == found) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> found = Collections.emptySet(); </pre></td></tr>
+<tr> <td class="numLineCover"> 118</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> Set<String> found = mappings.get(key);</pre></td></tr>
+<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"><a title="Line 119: Conditional coverage 100% (2/2)."> 35</a></td> <td class="src"><pre class="src"> <a title="Line 119: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (<span class="keyword">null</span> == found) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> found = Collections.emptySet(); </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"> 15</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.unmodifiableSet(found);</pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 35</td> <td class="src"><pre class="src"> <span class="keyword">return</span> Collections.unmodifiableSet(found);</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>
@@ -338,16 +338,16 @@
<td class="src"><pre class="src"> <span class="comment">/** True if exactly the same key-values are represented. */</span></pre></td></tr>
<tr> <td class="numLine"> 195</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"> 196</td> <td class="nbHitsUncovered"><a title="Line 196: Conditional coverage 50% (1/2)."> 22</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 196: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!(o <span class="keyword">instanceof</span> Metadata)) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 196</td> <td class="nbHitsUncovered"><a title="Line 196: Conditional coverage 50% (1/2)."> 27</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 196: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (!(o <span class="keyword">instanceof</span> Metadata)) {</a></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">return</span> <span class="keyword">false</span>;</span></pre></td></tr>
<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> }</pre></td></tr>
-<tr> <td class="numLineCover"> 199</td> <td class="nbHitsUncovered"><a title="Line 199: Conditional coverage 50% (1/2)."> 22</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 199: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="keyword">this</span> == o) {</a></span></pre></td></tr>
+<tr> <td class="numLineCover"> 199</td> <td class="nbHitsUncovered"><a title="Line 199: Conditional coverage 50% (1/2)."> 27</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 199: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> (<span class="keyword">this</span> == o) {</a></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">return</span> <span class="keyword">true</span>;</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"> 22</td> <td class="src"><pre class="src"> Metadata other = (Metadata) o;</pre></td></tr>
-<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">return</span> mappings.equals(other.mappings);</pre></td></tr>
+<tr> <td class="numLineCover"> 202</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> Metadata other = (Metadata) o;</pre></td></tr>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 27</td> <td class="src"><pre class="src"> <span class="keyword">return</span> mappings.equals(other.mappings);</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>
@@ -384,7 +384,7 @@
<td class="src"><pre class="src"> </pre></td></tr>
<tr> <td class="numLine"> 226</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">/** Does not allow any mutating operations. */</span></pre></td></tr>
-<tr> <td class="numLineCover"> 227</td> <td class="nbHitsCovered"> 26</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> ReadableMetadata <span class="keyword">extends</span> Metadata {</pre></td></tr>
+<tr> <td class="numLineCover"> 227</td> <td class="nbHitsCovered"> 36</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> ReadableMetadata <span class="keyword">extends</span> Metadata {</pre></td></tr>
<tr> <td class="numLine"> 228</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 229</td> <td class="nbHits"> </td>
@@ -436,13 +436,13 @@
<td class="src"><pre class="src"> <span class="comment">/** Get a reference to an unmodifiable view of this object. */</span></pre></td></tr>
<tr> <td class="numLine"> 255</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="keyword">public</span> Metadata unmodifiableView() {</pre></td></tr>
-<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> Metadata unmodifiable = <span class="keyword">new</span> ReadableMetadata();</pre></td></tr>
+<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> Metadata unmodifiable = <span class="keyword">new</span> ReadableMetadata();</pre></td></tr>
<tr> <td class="numLine"> 257</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// Extra precaution against mappings use, but not against moding</span></pre></td></tr>
<tr> <td class="numLine"> 258</td> <td class="nbHits"> </td>
<td class="src"><pre class="src"> <span class="comment">// sets that are values inside it.</span></pre></td></tr>
-<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> unmodifiable.mappings = Collections.unmodifiableMap(<span class="keyword">this</span>.mappings); </pre></td></tr>
-<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"> 13</td> <td class="src"><pre class="src"> <span class="keyword">return</span> unmodifiable;</pre></td></tr>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> unmodifiable.mappings = Collections.unmodifiableMap(<span class="keyword">this</span>.mappings); </pre></td></tr>
+<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">return</span> unmodifiable;</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>
diff --git a/coverage/com.google.enterprise.adaptor.Principal.html b/coverage/com.google.enterprise.adaptor.Principal.html
index aae51b0..b41971e 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"> 495</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">abstract</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"> 496</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">abstract</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>
@@ -162,24 +162,24 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 84</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"> 85</td> <td class="nbHitsCovered"> 495</td> <td class="src"><pre class="src"> <span class="keyword">int</span> spacecmp = namespace.compareTo(other.namespace);</pre></td></tr>
-<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"><a title="Line 86: Conditional coverage 100% (2/2)."> 495</a></td> <td class="src"><pre class="src"> <a title="Line 86: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (0 != spacecmp) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 56</td> <td class="src"><pre class="src"> <span class="keyword">return</span> spacecmp;</pre></td></tr>
+<tr> <td class="numLineCover"> 85</td> <td class="nbHitsCovered"> 496</td> <td class="src"><pre class="src"> <span class="keyword">int</span> spacecmp = namespace.compareTo(other.namespace);</pre></td></tr>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"><a title="Line 86: Conditional coverage 100% (2/2)."> 496</a></td> <td class="src"><pre class="src"> <a title="Line 86: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (0 != spacecmp) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 47</td> <td class="src"><pre class="src"> <span class="keyword">return</span> spacecmp;</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>
<td class="src"><pre class="src"> <span class="comment">// OK, same namespace</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="numLineCover"> 91</td> <td class="nbHitsCovered"><a title="Line 91: Conditional coverage 100% (2/2)."> 439</a></td> <td class="src"><pre class="src"> <a title="Line 91: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (isUser() != other.isUser()) {</a></pre></td></tr>
-<tr> <td class="numLineCover"> 92</td> <td class="nbHitsCovered"><a title="Line 92: Conditional coverage 100% (2/2)."> 45</a></td> <td class="src"><pre class="src"> <a title="Line 92: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> isUser() ? -1 : 1;</a></pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"><a title="Line 91: Conditional coverage 100% (2/2)."> 449</a></td> <td class="src"><pre class="src"> <a title="Line 91: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (isUser() != other.isUser()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 92</td> <td class="nbHitsCovered"><a title="Line 92: Conditional coverage 100% (2/2)."> 53</a></td> <td class="src"><pre class="src"> <a title="Line 92: Conditional coverage 100% (2/2)."> <span class="keyword">return</span> isUser() ? -1 : 1;</a></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"> <span class="comment">// OK, same namespace and same type</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="numLineCover"> 96</td> <td class="nbHitsCovered"> 394</td> <td class="src"><pre class="src"> <span class="keyword">return</span> name.compareTo(other.name);</pre></td></tr>
+<tr> <td class="numLineCover"> 96</td> <td class="nbHitsCovered"> 396</td> <td class="src"><pre class="src"> <span class="keyword">return</span> name.compareTo(other.name);</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>
diff --git a/coverage/com.google.enterprise.adaptor.ShutdownWaiter.html b/coverage/com.google.enterprise.adaptor.ShutdownWaiter.html
index 984825e..e1bc625 100644
--- a/coverage/com.google.enterprise.adaptor.ShutdownWaiter.html
+++ b/coverage/com.google.enterprise.adaptor.ShutdownWaiter.html
@@ -124,8 +124,8 @@
<tr> <td class="numLineCover"> 53</td> <td class="nbHitsCovered"> 17</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)."> 42</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"> 25</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)."> 43</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"> 26</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>
diff --git a/coverage/com.google.enterprise.adaptor.SystemTimeProvider.html b/coverage/com.google.enterprise.adaptor.SystemTimeProvider.html
index 69993b6..8992a50 100644
--- a/coverage/com.google.enterprise.adaptor.SystemTimeProvider.html
+++ b/coverage/com.google.enterprise.adaptor.SystemTimeProvider.html
@@ -58,7 +58,7 @@
<tr> <td class="numLineCover"> 20</td> <td class="nbHitsCovered"> 71</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"> 444719</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"> 419119</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.UserPrincipal.html b/coverage/com.google.enterprise.adaptor.UserPrincipal.html
index f14e97d..cdbe6c7 100644
--- a/coverage/com.google.enterprise.adaptor.UserPrincipal.html
+++ b/coverage/com.google.enterprise.adaptor.UserPrincipal.html
@@ -75,7 +75,7 @@
<td class="src"><pre class="src"> @Override</pre></td></tr>
<tr> <td class="numLine"> 31</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"> 32</td> <td class="nbHitsCovered"> 1118</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 32</td> <td class="nbHitsCovered"> 1138</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">true</span>;</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>
diff --git a/coverage/com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html b/coverage/com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html
new file mode 100644
index 0000000..bc25081
--- /dev/null
+++ b/coverage/com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html
@@ -0,0 +1,553 @@
+<!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.prebuilt.PrebuiltTransforms</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.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms</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:98px"><span class="text">78/79</span></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">38/38</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.125;</span>3.125</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms$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.125;</span>3.125</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms$CopyTransform</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:96px"><span class="text">26/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">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:91px"><span class="text">11/12</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.125;</span>3.125</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms$DeleteTransform</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">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">3.125;</span>3.125</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms$ReplaceTransform</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">24/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">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">3.125;</span>3.125</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.prebuilt;</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.enterprise.adaptor.DocumentTransform;</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.google.enterprise.adaptor.Metadata;</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> java.util.*;</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.logging.*;</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.regex.*;</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"> <span class="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 25</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Common transforms that you would expect to have available.</span></pre></td></tr>
+<tr> <td class="numLine"> 26</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLineCover"> 27</td> <td class="nbHitsCovered"> 22</td> <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">class</span> PrebuiltTransforms {</pre></td></tr>
+<tr> <td class="numLineCover"> 28</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> Pattern INTEGER_PATTERN = Pattern.compile(<span class="string">"[0-9]+"</span>);</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"> 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(PrebuiltTransforms.<span class="keyword">class</span>.getName());</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>
+ <td class="src"><pre class="src"> <span class="comment">// Prevent instantiation.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 34</td> <td class="nbHitsUncovered"> 0</td> <td class="src"><pre class="src"><span class="srcUncovered"> <span class="keyword">private</span> PrebuiltTransforms() {}</span></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="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 37</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Returns a transform that copies metadata values from one key to another.</span></pre></td></tr>
+<tr> <td class="numLine"> 38</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * The {@code "overwrite"} key can be set to {@code "true"} to cause the</span></pre></td></tr>
+<tr> <td class="numLine"> 39</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * destination to be replaced; otherwise the destination key is supplemented.</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="numLine"> 41</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <p>Copies are defined by pairs of {@code "X.from"} and {@code "X.to"}</span></pre></td></tr>
+<tr> <td class="numLine"> 42</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * configuration entries (where {@code X} is an integer). The value for each</span></pre></td></tr>
+<tr> <td class="numLine"> 43</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * is a metadata key. Copies are applied in the increasing order of the</span></pre></td></tr>
+<tr> <td class="numLine"> 44</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * integers.</span></pre></td></tr>
+<tr> <td class="numLine"> 45</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *</span></pre></td></tr>
+<tr> <td class="numLine"> 46</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <p>Example configuration:</span></pre></td></tr>
+<tr> <td class="numLine"> 47</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <pre><code>overwrite=false</span></pre></td></tr>
+<tr> <td class="numLine"> 48</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *3.from=colour</span></pre></td></tr>
+<tr> <td class="numLine"> 49</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *3.to=color</span></pre></td></tr>
+<tr> <td class="numLine"> 50</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *5.from=author</span></pre></td></tr>
+<tr> <td class="numLine"> 51</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *5.to=contributors</code></pre></span></pre></td></tr>
+<tr> <td class="numLine"> 52</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></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">static</span> DocumentTransform copyMetadata(Map<String, String> config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 54</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> overwrite = Boolean.parseBoolean(config.get(<span class="string">"overwrite"</span>));</pre></td></tr>
+<tr> <td class="numLineCover"> 55</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> List<String> copies = parseCopies(config);</pre></td></tr>
+<tr> <td class="numLineCover"> 56</td> <td class="nbHitsCovered"><a title="Line 56: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 56: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (copies.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 57</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.warning(<span class="string">"No entries listed to be copied"</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="numLineCover"> 59</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> CopyTransform(copies, overwrite, <span class="keyword">false</span>);</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"> </pre></td></tr>
+<tr> <td class="numLine"> 62</td> <td class="nbHits"> </td>
+ <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="comment"> * Returns a transform that moves metadata values from one key to another.</span></pre></td></tr>
+<tr> <td class="numLine"> 64</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * This method returns a transform that behaves identically to {@link</span></pre></td></tr>
+<tr> <td class="numLine"> 65</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * #copyMetadata}, except that the source keys are removed. If the source key</span></pre></td></tr>
+<tr> <td class="numLine"> 66</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * has no metadata values then the destination is left as-is.</span></pre></td></tr>
+<tr> <td class="numLine"> 67</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 68</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> DocumentTransform moveMetadata(Map<String, String> config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 69</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> overwrite = Boolean.parseBoolean(config.get(<span class="string">"overwrite"</span>));</pre></td></tr>
+<tr> <td class="numLineCover"> 70</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> List<String> copies = parseCopies(config);</pre></td></tr>
+<tr> <td class="numLineCover"> 71</td> <td class="nbHitsCovered"><a title="Line 71: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 71: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (copies.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 72</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.warning(<span class="string">"No entries listed to be moved"</span>);</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"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> CopyTransform(copies, overwrite, <span class="keyword">true</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"> </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"> * Returns interleaved source/destination pairs.</span></pre></td></tr>
+<tr> <td class="numLine"> 79</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 80</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> List<String> parseCopies(Map<String, String> config) {</pre></td></tr>
+<tr> <td class="numLine"> 81</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// We get all configuration items that are like "12.BLAH" (some integer</span></pre></td></tr>
+<tr> <td class="numLine"> 82</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// followed by a dot and more text). The inner map's keys is the text that</span></pre></td></tr>
+<tr> <td class="numLine"> 83</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// follows the dot (so "BLAH" in this case).</span></pre></td></tr>
+<tr> <td class="numLineCover"> 84</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Map<Integer, Map<String, String>> intConfig</pre></td></tr>
+<tr> <td class="numLine"> 85</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> = <span class="keyword">new</span> TreeMap<Integer, Map<String, String>>();</pre></td></tr>
+<tr> <td class="numLineCover"> 86</td> <td class="nbHitsCovered"><a title="Line 86: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 86: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Map.Entry<String, String> me : config.entrySet()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 87</td> <td class="nbHitsCovered"> 21</td> <td class="src"><pre class="src"> String[] parts = me.getKey().split(<span class="string">"\\."</span>, 2);</pre></td></tr>
+<tr> <td class="numLineCover"> 88</td> <td class="nbHitsCovered"><a title="Line 88: Conditional coverage 100% (2/2)."> 21</a></td> <td class="src"><pre class="src"> <a title="Line 88: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (parts.length != 2) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 89</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.log(Level.FINER,</pre></td></tr>
+<tr> <td class="numLine"> 90</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"Not a copy definition. Does not contain a dot: {0}"</span>, me.getKey());</pre></td></tr>
+<tr> <td class="numLineCover"> 91</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">continue</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="numLineCover"> 93</td> <td class="nbHitsCovered"><a title="Line 93: Conditional coverage 100% (2/2)."> 20</a></td> <td class="src"><pre class="src"> <a title="Line 93: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!INTEGER_PATTERN.matcher(parts[0]).matches()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 94</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.log(Level.FINER,</pre></td></tr>
+<tr> <td class="numLine"> 95</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"Not a copy definition. Does not start with an integer: {0}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 96</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> me.getKey());</pre></td></tr>
+<tr> <td class="numLineCover"> 97</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">continue</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="numLineCover"> 99</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> <span class="keyword">int</span> i = Integer.parseInt(parts[0]);</pre></td></tr>
+<tr> <td class="numLineCover"> 100</td> <td class="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> Map<String, String> values = intConfig.get(i);</pre></td></tr>
+<tr> <td class="numLineCover"> 101</td> <td class="nbHitsCovered"><a title="Line 101: Conditional coverage 100% (2/2)."> 18</a></td> <td class="src"><pre class="src"> <a title="Line 101: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (values == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 102</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> values = <span class="keyword">new</span> HashMap<String, String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 103</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> intConfig.put(i, values);</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="nbHitsCovered"> 18</td> <td class="src"><pre class="src"> values.put(parts[1], me.getValue());</pre></td></tr>
+<tr> <td class="numLineCover"> 106</td> <td class="nbHitsCovered"> 18</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>
+<tr> <td class="numLine"> 108</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment">// Now do the real processing of the config.</span></pre></td></tr>
+<tr> <td class="numLineCover"> 109</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> List<String> copies = <span class="keyword">new</span> ArrayList<String>(intConfig.size() * 2);</pre></td></tr>
+<tr> <td class="numLineCover"> 110</td> <td class="nbHitsCovered"><a title="Line 110: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 110: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Map.Entry<Integer, Map<String, String>> me : intConfig.entrySet()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 111</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> String from = me.getValue().get(<span class="string">"from"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 112</td> <td class="nbHitsCovered"> 10</td> <td class="src"><pre class="src"> String to = me.getValue().get(<span class="string">"to"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 113</td> <td class="nbHitsCovered"><a title="Line 113: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 113: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (from == <span class="keyword">null</span> || to == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 114</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Ignoring int {0}. Missing .from or .to"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 115</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> me.getKey());</pre></td></tr>
+<tr> <td class="numLineCover"> 116</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">continue</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"> 8</td> <td class="src"><pre class="src"> copies.add(from);</pre></td></tr>
+<tr> <td class="numLineCover"> 119</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> copies.add(to);</pre></td></tr>
+<tr> <td class="numLineCover"> 120</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Found config to rename {0} to {1}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 121</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {from, to});</pre></td></tr>
+<tr> <td class="numLineCover"> 122</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 123</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">return</span> copies;</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>
+<tr> <td class="numLineCover"> 126</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> CopyTransform <span class="keyword">implements</span> DocumentTransform {</pre></td></tr>
+<tr> <td class="numLine"> 127</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> List<String> copies;</pre></td></tr>
+<tr> <td class="numLine"> 128</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">boolean</span> overwrite;</pre></td></tr>
+<tr> <td class="numLine"> 129</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">boolean</span> move;</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"> <span class="keyword">private</span> CopyTransform(List<String> copies, <span class="keyword">boolean</span> overwrite,</pre></td></tr>
+<tr> <td class="numLineCover"> 132</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> move) {</pre></td></tr>
+<tr> <td class="numLineCover"> 133</td> <td class="nbHitsUncovered"><a title="Line 133: Conditional coverage 50% (1/2)."> 4</a></td> <td class="src"><pre class="src"><span class="srcUncovered"> <a title="Line 133: Conditional coverage 50% (1/2)."> <span class="keyword">if</span> ((copies.size() % 2) != 0) {</a></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="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"> 4</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.copies = Collections.unmodifiableList(<span class="keyword">new</span> ArrayList<String>(copies));</pre></td></tr>
+<tr> <td class="numLineCover"> 137</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.overwrite = overwrite;</pre></td></tr>
+<tr> <td class="numLineCover"> 138</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.move = move;</pre></td></tr>
+<tr> <td class="numLineCover"> 139</td> <td class="nbHitsCovered"> 4</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"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 142</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> transform(Metadata metadata, Map<String, String> params) {</pre></td></tr>
+<tr> <td class="numLineCover"> 143</td> <td class="nbHitsCovered"><a title="Line 143: Conditional coverage 100% (2/2)."> 10</a></td> <td class="src"><pre class="src"> <a title="Line 143: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (<span class="keyword">int</span> i = 0; i < copies.size(); i += 2) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 144</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> String from = copies.get(i);</pre></td></tr>
+<tr> <td class="numLineCover"> 145</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> String to = copies.get(i + 1);</pre></td></tr>
+<tr> <td class="numLineCover"> 146</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> Set<String> values = metadata.getAllValues(from);</pre></td></tr>
+<tr> <td class="numLineCover"> 147</td> <td class="nbHitsCovered"><a title="Line 147: Conditional coverage 100% (2/2)."> 8</a></td> <td class="src"><pre class="src"> <a title="Line 147: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (values.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 148</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"No values for {0}. Skipping"</span>, from);</pre></td></tr>
+<tr> <td class="numLineCover"> 149</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</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"> 6</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Copying values from {0} to {1}: {2}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 152</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {from, to, values});</pre></td></tr>
+<tr> <td class="numLineCover"> 153</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> Set<String> destValues = metadata.getAllValues(to);</pre></td></tr>
+<tr> <td class="numLineCover"> 154</td> <td class="nbHitsCovered"><a title="Line 154: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 154: Conditional coverage 100% (4/4) [each condition: 100%, 100%]."> <span class="keyword">if</span> (!overwrite && !destValues.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 155</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> values = <span class="keyword">new</span> HashSet<String>(values);</pre></td></tr>
+<tr> <td class="numLineCover"> 156</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.log(Level.FINER, <span class="string">"Preexisting values for {0}. Combining: {1}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 157</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {to, destValues});</pre></td></tr>
+<tr> <td class="numLineCover"> 158</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> values.addAll(destValues);</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"> 6</td> <td class="src"><pre class="src"> metadata.set(to, values);</pre></td></tr>
+<tr> <td class="numLineCover"> 161</td> <td class="nbHitsCovered"><a title="Line 161: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 161: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (move) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 162</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> log.log(Level.FINER, <span class="string">"Deleting source {0}"</span>, from);</pre></td></tr>
+<tr> <td class="numLineCover"> 163</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> metadata.set(from, Collections.<String>emptySet());</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="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"> 2</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"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 169</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"> 170</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="string">"CopyTransform(copies="</span> + copies + <span class="string">",overwrite="</span> + overwrite</pre></td></tr>
+<tr> <td class="numLine"> 171</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + <span class="string">",move="</span> + move + <span class="string">")"</span>;</pre></td></tr>
+<tr> <td class="numLine"> 172</td> <td class="nbHits"> </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>
+ <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="comment">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 176</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Returns a transform that deletes metadata keys. The keys to be deleted are</span></pre></td></tr>
+<tr> <td class="numLine"> 177</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * defined by {@code "keyX"} configuration entries (where {@code X} is an</span></pre></td></tr>
+<tr> <td class="numLine"> 178</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * integer).</span></pre></td></tr>
+<tr> <td class="numLine"> 179</td> <td class="nbHits"> </td>
+ <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"> * <p>Example configuration:</span></pre></td></tr>
+<tr> <td class="numLine"> 181</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <pre><code>key2=sensitive</span></pre></td></tr>
+<tr> <td class="numLine"> 182</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *key4=unhelpful</code></pre></span></pre></td></tr>
+<tr> <td class="numLine"> 183</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 184</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> DocumentTransform deleteMetadata(Map<String, String> config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 185</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> Set<String> keys = <span class="keyword">new</span> HashSet<String>(parseList(config, <span class="string">"key"</span>));</pre></td></tr>
+<tr> <td class="numLineCover"> 186</td> <td class="nbHitsCovered"><a title="Line 186: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 186: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (keys.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 187</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.warning(<span class="string">"No entries listed to delete"</span>);</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="numLineCover"> 189</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> DeleteTransform(keys);</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="numLine"> 192</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">static</span> List<String> parseList(Map<String, String> config,</pre></td></tr>
+<tr> <td class="numLine"> 193</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String prefix) {</pre></td></tr>
+<tr> <td class="numLineCover"> 194</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> List<String> keys = <span class="keyword">new</span> LinkedList<String>();</pre></td></tr>
+<tr> <td class="numLineCover"> 195</td> <td class="nbHitsCovered"><a title="Line 195: Conditional coverage 100% (2/2)."> 5</a></td> <td class="src"><pre class="src"> <a title="Line 195: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (Map.Entry<String, String> me : config.entrySet()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 196</td> <td class="nbHitsCovered"><a title="Line 196: Conditional coverage 100% (2/2)."> 16</a></td> <td class="src"><pre class="src"> <a title="Line 196: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!me.getKey().startsWith(prefix)) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 197</td> <td class="nbHitsCovered"> 7</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</pre></td></tr>
+<tr> <td class="numLine"> 198</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 199</td> <td class="nbHitsCovered"> 9</td> <td class="src"><pre class="src"> String number = me.getKey().substring(prefix.length());</pre></td></tr>
+<tr> <td class="numLineCover"> 200</td> <td class="nbHitsCovered"><a title="Line 200: Conditional coverage 100% (2/2)."> 9</a></td> <td class="src"><pre class="src"> <a title="Line 200: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (!INTEGER_PATTERN.matcher(number).matches()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 201</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Ignoring {0}. Number does not follow .{1}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 202</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {me.getKey(), prefix});</pre></td></tr>
+<tr> <td class="numLineCover"> 203</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</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"> 8</td> <td class="src"><pre class="src"> keys.add(me.getValue());</pre></td></tr>
+<tr> <td class="numLineCover"> 206</td> <td class="nbHitsCovered"> 8</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 207</td> <td class="nbHitsCovered"> 5</td> <td class="src"><pre class="src"> <span class="keyword">return</span> keys;</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"> </pre></td></tr>
+<tr> <td class="numLine"> 210</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> DeleteTransform <span class="keyword">implements</span> DocumentTransform {</pre></td></tr>
+<tr> <td class="numLine"> 211</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> List<String> keys;</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="numLineCover"> 213</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">public</span> DeleteTransform(Collection<String> keys) {</pre></td></tr>
+<tr> <td class="numLineCover"> 214</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.keys = Collections.unmodifiableList(<span class="keyword">new</span> ArrayList<String>(keys));</pre></td></tr>
+<tr> <td class="numLineCover"> 215</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</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"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 218</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> transform(Metadata metadata, Map<String, String> params) {</pre></td></tr>
+<tr> <td class="numLineCover"> 219</td> <td class="nbHitsCovered"><a title="Line 219: Conditional coverage 100% (2/2)."> 1</a></td> <td class="src"><pre class="src"> <a title="Line 219: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String key : keys) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 220</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> metadata.set(key, Collections.<String>emptySet());</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"> }</pre></td></tr>
+<tr> <td class="numLine"> 223</td> <td class="nbHits"> </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"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 225</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"> 226</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="string">"DeleteTransform(keys="</span> + keys + <span class="string">")"</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"> }</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">/**</span></pre></td></tr>
+<tr> <td class="numLine"> 231</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * Returns a transform that preforms string replacements within metadata</span></pre></td></tr>
+<tr> <td class="numLine"> 232</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * values. The keys to have replacements done on their values are defined by</span></pre></td></tr>
+<tr> <td class="numLine"> 233</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * {@code "keyX"} configuration entries (where {@code X} is an</span></pre></td></tr>
+<tr> <td class="numLine"> 234</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * integer). The {@code "overwrite"} configuration key can be set to {@code</span></pre></td></tr>
+<tr> <td class="numLine"> 235</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * "false"} to cause the original string to be left intact; otherwise the</span></pre></td></tr>
+<tr> <td class="numLine"> 236</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * original string is replaced.</span></pre></td></tr>
+<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="comment"> * <p>The needle to be found is configured via a {@code "string"} or {@code</span></pre></td></tr>
+<tr> <td class="numLine"> 239</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * "pattern"} configuration key. {@code string}'s value is treated as a</span></pre></td></tr>
+<tr> <td class="numLine"> 240</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * literal string to be found whereas {@code pattern}'s value is treated as</span></pre></td></tr>
+<tr> <td class="numLine"> 241</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * a regular expression. The replacement is defined by {@code "replacement"}</span></pre></td></tr>
+<tr> <td class="numLine"> 242</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * and is interpreted as a literal string if {@code "string"} was provided</span></pre></td></tr>
+<tr> <td class="numLine"> 243</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * and a regular expression replacement if {@code "pattern"} was provided.</span></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"> * <p>Example configuration:</span></pre></td></tr>
+<tr> <td class="numLine"> 246</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> * <pre><code>overwrite=false</span></pre></td></tr>
+<tr> <td class="numLine"> 247</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *key1=favorite</span></pre></td></tr>
+<tr> <td class="numLine"> 248</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *key5=least favorite</span></pre></td></tr>
+<tr> <td class="numLine"> 249</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *pattern=(Java|C|Perl)</span></pre></td></tr>
+<tr> <td class="numLine"> 250</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> *replacement=$1 (but it should be x86 assembler)</code</pre></span></pre></td></tr>
+<tr> <td class="numLine"> 251</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="comment"> */</span></pre></td></tr>
+<tr> <td class="numLine"> 252</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">static</span> DocumentTransform replaceMetadata(Map<String, String> config) {</pre></td></tr>
+<tr> <td class="numLineCover"> 253</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> <span class="keyword">boolean</span> overwrite = <span class="keyword">true</span>;</pre></td></tr>
+<tr> <td class="numLineCover"> 254</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String overwriteString = config.get(<span class="string">"overwrite"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 255</td> <td class="nbHitsCovered"><a title="Line 255: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 255: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (overwriteString != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 256</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> overwrite = Boolean.parseBoolean(overwriteString);</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="numLineCover"> 258</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String string = config.get(<span class="string">"string"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 259</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String pattern = config.get(<span class="string">"pattern"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 260</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String replacement = config.get(<span class="string">"replacement"</span>);</pre></td></tr>
+<tr> <td class="numLineCover"> 261</td> <td class="nbHitsCovered"><a title="Line 261: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 261: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (replacement == <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 262</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">"Missing replacement"</span>);</pre></td></tr>
+<tr> <td class="numLine"> 263</td> <td class="nbHits"> </td>
+ <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"> Pattern toMatch;</pre></td></tr>
+<tr> <td class="numLine"> 265</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> String replacementPattern;</pre></td></tr>
+<tr> <td class="numLineCover"> 266</td> <td class="nbHitsCovered"><a title="Line 266: Conditional coverage 100% (2/2)."> 5</a></td> <td class="src"><pre class="src"> <a title="Line 266: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (string != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 267</td> <td class="nbHitsCovered"><a title="Line 267: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 267: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (pattern != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 268</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"> 269</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"Using both string and pattern is not permitted"</span>);</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"> 2</td> <td class="src"><pre class="src"> toMatch = Pattern.compile(Pattern.quote(string));</pre></td></tr>
+<tr> <td class="numLineCover"> 272</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> replacementPattern = Matcher.quoteReplacement(replacement);</pre></td></tr>
+<tr> <td class="numLineCover"> 273</td> <td class="nbHitsCovered"><a title="Line 273: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 273: Conditional coverage 100% (2/2)."> } <span class="keyword">else</span> <span class="keyword">if</span> (pattern != <span class="keyword">null</span>) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 274</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> toMatch = Pattern.compile(pattern);</pre></td></tr>
+<tr> <td class="numLineCover"> 275</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> replacementPattern = replacement;</pre></td></tr>
+<tr> <td class="numLine"> 276</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> } <span class="keyword">else</span> {</pre></td></tr>
+<tr> <td class="numLineCover"> 277</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"> 278</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="string">"Neither string or pattern is defined"</span>);</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="numLineCover"> 281</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> Set<String> keys = <span class="keyword">new</span> HashSet<String>(parseList(config, <span class="string">"key"</span>));</pre></td></tr>
+<tr> <td class="numLineCover"> 282</td> <td class="nbHitsCovered"><a title="Line 282: Conditional coverage 100% (2/2)."> 3</a></td> <td class="src"><pre class="src"> <a title="Line 282: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (keys.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 283</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> log.warning(<span class="string">"No entries listed to replace"</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"> 3</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="keyword">new</span> ReplaceTransform(keys, toMatch, replacementPattern, overwrite);</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="numLine"> 288</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> ReplaceTransform <span class="keyword">implements</span> DocumentTransform {</pre></td></tr>
+<tr> <td class="numLine"> 289</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> List<String> keys;</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">final</span> Pattern toMatch;</pre></td></tr>
+<tr> <td class="numLine"> 291</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> String replacement;</pre></td></tr>
+<tr> <td class="numLine"> 292</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">boolean</span> overwrite;</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> ReplaceTransform(Collection<String> keys, Pattern toMatch,</pre></td></tr>
+<tr> <td class="numLineCover"> 295</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> String replacement, <span class="keyword">boolean</span> overwrite) {</pre></td></tr>
+<tr> <td class="numLineCover"> 296</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.keys = Collections.unmodifiableList(<span class="keyword">new</span> ArrayList<String>(keys));</pre></td></tr>
+<tr> <td class="numLineCover"> 297</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.toMatch = toMatch;</pre></td></tr>
+<tr> <td class="numLineCover"> 298</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.replacement = replacement;</pre></td></tr>
+<tr> <td class="numLineCover"> 299</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> <span class="keyword">this</span>.overwrite = overwrite;</pre></td></tr>
+<tr> <td class="numLineCover"> 300</td> <td class="nbHitsCovered"> 3</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"> </pre></td></tr>
+<tr> <td class="numLine"> 302</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 303</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">public</span> <span class="keyword">void</span> transform(Metadata metadata, Map<String, String> params) {</pre></td></tr>
+<tr> <td class="numLineCover"> 304</td> <td class="nbHitsCovered"><a title="Line 304: Conditional coverage 100% (2/2)."> 2</a></td> <td class="src"><pre class="src"> <a title="Line 304: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String key : keys) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 305</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> Set<String> original = metadata.getAllValues(key);</pre></td></tr>
+<tr> <td class="numLineCover"> 306</td> <td class="nbHitsCovered"><a title="Line 306: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 306: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (original.isEmpty()) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 307</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"No values for {0}. Skipping"</span>, key);</pre></td></tr>
+<tr> <td class="numLineCover"> 308</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> <span class="keyword">continue</span>;</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"> 4</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"Replacing values that match {0} with {1}: {2}"</span>,</pre></td></tr>
+<tr> <td class="numLine"> 311</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> <span class="keyword">new</span> Object[] {toMatch, replacement, original});</pre></td></tr>
+<tr> <td class="numLineCover"> 312</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> Set<String> values = <span class="keyword">new</span> HashSet<String>(original);</pre></td></tr>
+<tr> <td class="numLineCover"> 313</td> <td class="nbHitsCovered"><a title="Line 313: Conditional coverage 100% (2/2)."> 4</a></td> <td class="src"><pre class="src"> <a title="Line 313: Conditional coverage 100% (2/2)."> <span class="keyword">for</span> (String value : original) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 314</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> String newValue = toMatch.matcher(value).replaceAll(replacement);</pre></td></tr>
+<tr> <td class="numLineCover"> 315</td> <td class="nbHitsCovered"><a title="Line 315: Conditional coverage 100% (2/2)."> 6</a></td> <td class="src"><pre class="src"> <a title="Line 315: Conditional coverage 100% (2/2)."> <span class="keyword">if</span> (overwrite) {</a></pre></td></tr>
+<tr> <td class="numLineCover"> 316</td> <td class="nbHitsCovered"> 3</td> <td class="src"><pre class="src"> values.remove(value);</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="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> values.add(newValue);</pre></td></tr>
+<tr> <td class="numLineCover"> 319</td> <td class="nbHitsCovered"> 6</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 320</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> log.log(Level.FINE, <span class="string">"After replacing: {0}"</span>, values);</pre></td></tr>
+<tr> <td class="numLineCover"> 321</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> metadata.set(key, values);</pre></td></tr>
+<tr> <td class="numLineCover"> 322</td> <td class="nbHitsCovered"> 4</td> <td class="src"><pre class="src"> }</pre></td></tr>
+<tr> <td class="numLineCover"> 323</td> <td class="nbHitsCovered"> 2</td> <td class="src"><pre class="src"> }</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"> @Override</pre></td></tr>
+<tr> <td class="numLine"> 326</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"> 327</td> <td class="nbHitsCovered"> 1</td> <td class="src"><pre class="src"> <span class="keyword">return</span> <span class="string">"ReplaceTransform(keys="</span> + keys + <span class="string">",toMatch="</span> + toMatch</pre></td></tr>
+<tr> <td class="numLine"> 328</td> <td class="nbHits"> </td>
+ <td class="src"><pre class="src"> + <span class="string">",replacement="</span> + replacement + <span class="string">",overwrite="</span> + overwrite + <span class="string">")"</span>;</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"> }</pre></td></tr>
+<tr> <td class="numLine"> 331</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/frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html b/coverage/frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html
index 936d058..35161f3 100644
--- a/coverage/frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html
+++ b/coverage/frame-sourcefiles-com.google.enterprise.adaptor.prebuilt.html
@@ -27,6 +27,9 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.prebuilt.FileSystemAdaptor.html">FileSystemAdaptor</a> <i>(0%)</i></td>
</tr>
<tr>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms</a> <i>(98%)</i></td>
+</tr>
+<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.prebuilt.RecursiveFileIterator.html">RecursiveFileIterator</a> <i>(82%)</i></td>
</tr>
<tr>
diff --git a/coverage/frame-sourcefiles.html b/coverage/frame-sourcefiles.html
index 04fdd45..9ecb454 100644
--- a/coverage/frame-sourcefiles.html
+++ b/coverage/frame-sourcefiles.html
@@ -213,6 +213,9 @@
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.PollingIncrementalLister.html">PollingIncrementalLister</a> <i>(N/A)</i></td>
</tr>
<tr>
+<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms</a> <i>(98%)</i></td>
+</tr>
+<tr>
<td nowrap="nowrap"><a target="summary" href="com.google.enterprise.adaptor.Principal.html">Principal</a> <i>(100%)</i></td>
</tr>
<tr>
diff --git a/coverage/frame-summary-com.google.enterprise.adaptor.html b/coverage/frame-summary-com.google.enterprise.adaptor.html
index fa9d111..0d431a7 100644
--- a/coverage/frame-summary-com.google.enterprise.adaptor.html
+++ b/coverage/frame-summary-com.google.enterprise.adaptor.html
@@ -19,7 +19,7 @@
<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">202</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">722</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:84px"><span class="text">4015/4737</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">272</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:82px"><span class="text">1298/1570</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4213305174234425;</span>2.421</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">7</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">273</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/273</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">58</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/58</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.324324324324324;</span>2.324</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">19</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">143</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">252/395</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">55</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">59/114</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.513888888888889;</span>2.514</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">24</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:72px"><span class="text">387/532</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">56</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:67px"><span class="text">118/174</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.625;</span>2.625</td></tr>
</tbody>
</table>
<script type="text/javascript">
diff --git a/coverage/frame-summary-com.google.enterprise.adaptor.prebuilt.html b/coverage/frame-summary-com.google.enterprise.adaptor.prebuilt.html
index 4ffbdb5..fb2be67 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">19</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">143</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">252/395</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">55</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">59/114</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.513888888888889;</span>2.514</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">24</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:72px"><span class="text">387/532</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">56</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:67px"><span class="text">118/174</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.625;</span>2.625</td></tr>
</tbody>
</table>
<script type="text/javascript">
@@ -39,6 +39,12 @@
<tr><td><a href="com.google.enterprise.adaptor.prebuilt.FileSystemAdaptor.html">FileSystemAdaptor</a></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">55</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/55</span></div></div></td></tr></table></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:0px"><span class="text">0/22</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.5714285714285716;</span>3.571</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms</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:98px"><span class="text">78/79</span></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">38/38</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.125;</span>3.125</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms$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.125;</span>3.125</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms$CopyTransform</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:96px"><span class="text">26/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">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:91px"><span class="text">11/12</span></div></div></td></tr></table></td><td class="value"><span class="hidden">3.125;</span>3.125</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms$DeleteTransform</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">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">3.125;</span>3.125</td></tr>
+ <tr><td><a href="com.google.enterprise.adaptor.prebuilt.PrebuiltTransforms.html">PrebuiltTransforms$ReplaceTransform</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">24/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">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">3.125;</span>3.125</td></tr>
+
<tr><td><a href="com.google.enterprise.adaptor.prebuilt.RecursiveFileIterator.html">RecursiveFileIterator</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:86px"><span class="text">20/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">1</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:90px"><span class="text">9/10</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.125;</span>2.125</td></tr>
<tr><td><a href="com.google.enterprise.adaptor.prebuilt.RecursiveFileIterator.html">RecursiveFileIterator$WrappedIOException</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:60px"><span class="text">3/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.125;</span>2.125</td></tr>
diff --git a/coverage/frame-summary.html b/coverage/frame-summary.html
index e544e73..0261744 100644
--- a/coverage/frame-summary.html
+++ b/coverage/frame-summary.html
@@ -16,11 +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">236</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1357</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">4267/5624</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">462</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:74px"><span class="text">1357/1819</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.456059204440333;</span>2.456</td></tr>
+ <tr><td><b>All Packages</b></td><td class="value">241</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">1359</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:76px"><span class="text">4402/5761</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">463</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:75px"><span class="text">1416/1879</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4658158614402916;</span>2.466</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">202</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">722</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:84px"><span class="text">4015/4737</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">272</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:82px"><span class="text">1298/1570</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.4213305174234425;</span>2.421</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">7</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">273</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/273</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">58</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:0px"><span class="text">0/58</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.324324324324324;</span>2.324</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">19</td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">143</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:63px"><span class="text">252/395</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">55</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:51px"><span class="text">59/114</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.513888888888889;</span>2.514</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">24</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:72px"><span class="text">387/532</span></div></div></td></tr></table></td><td><table cellpadding="0px" cellspacing="0px" class="percentgraph"><tr class="percentgraph"><td align="right" class="percentgraph" width="40">56</td><td class="percentgraph"><div class="percentgraph"><div class="greenbar" style="width:67px"><span class="text">118/174</span></div></div></td></tr></table></td><td class="value"><span class="hidden">2.625;</span>2.625</td></tr>
</tbody>
</table>
<script type="text/javascript">
diff --git a/javadoc/allclasses-frame.html b/javadoc/allclasses-frame.html
index 444bcdb..2352105 100644
--- a/javadoc/allclasses-frame.html
+++ b/javadoc/allclasses-frame.html
@@ -101,6 +101,8 @@
<BR>
<A HREF="com/google/enterprise/adaptor/PollingIncrementalLister.html" title="interface in com.google.enterprise.adaptor" target="classFrame"><I>PollingIncrementalLister</I></A>
<BR>
+<A HREF="com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt" target="classFrame">PrebuiltTransforms</A>
+<BR>
<A HREF="com/google/enterprise/adaptor/Principal.html" title="class in com.google.enterprise.adaptor" target="classFrame">Principal</A>
<BR>
<A HREF="com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt" target="classFrame">RecursiveFileIterator</A>
diff --git a/javadoc/allclasses-noframe.html b/javadoc/allclasses-noframe.html
index 876bef8..6278425 100644
--- a/javadoc/allclasses-noframe.html
+++ b/javadoc/allclasses-noframe.html
@@ -101,6 +101,8 @@
<BR>
<A HREF="com/google/enterprise/adaptor/PollingIncrementalLister.html" title="interface in com.google.enterprise.adaptor"><I>PollingIncrementalLister</I></A>
<BR>
+<A HREF="com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt">PrebuiltTransforms</A>
+<BR>
<A HREF="com/google/enterprise/adaptor/Principal.html" title="class in com.google.enterprise.adaptor">Principal</A>
<BR>
<A HREF="com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt">RecursiveFileIterator</A>
diff --git a/javadoc/com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html b/javadoc/com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html
index 4a5cb80..eb3b25e 100644
--- a/javadoc/com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html
@@ -53,7 +53,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/CommandLineTransform.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PREV CLASS</B></A>
- <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>NEXT CLASS</B></A></FONT></TD>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html" target="_top"><B>FRAMES</B></A>
<A HREF="FileSystemAdaptor.html" target="_top"><B>NO FRAMES</B></A>
@@ -378,7 +378,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/CommandLineTransform.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PREV CLASS</B></A>
- <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>NEXT CLASS</B></A></FONT></TD>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html" target="_top"><B>FRAMES</B></A>
<A HREF="FileSystemAdaptor.html" target="_top"><B>NO FRAMES</B></A>
diff --git a/javadoc/com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html b/javadoc/com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html
new file mode 100644
index 0000000..06d0a1a
--- /dev/null
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html
@@ -0,0 +1,324 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+PrebuiltTransforms
+</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="PrebuiltTransforms";
+ }
+}
+</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/prebuilt/FileSystemAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="PrebuiltTransforms.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 | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <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.prebuilt</FONT>
+<BR>
+Class PrebuiltTransforms</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.prebuilt.PrebuiltTransforms</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public class <B>PrebuiltTransforms</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></DL>
+</PRE>
+
+<P>
+Common transforms that you would expect to have available.
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ========== 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 <A HREF="../../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html#copyMetadata(java.util.Map)">copyMetadata</A></B>(<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>> config)</CODE>
+
+<BR>
+ Returns a transform that copies metadata values from one key to another.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html#deleteMetadata(java.util.Map)">deleteMetadata</A></B>(<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>> config)</CODE>
+
+<BR>
+ Returns a transform that deletes metadata keys.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html#moveMetadata(java.util.Map)">moveMetadata</A></B>(<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>> config)</CODE>
+
+<BR>
+ Returns a transform that moves metadata values from one key to another.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html#replaceMetadata(java.util.Map)">replaceMetadata</A></B>(<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>> config)</CODE>
+
+<BR>
+ Returns a transform that preforms string replacements within metadata
+ values.</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>
+
+<!-- ============ 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="copyMetadata(java.util.Map)"><!-- --></A><H3>
+copyMetadata</H3>
+<PRE>
+public static <A HREF="../../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A> <B>copyMetadata</B>(<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>> config)</PRE>
+<DL>
+<DD>Returns a transform that copies metadata values from one key to another.
+ The <code>"overwrite"</code> key can be set to <code>"true"</code> to cause the
+ destination to be replaced; otherwise the destination key is supplemented.
+
+ <p>Copies are defined by pairs of <code>"X.from"</code> and <code>"X.to"</code>
+ configuration entries (where <code>X</code> is an integer). The value for each
+ is a metadata key. Copies are applied in the increasing order of the
+ integers.
+
+ <p>Example configuration:
+ <pre><code>overwrite=false
+3.from=colour
+3.to=color
+5.from=author
+5.to=contributors</code></pre>
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="moveMetadata(java.util.Map)"><!-- --></A><H3>
+moveMetadata</H3>
+<PRE>
+public static <A HREF="../../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A> <B>moveMetadata</B>(<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>> config)</PRE>
+<DL>
+<DD>Returns a transform that moves metadata values from one key to another.
+ This method returns a transform that behaves identically to <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html#copyMetadata(java.util.Map)"><CODE>copyMetadata(java.util.Map<java.lang.String, java.lang.String>)</CODE></A>, except that the source keys are removed. If the source key
+ has no metadata values then the destination is left as-is.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="deleteMetadata(java.util.Map)"><!-- --></A><H3>
+deleteMetadata</H3>
+<PRE>
+public static <A HREF="../../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A> <B>deleteMetadata</B>(<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>> config)</PRE>
+<DL>
+<DD>Returns a transform that deletes metadata keys. The keys to be deleted are
+ defined by <code>"keyX"</code> configuration entries (where <code>X</code> is an
+ integer).
+
+ <p>Example configuration:
+ <pre><code>key2=sensitive
+key4=unhelpful</code></pre>
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="replaceMetadata(java.util.Map)"><!-- --></A><H3>
+replaceMetadata</H3>
+<PRE>
+public static <A HREF="../../../../../com/google/enterprise/adaptor/DocumentTransform.html" title="interface in com.google.enterprise.adaptor">DocumentTransform</A> <B>replaceMetadata</B>(<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>> config)</PRE>
+<DL>
+<DD>Returns a transform that preforms string replacements within metadata
+ values. The keys to have replacements done on their values are defined by
+ <code>"keyX"</code> configuration entries (where <code>X</code> is an
+ integer). The <code>"overwrite"</code> configuration key can be set to <code>"false"</code> to cause the original string to be left intact; otherwise the
+ original string is replaced.
+
+ <p>The needle to be found is configured via a <code>"string"</code> or <code>"pattern"</code> configuration key. <code>string</code>'s value is treated as a
+ literal string to be found whereas <code>pattern</code>'s value is treated as
+ a regular expression. The replacement is defined by <code>"replacement"</code>
+ and is interpreted as a literal string if <code>"string"</code> was provided
+ and a regular expression replacement if <code>"pattern"</code> was provided.
+
+ <p>Example configuration:
+ <pre><code>overwrite=false
+key1=favorite
+key5=least favorite
+pattern=(Java|C|Perl)
+replacement=$1 (but it should be x86 assembler)</code</pre>
+<P>
+<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">
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" target="_top"><B>FRAMES</B></A>
+ <A HREF="PrebuiltTransforms.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 | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <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/prebuilt/RecursiveFileIterator.html b/javadoc/com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html
index 56ae128..f00d535 100644
--- a/javadoc/com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html
@@ -52,7 +52,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PREV CLASS</B></A>
<A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.WrappedIOException.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" target="_top"><B>FRAMES</B></A>
@@ -328,7 +328,7 @@
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PREV CLASS</B></A>
+ <A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PREV CLASS</B></A>
<A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.WrappedIOException.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../../index.html?com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" target="_top"><B>FRAMES</B></A>
diff --git a/javadoc/com/google/enterprise/adaptor/prebuilt/package-frame.html b/javadoc/com/google/enterprise/adaptor/prebuilt/package-frame.html
index 8d015e9..727dafa 100644
--- a/javadoc/com/google/enterprise/adaptor/prebuilt/package-frame.html
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/package-frame.html
@@ -44,6 +44,8 @@
<BR>
<A HREF="FileSystemAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt" target="classFrame">FileSystemAdaptor</A>
<BR>
+<A HREF="PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt" target="classFrame">PrebuiltTransforms</A>
+<BR>
<A HREF="RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt" target="classFrame">RecursiveFileIterator</A>
<BR>
<A HREF="StreamingCommand.html" title="class in com.google.enterprise.adaptor.prebuilt" target="classFrame">StreamingCommand</A></FONT></TD>
diff --git a/javadoc/com/google/enterprise/adaptor/prebuilt/package-summary.html b/javadoc/com/google/enterprise/adaptor/prebuilt/package-summary.html
index 1b98de5..2aab68b 100644
--- a/javadoc/com/google/enterprise/adaptor/prebuilt/package-summary.html
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/package-summary.html
@@ -125,6 +125,10 @@
<TD>Adaptor serving files from current directory</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt">PrebuiltTransforms</A></B></TD>
+<TD>Common transforms that you would expect to have available.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/RecursiveFileIterator.html" title="class in com.google.enterprise.adaptor.prebuilt">RecursiveFileIterator</A></B></TD>
<TD>Iterate over all files within a folder, including files in subdirectories.</TD>
</TR>
diff --git a/javadoc/com/google/enterprise/adaptor/prebuilt/package-tree.html b/javadoc/com/google/enterprise/adaptor/prebuilt/package-tree.html
index b2d4d89..e7dcea4 100644
--- a/javadoc/com/google/enterprise/adaptor/prebuilt/package-tree.html
+++ b/javadoc/com/google/enterprise/adaptor/prebuilt/package-tree.html
@@ -94,7 +94,7 @@
<LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/CommandLineAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>CommandLineAdaptor</B></A> (implements com.google.enterprise.adaptor.<A HREF="../../../../../com/google/enterprise/adaptor/AuthzAuthority.html" title="interface in com.google.enterprise.adaptor">AuthzAuthority</A>)
<LI TYPE="circle">com.google.enterprise.adaptor.prebuilt.<A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/FileSystemAdaptor.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>FileSystemAdaptor</B></A></UL>
<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.prebuilt.<A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/Command.Result.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>Command.Result</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> (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.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.prebuilt.<A HREF="../../../../../com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PrebuiltTransforms</B></A><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.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">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>)
<UL>
<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/6/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang"><B>Exception</B></A><UL>
diff --git a/javadoc/index-all.html b/javadoc/index-all.html
index 6bf8f2e..59d1914 100644
--- a/javadoc/index-all.html
+++ b/javadoc/index-all.html
@@ -165,6 +165,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/Config.html" title="class in com.google.enterprise.adaptor"><B>Config</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Configuration values for this program, like the GSA's hostname.<DT><A HREF="./com/google/enterprise/adaptor/Config.html#Config()"><B>Config()</B></A> -
Constructor for 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/prebuilt/PrebuiltTransforms.html#copyMetadata(java.util.Map)"><B>copyMetadata(Map<String, String>)</B></A> -
+Static method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt">PrebuiltTransforms</A>
+<DD>Returns a transform that copies metadata values from one key to another.
<DT><A HREF="./com/google/enterprise/adaptor/IOHelper.html#copyStream(java.io.InputStream, java.io.OutputStream)"><B>copyStream(InputStream, OutputStream)</B></A> -
Static method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/IOHelper.html" title="class in com.google.enterprise.adaptor">IOHelper</A>
<DD>Copy contents of <code>in</code> to <code>out</code>.
@@ -199,6 +202,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/ExceptionHandlers.html#defaultHandler()"><B>defaultHandler()</B></A> -
Static method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/ExceptionHandlers.html" title="class in com.google.enterprise.adaptor">ExceptionHandlers</A>
<DD>The default exception handler.
+<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html#deleteMetadata(java.util.Map)"><B>deleteMetadata(Map<String, String>)</B></A> -
+Static method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt">PrebuiltTransforms</A>
+<DD>Returns a transform that deletes metadata keys.
<DT><A HREF="./com/google/enterprise/adaptor/AbstractAdaptor.html#destroy()"><B>destroy()</B></A> -
Method in class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/AbstractAdaptor.html" title="class in com.google.enterprise.adaptor">AbstractAdaptor</A>
<DD>Shutdown and release resources of adaptor.
@@ -743,6 +749,9 @@
<DT><A HREF="./com/google/enterprise/adaptor/Metadata.html#Metadata(java.lang.Iterable)"><B>Metadata(Iterable<Map.Entry<String, String>>)</B></A> -
Constructor for class com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Metadata.html" title="class in com.google.enterprise.adaptor">Metadata</A>
<DD>Duplicate.
+<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html#moveMetadata(java.util.Map)"><B>moveMetadata(Map<String, String>)</B></A> -
+Static method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt">PrebuiltTransforms</A>
+<DD>Returns a transform that moves metadata values from one key to another.
</DL>
<HR>
<A NAME="_N_"><!-- --></A><H2>
@@ -774,7 +783,7 @@
<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/PollingIncrementalLister.html" title="interface in com.google.enterprise.adaptor"><B>PollingIncrementalLister</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> -
+<DT><A HREF="./com/google/enterprise/adaptor/PollingIncrementalLister.html" title="interface in com.google.enterprise.adaptor"><B>PollingIncrementalLister</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/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PrebuiltTransforms</B></A> - Class in <A HREF="./com/google/enterprise/adaptor/prebuilt/package-summary.html">com.google.enterprise.adaptor.prebuilt</A><DD>Common transforms that you would expect to have available.<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
provided to the GSA or the error handler gives up.
@@ -846,6 +855,10 @@
<DT><A HREF="./com/google/enterprise/adaptor/Session.html#removeAttribute(java.lang.String)"><B>removeAttribute(String)</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Session.html" title="interface in com.google.enterprise.adaptor">Session</A>
<DD>Remove attribute value.
+<DT><A HREF="./com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html#replaceMetadata(java.util.Map)"><B>replaceMetadata(Map<String, String>)</B></A> -
+Static method in class com.google.enterprise.adaptor.prebuilt.<A HREF="./com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt">PrebuiltTransforms</A>
+<DD>Returns a transform that preforms string replacements within metadata
+ values.
<DT><A HREF="./com/google/enterprise/adaptor/Request.html" title="interface in com.google.enterprise.adaptor"><B>Request</B></A> - Interface in <A HREF="./com/google/enterprise/adaptor/package-summary.html">com.google.enterprise.adaptor</A><DD>Interface provided to <A HREF="./com/google/enterprise/adaptor/Adaptor.html#getDocContent(com.google.enterprise.adaptor.Request, com.google.enterprise.adaptor.Response)"><CODE>Adaptor.getDocContent(Request, Response)</CODE></A> for describing the action that
should be taken.<DT><A HREF="./com/google/enterprise/adaptor/Response.html#respondNotFound()"><B>respondNotFound()</B></A> -
Method in interface com.google.enterprise.adaptor.<A HREF="./com/google/enterprise/adaptor/Response.html" title="interface in com.google.enterprise.adaptor">Response</A>
diff --git a/javadoc/overview-tree.html b/javadoc/overview-tree.html
index e8accc9..64948f9 100644
--- a/javadoc/overview-tree.html
+++ b/javadoc/overview-tree.html
@@ -99,7 +99,7 @@
<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">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/ExceptionHandlers.html" title="class in com.google.enterprise.adaptor"><B>ExceptionHandlers</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>
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/CustomFormatter.html" title="class in com.google.enterprise.adaptor"><B>CustomFormatter</B></A></UL>
<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/GsaCommunicationHandler.html" title="class in com.google.enterprise.adaptor"><B>GsaCommunicationHandler</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/HttpExchanges.html" title="class in com.google.enterprise.adaptor"><B>HttpExchanges</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/IOHelper.html" title="class in com.google.enterprise.adaptor"><B>IOHelper</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Metadata.html" title="class in com.google.enterprise.adaptor"><B>Metadata</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>)
-<LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Principal.html" title="class in com.google.enterprise.adaptor"><B>Principal</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.prebuilt.<A HREF="com/google/enterprise/adaptor/prebuilt/PrebuiltTransforms.html" title="class in com.google.enterprise.adaptor.prebuilt"><B>PrebuiltTransforms</B></A><LI TYPE="circle">com.google.enterprise.adaptor.<A HREF="com/google/enterprise/adaptor/Principal.html" title="class in com.google.enterprise.adaptor"><B>Principal</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>)
<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>)