else
{
metaclass = getMetaclass(query);
}
InstanceRef ref = m_query.getInvocationContext().findInstanceRef(metaclass, oid);
Instance instance = (ref == null) ? null : ref.getInstance();
// Check if the instance has already been retrieved
if (instance != null)
{
// Already retrieved instance
if (instance.isLazy())
{
if (query.isLazy())
{
if (!metaclass.isUpcast(instance.getLazyMetaclass()))
{
instance.setLazyMetaclass(metaclass);
}
}
else
{
instance.setMetaclass(metaclass);
}
}
if (instanceList != null)
{
bAdd = !instanceList.contains(instance);
if (bAdd &&
container == null &&
m_nMaxCount >= 0 &&
instanceList.getCount() == m_nOffset + m_nMaxCount)
{
m_bEOF = bDiscardExtra;
m_bEOP = !bDiscardExtra;
return false;
}
}
if (bAdd)
{
switch (instance.getState())
{
case Instance.DELETED:
bAdd = false;
break;
case Instance.DIRTY:
if (reverse != null)
{
Object reverseValue = instance.getValueDirect(reverse.getOrdinal());
if (reverseValue != Undefined.VALUE && reverseValue != container)
{
bAdd = false;
}
}
break;
}
if (!bAdd && instanceList == null)
{
if (container.getValueDirect(assoc.getOrdinal()) == Undefined.VALUE)
{
// Set the new value to null, old value to the retrieved instance
container.setValueDirect(assoc.getOrdinal(), null);
}
bAdd = true;
}
}
if (m_instanceSet.get(query, instance) == null)
{
// Merge the not yet retrieved attribute values
if (!bSkipInstance)
{
// Overwrite only if the instance is clean
boolean bOverwrite = (instance.getUnitOfWork() == null);
Field lockingField = query.getLockingField();
if (lockingField != null)
{
Attribute lockingAttribute = lockingField.getAttribute();
Object oldValue = instance.getNewValueDirect(lockingAttribute.getOrdinal());
if (oldValue != Undefined.VALUE)
{
// Check the old lock value
Primitive primitive = (Primitive)lockingAttribute.getType();
Object value = getValue(lockingField);
if (((Boolean)primitive.findNEFunction(primitive).invoke(oldValue, value)).booleanValue())
{
// The lock values do not match
// If the instance is dirty/deleted or share-locked, throw an exception
if (!bOverwrite || ref.isLocked())
{
throw new OptimisticLockException(instance);
}
// Discard all the instance attributes