1. Project Clover database Tue Dec 20 2016 21:24:09 CET
  2. Package org.xwiki.rendering.wikimodel.util

File SectionBuilder.java

 

Coverage histogram

../../../../../img/srcFileCovDistChart10.png
0% of files have more coverage

Code metrics

12
43
19
2
197
133
25
0.58
2.26
9.5
1.32

Classes

Class Line # Actions
SectionBuilder 33 33 0% 19 0
1.0100%
SectionBuilder.TocEntry 35 10 0% 6 0
1.0100%
 

Contributing tests

This file is covered by 1477 tests. .

Source view

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.ArrayDeque;
23    import java.util.ArrayList;
24    import java.util.Collections;
25    import java.util.Deque;
26    import java.util.List;
27    import java.util.Stack;
28   
29    /**
30    * @version $Id: 6c196f441355c2ccb146fd3c2ffb4acafe609493 $
31    * @since 4.0M1
32    */
 
33    public class SectionBuilder<T>
34    {
 
35    protected class TocEntry implements TreeBuilder.IPos<TocEntry>,
36    ISectionListener.IPos<T>
37    {
38    T fData;
39   
40    protected boolean fDoc;
41   
42    protected boolean fHeader;
43   
44    int fDocLevel;
45   
46    int fLevel;
47   
 
48  29611 toggle public TocEntry(int docLevel, int level, T data, boolean doc,
49    boolean header)
50    {
51  29610 fDocLevel = docLevel;
52  29611 fLevel = level;
53  29610 fData = data;
54  29609 fDoc = doc;
55  29607 fHeader = header;
56    }
57   
 
58  1963 toggle public boolean equalsData(TocEntry pos)
59    {
60  1963 return true;
61    }
62   
 
63  166939 toggle public T getData()
64    {
65  166943 return fData;
66    }
67   
 
68  111817 toggle public int getDocumentLevel()
69    {
70  111820 return fDocLevel;
71    }
72   
 
73  114232 toggle public int getHeaderLevel()
74    {
75  114237 return fLevel;
76    }
77   
 
78  3926 toggle public int getPos()
79    {
80  3926 return fDocLevel * 10 + fLevel + 1;
81    }
82    }
83   
84    Deque<TreeBuilder<TocEntry>> fBuilder = new ArrayDeque<TreeBuilder<TocEntry>>();
85   
86    private Deque<TocEntry> fDocEntries = new ArrayDeque<TocEntry>();
87   
88    ISectionListener<T> fListener;
89   
 
90  24826 toggle public SectionBuilder(ISectionListener<T> listener)
91    {
92  24825 fListener = listener;
93    }
94   
 
95  26358 toggle private void pushBuilder()
96    {
97  26360 fBuilder.push(new TreeBuilder<TocEntry>(
98    new TreeBuilder.ITreeListener<TocEntry>()
99    {
 
100  27953 toggle public void onBeginRow(TocEntry n)
101    {
102  27954 if (!n.fDoc) {
103  1590 fListener.beginSection(n);
104  1590 if (n.fHeader) {
105  1220 fListener.beginSectionHeader(n);
106    } else {
107  370 fListener.beginSectionContent(n);
108    }
109    }
110    }
111   
 
112  27641 toggle public void onBeginTree(TocEntry n)
113    {
114  27644 if (n.fDoc) {
115  26362 fListener.beginDocument(n);
116    }
117    }
118   
 
119  27947 toggle public void onEndRow(TocEntry n)
120    {
121  27950 if (!n.fDoc) {
122  1590 fListener.endSectionContent(n);
123  1590 fListener.endSection(n);
124    }
125    }
126   
 
127  27642 toggle public void onEndTree(TocEntry n)
128    {
129  27643 if (n.fDoc) {
130  26361 fListener.endDocument(n);
131    }
132    }
133    }));
134    }
135   
 
136  26354 toggle private TreeBuilder<TocEntry> popBuilder()
137    {
138  26357 return fBuilder.pop();
139    }
140   
141    /**
142    * @param docLevel
143    * @param level
144    * @param data
145    * @param b
146    * @return
147    */
 
148  27581 toggle private TocEntry align(int docLevel, int level, T data, boolean doc)
149    {
150  27585 TocEntry entry = null;
151  27580 List<TocEntry> entries = new ArrayList<TocEntry>();
152  57189 for (int i = 0; i <= level; ++i) {
153  29605 entry = new TocEntry(docLevel, i, data, doc, i == level);
154  29609 entries.add(entry);
155    }
156  27584 fBuilder.peek().align(entries);
157   
158  27585 return entry;
159    }
160   
 
161  26364 toggle public void beginDocument(T data)
162    {
163  26365 pushBuilder();
164   
165  26365 TocEntry entry = align(getDocLevel() + 1, 0, data, true);
166   
167  26365 fDocEntries.push(entry);
168    }
169   
 
170  1220 toggle public void beginHeader(int level, T data)
171    {
172  1220 int docLevel = getDocLevel();
173  1220 align(docLevel, level, data, false);
174    }
175   
 
176  26360 toggle public void endDocument()
177    {
178  26362 fDocEntries.pop();
179   
180  26361 popBuilder().align(Collections.<TocEntry>emptyList());
181    }
182   
 
183  1220 toggle public void endHeader()
184    {
185  1220 TocEntry entry = fBuilder.peek().getPeek();
186  1220 fListener.endSectionHeader(entry);
187  1220 fListener.beginSectionContent(entry);
188    }
189   
190    /**
191    * @return
192    */
 
193  27580 toggle private int getDocLevel()
194    {
195  27581 return fDocEntries.size();
196    }
197    }