src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/SingleMapNodeProperty.java

changeset 368
0989ad8c0860
parent 286
f50545b5e2f1
child 408
b0610cd08440
equal deleted inserted replaced
366:8c0b6bccfe47 368:0989ad8c0860
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

mercurial