001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.server.ldap.gui;
021
022
023 import java.awt.BorderLayout;
024 import java.awt.Component;
025 import java.awt.Dimension;
026 import java.awt.Point;
027 import java.awt.Toolkit;
028 import java.awt.event.WindowAdapter;
029 import java.awt.event.WindowEvent;
030 import java.io.IOException;
031 import java.util.ArrayList;
032 import java.util.List;
033
034 import javax.swing.JOptionPane;
035 import javax.swing.JPanel;
036 import javax.swing.JFrame;
037 import javax.swing.JScrollPane;
038 import javax.swing.JTable;
039 import javax.swing.JButton;
040 import javax.swing.BoxLayout;
041 import javax.swing.JTextField;
042 import javax.swing.JMenuBar;
043 import javax.swing.JMenu;
044 import javax.swing.JMenuItem;
045 import javax.swing.event.ListSelectionEvent;
046 import javax.swing.event.ListSelectionListener;
047
048 import org.apache.directory.server.i18n.I18n;
049 import org.apache.directory.server.ldap.LdapServer;
050 import org.apache.directory.server.ldap.LdapSession;
051 import org.apache.directory.server.ldap.handlers.extended.GracefulShutdownHandler;
052 import org.apache.directory.shared.ldap.message.extended.GracefulDisconnect;
053 import org.apache.directory.shared.ldap.message.extended.NoticeOfDisconnect;
054 import org.apache.mina.core.future.CloseFuture;
055 import org.apache.mina.core.future.WriteFuture;
056 import org.apache.mina.core.service.IoAcceptor;
057 import org.apache.mina.core.service.IoHandler;
058 import org.apache.mina.core.session.IoSession;
059
060 import org.slf4j.Logger;
061 import org.slf4j.LoggerFactory;
062
063
064 public class SessionsFrame extends JFrame
065 {
066 private static final Logger LOG = LoggerFactory.getLogger( SessionsFrame.class );
067 private static final long serialVersionUID = -863445561454536133L;
068 private static final String REFRESH_COMMAND = "Refresh";
069
070 boolean isServiceBound = true;
071 private IoSession requestor;
072 private IoHandler ldapProvider;
073 private JPanel jContentPane;
074 private JPanel mainPanel;
075 private JScrollPane sessionsPane;
076 private JTable sessionsTable;
077 private JPanel filterPanel;
078 private JButton filterButton;
079 private JTextField filterText;
080 private JMenuBar menuBar;
081 private JMenu menuFile;
082 private JMenuItem exitItem;
083 private JMenu menuSession;
084 private JMenuItem closeItem;
085 private JMenu menuSendNoD;
086 private JMenuItem unavailableItem;
087 private JMenuItem protocolErrorItem;
088 private JMenuItem strongAuthRequiredItem;
089 private JPanel southPanel;
090 private JMenuItem showRequests;
091 private JButton refreshButton;
092
093 private LdapSession selected;
094 private JMenuItem unbindItem;
095 private JMenuItem bindItem;
096 private LdapServer ldapServer;
097
098
099 /**
100 * This is the default constructor
101 * @param ldapServer the session registry
102 */
103 public SessionsFrame( LdapServer ldapServer )
104 {
105 super();
106 this.ldapServer = ldapServer;
107 initialize();
108 }
109
110
111 /**
112 * This method initializes this
113 */
114 private void initialize()
115 {
116 this.setSize( 789, 436 );
117 this.setJMenuBar( getMainMenuBar() );
118 this.setContentPane( getJContentPane() );
119 this.setTitle( "Sessions" );
120 this.addWindowListener( new java.awt.event.WindowAdapter()
121 {
122 public void windowClosing( java.awt.event.WindowEvent e )
123 {
124 SessionsFrame.this.setVisible( false );
125 SessionsFrame.this.dispose();
126 }
127 } );
128 }
129
130
131 /**
132 * This method initializes jContentPane
133 *
134 * @return javax.swing.JPanel
135 */
136 private JPanel getJContentPane()
137 {
138 if ( jContentPane == null )
139 {
140 jContentPane = new JPanel();
141 jContentPane.setLayout( new BorderLayout() );
142 jContentPane.add( getMainPanel(), java.awt.BorderLayout.CENTER );
143 }
144 return jContentPane;
145 }
146
147
148 /**
149 * This method initializes jPanel
150 *
151 * @return javax.swing.JPanel
152 */
153 private JPanel getMainPanel()
154 {
155 if ( mainPanel == null )
156 {
157 mainPanel = new JPanel();
158 mainPanel.setLayout( new BorderLayout() );
159 mainPanel.add( getFilterPanel(), java.awt.BorderLayout.NORTH );
160 mainPanel.add( getSessionsPane(), java.awt.BorderLayout.CENTER );
161 mainPanel.add( getSouthPanel(), java.awt.BorderLayout.SOUTH );
162 }
163 return mainPanel;
164 }
165
166
167 /**
168 * This method initializes jScrollPane
169 *
170 * @return javax.swing.JScrollPane
171 */
172 private JScrollPane getSessionsPane()
173 {
174 if ( sessionsPane == null )
175 {
176 sessionsPane = new JScrollPane();
177 sessionsPane.setName( "jScrollPane" );
178 sessionsPane.setViewportView( getSessionsTable() );
179 }
180 return sessionsPane;
181 }
182
183
184 /**
185 * This method initializes jTable
186 *
187 * @return javax.swing.JTable
188 */
189 private JTable getSessionsTable()
190 {
191 if ( sessionsTable == null )
192 {
193 sessionsTable = new JTable();
194 sessionsTable.setSelectionMode( javax.swing.ListSelectionModel.SINGLE_SELECTION );
195 sessionsTable.setModel( new SessionsModel( ldapServer.getLdapSessionManager().getSessions() ) );
196 sessionsTable.getSelectionModel().addListSelectionListener( new ListSelectionListener()
197 {
198 public void valueChanged( ListSelectionEvent e )
199 {
200 int row = sessionsTable.getSelectedRow();
201 if ( row == -1 )
202 {
203 selected = null;
204 }
205 else
206 {
207 selected = ( ( SessionsModel ) sessionsTable.getModel() ).getLdapSession( row );
208 closeItem.setEnabled( true );
209 menuSendNoD.setEnabled( true );
210 showRequests.setEnabled( true );
211 }
212 }
213 } );
214 }
215 return sessionsTable;
216 }
217
218
219 /**
220 * This method initializes jPanel
221 *
222 * @return javax.swing.JPanel
223 */
224 private JPanel getFilterPanel()
225 {
226 if ( filterPanel == null )
227 {
228 filterPanel = new JPanel();
229 filterPanel.setLayout( new BoxLayout( getFilterPanel(), BoxLayout.X_AXIS ) );
230 filterPanel.setBorder( javax.swing.BorderFactory
231 .createEtchedBorder( javax.swing.border.EtchedBorder.RAISED ) );
232 filterPanel.add( getFilterButton(), null );
233 filterPanel.add( getFilterText(), null );
234 }
235 return filterPanel;
236 }
237
238
239 /**
240 * This method initializes jButton
241 *
242 * @return javax.swing.JButton
243 */
244 private JButton getFilterButton()
245 {
246 if ( filterButton == null )
247 {
248 filterButton = new JButton();
249 filterButton.setText( "Filter" );
250 }
251 return filterButton;
252 }
253
254
255 /**
256 * This method initializes jTextField
257 *
258 * @return javax.swing.JTextField
259 */
260 private JTextField getFilterText()
261 {
262 if ( filterText == null )
263 {
264 filterText = new JTextField();
265 }
266 return filterText;
267 }
268
269
270 /**
271 * This method initializes jJMenuBar
272 *
273 * @return javax.swing.JMenuBar
274 */
275 private JMenuBar getMainMenuBar()
276 {
277 if ( menuBar == null )
278 {
279 menuBar = new JMenuBar();
280 menuBar.add( getMenuFile() );
281 menuBar.add( getMenuSession() );
282 }
283 return menuBar;
284 }
285
286
287 /**
288 * This method initializes jMenu
289 *
290 * @return javax.swing.JMenu
291 */
292 private JMenu getMenuFile()
293 {
294 if ( menuFile == null )
295 {
296 menuFile = new JMenu();
297 menuFile.setText( "File" );
298 menuFile.add( getExitItem() );
299 }
300 return menuFile;
301 }
302
303
304 /**
305 * This method initializes jMenuItem
306 *
307 * @return javax.swing.JMenuItem
308 */
309 private JMenuItem getExitItem()
310 {
311 if ( exitItem == null )
312 {
313 exitItem = new JMenuItem();
314 exitItem.setText( "exit" );
315 exitItem.addActionListener( new java.awt.event.ActionListener()
316 {
317 public void actionPerformed( java.awt.event.ActionEvent e )
318 {
319 SessionsFrame.this.setVisible( false );
320 SessionsFrame.this.dispose();
321 }
322 } );
323 }
324 return exitItem;
325 }
326
327
328 /**
329 * This method initializes jMenu
330 *
331 * @return javax.swing.JMenu
332 */
333 private JMenu getMenuSession()
334 {
335 if ( menuSession == null )
336 {
337 menuSession = new JMenu();
338 menuSession.setText( "Session" );
339 menuSession.add( getCloseItem() );
340 closeItem.setEnabled( false );
341 menuSession.add( getMenuSendNoD() );
342 menuSendNoD.setEnabled( false );
343 menuSession.add( getShowRequests() );
344 menuSession.add( getUnbindItem() );
345 menuSession.add( getBindItem() );
346 showRequests.setEnabled( false );
347 }
348 return menuSession;
349 }
350
351
352 /**
353 * This method initializes jMenuItem
354 *
355 * @return javax.swing.JMenuItem
356 */
357 private JMenuItem getCloseItem()
358 {
359 if ( closeItem == null )
360 {
361 closeItem = new JMenuItem();
362 closeItem.setText( "close" );
363 closeItem.addActionListener( new java.awt.event.ActionListener()
364 {
365 public void actionPerformed( java.awt.event.ActionEvent e )
366 {
367 ldapServer.getLdapSessionManager().removeLdapSession( selected.getIoSession() );
368 try
369 {
370 Thread.sleep( 250 );
371 }
372 catch ( InterruptedException e1 )
373 {
374 LOG.error( "", e1 );
375 }
376 refresh();
377 }
378 } );
379 }
380 return closeItem;
381 }
382
383
384 /**
385 * This method initializes jMenu
386 *
387 * @return javax.swing.JMenu
388 */
389 private JMenu getMenuSendNoD()
390 {
391 if ( menuSendNoD == null )
392 {
393 menuSendNoD = new JMenu();
394 menuSendNoD.setText( "Send NoD" );
395 menuSendNoD.add( getUnavailableItem() );
396 menuSendNoD.add( getProtocolErrorItem() );
397 menuSendNoD.add( getStrongAuthRequiredItem() );
398 }
399 return menuSendNoD;
400 }
401
402
403 /**
404 * This method initializes jMenuItem
405 *
406 * @return javax.swing.JMenuItem
407 */
408 private JMenuItem getUnavailableItem()
409 {
410 if ( unavailableItem == null )
411 {
412 unavailableItem = new JMenuItem();
413 unavailableItem.setText( "unavailable" );
414 unavailableItem.addActionListener( new java.awt.event.ActionListener()
415 {
416 public void actionPerformed( java.awt.event.ActionEvent e )
417 {
418 selected.getIoSession().write( NoticeOfDisconnect.UNAVAILABLE );
419 try
420 {
421 Thread.sleep( 250 );
422 }
423 catch ( InterruptedException e1 )
424 {
425 LOG.error( "", e1 );
426 }
427 refresh();
428 }
429 } );
430 }
431 return unavailableItem;
432 }
433
434
435 /**
436 * This method initializes jMenuItem
437 *
438 * @return javax.swing.JMenuItem
439 */
440 private JMenuItem getProtocolErrorItem()
441 {
442 if ( protocolErrorItem == null )
443 {
444 protocolErrorItem = new JMenuItem();
445 protocolErrorItem.setText( "protocolError" );
446 protocolErrorItem.addActionListener( new java.awt.event.ActionListener()
447 {
448 public void actionPerformed( java.awt.event.ActionEvent e )
449 {
450 selected.getIoSession().write( NoticeOfDisconnect.PROTOCOLERROR );
451 try
452 {
453 Thread.sleep( 250 );
454 }
455 catch ( InterruptedException e1 )
456 {
457 LOG.error( "", e1 );
458 }
459 refresh();
460 }
461 } );
462 }
463 return protocolErrorItem;
464 }
465
466
467 /**
468 * This method initializes jMenuItem
469 *
470 * @return javax.swing.JMenuItem
471 */
472 private JMenuItem getStrongAuthRequiredItem()
473 {
474 if ( strongAuthRequiredItem == null )
475 {
476 strongAuthRequiredItem = new JMenuItem();
477 strongAuthRequiredItem.setText( "strongAuthRequired" );
478 strongAuthRequiredItem.addActionListener( new java.awt.event.ActionListener()
479 {
480 public void actionPerformed( java.awt.event.ActionEvent e )
481 {
482 WriteFuture future = selected.getIoSession().write( NoticeOfDisconnect.STRONGAUTHREQUIRED );
483 try
484 {
485 future.awaitUninterruptibly( 1000L );
486 CloseFuture cfuture = selected.getIoSession().close( true );
487 cfuture.awaitUninterruptibly( 1000L );
488 }
489 catch ( Exception e1 )
490 {
491 LOG.error( "", e1 );
492 }
493 refresh();
494 }
495 } );
496 }
497 return strongAuthRequiredItem;
498 }
499
500
501 // /**
502 // * This method initializes jPopupMenu
503 // *
504 // * @return javax.swing.JPopupMenu
505 // */
506 // private JPopupMenu getSessionsPopupMenu()
507 // {
508 // if ( popupMenu == null )
509 // {
510 // popupMenu = new JPopupMenu();
511 // popupMenu.add(getJMenuItem());
512 // popupMenu.add(getJMenu());
513 // popupMenu.add(getJMenuItem4());
514 // }
515 // return popupMenu;
516 // }
517
518 /**
519 * This method initializes jPanel
520 *
521 * @return javax.swing.JPanel
522 */
523 private JPanel getSouthPanel()
524 {
525 if ( southPanel == null )
526 {
527 southPanel = new JPanel();
528 southPanel
529 .setBorder( javax.swing.BorderFactory.createEtchedBorder( javax.swing.border.EtchedBorder.RAISED ) );
530 southPanel.add( getRefreshButton(), null );
531 }
532 return southPanel;
533 }
534
535
536 /**
537 * This method initializes jMenuItem
538 *
539 * @return javax.swing.JMenuItem
540 */
541 private JMenuItem getShowRequests()
542 {
543 if ( showRequests == null )
544 {
545 showRequests = new JMenuItem();
546 showRequests.setText( "show requests" );
547 showRequests.addActionListener( new java.awt.event.ActionListener()
548 {
549 public void actionPerformed( java.awt.event.ActionEvent e )
550 {
551 OutstandingRequestsDialog dialog =
552 new OutstandingRequestsDialog( SessionsFrame.this, selected, ldapServer );
553 dialog.addWindowListener( new WindowAdapter()
554 {
555 public void windowClosed( WindowEvent e )
556 {
557 e.getWindow().dispose();
558 }
559 } );
560 dialog.setVisible( true );
561 }
562 } );
563 }
564 return showRequests;
565 }
566
567
568 // /**
569 // * This method initializes jMenuItem
570 // *
571 // * @return javax.swing.JMenuItem
572 // */
573 // private JMenuItem getJMenuItem()
574 // {
575 // if ( jMenuItem == null )
576 // {
577 // jMenuItem = new JMenuItem();
578 // jMenuItem.setText("close");
579 // }
580 // return jMenuItem;
581 // }
582 //
583 //
584 // /**
585 // * This method initializes jMenu
586 // *
587 // * @return javax.swing.JMenu
588 // */
589 // private JMenu getJMenu()
590 // {
591 // if ( jMenu == null )
592 // {
593 // jMenu = new JMenu();
594 // jMenu.setText("Send NoD");
595 // jMenu.add(getJMenuItem1());
596 // jMenu.add(getJMenuItem2());
597 // jMenu.add(getJMenuItem3());
598 // }
599 // return jMenu;
600 // }
601 //
602 //
603 // /**
604 // * This method initializes jMenuItem1
605 // *
606 // * @return javax.swing.JMenuItem
607 // */
608 // private JMenuItem getJMenuItem1()
609 // {
610 // if ( jMenuItem1 == null )
611 // {
612 // jMenuItem1 = new JMenuItem();
613 // jMenuItem1.setText("unavailable");
614 // }
615 // return jMenuItem1;
616 // }
617 //
618 //
619 // /**
620 // * This method initializes jMenuItem2
621 // *
622 // * @return javax.swing.JMenuItem
623 // */
624 // private JMenuItem getJMenuItem2()
625 // {
626 // if ( jMenuItem2 == null )
627 // {
628 // jMenuItem2 = new JMenuItem();
629 // jMenuItem2.setText("protocolError");
630 // }
631 // return jMenuItem2;
632 // }
633 //
634 //
635 // /**
636 // * This method initializes jMenuItem3
637 // *
638 // * @return javax.swing.JMenuItem
639 // */
640 // private JMenuItem getJMenuItem3()
641 // {
642 // if ( jMenuItem3 == null )
643 // {
644 // jMenuItem3 = new JMenuItem();
645 // jMenuItem3.setText("strongAuthRequired");
646 // }
647 // return jMenuItem3;
648 // }
649 //
650 //
651 // /**
652 // * This method initializes jMenuItem4
653 // *
654 // * @return javax.swing.JMenuItem
655 // */
656 // private JMenuItem getJMenuItem4()
657 // {
658 // if ( jMenuItem4 == null )
659 // {
660 // jMenuItem4 = new JMenuItem();
661 // jMenuItem4.setText("show requests");
662 // }
663 // return jMenuItem4;
664 // }
665
666 /**
667 * This method initializes jButton2
668 *
669 * @return javax.swing.JButton
670 */
671 private JButton getRefreshButton()
672 {
673 if ( refreshButton == null )
674 {
675 refreshButton = new JButton();
676 refreshButton.setText( REFRESH_COMMAND );
677 refreshButton.addActionListener( new java.awt.event.ActionListener()
678 {
679 public void actionPerformed( java.awt.event.ActionEvent e )
680 {
681 if ( e.getActionCommand().equals( REFRESH_COMMAND ) )
682 {
683 refresh();
684 }
685 }
686 } );
687 }
688 return refreshButton;
689 }
690
691
692 private void refresh()
693 {
694 LOG.info( "Refreshing Sessions UI" );
695 sessionsTable.setModel( new SessionsModel( ldapServer.getLdapSessionManager().getSessions() ) );
696 closeItem.setEnabled( false );
697 menuSendNoD.setEnabled( false );
698 showRequests.setEnabled( false );
699 unbindItem.setEnabled( isServiceBound );
700 bindItem.setEnabled( !isServiceBound );
701 }
702
703 public void setRequestor( IoSession requestor )
704 {
705 this.requestor = requestor;
706 }
707
708 /**
709 * This method initializes jMenuItem
710 *
711 * @return javax.swing.JMenuItem
712 */
713 private JMenuItem getUnbindItem()
714 {
715 if ( unbindItem == null )
716 {
717 unbindItem = new JMenuItem();
718 unbindItem.setText( "Unbind Service" );
719 unbindItem.setEnabled( isServiceBound );
720 unbindItem.addActionListener( new java.awt.event.ActionListener()
721 {
722 public void actionPerformed( java.awt.event.ActionEvent e )
723 {
724 int input = JOptionPane.showConfirmDialog( SessionsFrame.this,
725 "Selecting no will send a notice of disconnect ONLY. "
726 + "\nSelecting yes will send both. Cancel will abort unbind.",
727 "Send graceful disconnect before disconnect notice?", JOptionPane.YES_NO_CANCEL_OPTION );
728 IoAcceptor acceptor = ( IoAcceptor ) requestor.getService();
729 List<IoSession> sessions = new ArrayList<IoSession>(
730 acceptor.getManagedSessions().values() );
731
732 if ( input == JOptionPane.CANCEL_OPTION )
733 {
734 }
735 else if ( input == JOptionPane.NO_OPTION )
736 {
737 GracefulShutdownHandler.sendNoticeOfDisconnect( sessions, requestor );
738 acceptor.unbind( requestor.getServiceAddress() );
739 isServiceBound = false;
740 unbindItem.setEnabled( isServiceBound );
741 bindItem.setEnabled( !isServiceBound );
742 JOptionPane.showMessageDialog( SessionsFrame.this, "Ldap service for "
743 + requestor.getLocalAddress() + " has been successfully unbound.", "Success!",
744 JOptionPane.INFORMATION_MESSAGE );
745 refresh();
746 }
747 else
748 {
749 ShutdownDialog dialog = new ShutdownDialog();
750 setCenteredPosition( SessionsFrame.this, dialog );
751 dialog.setModal( true );
752 dialog.setVisible( true );
753
754 if ( dialog.isSendCanceled() )
755 {
756 LOG.debug( "GracefulShutdown was canceled." );
757 JOptionPane.showMessageDialog( SessionsFrame.this, "Shutdown has been canceled.",
758 "Graceful Shutdown Aborted", JOptionPane.OK_OPTION );
759 return;
760 }
761
762 LOG.debug( "GracefulShutdown parameters captured." );
763 int timeOffline = dialog.getTimeOffline();
764 int delay = dialog.getDelay();
765 GracefulDisconnect graceful = new GracefulDisconnect( timeOffline, delay );
766 GracefulShutdownHandler.sendGracefulDisconnect( sessions, graceful, requestor );
767 acceptor.unbind( requestor.getServiceAddress() );
768 isServiceBound = false;
769 unbindItem.setEnabled( isServiceBound );
770 bindItem.setEnabled( !isServiceBound );
771
772 // do progress dialog with bypass button to wait for delay time
773 if ( delay > 0 )
774 {
775 ShutdownProgress progress = new ShutdownProgress();
776 setCenteredPosition( SessionsFrame.this, progress );
777 progress.setModal( true );
778 progress.setTime( delay * 1000 );
779 Thread t = new Thread( progress );
780 t.start();
781 progress.setVisible( true );
782 }
783
784 // now send the notice of disconnect
785 GracefulShutdownHandler.sendNoticeOfDisconnect( sessions, requestor );
786 JOptionPane.showMessageDialog( SessionsFrame.this, "Ldap service for "
787 + requestor.getLocalAddress() + " has been successfully unbound.", "Success!",
788 JOptionPane.OK_OPTION );
789 refresh();
790 }
791 }
792 } );
793 }
794 return unbindItem;
795 }
796
797
798 private void setCenteredPosition( JFrame frame, Component comp )
799 {
800 Point pt = new Point();
801 Toolkit tk = Toolkit.getDefaultToolkit();
802 Dimension screenSize = tk.getScreenSize();
803 pt.x = ( screenSize.width - frame.getWidth() ) / 2;
804 pt.y = ( screenSize.height - frame.getHeight() ) / 2;
805
806 pt.x += ( frame.getWidth() - comp.getWidth() ) / 2;
807 pt.y += ( frame.getHeight() - comp.getHeight() ) / 2;
808 comp.setLocation( pt );
809 }
810
811
812 /**
813 * This method initializes jMenuItem
814 *
815 * @return javax.swing.JMenuItem
816 */
817 private JMenuItem getBindItem()
818 {
819 if ( bindItem == null )
820 {
821 bindItem = new JMenuItem();
822 bindItem.setText( "Bind Service" );
823 unbindItem.setEnabled( !isServiceBound );
824 bindItem.addActionListener( new java.awt.event.ActionListener()
825 {
826 public void actionPerformed( java.awt.event.ActionEvent e )
827 {
828 try
829 {
830 ( ( IoAcceptor ) requestor.getService() ).setHandler( getLdapProvider() );
831 ( ( IoAcceptor ) requestor.getService() ).bind( requestor.getServiceAddress() );
832 JOptionPane.showMessageDialog( SessionsFrame.this, "Ldap service " + requestor.getServiceAddress()
833 + " has been successfully bound.\n" + " Clients may now connect to the server once again.",
834 "Success!", JOptionPane.INFORMATION_MESSAGE );
835 isServiceBound = true;
836 unbindItem.setEnabled( isServiceBound );
837 bindItem.setEnabled( !isServiceBound );
838 }
839 catch ( IOException e1 )
840 {
841 LOG.error( I18n.err( I18n.ERR_158 ), e1 );
842 JOptionPane.showMessageDialog( SessionsFrame.this, e1.getLocalizedMessage(), "Error encountered!",
843 JOptionPane.ERROR_MESSAGE );
844 }
845 }
846 } );
847 }
848 return bindItem;
849 }
850
851
852 public void setLdapProvider( IoHandler ldapProvider )
853 {
854 this.ldapProvider = ldapProvider;
855 }
856
857
858 public IoHandler getLdapProvider()
859 {
860 return ldapProvider;
861 }
862 } // @jve:decl-index=0:visual-constraint="10,10"