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
package org.litesoft.GWT.eventbus.server.nonpublic;

import javax.servlet.http.*;

import org.litesoft.GWT.eventbus.server.*;
import org.litesoft.logger.*;

public class ServerEventBusSessionMapper
{
    private static final Logger LOGGER = LoggerFactory.getLogger( ServerEventBusSessionMapper.class );

    private static void addServletBrowserData( HttpServletRequest pRequest, ServerEventBus pServerEventBus )
    {
        if ( pServerEventBus instanceof NonTemporaryServerEventBus )
        {
            pServerEventBus.setClientWindowInstanceData( ServerEventBus.TRANSLATED_PATH,
                                                         pRequest.getPathTranslated() );
            pServerEventBus.setClientWindowInstanceData( ServerEventBus.REMOTE_ADDR,
                                                         pRequest.getRemoteAddr() );
        }
    }

    public static ServerEventBus getServerEventBus( HttpServletRequest pRequest,
                                                    ThreadLocalContextFactory pThreadLocalContextFactory,
                                                    int pClientIdNumber )
            throws InvalidSessionException
    {
        ServerEventBus zServerEventBus = ServerEventBusManager.INSTANCE.getServerEventBus( pClientIdNumber );
        if ( null != zServerEventBus )
        {
            if ( !verifyRelatedBusCommonObject( pRequest, pThreadLocalContextFactory, zServerEventBus ) )
            {
                String zProblem = "Cross Session Request for ClientID '" + pClientIdNumber + "' from '" +
                                  pRequest.getRemoteUser() + "' at: " + pRequest.getRemoteAddr();
                LOGGER.warn.log( zProblem );
                throw new InvalidSessionException( zProblem );
            }
            // getRelatedBusCommonObject() == null passes
        }
        return zServerEventBus;
    }

    private static synchronized boolean verifyRelatedBusCommonObject( HttpServletRequest pRequest,
                                                                      ThreadLocalContextFactory pThreadLocalContextFactory,
                                                                      ServerEventBus pServerEventBus )
    {
        Object zRelatedBusCommonObject = pServerEventBus.getRelatedBusCommonObject();
        return (zRelatedBusCommonObject == null) ||
               (zRelatedBusCommonObject == getSessionTracker( pRequest, pThreadLocalContextFactory ));
    }

    private static final String SERVER_EVENT_BUSES = "ServerEventBuses";

    public static synchronized Integer[] getSessionServerEventBusClientIdNumbers( HttpServletRequest pRequest,
                                                                                  ThreadLocalContextFactory pThreadLocalContextFactory )
    {
        return getSessionTracker( pRequest, pThreadLocalContextFactory ).getClientIdNumbers();
    }

    private static synchronized SEBSessionTracker getSessionTracker( HttpServletRequest pRequest,
                                                                     ThreadLocalContextFactory pThreadLocalContextFactory )
    {
        HttpSession session = pRequest.getSession();
        SEBSessionTracker tracker = (SEBSessionTracker) session.getAttribute( SERVER_EVENT_BUSES );
        if ( tracker == null )
        {
            session.setAttribute( SERVER_EVENT_BUSES,
                                  tracker = new SEBSessionTracker( pThreadLocalContextFactory ) );
        }
        return tracker;
    }

    public static void addServerEventBus( ServerEventBus pParent, ServerEventBus pServerEventBus )
    {
        // Force use of same stuff
        SEBSessionTracker tracker = (SEBSessionTracker) pParent.getRelatedBusCommonObject();

        pServerEventBus.setRelatedBusCommonObject( tracker );
        tracker.addServerEventBus( pServerEventBus );
    }

    public static void addServerEventBus( HttpServletRequest pRequest,
                                          ThreadLocalContextFactory pThreadLocalContextFactory,
                                          ServerEventBus pServerEventBus )
    {
        SEBSessionTracker tracker = getSessionTracker( pRequest, pThreadLocalContextFactory );
        addServletBrowserData( pRequest, pServerEventBus );

        pServerEventBus.setRelatedBusCommonObject( tracker );
        tracker.addServerEventBus( pServerEventBus );
    }

    public static SEBSessionTracker addTrackerToServerEventBus( HttpServletRequest pRequest,
                                                                ThreadLocalContextFactory pThreadLocalContextFactory,
                                                                ServerEventBus pServerEventBus )
    {
        SEBSessionTracker tracker = getSessionTracker( pRequest, pThreadLocalContextFactory );
        addServletBrowserData( pRequest, pServerEventBus );
        pServerEventBus.setRelatedBusCommonObject( tracker );
        return tracker;
    }

    public static String getLogoutMessage( HttpServletRequest pRequest,
                                           ThreadLocalContextFactory pThreadLocalContextFactory )
    {
        return getSessionTracker( pRequest, pThreadLocalContextFactory ).getLogoutMessage();
    }

    public static void setLogoutMessage( HttpServletRequest pRequest,
                                         ThreadLocalContextFactory pThreadLocalContextFactory,
                                         String pLogoutMessage )
    {
        getSessionTracker( pRequest, pThreadLocalContextFactory ).setLogoutMessage( pLogoutMessage );
    }

    public static boolean anyServerEventBusesFor( HttpServletRequest pRequest,
                                                  ThreadLocalContextFactory pThreadLocalContextFactory )
    {
        return getSessionTracker( pRequest, pThreadLocalContextFactory ).anyServerEventBuses();
    }

    public static void dropAllServerEventBusesFor( HttpServletRequest pRequest,
                                                   ThreadLocalContextFactory pThreadLocalContextFactory,
                                                   String pWhy )
    {
        getSessionTracker( pRequest, pThreadLocalContextFactory ).dropAllServerEventBuses( pWhy );
    }
}

Commits for litesoft/trunk/Java/GWT/OldServer/src/org/litesoft/GWT/eventbus/server/nonpublic/ServerEventBusSessionMapper.java

Diff revisions: vs.
Revision Author Commited Message
2 GeorgeS picture GeorgeS Sun 07 Feb, 2010 12:50:58 +0000