1 21 package oracle.toplink.essentials.internal.indirection; 23 24 import java.util.*; 25 import oracle.toplink.essentials.queryframework.*; 26 import oracle.toplink.essentials.indirection.*; 27 import oracle.toplink.essentials.exceptions.*; 28 import oracle.toplink.essentials.internal.descriptors.*; 29 import oracle.toplink.essentials.internal.helper.*; 30 import oracle.toplink.essentials.internal.sessions.AbstractRecord; 31 import oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl; 32 import oracle.toplink.essentials.internal.sessions.AbstractSession; 33 34 45 public class BasicIndirectionPolicy extends IndirectionPolicy { 46 47 51 public BasicIndirectionPolicy() { 52 super(); 53 } 54 55 59 public Object backupCloneAttribute(Object attributeValue, Object clone, Object backup, UnitOfWorkImpl unitOfWork) { 60 ValueHolderInterface valueHolder = (ValueHolderInterface)attributeValue; ValueHolder result = new ValueHolder(); 64 65 if ((!(valueHolder instanceof UnitOfWorkValueHolder)) || valueHolder.isInstantiated()) { 67 result.setValue(super.backupCloneAttribute(valueHolder.getValue(), clone, backup, unitOfWork)); 68 } else { 69 ((UnitOfWorkValueHolder)valueHolder).setBackupValueHolder(result); 70 } 71 72 return result; 73 } 74 75 82 public Object cloneAttribute(Object attributeValue, Object original, Object clone, UnitOfWorkImpl unitOfWork, boolean buildDirectlyFromRow) { 83 ValueHolderInterface valueHolder = (ValueHolderInterface) attributeValue; 84 ValueHolderInterface result; 85 86 if (!buildDirectlyFromRow && unitOfWork.isOriginalNewObject(original)) { 87 if ((valueHolder instanceof DatabaseValueHolder) 90 && (! ((DatabaseValueHolder) valueHolder).isInstantiated()) 91 && (((DatabaseValueHolder) valueHolder).getSession() == null) 92 && (! ((DatabaseValueHolder) valueHolder).isSerializedRemoteUnitOfWorkValueHolder())) { 93 throw DescriptorException.attemptToRegisterDeadIndirection(original, getMapping()); 94 } 95 if (this.getMapping().getRelationshipPartner() == null) { 96 result = new ValueHolder(); 97 result.setValue(this.getMapping().buildCloneForPartObject(valueHolder.getValue(), original, clone, unitOfWork, false)); 98 } else { 99 AbstractRecord row = null; 102 if (valueHolder instanceof DatabaseValueHolder) { 103 row = ((DatabaseValueHolder)valueHolder).getRow(); 104 } 105 result = this.getMapping().createUnitOfWorkValueHolder(valueHolder, original, clone, row, unitOfWork, buildDirectlyFromRow); 106 107 Object newObject = this.getMapping().buildCloneForPartObject(valueHolder.getValue(), original, clone, unitOfWork, false); 108 ((UnitOfWorkValueHolder)result).privilegedSetValue(newObject); 109 ((UnitOfWorkValueHolder)result).setInstantiated(); 110 } 111 } else { 112 AbstractRecord row = null; 113 if (valueHolder instanceof DatabaseValueHolder) { 114 row = ((DatabaseValueHolder)valueHolder).getRow(); 115 } 116 result = this.getMapping().createUnitOfWorkValueHolder(valueHolder, original, clone, row, unitOfWork, buildDirectlyFromRow); 117 } 118 return result; 119 } 120 121 127 public Vector extractPrimaryKeyForReferenceObject(Object referenceObject, AbstractSession session) { 128 if (this.objectIsInstantiated(referenceObject)) { 129 return super.extractPrimaryKeyForReferenceObject(((ValueHolderInterface)referenceObject).getValue(), session); 130 } else { 131 return this.getOneToOneMapping().extractPrimaryKeysForReferenceObjectFromRow(this.extractReferenceRow(referenceObject)); 132 } 133 } 134 135 142 public AbstractRecord extractReferenceRow(Object referenceObject) { 143 if (this.objectIsInstantiated(referenceObject)) { 144 return null; 145 } else { 146 return ((DatabaseValueHolder)referenceObject).getRow(); 147 } 148 } 149 150 155 public Object getOriginalIndirectionObject(Object unitOfWorkIndirectionObject, AbstractSession session) { 156 if (unitOfWorkIndirectionObject instanceof UnitOfWorkValueHolder) { 157 ValueHolderInterface valueHolder = ((UnitOfWorkValueHolder)unitOfWorkIndirectionObject).getWrappedValueHolder(); 158 if ((valueHolder != null) && (valueHolder instanceof DatabaseValueHolder)) { 159 ((DatabaseValueHolder)valueHolder).releaseWrappedValueHolder(); 160 } 161 return valueHolder; 162 } else { 163 return unitOfWorkIndirectionObject; 164 } 165 } 166 167 172 public Object getRealAttributeValueFromObject(Object object) { 173 if (ClassConstants.ValueHolderInterface_Class.isAssignableFrom(object.getClass())) { 175 return ((ValueHolderInterface)object).getValue(); 176 } else { 177 return object; 178 } 179 } 180 181 185 public void iterateOnAttributeValue(DescriptorIterator iterator, Object attributeValue) { 186 iterator.iterateValueHolderForMapping((ValueHolderInterface)attributeValue, this.getMapping()); 187 } 188 189 196 public Object nullValueFromRow() { 197 return new ValueHolder(); 198 } 199 200 204 public boolean objectIsInstantiated(Object object) { 205 return ((ValueHolderInterface)object).isInstantiated(); 206 } 207 208 213 public void setRealAttributeValueInObject(Object target, Object attributeValue) { 214 ValueHolderInterface holder = (ValueHolderInterface)this.getMapping().getAttributeValueFromObject(target); 215 if (holder == null) { 216 holder = new ValueHolder(attributeValue); 217 } else { 218 holder.setValue(attributeValue); 219 } 220 super.setRealAttributeValueInObject(target, holder); 221 } 222 223 228 protected boolean typeIsValid(Class attributeType) { 229 return attributeType == ClassConstants.ValueHolderInterface_Class; 230 } 231 232 240 public Object validateAttributeOfInstantiatedObject(Object attributeValue) { 241 if (attributeValue == null) { 245 return new ValueHolder(); 246 } 247 if (!(attributeValue instanceof ValueHolderInterface)) { 248 throw DescriptorException.valueHolderInstantiationMismatch(attributeValue, this.getMapping()); 249 } 250 return attributeValue; 251 } 252 253 260 public void validateDeclaredAttributeType(Class attributeType, IntegrityChecker checker) throws DescriptorException { 261 super.validateDeclaredAttributeType(attributeType, checker); 262 if (!this.typeIsValid(attributeType)) { 263 checker.handleError(DescriptorException.attributeAndMappingWithIndirectionMismatch(this.getMapping())); 264 } 265 } 266 267 274 public void validateGetMethodReturnType(Class returnType, IntegrityChecker checker) throws DescriptorException { 275 super.validateGetMethodReturnType(returnType, checker); 276 if (!this.typeIsValid(returnType)) { 277 checker.handleError(DescriptorException.returnAndMappingWithIndirectionMismatch(this.getMapping())); 278 } 279 } 280 281 288 public void validateSetMethodParameterType(Class parameterType, IntegrityChecker checker) throws DescriptorException { 289 super.validateSetMethodParameterType(parameterType, checker); 290 if (!this.typeIsValid(parameterType)) { 291 checker.handleError(DescriptorException.parameterAndMappingWithIndirectionMismatch(this.getMapping())); 292 } 293 } 294 295 301 public Object valueFromQuery(ReadQuery query, AbstractRecord row, AbstractSession session) { 302 return new QueryBasedValueHolder(query, row, session); 303 } 304 305 311 public Object valueFromRow(Object object) { 312 return new ValueHolder(object); 313 } 314 } 315 | Popular Tags |