1 package net.trajano.twiff.renderer;
2
3 import java.util.Collections;
4 import java.util.LinkedHashMap;
5 import java.util.LinkedList;
6 import java.util.List;
7 import java.util.Map;
8
9 /***
10 * This is a simple element that has no components.
11 *
12 * @author Archimedes Trajano
13 */
14 public class SimpleElement implements CompositePageElement {
15 /***
16 * Attributes used in the element. It is recommended that a
17 * {@link LinkedHashMap} is used to ensure order.
18 */
19 private final Map<String, String> attributes;
20
21 /***
22 * Element name. Basically the tag.
23 */
24 private final String elementName;
25
26 /***
27 * List of sub-elements in this component. It it is recommended that a
28 * {@link LinkedList} is used as it would only be read in order.
29 */
30 private final List<PageElement> subElements = new LinkedList<PageElement>();
31
32 /***
33 *
34 */
35 private int columnNumber;
36
37 /***
38 *
39 */
40 private int lineNumber;
41
42 /***
43 * This is a simplified constructor used for testing.
44 *
45 * @param elementName
46 */
47 public SimpleElement(final String elementName) {
48 this.elementName = new String(elementName);
49 this.attributes = Collections.EMPTY_MAP;
50 }
51
52 /***
53 * Constructs the element.
54 *
55 * @param elementName
56 * element name.
57 * @param attributes
58 * attributes in the element.
59 */
60 public SimpleElement(final String elementName, final Map<String, String> attributes) {
61 this.elementName = elementName;
62 this.attributes = attributes;
63 }
64
65 /***
66 * Accepts a visitor that should visit the page data.
67 *
68 * @param visitor
69 * visitor.
70 */
71 public void accept(final PageElementVisitor visitor) {
72 if (subElements.isEmpty()) {
73 visitor.visitSimpleEmptyElement(this, elementName, attributes);
74 } else {
75 visitor.startSimpleElement(this, elementName, attributes, subElements);
76 for (PageElement element : subElements) {
77 element.accept(visitor);
78 }
79 visitor.endSimpleElement(this, elementName, attributes, subElements);
80 }
81 }
82
83 /***
84 * @param element
85 */
86 public void addElement(final PageElement element) {
87 subElements.add(element);
88 }
89
90 /***
91 * Returns the attributes.
92 *
93 * @return attributes.
94 */
95 public Map<String, String> getAttributes() {
96 return Collections.unmodifiableMap(attributes);
97 }
98
99 /***
100 * Returns the sub-elements in the element.
101 *
102 * @return sub-elements.
103 */
104 public List<PageElement> getElements() {
105 return Collections.unmodifiableList(subElements);
106 }
107
108 /***
109 * @see net.trajano.twiff.renderer.PageElement#getColumnNumber()
110 */
111 public int getColumnNumber() {
112 return columnNumber;
113 }
114
115 /***
116 * @see net.trajano.twiff.renderer.PageElement#getLineNumber()
117 */
118 public int getLineNumber() {
119 return lineNumber;
120 }
121 }