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"