Clover Coverage Report - XWiki Rendering - Parent POM 4.0-SNAPSHOT (Aggregated)
Coverage timestamp: Mon Mar 12 2012 18:03:13 CET
../../../../../img/srcFileCovDistChart8.png 68% of files have more coverage
52   194   28   4.73
28   130   0.54   3.67
11     2.55  
3    
 
  TreeBuilder       Line # 32 52 0% 28 19 79.1% 0.7912088
  TreeBuilder.IPos       Line # 39 0 - 0 0 - -1.0
  TreeBuilder.ITreeListener       Line # 53 0 - 0 0 - -1.0
 
  (967)
 
1    /*
2    * See the NOTICE file distributed with this work for additional
3    * information regarding copyright ownership.
4    *
5    * This is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU Lesser General Public License as
7    * published by the Free Software Foundation; either version 2.1 of
8    * the License, or (at your option) any later version.
9    *
10    * This software is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13    * Lesser General Public License for more details.
14    *
15    * You should have received a copy of the GNU Lesser General Public
16    * License along with this software; if not, write to the Free
17    * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18    * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19    */
20    package org.xwiki.rendering.wikimodel.util;
21   
22    import java.util.ArrayList;
23    import java.util.List;
24   
25    /**
26    * This is an internal utility class used as a context to keep in memory the
27    * current state of parsed trees (list items).
28    *
29    * @version $Id: 47c52a6d007db5a9c5af58ed559c99a3c042b918 $
30    * @since 4.0M1
31    */
 
32    public final class TreeBuilder<X extends TreeBuilder.IPos<X>>
33    {
34    /**
35    * This interface identifies position of elements in rows.
36    *
37    * @author MikhailKotelnikov
38    */
 
39    public interface IPos<X extends IPos<X>>
40    {
41    /**
42    * @return <code>true</code> if the underlying data in both positions
43    * are the same
44    */
45    boolean equalsData(X pos);
46   
47    /**
48    * @return the position of the node
49    */
50    int getPos();
51    }
52   
 
53    public interface ITreeListener<X extends IPos<X>>
54    {
55    void onBeginRow(X n);
56   
57    void onBeginTree(X n);
58   
59    void onEndRow(X n);
60   
61    void onEndTree(X n);
62    }
63   
 
64  11621 toggle private static <X extends IPos<X>> void addTail(
65    ITreeListener<X> listener,
66    List<X> firstArray,
67    List<X> secondArray,
68    int secondPos,
69    boolean openTree)
70    {
71  11621 X n = getNode(secondArray, secondPos);
72  11621 if (n == null) {
73  7287 return;
74    }
75  4334 if (openTree) {
76  3980 listener.onBeginTree(n);
77    }
78  4334 listener.onBeginRow(n);
79  4334 firstArray.add(n);
80  4334 addTail(listener, firstArray, secondArray, secondPos + 1, true);
81    }
82   
 
83  7287 toggle private static <X extends IPos<X>> void doAlign(
84    ITreeListener<X> listener,
85    List<X> firstArray,
86    List<X> secondArray,
87    boolean expand)
88    {
89  7287 boolean newTree = true;
90  7287 int f;
91  7287 int s;
92  7287 int firstLen = firstArray.size();
93  7287 int secondLen = secondArray.size();
94  8223 for (f = 0, s = 0; f < firstLen && s < secondLen; f++) {
95  1320 X first = firstArray.get(f);
96  1320 X second = secondArray.get(s);
97  1320 int firstPos = first.getPos();
98  1320 int secondPos = second.getPos();
99  1320 if (firstPos >= secondPos) {
100  1248 if (!first.equalsData(second)) {
101  30 break;
102  1218 } else if (s == secondLen - 1) {
103  354 newTree = false;
104  354 break;
105    }
106  864 s++;
107    }
108    }
109  7287 removeTail(listener, firstArray, f, newTree, expand);
110  7287 if (expand) {
111  7287 addTail(listener, firstArray, secondArray, s, newTree);
112    }
113    }
114   
 
115  23242 toggle private static <X extends IPos<X>> X getNode(List<X> list, int pos)
116    {
117  23242 return pos < 0 || pos >= list.size() ? null : list.get(pos);
118    }
119   
 
120  11621 toggle private static <X extends IPos<X>> void removeTail(
121    ITreeListener<X> listener,
122    List<X> array,
123    int pos,
124    boolean closeTree,
125    boolean remove)
126    {
127  11621 X node = getNode(array, pos);
128  11621 if (node == null) {
129  7287 return;
130    }
131  4334 removeTail(listener, array, pos + 1, true, true);
132  4334 listener.onEndRow(node);
133  4334 if (closeTree) {
134  3980 listener.onEndTree(node);
135    }
136  4334 if (remove) {
137  4334 array.remove(pos);
138    }
139    }
140   
141    /**
142    *
143    */
144    public List<X> fList = new ArrayList<X>();
145   
146    private ITreeListener<X> fListener;
147   
148    /**
149    *
150    */
 
151  3201 toggle public TreeBuilder(ITreeListener<X> listener)
152    {
153  3201 super();
154  3201 fListener = listener;
155    }
156   
 
157  7287 toggle public void align(List<X> row)
158    {
159  7287 doAlign(fListener, fList, row, true);
160    }
161   
 
162  0 toggle public void align(X pos)
163    {
164  0 List<X> list = new ArrayList<X>();
165  0 if (pos != null) {
166  0 list.add(pos);
167    }
168  0 align(list);
169    }
170   
 
171  393 toggle public X get(int pos)
172    {
173  393 return pos >= 0 && pos < fList.size() ? fList.get(pos) : null;
174    }
175   
 
176  393 toggle public X getPeek()
177    {
178  393 return get(fList.size() - 1);
179    }
180   
 
181  0 toggle public void trim(List<X> row)
182    {
183  0 doAlign(fListener, fList, row, false);
184    }
185   
 
186  0 toggle public void trim(X pos)
187    {
188  0 List<X> list = new ArrayList<X>();
189  0 if (pos != null) {
190  0 list.add(pos);
191    }
192  0 trim(list);
193    }
194    }