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"