use of org.datanucleus.store.types.SCO in project datanucleus-core by datanucleus.
the class DetachFieldManager method processContainer.
private Object processContainer(int fieldNumber, Object container, AbstractMemberMetaData mmd) {
Object detachedContainer;
TypeManager typeManager = op.getExecutionContext().getTypeManager();
ContainerHandler containerHandler = typeManager.getContainerHandler(mmd.getType());
if (mmd.hasMap()) {
detachedContainer = processMapContainer(fieldNumber, container, mmd, containerHandler);
} else {
detachedContainer = processElementContainer(fieldNumber, container, mmd, containerHandler);
}
if (!mmd.hasArray()) {
// Need to unset owner for mutable SCOs
Object wrappedContainer;
if (SCOUtils.detachAsWrapped(op)) {
// Try to wrap the field, if possible, replacing it since it will be returned as wrapped
wrappedContainer = SCOUtils.wrapSCOField(op, fieldNumber, detachedContainer, true);
// Return the wrapped, if mutable, otherwise just the immutable value
detachedContainer = wrappedContainer;
} else {
// Try to wrap the field, if possible, just to be able to unset the owner, so don't
// replace it
wrappedContainer = SCOUtils.wrapSCOField(op, fieldNumber, detachedContainer, false);
// The container can be already an SCO so unwrap it if necessary
if (detachedContainer instanceof SCO) {
detachedContainer = SCOUtils.unwrapSCOField(op, fieldNumber, (SCO) detachedContainer);
}
}
// It still can be an immutable collection or map, so must check if has been wrapped
if (wrappedContainer instanceof SCO) {
((SCO) wrappedContainer).unsetOwner();
}
}
return detachedContainer;
}
use of org.datanucleus.store.types.SCO in project datanucleus-core by datanucleus.
the class PersistFieldManager method storeObjectField.
/**
* Method to store an object field.
* @param fieldNumber Number of the field (absolute)
* @param value Value of the field
*/
public void storeObjectField(int fieldNumber, Object value) {
if (value != null) {
if (replaceSCOsWithWrappers) {
// Replace any SCO field that isn't already a wrapper, with its wrapper object
boolean[] secondClassMutableFieldFlags = op.getClassMetaData().getSCOMutableMemberFlags();
if (secondClassMutableFieldFlags[fieldNumber] && !(value instanceof SCO)) {
// Replace the field with a SCO wrapper
value = SCOUtils.wrapSCOField(op, fieldNumber, value, true);
}
}
AbstractMemberMetaData mmd = op.getClassMetaData().getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
if (mmd.isCascadePersist()) {
ClassLoaderResolver clr = op.getExecutionContext().getClassLoaderResolver();
RelationType relationType = mmd.getRelationType(clr);
if (relationType != RelationType.NONE) {
if (mmd.hasContainer()) {
processContainer(fieldNumber, value, mmd);
} else {
// Process PC fields
if (mmd.isEmbedded() || mmd.isSerialized()) {
processPersistable(value, fieldNumber, ObjectProvider.EMBEDDED_PC);
} else {
processPersistable(value, -1, ObjectProvider.PC);
}
}
}
}
}
}
Aggregations