litesoft
@ 151
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
// This Source Code is in the Public Domain per: http://litesoft.org/License.txt package org.litesoft.orsup.lazyload; import org.litesoft.orsup.base.*; import org.litesoft.orsup.nonpublic.*; public abstract class AbstractLazyLoadToOne<Owner extends PersistentObjectImpl, Them extends PersistentObjectImpl> extends AbstractLazyLoadTo<Owner, Them> { protected Them mValue = null; protected Object mDBValue = null; protected AbstractLazyLoadToOne( Owner pOwner, AbstractAttributeAccessorSCDtoOne<Owner, Them> pSCDtoOne ) { super( pOwner, pSCDtoOne ); } public abstract AbstractAttributeAccessorSCDtoOne<Owner, Them> getSCDtoOne(); @Override public final String getAttributeName() { return getSCDtoOne().getName(); } @Override protected final boolean isThemDependantOnUs() { return getSCDtoOne().isThemDependantOnUs(); } /** * @param pDBValue !null */ abstract protected PersistentObject<?> LL_loadValueWithNonNull( Object pDBValue ); public final Them LL_getValue() { if ( !mLoaded ) { if ( mDBValue != null ) { //noinspection unchecked mValue = (Them) LL_loadValueWithNonNull( mDBValue ); } mLoaded = true; } return mValue; } public final void LL_setValue( Them pNewThem, String pBackRefAttributeNameOnNewThem ) { backbackdoorSetValue( pNewThem, pBackRefAttributeNameOnNewThem ); if ( (mValue != null) && (pBackRefAttributeNameOnNewThem != null) ) { getToManyLazyLoader( pNewThem, pBackRefAttributeNameOnNewThem ).backdoorAddValue( mOwner ); } } public Object db_getValue() { return mDBValue; } public void db_setValue( Object pPOKey ) { mDBValue = pPOKey; } @Override protected final void releaseLoadeds() { mValue = null; } /** * Note Only called when the New Them is NOT the same as the Old Them * * @param pNewThem Nullable * @param pBackRefAttributeNameOnNewThem */ final void backdoorSetValue( Them pNewThem, String pBackRefAttributeNameOnNewThem ) { Them zCurThem = LL_getValue(); Object newDBValue = extract_db_value( pNewThem, pBackRefAttributeNameOnNewThem ); PersistentObjectImpl.BackDoor.verifyMutabilityOnChangeToOneOn( mOwner, // getSCDtoOne(), // zCurThem, mDBValue, // pNewThem, newDBValue // ); backbackdoorSetValue( pNewThem, pBackRefAttributeNameOnNewThem ); } final void backbackdoorSetValue( Them pNewThem, String pBackRefAttributeNameOnNewThem ) { Them zCurThem = LL_getValue(); if ( zCurThem != null ) { String zBackRefAttributeNameOnNewThem = getBackRefOnUnWire( pBackRefAttributeNameOnNewThem ); if ( zBackRefAttributeNameOnNewThem != null ) { getToManyLazyLoader( zCurThem, zBackRefAttributeNameOnNewThem ).backdoorRemoveValue( mOwner ); } if ( isThemDependantOnUs() ) { zCurThem.requestDelete(); } } mDBValue = extract_db_value( pNewThem, pBackRefAttributeNameOnNewThem ); mValue = pNewThem; } public final Object extract_db_value( PersistentObjectImpl pNewThem, String pBackRefAttributeNameOnNewThem ) { return (pNewThem == null) ? null : LL_extract_db_value( pNewThem, pBackRefAttributeNameOnNewThem ); } private AbstractLazyLoadToMany<Them, Owner> getToManyLazyLoader( Them pThem, String pBackRefAttributeNameOnNewThem ) { checkTransactions( pThem ); MetaDataForPO zMDForPO = pThem.getMetaDataForPO(); AttributeAccessorSCD scd = zMDForPO.getAccessorSCDrequired( pBackRefAttributeNameOnNewThem ); //noinspection unchecked return ((AbstractAttributeAccessorSCDtoMany) scd).getValueHolder( pThem ); } abstract protected String getBackRefOnUnWire( String pBackRefAttributeNameOnNewThem ); /** * @param pNewThem !null */ abstract protected Object LL_extract_db_value( PersistentObjectImpl pNewThem, String pBackRefAttributeNameOnNewThem ); } |