litesoft
@ 804
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 133 134 |
package org.litesoft.security; import java.lang.reflect.*; import org.litesoft.bo.views.server.*; import org.litesoft.changemanagement.*; import org.litesoft.core.*; import org.litesoft.core.typeutils.*; public abstract class AbstractCurrentSecurityPOAccessor<PO extends SecurityPO<PO>, VO extends SecurityVO<VO>> implements ServerStateChangedListener { protected final String mWhat; protected final Class<PO> mClassPO; protected final Class<VO> mClassVO; protected final PoServerVoDataProvider<VO> mDataProvider; protected PO mPO; protected boolean mViewStale; protected ChangeListenerManager mRegisteredWithCLM; protected AbstractCurrentSecurityPOAccessor( String pWhat, Class<PO> pClassPO, Class<VO> pClassVO, PoServerVoDataProvider<VO> pDataProvider ) { mWhat = pWhat; mClassPO = pClassPO; mClassVO = pClassVO; mDataProvider = pDataProvider; } protected static <T> T getCurrentInstance( Class<T> pClass ) { ServerStore zStore = ServerContext.get().getServerStore(); T zAccessor = zStore.get( pClass ); if ( zAccessor == null ) { try { Constructor<T> c = pClass.getDeclaredConstructor(); c.setAccessible( true ); // Allow 'private' access zStore.set( pClass, zAccessor = c.newInstance() ); } catch ( Exception e ) { throw new Error( e ); // Good and Well Dorked! } } return zAccessor; } @Override public synchronized void serverStateChanged( ServerStateChangeSet pServerStateChangeSet ) { mViewStale = true; } public void logout() { update( null, null ); } @SuppressWarnings({"unchecked"}) protected Pair<PO, VO> refresh( Pair pPair ) { PO zPO = (PO) mDataProvider.getPO( pPair.getVO().getID() ); return update( mDataProvider.createView( zPO, false ), zPO ); } protected Pair<PO, VO> update( VO pVO, PO pPO ) { Pair<PO, VO> rv; PO zOld, zNew; synchronized ( this ) { rv = new Pair<PO, VO>( mViewStale = false, pVO, pPO ); ServerContext.get().getServerSession().setAttribute( mClassVO, pVO ); zOld = mPO; zNew = mPO = pPO; } if ( !Objects.areNonArraysEqual( zOld, zNew ) ) { if ( zOld != null ) { mRegisteredWithCLM.removeListener( this ); mRegisteredWithCLM = null; } if ( zNew != null ) { (mRegisteredWithCLM = ChangeListenerManager.get()).addListener( this, mClassPO, zNew.getPersistentObjectUniqueKey() ); } } return rv; } protected static class Pair<PO extends SecurityPO<PO>, VO extends SecurityVO<VO>> { private boolean mStale; private VO mVO; private PO mPO; protected Pair( boolean pStale, VO pVO, PO pPO ) { mStale = (pVO != null) && pStale; mVO = pVO; mPO = pPO; } public boolean isStale() { return mStale; } public VO getVO() { return mVO; } public PO getPO() { return mPO; } public boolean inSync() // Only called when Both are !null { return !mStale && // Objects.areNonArraysEqual( mPO.getID(), mVO.getID() ) && // Objects.areNonArraysEqual( mPO.getRecordVersion(), mVO.getRecordVersion() ); } @Override public String toString() { return "Prioritizer: " + mStale + " PO: " + mPO + " VO: " + mVO; } } } |