140 */ |
140 */ |
141 private final Loader itemsLoader = new Loader(false) { |
141 private final Loader itemsLoader = new Loader(false) { |
142 |
142 |
143 private ThreadLocal<BeanT> target = new ThreadLocal<BeanT>(); |
143 private ThreadLocal<BeanT> target = new ThreadLocal<BeanT>(); |
144 private ThreadLocal<ValueT> map = new ThreadLocal<ValueT>(); |
144 private ThreadLocal<ValueT> map = new ThreadLocal<ValueT>(); |
|
145 private int depthCounter = 0; // needed to clean ThreadLocals |
145 |
146 |
146 @Override |
147 @Override |
147 public void startElement(UnmarshallingContext.State state, TagName ea) throws SAXException { |
148 public void startElement(UnmarshallingContext.State state, TagName ea) throws SAXException { |
148 // create or obtain the Map object |
149 // create or obtain the Map object |
149 try { |
150 try { |
150 target.set((BeanT)state.prev.target); |
151 target.set((BeanT)state.prev.target); |
151 map.set(acc.get(target.get())); |
152 map.set(acc.get(target.get())); |
|
153 depthCounter++; |
152 if(map.get() == null) { |
154 if(map.get() == null) { |
153 map.set(ClassFactory.create(mapImplClass)); |
155 map.set(ClassFactory.create(mapImplClass)); |
154 } |
156 } |
155 map.get().clear(); |
157 map.get().clear(); |
156 state.target = map.get(); |
158 state.target = map.get(); |
164 @Override |
166 @Override |
165 public void leaveElement(State state, TagName ea) throws SAXException { |
167 public void leaveElement(State state, TagName ea) throws SAXException { |
166 super.leaveElement(state, ea); |
168 super.leaveElement(state, ea); |
167 try { |
169 try { |
168 acc.set(target.get(), map.get()); |
170 acc.set(target.get(), map.get()); |
169 target.remove(); |
171 if (--depthCounter == 0) { |
|
172 target.remove(); |
|
173 map.remove(); |
|
174 } |
170 } catch (AccessorException ex) { |
175 } catch (AccessorException ex) { |
171 handleGenericException(ex,true); |
176 handleGenericException(ex,true); |
172 } |
177 } |
173 } |
178 } |
174 |
179 |