FieldManager type used to hold onto a single field value and then
dispense it via the fetch methods. The manager can also perform actions
on the held field.
| Method from org.apache.openjpa.kernel.SingleFieldManager Detail: |
public void delete(OpCallbacks call) {
delete(true, call);
}
Delete and/or dereference field values. |
void delete(ValueMetaData vmd,
Object obj,
OpCallbacks call) {
if (obj == null)
return;
// delete if unknowned or this isn't an embedded field or if owned by us
StateManagerImpl sm = _broker.getStateManagerImpl(obj, false);
if (sm != null && (sm.getOwner() == null || !vmd.isEmbeddedPC()
|| (sm.getOwner() == _sm
&& sm.getOwnerIndex() == vmd.getFieldMetaData().getIndex())))
_broker.delete(sm.getManagedInstance(), sm, call);
}
Delete an object embedded in the given value. |
public void dereferenceDependent() {
delete(false, null);
}
Dereference field values. |
void dereferenceDependent(Object obj) {
if (obj == null)
return;
StateManagerImpl sm = _broker.getStateManagerImpl(obj, false);
if (sm != null)
sm.setDereferencedDependent(true, true);
}
Dereference the given object. |
public void gatherCascadeRefresh(OpCallbacks call) {
if (objval == null)
return;
FieldMetaData fmd = _sm.getMetaData().getField(field);
switch (fmd.getDeclaredTypeCode()) {
case JavaTypes.PC:
case JavaTypes.PC_UNTYPED:
_broker.gatherCascadeRefresh(objval, call);
break;
case JavaTypes.ARRAY:
gatherCascadeRefresh((Object[]) objval, call);
break;
case JavaTypes.COLLECTION:
gatherCascadeRefresh((Collection) objval, call);
break;
case JavaTypes.MAP:
if (fmd.getKey().getCascadeRefresh()
== ValueMetaData.CASCADE_IMMEDIATE)
gatherCascadeRefresh(((Map) objval).keySet(), call);
if (fmd.getElement().getCascadeRefresh()
== ValueMetaData.CASCADE_IMMEDIATE)
gatherCascadeRefresh(((Map) objval).values(), call);
break;
}
}
Recursively invoke the broker to gather cascade-refresh objects in
the current field into the given set. This method is only called
for fields that we know have cascade-refresh settings. |
public boolean isDefaultValue() {
return dblval == 0 && longval == 0
&& (objval == null || "".equals(objval));
}
Return true if the last-provided field has a default value. |
public void persist(OpCallbacks call) {
if (objval == null)
return;
FieldMetaData fmd = _sm.getMetaData().getField(field);
switch (fmd.getDeclaredTypeCode()) {
case JavaTypes.PC:
case JavaTypes.PC_UNTYPED:
if (!_broker.isDetachedNew() && _broker.isDetached(objval))
return; // allow but ignore
_broker.persist(objval, true, call);
break;
case JavaTypes.ARRAY:
_broker.persistAll(Arrays.asList((Object[]) objval), true,
call);
break;
case JavaTypes.COLLECTION:
_broker.persistAll((Collection) objval, true, call);
break;
case JavaTypes.MAP:
if (fmd.getKey().getCascadePersist()
== ValueMetaData.CASCADE_IMMEDIATE)
_broker.persistAll(((Map) objval).keySet(), true, call);
if (fmd.getElement().getCascadePersist()
== ValueMetaData.CASCADE_IMMEDIATE)
_broker.persistAll(((Map) objval).values(), true, call);
break;
}
}
Persist the stored field safely, preventing infinite recursion using
the given set of already-persisted objects. This method is only called
for fields that we know have cascade-immediate settings. |
public boolean preFlush(boolean logical,
OpCallbacks call) {
// only care about object fields
FieldMetaData fmd = _sm.getMetaData().getField(field);
if (fmd.getDeclaredTypeCode() < JavaTypes.OBJECT)
return false;
// perform pers-by-reach and dependent refs
boolean ret = preFlush(fmd, logical, call);
// manage inverses
InverseManager manager = _broker.getInverseManager();
if (manager != null)
manager.correctRelations(_sm, fmd, objval);
return ret;
}
Perform pre-flush tasks on the current field. This includes checking
for nulls, persisting pcs, embedding embedded fields, and ref'ing
pc fields. Return true if the field needs to be replaced with the
new value. |
public boolean proxy(boolean reset,
boolean replaceNull) {
FieldMetaData fmd = _sm.getMetaData().getField(field);
Proxy proxy = null;
boolean ret = false;
switch (fmd.getDeclaredTypeCode()) {
case JavaTypes.DATE:
if (objval == null)
return false;
proxy = checkProxy();
if (proxy == null) {
proxy = (Proxy) _sm.newFieldProxy(field);
((Date) proxy).setTime(((Date) objval).getTime());
if (proxy instanceof Timestamp
&& objval instanceof Timestamp)
((Timestamp) proxy).setNanos(((Timestamp) objval).
getNanos());
ret = true;
}
break;
case JavaTypes.CALENDAR:
if (objval == null)
return false;
proxy = checkProxy();
if (proxy == null) {
proxy = (Proxy) _sm.newFieldProxy(field);
((Calendar) proxy).setTime(((Calendar) objval).getTime());
ret = true;
}
break;
case JavaTypes.COLLECTION:
if (objval == null && !replaceNull)
return false;
proxy = checkProxy();
if (proxy == null) {
proxy = (Proxy) _sm.newFieldProxy(field);
if (objval != null)
((Collection) proxy).addAll((Collection) objval);
ret = true;
}
break;
case JavaTypes.MAP:
if (objval == null && !replaceNull)
return false;
proxy = checkProxy();
if (proxy == null) {
proxy = (Proxy) _sm.newFieldProxy(field);
if (objval != null)
((Map) proxy).putAll((Map) objval);
ret = true;
}
break;
case JavaTypes.OBJECT:
if (objval == null)
return false;
proxy = checkProxy();
if (proxy == null) {
proxy = getProxyManager().newCustomProxy(objval);
ret = proxy != null;
}
break;
}
if (proxy != null) {
proxy.setOwner(_sm, field);
ChangeTracker tracker = proxy.getChangeTracker();
if (reset && tracker != null) {
if (fmd.getDeclaredTypeCode() == JavaTypes.MAP) {
// track values if key is derived from value, else keys
boolean keys = fmd.getKey().getValueMappedBy() == null;
((MapChangeTracker) tracker).setTrackKeys(keys);
}
tracker.startTracking();
}
objval = proxy;
}
return ret;
}
Proxy the held field if needed. Return true if the field needs to
be replaced with the now-proxied instance. |
public void releaseEmbedded() {
if (objval == null)
return;
FieldMetaData fmd = _sm.getMetaData().getField(field);
switch (fmd.getDeclaredTypeCode()) {
case JavaTypes.PC:
if (fmd.isEmbeddedPC())
releaseEmbedded(fmd, objval);
break;
case JavaTypes.ARRAY:
if (fmd.getElement().isEmbeddedPC())
releaseEmbedded(fmd.getElement(), (Object[]) objval);
break;
case JavaTypes.COLLECTION:
if (fmd.getElement().isEmbeddedPC())
releaseEmbedded(fmd.getElement(), (Collection) objval);
break;
case JavaTypes.MAP:
if (fmd.getKey().isEmbeddedPC())
releaseEmbedded(fmd.getKey(), ((Map) objval).keySet());
if (fmd.getElement().isEmbeddedPC())
releaseEmbedded(fmd.getElement(), ((Map) objval).values());
break;
}
}
Release the currently embedded field (make it transient). |
public void serialize(ObjectOutput out,
boolean def) throws IOException {
FieldMetaData fmd = _sm.getMetaData().getField(field);
switch (fmd.getDeclaredTypeCode()) {
case JavaTypes.BOOLEAN:
out.writeBoolean(!def && longval == 1);
break;
case JavaTypes.BYTE:
out.writeByte((def) ? (byte) 0 : (byte) longval);
break;
case JavaTypes.CHAR:
out.writeChar((def) ? (char) 0 : (char) longval);
break;
case JavaTypes.DOUBLE:
out.writeDouble((def) ? 0D : dblval);
break;
case JavaTypes.FLOAT:
out.writeFloat((def) ? 0F : (float) dblval);
break;
case JavaTypes.INT:
out.writeInt((def) ? 0 : (int) longval);
break;
case JavaTypes.LONG:
out.writeLong((def) ? 0L : longval);
break;
case JavaTypes.SHORT:
out.writeShort((def) ? (short) 0 : (short) longval);
break;
default:
out.writeObject((def) ? null : objval);
}
}
Write the stored field or its default value to the given stream. |
public void unproxy() {
if (objval == null)
return;
FieldMetaData fmd = _sm.getMetaData().getField(field);
switch (fmd.getDeclaredTypeCode()) {
case JavaTypes.COLLECTION:
case JavaTypes.MAP:
case JavaTypes.DATE:
case JavaTypes.OBJECT:
if (objval instanceof Proxy) {
Proxy proxy = (Proxy) objval;
proxy.setOwner(null, -1);
if (proxy.getChangeTracker() != null)
proxy.getChangeTracker().stopTracking();
}
}
}
Unproxies the current field if needed. |