OpenJPAStateManager sm, FieldMetaData fmd) {
Map map = copyMap(manager, orig, fmd, sm);
if (map == null)
throw new UserException(_loc.get("not-copyable", fmd));
ValueMetaData keymd = fmd.getKey();
ValueMetaData valmd = fmd.getElement();
if (!keymd.isDeclaredTypePC() && !valmd.isDeclaredTypePC())
return map;
// if we have to replace keys, just clear and re-add; otherwise
// we can use the entry set to reset the values only
Map.Entry entry;
if (keymd.isDeclaredTypePC()) {
map.clear();
Object key, val;
for (Iterator itr = orig.entrySet().iterator(); itr.hasNext();) {
entry = (Map.Entry) itr.next();
key = entry.getKey();
if (keymd.getCascadeAttach() == ValueMetaData.CASCADE_NONE)
key = getReference(manager, key, sm, keymd);
else
key = manager.attach(key, null, sm, keymd, false);
val = entry.getValue();
if (valmd.isDeclaredTypePC()) {
if (valmd.getCascadeAttach() == ValueMetaData.CASCADE_NONE)
val = getReference(manager, val, sm, valmd);
else
val = manager.attach(val, null, sm, valmd, false);
}
map.put(key, val);
}
} else {
Object val;
for (Iterator itr = map.entrySet().iterator(); itr.hasNext();) {
entry = (Map.Entry) itr.next();
if (valmd.getCascadeAttach() == ValueMetaData.CASCADE_NONE)
val = getReference(manager, entry.getValue(), sm, valmd);
else
val = manager.attach(entry.getValue(), null, sm, valmd,
false);
entry.setValue(val);