001    /** =====================================================================       
002    *
003    *  File Name : $Id: ManageSystem.java,v 1.7 2008/01/15 11:08:15 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           Jan 15 2008 C.Bevil      First Release
023    *
024    *     Commissioning Notes
025    *     -------------------
026    *
027    *     None
028    *     
029    *  =====================================================================
030    *
031    *     @Version   : $Id: ManageSystem.java,v 1.7 2008/01/15 11:08:15 cb Exp $
032    *
033    *     @Author    : $Author: cb $
034    *
035    *     Header     : $Header: /opt/INGsrc/src/CVS/softproj/FaultDatabase/src/FaultDatabase/FaultDatabase/src/GWTApplication/client/ManageSystem.java,v 1.7 2008/01/15 11:08:15 cb Exp $
036    *
037    *     Log        : $Log: ManageSystem.java,v $
038    *     Log        : Revision 1.7  2008/01/15 11:08:15  cb
039    *     Log        : Ran through PMD and sorted out the javadoc so that we could export the
040    *     Log        : javadoc to the javadoc repository.
041    *     Log        :
042    *     Log        : Revision 1.6  2007/12/12 15:26:13  cb
043    *     Log        : Added new javascript library which allows fancy message boxes to be
044    *     Log        : displayed.
045    *     Log        :
046    *     Log        : Revision 1.5  2007/10/02 12:14:48  cb
047    *     Log        : Corrected a label for the reset password field
048    *     Log        :
049    *     Log        : Revision 1.4  2007/08/17 14:26:42  cb
050    *     Log        : Updated for lastest prototype incorporating a lot of Nikos comments
051    *     Log        :
052    *     Log        : Revision 1.3  2007/08/01 13:00:05  cb
053    *     Log        : First prototype after import
054    *     Log        :
055    *     Log        : Revision 1.2  2007/07/13 10:54:05  cb
056    *     Log        : Complete interface prototype
057    *     Log        :
058    *     Log        : Revision 1.1.1.1  2007/06/01 08:33:26  cb
059    *     Log        : Imported using TkCVS
060    *     Log        :
061    *
062    * =====================================================================*/
063    
064    package GWTApplication.client;
065    
066    import com.google.gwt.user.client.*;
067    import com.google.gwt.user.client.rpc.*;
068    import com.google.gwt.user.client.ui.*;
069    import com.google.gwt.user.client.ui.FlexTable.*;
070    
071    import com.gwtext.client.core.EventObject;
072    import com.gwtext.client.util.Format;
073    import com.gwtext.client.widgets.MessageBox;
074    import com.gwtext.client.widgets.MessageBoxConfig;
075    
076    import java.util.*;
077    
078    /**
079     * This class will be used to add to a tab panel, a form which may be
080     * used by a privileged use it to administer the fault management
081     * system.  It will allow the user to Update for example the list of
082     * uses of the system, reset passwords and add new components into the
083     * list which represents data within the systems.  
084     * <P> 
085     * The user in order to perform this role, must authenticate himself
086     * against the system before any changes that he makes will be
087     * accepted by the system.
088     *<P>
089     * @author Craige Bevil
090     * @version $Id: ManageSystem.java,v 1.7 2008/01/15 11:08:15 cb Exp $
091     */
092    
093    class ManageSystem extends FaultDBForm implements ClickListener {
094    
095        /**
096         * This will be used for collating together all of the information
097         * associated with an input field in the form
098         */
099    
100        class InterfaceInputField {
101            
102            /**
103             * This is the label which will be attached to the input field
104             */
105            
106            public String InputFieldLabel;
107            
108            /**
109             * This is the label which which will be attached to in the
110             * input acknowledge button
111             */
112            
113            public String AcknowledgementWidgetLabel;
114            
115            /**
116             *  This is the input widget 
117             */
118            
119            public Widget InputWidget;
120            
121            /**
122             * This is the button which will be used to acknowledge that
123             * the user input is now complete
124             */
125            
126            public Button ButtonAcknowledgementWidget;
127            
128            InterfaceInputField (String InputFieldLabel,
129                                 String AcknowledgementWidgetLabel,
130                                 Widget InputWidget,
131                                 Button ButtonAcknowledgementWidget) {
132    
133                this.InputFieldLabel             = InputFieldLabel;
134                this.AcknowledgementWidgetLabel  = AcknowledgementWidgetLabel;
135                this.InputWidget                 = InputWidget;
136                this.ButtonAcknowledgementWidget = ButtonAcknowledgementWidget;
137            }
138        }
139        
140        final static int INSTRUMENTIDX              = 0;
141        final static int TELESCOPEOPERATORIDX       = 1;
142        final static int DUTYTECHNICIANIDX  = 2;
143        final static int SUPPORTASTRONOMERIDX       = 3;
144        final static int SYSTEMIDX          = 4;
145    
146        final InterfaceInputField[] InterfaceInputFields = new InterfaceInputField [] {
147            new InterfaceInputField(internationalizationConstants.newLabel() + " " + internationalizationConstants.instrument(),"+",null,null),
148            new InterfaceInputField(internationalizationConstants.newLabel() + " " + internationalizationConstants.telescopeOperator(), "+",null,null),
149            new InterfaceInputField(internationalizationConstants.newLabel() + " " + internationalizationConstants.dutyTechnician(),"+",null,null),
150            new InterfaceInputField(internationalizationConstants.newLabel() + " " + internationalizationConstants.supportAstronomer(),"+",null,null),
151            new InterfaceInputField(internationalizationConstants.newLabel() + " " + internationalizationConstants.system(), "+",null,null)
152        };
153        
154        /**
155         * This is the button which is to be used for resetting the password of a user 
156         */
157    
158        private Button ResetPasswordButton;
159        
160        /**
161         * This is the field into which the user will enter the details of
162         * the new password for a user
163         */
164    
165        final private PasswordTextBox PasswordField;
166    
167        /**
168         * This is the field into which the user will use to confirm the password
169         */
170    
171        final private PasswordTextBox PasswordConfirmField;
172        
173        /** 
174         * This is the list of users from which the user can select the
175         * name of the person who he wants to change the password for.
176         */
177    
178        final private ListBox UserToChangePwdList;
179    
180            
181        /**
182         * This is the button which will be pressed to generate a new user 
183         */
184    
185        private Button CreateNewUserButton;
186        
187        /**
188         * This is the text box which the user will use to enter the name
189         * of the new user to the system
190         */
191        
192        final private TextBox NameOfNewUser = new TextBox();
193    
194        /**
195         * This is the text box which the user will use to enter the surname
196         * of the new user to the system
197         */
198        
199        final private TextBox SurnameOfNewUser = new TextBox();
200    
201        /**
202         * This is the text box which the user will use to enter the email
203         * address of the new user to the system
204         */
205        
206        private TextBox MailAddressOfNewUser = new TextBox();
207        
208         /**
209         * This is the main panel into which we pack up all of the Widgets
210         * which comprise this form.
211         */
212        
213        final private HorizontalPanel mainPanel;
214    
215        /**
216         * This is used to create the panel which will be used by the
217         * manager of the system to manage the data
218         */
219        
220        ManageSystem (final TabPanel MainTabPanel,final FaultServiceAsync svc,final AuthenticationDetails UserAuthentication) {
221            
222            this.svc = svc;
223            this.UserAuthentication = UserAuthentication;
224            
225            mainPanel = new HorizontalPanel();
226            
227            final FlexTable table = new FlexTable();
228            final FlexCellFormatter formatter = (FlexCellFormatter)table.getCellFormatter();
229    
230            table.setWidth("98%");
231    
232            Label tempLabel;
233                        
234            tempLabel = new Label(internationalizationConstants.createNewOptions());
235            table.setWidget(0,0,tempLabel);
236            tempLabel.setStyleName("modifyFaultTitleLabel");
237            
238            formatter.setStyleName(0,0,"manageSystemTableBackground");
239            formatter.setColSpan(0,0,3);
240    
241            tempLabel.setWidth("98%");
242            
243            // Now add the labels and the buttons to the form. Note that
244            // we index the InterfaceInputFields variable here so be careful
245            // with the indexing
246            
247            for (int i = 0; i <= SYSTEMIDX; i++) {
248    
249                Label j;
250                
251                j = new Label(InterfaceInputFields[i].InputFieldLabel);
252                j.setStyleName("gwt-Label");
253    
254                table.setWidget(i+1,0,j);
255                
256                // Now create a button which will be used to perform the action 
257                
258                InterfaceInputFields[i].ButtonAcknowledgementWidget = new Button(InterfaceInputFields[i].AcknowledgementWidgetLabel,this);
259                InterfaceInputFields[i].ButtonAcknowledgementWidget.addStyleName("gwt-Label");
260    
261                // Store the button widget so we can work out when the
262                // user clicks on the button which button he actually
263                // pressed.
264    
265                table.setWidget(i+1,2,InterfaceInputFields[i].ButtonAcknowledgementWidget);
266            }
267    
268            // Now allow the user to enter the details of a new instrument 
269    
270            final TextBox newInstrument = new TextBox();
271            
272            newInstrument.setMaxLength(20);
273            newInstrument.setWidth("98%");
274            InterfaceInputFields[INSTRUMENTIDX].InputWidget = newInstrument;
275                    
276            table.setWidget(1,1,newInstrument);
277            
278            // Field which allows the user to create a new TO 
279            
280            final ListBox newTO = new ListBox();
281            newTO.setVisibleItemCount(1);
282            newTO.setName("NewTO");
283            newTO.setMultipleSelect(false);
284            newTO.setWidth("98%");
285            table.setWidget(2,1,newTO);
286            InterfaceInputFields[TELESCOPEOPERATORIDX].InputWidget = newTO;
287            setupDropDownList(new Integer(FaultDatabaseConstants.TELESCOPEOPERATOR),newTO);
288            
289            // Now create the new duty technician field 
290            
291            final ListBox newDE = new ListBox();
292            newDE.setVisibleItemCount(1);
293            newDE.setName("NewDE");
294            newDE.setMultipleSelect(false);
295            newDE.setWidth("98%");
296            table.setWidget(3,1,newDE);
297            InterfaceInputFields[DUTYTECHNICIANIDX].InputWidget = newDE;
298            setupDropDownList(new Integer(FaultDatabaseConstants.DUTYENGINEERS),newDE);
299                    
300            // Now create the new support astronomer field 
301    
302            final ListBox newSA = new ListBox();
303            newSA.setVisibleItemCount(1);
304            newSA.setName("NewDE");
305            newSA.setMultipleSelect(false);
306            newSA.setWidth("98%");
307            table.setWidget(4,1,newSA);
308            InterfaceInputFields[SUPPORTASTRONOMERIDX].InputWidget = newSA;
309            setupDropDownList(new Integer (FaultDatabaseConstants.SUPPORTASTRONOMERS),newSA);
310                    
311            // Now create the new system field 
312    
313            final TextBox newSystem = new TextBox();
314            newSystem.setName("NewSystem");
315            newSystem.setWidth("98%");
316            newSystem.setMaxLength(20);
317            table.setWidget(5,1,newSystem);
318            InterfaceInputFields[SYSTEMIDX].InputWidget = newSystem;
319                    
320            // Create a label which shows that the user can create a new
321            // user for the system
322            
323            tempLabel = new Label(internationalizationConstants.createNewUser());
324            tempLabel.setWidth("98%");
325            tempLabel.setStyleName("modifyFaultTitleLabel");
326                    
327            table.setWidget(7,0,tempLabel);
328            formatter.setStyleName(7,0,"manageSystemTableBackground");
329            formatter.setColSpan(7,0,3);
330    
331            // Now create the field which will allow the user to enter the name of the new user 
332            
333            tempLabel = new Label(internationalizationConstants.name());
334            tempLabel.setStyleName("gwt-Label");
335            tempLabel.setWidth("98%");
336            table.setWidget(8,0,tempLabel);
337    
338            NameOfNewUser.setMaxLength(30);
339            NameOfNewUser.setWidth("4cm");
340            table.setWidget(8,1,NameOfNewUser);                 
341                
342            // Now create the field which will allow the user to enter the surname of the new user 
343            
344            tempLabel = new Label(internationalizationConstants.surname());
345            tempLabel.setStyleName("gwt-Label");
346            tempLabel.setWidth("98%");
347            table.setWidget(9,0,tempLabel);
348            
349            SurnameOfNewUser.setMaxLength(30);
350            SurnameOfNewUser.setWidth("4cm");
351            table.setWidget(9,1,SurnameOfNewUser);              
352                
353            // Now create the field which will allow the user to enter the
354            // email address of the new user
355            
356            tempLabel = new Label(internationalizationConstants.emailAddress());
357            tempLabel.setStyleName("gwt-Label");
358            tempLabel.setWidth("98%");
359            table.setWidget(10,0,tempLabel);
360    
361            MailAddressOfNewUser.setMaxLength(30);
362            MailAddressOfNewUser.setWidth("4cm");
363            table.setWidget(10,1,MailAddressOfNewUser);                 
364    
365            // Now create a button which will create a new user when pressed 
366            
367            CreateNewUserButton = new Button(internationalizationConstants.createNewUser(),this);
368            
369            table.setWidget(10,2,CreateNewUserButton);
370    
371            // Now allow the sysadm to reset the password of a user 
372            
373            // Create a label which shows that the user can create a new 
374            
375            tempLabel = new Label(internationalizationConstants.resetPassword());
376            tempLabel.setWidth("98%");
377            tempLabel.setStyleName("modifyFaultTitleLabel");
378    
379            table.setWidget(11,0,tempLabel);        
380            formatter.setStyleName(11,0,"manageSystemTableBackground");
381            formatter.setColSpan(11,0,3);
382            
383            // Now give the user a chance of selecting the name of the
384            // person who needs his password changing
385            
386            tempLabel = new Label(internationalizationConstants.name());
387            tempLabel.setStyleName("gwt-Label");
388            tempLabel.setWidth("98%");
389            table.setWidget(12,0,tempLabel);
390            
391            UserToChangePwdList = new ListBox();    
392    
393            UserToChangePwdList.setVisibleItemCount(1);
394            UserToChangePwdList.setName("ChangeUserPassword");
395            UserToChangePwdList.setMultipleSelect(false);
396            UserToChangePwdList.setWidth("98%");
397            table.setWidget(12,1,UserToChangePwdList);
398            fillListBoxWithStaffMembers(UserToChangePwdList,null,false);
399    
400            // Now the password and password confirmation field 
401            
402            tempLabel = new Label(internationalizationConstants.newPassword());
403            tempLabel.setStyleName("gwt-Label");
404            tempLabel.setWidth("98%");
405            table.setWidget(13,0,tempLabel);
406            
407            PasswordField = new PasswordTextBox();  
408            PasswordField.setName("ChangeUserPassword");
409            PasswordField.setWidth("98%");
410            table.setWidget(13,1,PasswordField);
411    
412            // Now the field into which the user will confirm his password 
413    
414            tempLabel = new Label(internationalizationConstants.confirmPassword());
415            tempLabel.setStyleName("gwt-Label");
416            tempLabel.setWidth("98%");
417            table.setWidget(14,0,tempLabel);
418            
419            PasswordConfirmField = new PasswordTextBox();   
420            PasswordConfirmField.setName("ChangeUserPasswordConfirm");
421            PasswordConfirmField.setWidth("98%");
422            table.setWidget(14,1,PasswordConfirmField);
423    
424            // Now create a button which will reset the password when
425            // pressed
426            
427            ResetPasswordButton = new Button(internationalizationConstants.resetPassword(),this);
428            table.setWidget(14,2,ResetPasswordButton);
429                    
430            // Now add to the main panel 
431    
432            mainPanel.add(table);
433    
434            formatter.setWidth(0,1,"3cm");
435    
436            // Now add the panel to the tab bar 
437    
438            MainTabPanel.add(mainPanel,internationalizationConstants.manageSystem());
439        }    
440        
441        
442        /**
443         * Used to fill the drop down menu which contains a list of all of
444         * the people who are not in the group which is specified in the
445         * <b>GroupToExclude</b> parameter
446         * @param listBox This is the list into which we should put the staff members
447         */
448        
449        private void setupDropDownList (final Integer GroupToExclude, final ListBox listBox) {
450    
451            svc.getMembersOfStaffNotInGroup (GroupToExclude,new AsyncCallback() {
452                    
453                    /**
454                     * On success we enter the details of the telescope
455                     * operators into the list which was provided by the
456                     * caller
457                     */             
458                    
459                    public void onSuccess (final Object result) {
460                    
461                        listBox.clear();
462    
463                        final ArrayList temp = (ArrayList)result;
464                                        
465                        for (int i=0; i < temp.size(); i++) { 
466                            
467                            final Person person = (Person)temp.get(i);
468                            
469                            // Now add the name of the telescope operator
470                            // to the list
471    
472                            listBox.addItem(person.getName() + " " + person.getSurname(),person.getEmailAddress());
473                        }
474                    }
475                    
476                    public void onFailure (Throwable ex) {
477                        MessageBox.alert(internationalizationConstants.information(),"Unable to get the list of potential " + GroupToExclude + "s");
478                    }
479                });
480    
481        }
482        
483        /**
484         * Called when the user presses one of the buttons on the
485         * interface and requests the business associated with that button
486         * to be performed.
487         * @param sender This is the widget which is reponsible for the
488         * click event and we will use this to establish exactly what the
489         * user was trying to do with the interface.
490         */
491        
492        public void onClick(final Widget sender) {
493            
494            // Now we have to decide what button the user clicked on in
495            // the interface and then act accordingly
496    
497            if (sender.equals(InterfaceInputFields[INSTRUMENTIDX].ButtonAcknowledgementWidget)) {
498    
499                // The user wants to add a new instrument to the system 
500    
501                addNewInstrumentToSystem();
502                
503            } else if (sender.equals(InterfaceInputFields[TELESCOPEOPERATORIDX].ButtonAcknowledgementWidget)) {
504                
505                // The user wants to add a new TO to the system 
506                
507                createNewRoleForUser(TELESCOPEOPERATORIDX,new Integer(FaultDatabaseConstants.TELESCOPEOPERATOR),internationalizationConstants.telescopeOperator());
508                        
509            } else if (sender.equals(InterfaceInputFields[DUTYTECHNICIANIDX].ButtonAcknowledgementWidget)) {
510    
511                // The user wants to add a new duty technician to the system 
512    
513                createNewRoleForUser(DUTYTECHNICIANIDX,new Integer(FaultDatabaseConstants.DUTYENGINEERS),internationalizationConstants.dutyTechnician());
514                        
515            } else if (sender.equals(InterfaceInputFields[SUPPORTASTRONOMERIDX].ButtonAcknowledgementWidget)) {
516    
517                // The user wants to add a new support astronomer to the system 
518                
519                createNewRoleForUser(SUPPORTASTRONOMERIDX,new Integer(FaultDatabaseConstants.SUPPORTASTRONOMERS),internationalizationConstants.supportAstronomer());
520                        
521                        
522            } else if (sender.equals(InterfaceInputFields[SYSTEMIDX].ButtonAcknowledgementWidget)) {
523    
524                // The user wants to add a new systen to the system 
525                
526                addNewSystemToSystem();
527                
528            } else if (sender.equals(ResetPasswordButton)) {
529    
530                // The user wants to reset the password of a user 
531                
532                resetPasswordForUser();
533                
534            } else if (sender.equals(CreateNewUserButton)) {
535    
536                // The user wants to add a new user to the system
537                
538                createNewUser();
539            }
540        }
541        
542        /**
543         * This is a callback which is attached to the reset password
544         * button which will permit the manager to reset the password of a
545         * user
546         */
547        
548        private void resetPasswordForUser() {
549    
550            // Verify that all of the fields have been filled in 
551            
552            final String password          = PasswordField.getText();
553            final String confirmedPassword = PasswordConfirmField.getText();
554            final String emailAddress      = UserToChangePwdList.getValue(UserToChangePwdList.getSelectedIndex()); 
555            final String fullName          = UserToChangePwdList.getItemText(UserToChangePwdList.getSelectedIndex());
556            
557            // Ensure that the user has filled in all of the fields in this section 
558    
559            if (password.equalsIgnoreCase("")) {
560                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.userPassword())); 
561                return;
562            } 
563    
564            if (confirmedPassword.equalsIgnoreCase("")) {
565                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.confirmPassword())); 
566                return;
567            }
568            
569            if (emailAddress.equalsIgnoreCase("")) {
570                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.emailAddress())); 
571                return;
572            }
573            
574            // Check that the two passwords are the same 
575    
576            if (!confirmedPassword.equals(password)) {
577                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.passwordMismatch());
578                return;
579            }
580            
581            
582            // Now we can reset the password which is associated with this user 
583            
584            MessageBox.confirm(internationalizationConstants.confirm(),internationalizationConstants.areYouSureYouWantToResetThisPassword(fullName),new MessageBox.ConfirmCallback() {
585                    
586                    public void execute(String btnID) {
587            
588                        if ("yes".equals(btnID)) {
589    
590                            // Now execute the action of the servlet 
591            
592                            svc.resetPassword (emailAddress,confirmedPassword,new AsyncCallback() {
593                                    
594                                    public void onSuccess (final Object result) {
595                                        
596                                        // Reset the input fields 
597                                        
598                                        PasswordField.setText("");
599                                        PasswordConfirmField.setText("");
600                                    }
601                                    
602                                    public void onFailure (Throwable ex) {
603                                        MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.unableToResetPassword(fullName));
604                                    }
605                                });
606                        }
607                    }
608                });
609        }
610        
611        
612        /**
613         * This will add a new user to the system. The user must have
614         * filled in the name, surname and email fields in the form for
615         * this to happen.
616         */
617        
618        private void createNewUser() {
619            
620            // First we need to check that the user has filled in all of
621            // the fields which he is expected to fill in
622            
623            final String name           = NameOfNewUser.getText();
624            final String surname        = SurnameOfNewUser.getText();
625            final String emailAddress   = MailAddressOfNewUser.getText();
626    
627            // Ensure that the user has filled in the name, surname and the email fields of the form 
628    
629            if (name.equalsIgnoreCase("")) {
630                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.name())); 
631                return;
632            } 
633    
634            if (surname.equalsIgnoreCase("")) {
635                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.surname())); 
636                return;
637            }
638            
639            if (emailAddress.equalsIgnoreCase("")) {
640                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.emailAddress())); 
641                return;
642            }
643            
644            // Verify that the email address is a valid email address 
645            
646            if (!emailAddress.matches("(\\w+)@(\\w+\\.)(\\w+)(\\.\\w+)*")) {
647                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.invalidEmailAddress());
648                return;
649            }
650                                                      
651            // Now call the servlet to add the details of the new user to
652            // the system
653            
654            svc.addNewUser (name,surname,emailAddress,new AsyncCallback() {
655                    
656                    public void onSuccess (final Object result) {
657    
658                        // Reset the input fields 
659    
660                        NameOfNewUser.setText("");
661                        SurnameOfNewUser.setText("");
662                        MailAddressOfNewUser.setText("");
663                        
664                        // Now reset the listbox fields to include the
665                        // details of the new user which has been added
666                        
667                        setupDropDownList(new Integer(FaultDatabaseConstants.TELESCOPEOPERATOR),(ListBox)InterfaceInputFields[TELESCOPEOPERATORIDX].InputWidget);
668                        setupDropDownList(new Integer(FaultDatabaseConstants.DUTYENGINEERS),(ListBox)InterfaceInputFields[DUTYTECHNICIANIDX].InputWidget);
669                        setupDropDownList(new Integer (FaultDatabaseConstants.SUPPORTASTRONOMERS),(ListBox)InterfaceInputFields[SUPPORTASTRONOMERIDX].InputWidget);                         
670    
671                        // Now update the list of users in the reset password list 
672    
673                        fillListBoxWithStaffMembers(UserToChangePwdList,null,false);                
674    
675                        MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.newUserAdded(name,surname));
676                    }
677                    
678                    public void onFailure (Throwable ex) {
679                        MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.unableToAddNewUser());
680                    }
681                });
682        }
683        
684        /**
685         * Creates a new instrument in the system after first ensuring
686         * that the user has filled in the field correctly.
687         */
688        
689        private void addNewInstrumentToSystem () {
690            
691            // Establish that the user has entered something sensible in
692            // the instrument field
693            
694            final TextBox inputField  = (TextBox)InterfaceInputFields[INSTRUMENTIDX].InputWidget;
695    
696            final String newInstrument = inputField.getText();
697            
698            // Check that here has been something put into the field 
699    
700            if (newInstrument.equalsIgnoreCase("")) {
701                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.newInstrument()));
702                return;
703            }
704            
705            svc.addNewInstrumentToSystem (newInstrument,new AsyncCallback() {
706                    
707                    public void onSuccess (final Object result) {
708                        MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.newFieldAdded(newInstrument));
709                        inputField.setText("");
710                    }
711                    
712                    public void onFailure (Throwable ex) {
713                        MessageBox.alert(internationalizationConstants.information(),"Unable to add new instrument to the system");
714                    }
715                });
716    
717        }
718    
719        /**
720         * Creates a new system in the system after first ensuring
721         * that the user has filled in the field correctly.
722         */
723        
724        private void addNewSystemToSystem () {
725            
726            // Establish that the user has entered something sensible in
727            // the system field
728    
729            final TextBox inputField = (TextBox)InterfaceInputFields[SYSTEMIDX].InputWidget;
730    
731            final String newSystem = inputField.getText();
732            
733            // Check that here has been something put into the field 
734            
735            if (newSystem.equalsIgnoreCase("")) {
736                MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.textFieldEmpty(internationalizationConstants.newSystem()));
737                return;                 
738            }
739            
740            svc.addNewSystemToSystem (newSystem,new AsyncCallback() {
741                    
742                    public void onSuccess (final Object result) {
743                        MessageBox.alert(internationalizationConstants.information(),internationalizationConstants.newFieldAdded(newSystem));
744                        inputField.setText("");                                 
745                    }
746                    
747                    public void onFailure (Throwable ex) {
748                        MessageBox.alert(internationalizationConstants.information(),"Unable to add new system to the system");
749                    }
750                });
751    
752        }
753        
754        /**
755         * Creates a new role for a user. This will be used to add the use
756         * to the list of support astronomers, TOs etc. Calls the servlet
757         * which will add the user to the role.
758         * <P>
759         * @param WidgetIndex This is the index into the array which contains the drop down listboxes with the names of the potential members of the roles. 
760         * @param Role This is the role into which he will be placed i.e. Support astronomer, TO etc. 
761         * @param RoleDescription This is the description of the role in
762         * natural language expressed in the language of the current
763         * locale. 
764         */
765         
766        private void createNewRoleForUser (final int WidgetIndex, final Integer Role,final String RoleDescription) {
767            
768            // Fetch the email address of the person that is to be added
769            // to the new role from the drop down menu
770            
771            final ListBox temp = (ListBox)InterfaceInputFields[WidgetIndex].InputWidget;
772    
773            final String usersName = temp.getItemText(temp.getSelectedIndex());
774            
775            final String emailAddress = temp.getValue(temp.getSelectedIndex());
776    
777            // Ask the user if he is sure that he wants to do this before we go ahead 
778    
779            MessageBox.confirm(internationalizationConstants.confirm(),internationalizationConstants.areYouSureYouWantToAddUserToThisRole(usersName,RoleDescription + "s"),new MessageBox.ConfirmCallback() {
780                    
781                    public void execute(String btnID) {
782    
783                        // If the user pressed yes 
784    
785                        if ("yes".equals(btnID)) {
786                            
787                            // Now make a call to the servlet to ask it to add the user to
788                            // the role.
789                            
790                            svc.addNewRole (emailAddress,Role,new AsyncCallback() {
791                    
792                                    public void onSuccess (final Object result) {
793                                        
794                                        // Now we need to rebuild the list in the manage
795                                        // system interface to exclude the user which has
796                                        // just been added to the list
797                                        
798                                        switch (Role.intValue()) { 
799                            
800                                        case FaultDatabaseConstants.TELESCOPEOPERATOR : 
801                                            setupDropDownList(new Integer(FaultDatabaseConstants.TELESCOPEOPERATOR),(ListBox)InterfaceInputFields[TELESCOPEOPERATORIDX].InputWidget);
802                                            break;
803    
804                                        case FaultDatabaseConstants.DUTYENGINEERS : 
805                                            setupDropDownList(new Integer(FaultDatabaseConstants.DUTYENGINEERS),(ListBox)InterfaceInputFields[DUTYTECHNICIANIDX].InputWidget);
806                                            break;
807    
808                                        case FaultDatabaseConstants.SUPPORTASTRONOMERS : 
809                                            setupDropDownList(new Integer (FaultDatabaseConstants.SUPPORTASTRONOMERS),(ListBox)InterfaceInputFields[SUPPORTASTRONOMERIDX].InputWidget);                             
810                                            break;
811                                        }
812                        
813                                    }
814                    
815                                    public void onFailure (Throwable ex) {
816                                        MessageBox.alert(internationalizationConstants.information(),"Unable to add user " + emailAddress + " to role");
817                                    }
818                                });
819                        }
820                    }
821                });
822        }
823    }
824    
825