in openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java [615:743]
private boolean preFlush(FieldMetaData fmd, int type, int keyType,
int elemType, boolean external, boolean logical, OpCallbacks call) {
Object val = objval;
if (val == null)
return false;
boolean copy = false;
switch (type) {
case JavaTypes.PC:
if (fmd.isEmbeddedPC()) {
objval = embed(fmd, val);
copy = true;
} else {
if (external)
val = fmd.getExternalValue(val, _broker);
if (val != null)
preFlushPC(fmd, val, logical, call);
}
break;
case JavaTypes.PC_UNTYPED:
if (external)
val = fmd.getExternalValue(val, _broker);
if (val != null)
preFlushPC(fmd, val, logical, call);
break;
case JavaTypes.ARRAY:
if (fmd.getElement().isEmbeddedPC())
embed(fmd.getElement(), (Object[]) val);
else if (elemType == JavaTypes.PC
|| elemType == JavaTypes.PC_UNTYPED) {
if (external)
val = fmd.getExternalValue(val, _broker);
if (val != null)
preFlushPCs(fmd.getElement(), (Object[]) val, logical,
call);
}
break;
case JavaTypes.COLLECTION:
if (fmd.getElement().isEmbeddedPC()) {
objval = embed(fmd.getElement(), (Collection) val);
copy = true;
} else if (elemType == JavaTypes.PC
|| elemType == JavaTypes.PC_UNTYPED) {
boolean flushed = false;
if (external)
val = fmd.getExternalValue(val, _broker);
else if (val instanceof Proxy) {
// shortcut change trackers; also ensures we don't
// iterate lrs fields
ChangeTracker ct = ((Proxy) val).getChangeTracker();
if (ct != null && ct.isTracking()) {
preFlushPCs(fmd.getElement(), ct.getAdded(),
logical, call);
preFlushPCs(fmd.getElement(), ct.getChanged(),
logical, call);
flushed = true;
}
}
if (!flushed && val != null)
preFlushPCs(fmd.getElement(), (Collection) val, logical,
call);
}
break;
case JavaTypes.MAP:
boolean keyEmbed = fmd.getKey().isEmbeddedPC();
boolean valEmbed = fmd.getElement().isEmbeddedPC();
if (keyEmbed || valEmbed) {
objval = embed(fmd, (Map) val, keyEmbed, valEmbed);
copy = keyEmbed;
}
if (!keyEmbed && (keyType == JavaTypes.PC
|| keyType == JavaTypes.PC_UNTYPED)) {
boolean flushed = false;
if (external) {
val = fmd.getExternalValue(val, _broker);
external = false;
} else if (val instanceof Proxy) {
// shortcut change trackers; also ensures we don't
// iterate lrs fields
MapChangeTracker ct = (MapChangeTracker) ((Proxy) val).
getChangeTracker();
if (ct != null && ct.isTracking() && ct.getTrackKeys())
{
preFlushPCs(fmd.getKey(), ct.getAdded(), logical,
call);
preFlushPCs(fmd.getKey(), ct.getChanged(), logical,
call);
flushed = true;
}
}
if (!flushed && val != null)
preFlushPCs(fmd.getKey(), ((Map) val).keySet(), logical,
call);
}
if (!valEmbed && (elemType == JavaTypes.PC
|| elemType == JavaTypes.PC_UNTYPED)) {
boolean flushed = false;
if (external)
val = fmd.getExternalValue(val, _broker);
else if (val instanceof Proxy) {
// shortcut change trackers; also ensures we don't
// iterate lrs fields
MapChangeTracker ct = (MapChangeTracker) ((Proxy) val).
getChangeTracker();
if (ct != null && ct.isTracking()) {
if (ct.getTrackKeys()) {
preFlushPCs(fmd.getElement(), ct.getAdded(),
(Map) val, logical, call);
preFlushPCs(fmd.getElement(), ct.getChanged(),
(Map) val, logical, call);
} else {
preFlushPCs(fmd.getElement(), ct.getAdded(),
logical, call);
preFlushPCs(fmd.getElement(), ct.getChanged(),
logical, call);
}
flushed = true;
}
}
if (!flushed && val != null)
preFlushPCs(fmd.getElement(), ((Map) val).values(),
logical, call);
}
break;
}
return copy;
}