01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. See the NOTICE file distributed with
04: * this work for additional information regarding copyright ownership.
05: * The ASF licenses this file to You under the Apache License, Version 2.0
06: * (the "License"); you may not use this file except in compliance with
07: * the License. You may obtain a copy of the License at
08: *
09: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: */
17:
18: package java.beans;
19:
20: import java.util.Iterator;
21: import java.util.Map;
22: import java.util.Set;
23:
24: class UtilMapPersistenceDelegate extends DefaultPersistenceDelegate {
25: @Override
26: @SuppressWarnings({"unchecked","nls"})
27: protected void initialize(Class<?> type, Object oldInstance,
28: Object newInstance, Encoder enc) {
29: // Call the initialization of the super type
30: super .initialize(type, oldInstance, newInstance, enc);
31:
32: Map map = (Map) oldInstance;
33: Set keySet = map.keySet();
34: for (Iterator i = keySet.iterator(); i.hasNext();) {
35: Object key = i.next();
36: Expression getterExp = new Expression(oldInstance, "get",
37: new Object[] { key });
38: try {
39: // Calculate the old value of the property
40: Object oldVal = getterExp.getValue();
41: // Write the getter expression to the encoder
42: enc.writeExpression(getterExp);
43: // Get the target value that exists in the new environment
44: Object targetVal = enc.get(oldVal);
45: // Get the current property value in the new environment
46: Object newVal = null;
47: try {
48: newVal = new Expression(newInstance, "get",
49: new Object[] { key }).getValue();
50: } catch (ArrayIndexOutOfBoundsException ex) {
51: // The newInstance has no elements, so current property
52: // value remains null
53: }
54: /*
55: * Make the target value and current property value equivalent
56: * in the new environment
57: */
58: if (null == targetVal) {
59: if (null != newVal) {
60: // Set to null
61: Statement setterStm = new Statement(
62: oldInstance, "put", new Object[] { key,
63: null });
64: enc.writeStatement(setterStm);
65: }
66: } else {
67: PersistenceDelegate pd = enc
68: .getPersistenceDelegate(targetVal
69: .getClass());
70: if (!pd.mutatesTo(targetVal, newVal)) {
71: Statement setterStm = new Statement(
72: oldInstance, "put", new Object[] { key,
73: oldVal });
74: enc.writeStatement(setterStm);
75: }
76: }
77: } catch (Exception ex) {
78: enc.getExceptionListener().exceptionThrown(ex);
79: }
80: }
81: }
82: }
|