Subversion Repository Public Repository

litesoft

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.commonfoundation.typeutils.*;
import org.litesoft.core.*;

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;
        }
    }
}

Commits for litesoft/trunk/Java/core/Server/src/org/litesoft/security/AbstractCurrentSecurityPOAccessor.java

Diff revisions: vs.
Revision Author Commited Message
939 Diff Diff GeorgeS picture GeorgeS Mon 02 Jun, 2014 21:30:31 +0000

Extracting commonfoundation

804 Diff Diff GeorgeS picture GeorgeS Wed 15 Aug, 2012 12:48:51 +0000
484 GeorgeS picture GeorgeS Mon 05 Sep, 2011 02:03:16 +0000