001 /** ===================================================================== 002 * 003 * File Name : $Id: FaultUpdateMonitor.java,v 1.6 2007/09/06 07:58:12 cb Exp $ 004 * 005 * Description 006 * ----------- 007 * 008 * See javadoc comment 009 * 010 * ===================================================================== 011 * 012 * @Author : Craige Bevil 013 * Control Software Group 014 * Isaac Newton Group of Telescopes 015 * 016 * ===================================================================== 017 * 018 * Modification Log 019 * 020 * Vers Date Author Reason 021 * ---- ---- ------ ------ 022 * 1 C.Bevil First Release 023 * 024 * Commissioning Notes 025 * ------------------- 026 * 027 * None 028 * 029 * ===================================================================== 030 * 031 * @Version : $Id: FaultUpdateMonitor.java,v 1.6 2007/09/06 07:58:12 cb Exp $ 032 * 033 * @Author : $Author: cb $ 034 * 035 * Header : $Header: /opt/INGsrc/src/CVS/softproj/FaultDatabase/src/FaultDatabase/FaultDatabase/src/GWTApplication/client/FaultUpdateMonitor.java,v 1.6 2007/09/06 07:58:12 cb Exp $ 036 * 037 * Log : $Log: FaultUpdateMonitor.java,v $ 038 * Log : Revision 1.6 2007/09/06 07:58:12 cb 039 * Log : Correct comments, added trap when updating listeners just in case 040 * Log : there is an exception. 041 * Log : 042 * Log : Revision 1.5 2007/09/06 06:53:43 cb 043 * Log : Before overhaul to fix update problems 044 * Log : 045 * Log : Revision 1.4 2007/08/22 15:57:26 cb 046 * Log : We now monitor all faults in the database which may have changed. 047 * Log : 048 * Log : Revision 1.3 2007/08/17 14:26:43 cb 049 * Log : Updated for lastest prototype incorporating a lot of Nikos comments 050 * Log : 051 * Log : Revision 1.2 2007/08/14 13:32:24 cb 052 * Log : Before we rip out the fault hash so that we check against the whole 053 * Log : database for updated faults 054 * Log : 055 * Log : Revision 1.1 2007/07/24 08:27:09 cb 056 * Log : First version 057 * Log : 058 * 059 * =====================================================================*/ 060 061 062 package GWTApplication.client; 063 064 import com.google.gwt.core.client.GWT; 065 import com.google.gwt.user.client.*; 066 import com.google.gwt.user.client.rpc.*; 067 import com.google.gwt.user.client.ui.*; 068 import com.google.gwt.user.client.ui.FlexTable.*; 069 import com.google.gwt.user.client.ui.HTMLTable.*; 070 import com.google.gwt.user.client.ui.Hyperlink.*; 071 072 073 import java.util.*; 074 075 /** 076 * This class will be used to check the database intermittingly to see 077 * if any of the faults which listeners have registered an interest in 078 * have been updated. If any faults have been updated then the 079 * listeners are informed of the faults which have changed since the 080 * last time that we checked. 081 * @author Craige Bevil 082 * @version $Id: FaultUpdateMonitor.java,v 1.6 2007/09/06 07:58:12 cb Exp $ 083 * @see SearchResultFormatter 084 */ 085 086 class FaultUpdateMonitor extends com.google.gwt.user.client.Timer { 087 088 /** 089 * This is the service which will be used to access the servlet 090 * which is running in the tomcat container 091 */ 092 093 FaultServiceAsync svc; 094 095 /** 096 * This is the time in milliseconds since 1970 since the last time 097 * that we checked if the faults had been updated 098 */ 099 100 Date timeOfLastUpdateCheck = null; 101 102 /** 103 * This is a list of the fault listeners 104 */ 105 106 HashMap Listeners = new HashMap(); 107 108 /** 109 * This class will be used for internationalization so that we can 110 * flick between the locales of English and Spanish. 111 */ 112 113 private InternationalizationConstants internationalizationConstants = (InternationalizationConstants) GWT.create(InternationalizationConstants.class); 114 115 /** 116 * Constructor 117 */ 118 119 FaultUpdateMonitor (FaultServiceAsync svc) { 120 this.svc = svc; 121 } 122 123 /** 124 * Obligation of the TimerTask interface and is called 125 * intermittingly. This calls servlet operation which will check 126 * to see if any of the faults have been updated and if so it will 127 * inform the listener. 128 */ 129 130 public void run () { 131 132 // If there are no listeners then we do nothing 133 134 if (Listeners.size() == 0) { 135 return; 136 } 137 138 // Now we need to call the servlet to get the list of faults 139 // which have been updated since the time of the last check 140 141 svc.getFaultsUpdated (timeOfLastUpdateCheck,internationalizationConstants.locale(),new AsyncCallback() { 142 143 public void onSuccess (final Object result) { 144 145 // On success we will get list of all of the 146 // faults which have been updated since the last 147 // time that we checked. 148 149 FaultUpdateSnapshot faultsChanged =(FaultUpdateSnapshot)result; 150 151 // Update the time that we checked the database 152 // last (note that we get the time from the web 153 // server and NOT the local time from the web 154 // client as that can be completely different to 155 // the web client). 156 157 timeOfLastUpdateCheck = faultsChanged.timeStampOfLastCheck; 158 159 if (faultsChanged.faultsUpdated.size() > 0) { 160 161 // Now inform all of the listeners of the 162 // faults that have been updated 163 164 Iterator listenerList = Listeners.keySet().iterator(); 165 166 while (listenerList.hasNext()) { 167 168 // Now get the list of faults which this listener is 169 // interested in and prepare the list which we will 170 // send down to the servlet for verification. 171 172 final FaultListener listener = (FaultListener)listenerList.next(); 173 174 try { 175 listener.faultsChanged(faultsChanged.faultsUpdated); 176 } catch (Exception e) { 177 // If we cannnot inform a listener then do nothing 178 } 179 } 180 } 181 } 182 183 public void onFailure (Throwable ex) 184 { 185 // It's not that important to the system if we 186 // cannot reach the server so don't complain. 187 } 188 }); 189 } 190 191 /** 192 * Will be used by a client to register itself as a listener so 193 * that it will be informed when faults which it is interested in 194 * are changed in the database. 195 * @param faultListener This is the object which will be called 196 * when any one of the faults listed in the faultsOfInterest array 197 * are updated. 198 */ 199 200 public void addListener(final FaultListener faultListener) { 201 Listeners.put(faultListener,faultListener); 202 } 203 } 204 205