Search in sources :

Example 16 with SCO

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;
}
Also used : ContainerHandler(org.datanucleus.store.types.ContainerHandler) TypeManager(org.datanucleus.store.types.TypeManager) SCO(org.datanucleus.store.types.SCO)

Example 17 with SCO

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);
                    }
                }
            }
        }
    }
}
Also used : RelationType(org.datanucleus.metadata.RelationType) ClassLoaderResolver(org.datanucleus.ClassLoaderResolver) AbstractMemberMetaData(org.datanucleus.metadata.AbstractMemberMetaData) SCO(org.datanucleus.store.types.SCO)

Aggregations

SCO (org.datanucleus.store.types.SCO)17 ExecutionContext (org.datanucleus.ExecutionContext)9 BackedSCO (org.datanucleus.store.types.wrappers.backed.BackedSCO)8 Collection (java.util.Collection)7 AbstractMemberMetaData (org.datanucleus.metadata.AbstractMemberMetaData)7 ReachableObjectNotCascadedException (org.datanucleus.exceptions.ReachableObjectNotCascadedException)4 RelationType (org.datanucleus.metadata.RelationType)4 ObjectProvider (org.datanucleus.state.ObjectProvider)4 Map (java.util.Map)3 ApiAdapter (org.datanucleus.api.ApiAdapter)3 DNStateManager (org.datanucleus.state.DNStateManager)3 TypeManager (org.datanucleus.store.types.TypeManager)3 ContainerHandler (org.datanucleus.store.types.ContainerHandler)2 ArrayStore (org.datanucleus.store.types.scostore.ArrayStore)2 CollectionStore (org.datanucleus.store.types.scostore.CollectionStore)2 ClassLoaderResolver (org.datanucleus.ClassLoaderResolver)1 AbstractClassMetaData (org.datanucleus.metadata.AbstractClassMetaData)1 ContainerAdapter (org.datanucleus.store.types.ContainerAdapter)1 SCOContainer (org.datanucleus.store.types.SCOContainer)1