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
135
136
137
138
139
140
141
142
package org.litesoft.initfrom.server;

import org.litesoft.bo.views.*;
import org.litesoft.changemanagement.*;
import org.litesoft.commonfoundation.typeutils.*;
import org.litesoft.core.*;
import org.litesoft.initfrom.client.boviews.*;
import org.litesoft.initfrom.server.boviews.podataproviders.*;
import org.litesoft.initfrom.server.pos.*;

public class CurrentUserAccessor implements ServerStateChangedListener {
    public static synchronized CurrentUserAccessor get() {
        ServerStore zStore = ServerContext.get().getServerStore();
        CurrentUserAccessor zAccessor = zStore.get( CurrentUserAccessor.class );
        if ( zAccessor == null ) {
            zStore.set( CurrentUserAccessor.class, zAccessor = new CurrentUserAccessor() );
        }
        return zAccessor;
    }

    private boolean mViewStale;
    private ChangeListenerManager mRegisteredWithCLM;
    private User mPO;

    public User getRequiredUser() {
        User zUser = getOptionalUser( null );
        if ( zUser == null ) {
            throw new SessionExpiredException( "No Current User" );
        }
        return zUser;
    }

    public User getOptionalUser( String pDefaultUserLoginEmail ) {
        Pair zPair = getPair( pDefaultUserLoginEmail );
        if ( zPair.getVO() == null ) {
            return null;
        }
        if ( (zPair.getPO() == null) || !zPair.inSync() ) {
            zPair = refresh( zPair );
        }
        return zPair.getPO();
    }

    public UserView getUserView( String pDefaultUserLoginEmail ) {
        Pair zPair = getPair( pDefaultUserLoginEmail );
        if ( zPair.isStale() ) {
            zPair = refresh( zPair );
        }
        return zPair.getVO();
    }

    public void logout() {
        update( null, null );
    }

    public UserView updateUser( User pPO ) {
        UserView zView = getDataProvider().createView( pPO, false );
        update( zView, pPO );
        return zView;
    }

    private Pair refresh( Pair pPair ) {
        UserViewPoServerVoDataProvider zDP = getDataProvider();
        User zPO = (User) zDP.getPO( pPair.getVO().getID() );
        return update( zDP.createView( zPO, false ), zPO );
    }

    private Pair update( UserView pView, User pPO ) {
        Pair rv;
        User zOld, zNew;
        synchronized ( this ) {
            rv = new Pair( mViewStale = false, pView, pPO );
            ServerContext.get().getServerSession().setAttribute( UserView.class, pView );
            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, User.class, zNew.getPersistentObjectUniqueKey() );
            }
        }
        return rv;
    }

    private Pair getPair( String pDefaultUserLoginEmail ) {
        synchronized ( this ) {
            UserView zView = ServerContext.get().getServerSession().getAttribute( UserView.class );
            if ( (zView != null) || (pDefaultUserLoginEmail == null) ) {
                return new Pair( mViewStale, zView, mPO );
            }
        }
        getDataProvider().loginDefaultUser( pDefaultUserLoginEmail );
        synchronized ( this ) {
            UserView zView = ServerContext.get().getServerSession().getAttribute( UserView.class );
            return new Pair( mViewStale, zView, mPO );
        }
    }

    @Override
    public synchronized void serverStateChanged( ServerStateChangeSet pServerStateChangeSet ) {
        mViewStale = true;
    }

    private UserViewPoServerVoDataProvider getDataProvider() {
        return (UserViewPoServerVoDataProvider) ServerContext.getMasterServerStore().get( ServerVoDataProviderMap.class ).get( UserView.class );
    }

    private static class Pair {
        private boolean mStale;
        private UserView mVO;
        private User mPO;

        private Pair( boolean pStale, UserView pVO, User pPO ) {
            mStale = (pVO != null) && pStale;
            mVO = pVO;
            mPO = pPO;
        }

        public boolean isStale() {
            return mStale;
        }

        public UserView getVO() {
            return mVO;
        }

        public User 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() );
        }
    }
}

Commits for litesoft/trunk/GWT_Sandbox/InitFrom/src/org/litesoft/initfrom/server/CurrentUserAccessor.java

Diff revisions: vs.
Revision Author Commited Message
948 Diff Diff GeorgeS picture GeorgeS Sat 07 Jun, 2014 23:42:39 +0000

Jusefuls Formatter Updated to New Code Format

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
459 GeorgeS picture GeorgeS Sun 21 Aug, 2011 00:42:41 +0000