1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.jcr.node2bean.impl;
35
36 import info.magnolia.jcr.node2bean.TransformationState;
37 import info.magnolia.jcr.node2bean.TypeDescriptor;
38 import info.magnolia.transformer.TransformationProblem;
39
40 import java.util.ArrayDeque;
41 import java.util.Collection;
42 import java.util.Deque;
43
44 import javax.inject.Singleton;
45 import javax.jcr.Node;
46 import javax.jcr.RepositoryException;
47
48 import org.apache.commons.collections4.ArrayStack;
49
50
51
52
53 @Singleton
54 public class TransformationStateImpl implements TransformationState {
55
56 protected ArrayStack typeStack = new ArrayStack();
57
58 protected ArrayStack beanStack = new ArrayStack();
59
60 protected ArrayStack nodeStack = new ArrayStack();
61
62 private Deque<TransformationProblem> problems = new ArrayDeque<>();
63
64 @Override
65 public Object getCurrentBean() {
66 return beanStack.peek();
67 }
68
69 @Override
70 public void setCurrentBean(Object bean) {
71 beanStack.set(beanStack.size() - 1, bean);
72 }
73
74 @Override
75 public TypeDescriptor getCurrentType() {
76 return (TypeDescriptor) typeStack.peek();
77 }
78
79 @Override
80 public Node getCurrentNode() {
81 return (Node) nodeStack.peek();
82 }
83
84 @Override
85 public Object peekBean(int pos) {
86 return beanStack.peek(pos);
87 }
88
89 @Override
90 public TypeDescriptor peekType(int pos) {
91 return (TypeDescriptor) typeStack.peek(pos);
92 }
93
94 @Override
95 public Node peekNode(int pos) {
96 return (Node) nodeStack.peek(pos);
97 }
98
99 @Override
100 public void popBean() {
101 beanStack.pop();
102 }
103
104 @Override
105 public void popType() {
106 typeStack.pop();
107 }
108
109 @Override
110 public void popNode() {
111 nodeStack.pop();
112 }
113
114 @Override
115 public void pushBean(Object bean) {
116 beanStack.push(bean);
117 }
118
119 @Override
120 public void pushProblem(TransformationProblem problem) {
121 this.problems.push(problem);
122 }
123
124 @Override
125 public Collection<TransformationProblem> getProblems() {
126 return this.problems;
127 }
128
129 @Override
130 public void pushType(TypeDescriptor type) {
131 typeStack.push(type);
132 }
133
134 @Override
135 public void pushNode(Node node) {
136 nodeStack.push(node);
137 }
138
139 @Override
140 public int getLevel() {
141 return Math.max(Math.max(typeStack.size(), beanStack.size()), nodeStack.size());
142 }
143
144 @Override
145 public void trackProblem(TransformationProblem.Builder problemBuilder) {
146 problems.add(problemBuilder.withLocation(getCurrentTransformationPath()).build());
147 }
148
149
150
151
152
153
154 private String getCurrentTransformationPath() {
155
156
157 if (nodeStack.size() <= 1) {
158 return "/";
159 }
160
161 final Node root = (Node) nodeStack.get(0);
162
163 try {
164 return getCurrentNode().getPath().replace(root.getPath(), "");
165 } catch (RepositoryException e) {
166 return "<unknown_path>";
167 }
168 }
169 }