source: trunk/grails-app/services/dbnp/modules/ModuleNotificationService.groovy @ 1941

Last change on this file since 1941 was 1941, checked in by robert@…, 11 years ago
  • Implemented getStudyVersions rest call to assist module synchronization
  • Removed debug println statements
  • Property svn:keywords set to Rev Author Date
File size: 2.9 KB
Line 
1/**
2 * SynchronizationService Service
3 *
4 * Description of my service
5 *
6 * @author  your email (+name?)
7 * @since       2010mmdd
8 * @package     ???
9 *
10 * Revision information:
11 * $Rev: 1941 $
12 * $Author: robert@isdat.nl $
13 * $Date: 2011-06-27 12:57:45 +0000 (ma, 27 jun 2011) $
14 */
15package dbnp.modules
16
17import dbnp.studycapturing.*
18import org.dbnp.gdt.*
19import org.springframework.web.context.request.RequestContextHolder
20
21class ModuleNotificationService implements Serializable {
22        def remoteAuthenticationService
23       
24    static transactional = false
25       
26    /**
27     * Sends a notification to assay modules that some part of a study has changed.
28     *
29     * Only modules that have the notify flag set to true will be notified. They will be notified on the URL
30     *
31     * [moduleUrl]/rest/notifyStudyChange?studyToken=abc
32     *
33     * Errors that occur when calling this URL are ignored. The module itself is responsible of
34     * maintaining a synchronized state.
35     *
36     * @param study
37     * @return
38     */
39        def invalidateStudy( Study study ) {
40                if( !study )
41                        return
42                       
43                log.info( "Invalidate " + study )
44
45                def modules = AssayModule.findAllByNotify(true);
46               
47                // If no modules are set to notify, return
48                if( !modules )
49                        return
50                       
51                       
52                // Try to see which user is logged in. If no user is logged in (or no http session exists yet)
53                // we send no authentication parameters
54                def user
55                try {
56                        user = RequestContextHolder.currentRequestAttributes().getSession().gscfUser
57                       
58                        if( !user )
59                                throw new Exception( "No user is logged in" );
60                               
61                } catch( Exception e ) {
62                        log.warn "Sending study change notification without authentication, because an exception occurred: " + e.getMessage();
63                }
64               
65                def urls = []
66                modules.each { module ->
67                        // create a random session token that will be used to allow to module to
68                        // sync with gscf prior to presenting the measurement data
69                        def sessionToken = UUID.randomUUID().toString()
70                        def consumer = module.url
71                       
72                        // Create a URL to call
73                        def authenticationParameters = "";
74                        if( user ) {
75                                // put the session token to work (for 15 minutes)
76                                remoteAuthenticationService.logInRemotely( consumer, sessionToken, user, 15 * 60 )
77
78                                authenticationParameters = "consumer=" + consumer + "&sessionToken=" + sessionToken;
79                        }
80                               
81                        urls << module.url + '/rest/notifyStudyChange?studyToken=' + study.giveUUID() + ( authenticationParameters ? "&" + authenticationParameters : "" )
82                }
83               
84                // Notify the module in a separate thread, so the user doesn't have to wait for it
85                Thread.start { 
86                        urls.each { url ->
87                                log.info( "GSCF NOTIFY MODULE OF STUDY CHANGE: ${url}")
88                                try {
89                                        def connection = url.toURL().openConnection()
90                                        if( connection.responseCode == 200 ) {
91                                                log.info( "GSCF NOTIFY-CALL SUCCEEDED: ${url}" )
92                                        } else {
93                                                log.info( "GSCF NOTIFY-CALL FAILED: ${url}: " + connection.responseCode )
94                                        }
95                                } catch( Exception ignore) {
96                                        log.info( "GSCF NOTIFY-CALL ERROR: ${url} - " + ignore.getMessage() )
97                                }
98                        }
99                 };
100    }
101}
Note: See TracBrowser for help on using the repository browser.