Package org.jpox.metadata

Examples of org.jpox.metadata.AbstractMemberMetaData


        // Pass 1 to find the number of cacheable fields TODO Embody this in AbstractMemberMetaData
        ClassLoaderResolver clr = getObjectManager().getClassLoaderResolver();
        int numCacheableFields = 0;
        for (int i=0;i<allFieldNumbers.length;i++)
        {
            AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(i);
            if (fmd.getRelationType(clr) == Relation.NONE)
            {
                numCacheableFields++;
            }
        }
        int[] cacheableFieldNumbers = new int[numCacheableFields];

        // Pass 2 to set up the loaded fields info for all cacheable fields
        int cacheableNum = 0;
        for (int i=0;i<allFieldNumbers.length;i++)
        {
            boolean cacheable = true;
            AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(i);
            if (fmd.getRelationType(clr) != Relation.NONE)
            {
                cacheable = false;
            }
            if (cacheable)
            {
View Full Code Here


                myID = null;

                int fieldCount = getHighestFieldNumber();
                for (int fieldNumber = 0; fieldNumber < fieldCount; fieldNumber++)
                {
                    AbstractMemberMetaData fmd=cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
                    if (fmd.isPrimaryKey() && getStoreManager().isStrategyDatastoreAttributed(fmd.getValueStrategy(), false))
                    {
                        //replace the value of the id, but before convert the value to the field type if needed
                        replaceField(fieldNumber, TypeConversionHelper.convertTo(id, fmd.getType()), true);
                    }
                }
            }
            catch (Exception e)
            {
View Full Code Here

                    myLC.stateType() == LifeCycleState.P_NEW)
                {
                    int[] pkFieldNumbers = cmd.getPKMemberPositions();
                    for (int i = 0; i < pkFieldNumbers.length; i++)
                    {
                        AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(i);
                        if (getStoreManager().isStrategyDatastoreAttributed(fmd.getValueStrategy(), false))
                        {
                            flush();
                            break;
                        }
                    }
View Full Code Here

    public void unloadField(String fieldName)
    {
        if (pcObjectType == PC)
        {
            // Mark as not loaded
            AbstractMemberMetaData mmd = getClassMetaData().getMetaDataForMember(fieldName);
            loadedFields[mmd.getAbsoluteFieldNumber()] = false;
        }
        else
        {
            throw new JPOXUserException("Cannot unload field/property of embedded object");
        }
View Full Code Here

            if (cmd.hasRelations(myOM.getClassLoaderResolver()))
            {
                // Check for cascade refreshes to related objects
                for (int i=0;i<fieldNumbers.length;i++)
                {
                    AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumbers[i]);
                    int relationType = fmd.getRelationType(myOM.getClassLoaderResolver());
                    if (relationType != Relation.NONE && fmd.isCascadeRefresh())
                    {
                        // Need to refresh the related field object(s)
                        Object value = provideField(fieldNumbers[i]);
                        if (value != null)
                        {
View Full Code Here

        }
        else if (myLC != null)
        {
            boolean loadedOldValue = false;
            Object oldValue = currentValue;
            AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(field);
            ClassLoaderResolver clr = myOM.getClassLoaderResolver();
            int relationType = fmd.getRelationType(clr);
            if (!loadedFields[field] && currentValue == null)
            {
                // Updating value of a field that isnt currently loaded
                if (myOM.getOMFContext().getPersistenceConfiguration().getBooleanProperty("org.jpox.manageRelationships") &&
                    (relationType == Relation.ONE_TO_ONE_BI || relationType == Relation.MANY_TO_ONE_BI))
                {
                    // Managed relation field, so load old value
                    loadField(field);
                    loadedOldValue = true;
                    oldValue = provideField(field);
                }
                if (relationType != Relation.NONE && fmd.isDependent() && newValue == null)
                {
                    // Field being nulled and is dependent so load the existing value so it can be deleted
                    loadField(field);
                    loadedOldValue = true;
                    oldValue = provideField(field);
                }
                // TODO When field has relation consider loading it always for managed relations
            }

            // Check equality of old and new values
            boolean equal = false;
            if (oldValue == null && newValue == null)
            {
                equal = true;
            }
            else if (oldValue != null && newValue != null)
            {
                if (oldValue instanceof PersistenceCapable)
                {
                    // PC object field so compare object equality
                    // See JDO2 [5.4] "The JDO implementation must not use the application's hashCode and equals methods
                    // from the persistence-capable classes except as needed to implement the Collections Framework"
                    if (oldValue == newValue)
                    {
                        equal = true;
                    }
                }
                else
                {
                    // Non-PC object field so compare using equals()
                    if (oldValue.equals(newValue))
                    {
                        equal = true;
                    }
                }
            }

            // Update the field
            if (!loadedFields[field] || !equal || fmd.hasArray())
            {
                // Either field isn't loaded, or has changed, or is an array.
                // We include arrays here since we have no way of knowing if the array element has changed
                // except if the user sets the array field. See JDO2 [6.3] that the application should
                // replace the value with its current value.
                boolean wasDirty = preWriteField(field);

                if (oldValue instanceof SCO)
                {
                    if (oldValue instanceof SCOContainer)
                    {
                        // Make sure container values are loaded
                        ((SCOContainer)oldValue).load();
                    }
                    ((SCO) oldValue).unsetOwner();
                }
                if (newValue instanceof SCO)
                {
                    SCO sco = (SCO) newValue;
                    Object owner = sco.getOwner();
                    if (owner != null)
                    {
                        throw new JDOUserException(LOCALISER.msg("026007",
                            sco.getFieldName(), owner));
                    }
                }

                writeField(field, newValue);
                postWriteField(wasDirty);
            }
            else if (loadedOldValue)
            {
                // We've updated the value with the old value (when retrieving it above), so put the new value back again
                boolean wasDirty = preWriteField(field);
                writeField(field, newValue);
                postWriteField(wasDirty);
            }

            if (!equal &&
                myOM.getOMFContext().getPersistenceConfiguration().getBooleanProperty("org.jpox.manageRelationships"))
            {
                // Managed Relations : register updated bidir fields for later processing
                if (relationType == Relation.ONE_TO_ONE_BI ||
                    relationType == Relation.MANY_TO_ONE_BI ||
                    relationType == Relation.ONE_TO_MANY_BI ||
                    relationType == Relation.MANY_TO_MANY_BI)
                {
                    // Managed Relationships - add the field to be managed so we can analyse its value at flush
                    if (relationManager == null)
                    {
                        relationManager = new RelationshipManager(this);
                    }
                    relationManager.relationChange(field, oldValue, newValue);
                }
            }

            if (fmd.isDependent() && oldValue != null && newValue == null && oldValue instanceof PersistenceCapable)
            {
                // PC field being nulled, so delete previous PC value
                // TODO Avoid this flush since it will screw up optimistic txn handling
                flush(); // Make sure that any null reference is set first (to avoid any FK constraint failures)

                JPOXLogger.PERSISTENCE.debug(LOCALISER.msg("026026",
                    oldValue, fmd.getFullFieldName()));
                myOM.deleteObjectInternal(oldValue);
            }
        }
        else
        {
View Full Code Here

                if (ownerSM == null || ownerSM.cmd == null)
                {
                    //for some reason these are null... raised when running JPA TCK
                    continue;
                }
                AbstractMemberMetaData ownerFmd = ownerSM.cmd.getMetaDataForManagedMemberAtAbsolutePosition(owner.fieldNumber);
                if (ownerFmd.getCollection() != null)
                {
                    // PC Object embedded in collection
                    Object ownerField = ownerSM.provideField(owner.fieldNumber);
                    if (ownerField instanceof SCOCollection)
                    {
                        ((SCOCollection)ownerField).updateEmbeddedElement(myPC, fieldNumber, value);
                    }
                }
                else if (ownerFmd.getMap() != null)
                {
                    // PC Object embedded in map
                    Object ownerField = ownerSM.provideField(owner.fieldNumber);
                    if (ownerField instanceof SCOMap)
                    {
View Full Code Here

            // Not a SCO wrapper, or is a SCO wrapper but not owned by this object
            Object unwrappedValue = sco.getValue();
            if (replaceFieldIfChanged)
            {
                AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
                if (JPOXLogger.PERSISTENCE.isDebugEnabled())
                {
                    JPOXLogger.PERSISTENCE.debug(LOCALISER.msg("026030",
                        StringUtils.toJVMIDString(myPC), myID, fmd.getName()));
                }
                replaceField(fieldNumber, unwrappedValue, false);
            }
            return unwrappedValue;
        }
View Full Code Here

        }

        if (value instanceof PersistenceCapable)
        {
            // Special case of SCO that we should split into a separate method for clarity, nothing to do with wrapping
            AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
            if (fmd.getEmbeddedMetaData() != null && fmd.getEmbeddedMetaData().getOwnerMember() != null)
            {
                // Embedded field, so assign the embedded/serialised object "owner-field" if specified
                JDOStateManagerImpl subSM = (JDOStateManagerImpl)myOM.findStateManager(value);
                int ownerAbsFieldNum = subSM.cmd.getAbsolutePositionOfMember(fmd.getEmbeddedMetaData().getOwnerMember());
                if (ownerAbsFieldNum >= 0)
                {
                    miscFlags |= MISC_UPDATING_EMBEDDING_FIELDS_WITH_OWNER;
                    subSM.replaceField(ownerAbsFieldNum, myPC, true);
                    miscFlags &=~MISC_UPDATING_EMBEDDING_FIELDS_WITH_OWNER;
                }
            }
        }

        if (getSecondClassMutableFields()[fieldNumber])
        {
            if (!(value instanceof SCO) || myPC != ((SCO)value).getOwner())
            {
                // Not a SCO wrapper, or is a SCO wrapper but not owned by this object
                AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
                if (replaceFieldIfChanged)
                {
                    if (JPOXLogger.PERSISTENCE.isDebugEnabled())
                    {
                        JPOXLogger.PERSISTENCE.debug(LOCALISER.msg("026029",
                            StringUtils.toJVMIDString(myPC), myID, fmd.getName()));
                    }
                }
                return SCOUtils.newSCOInstance(this, fmd, fmd.getType(),
                    (value != null ? value.getClass() : null), value, forInsert, forUpdate, replaceFieldIfChanged);
            }
        }

        return value;
View Full Code Here

        {
            // Not yet inserted anything
            return false;
        }

        AbstractMemberMetaData fmd = cmd.getMetaDataForManagedMemberAtAbsolutePosition(fieldNumber);
        if (fmd == null)
        {
            // Specified field doesnt exist for this object type!
            return false;
        }
        return latestInsertedDatastoreClass.managesClass(fmd.getClassName());
    }
View Full Code Here

TOP

Related Classes of org.jpox.metadata.AbstractMemberMetaData

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.