Package org.apache.directory.server.ldap.gui

Source Code of org.apache.directory.server.ldap.gui.SessionsFrame

/*
*  Licensed to the Apache Software Foundation (ASF) under one
*  or more contributor license agreements.  See the NOTICE file
*  distributed with this work for additional information
*  regarding copyright ownership.  The ASF licenses this file
*  to you under the Apache License, Version 2.0 (the
*  "License"); you may not use this file except in compliance
*  with the License.  You may obtain a copy of the License at
*    http://www.apache.org/licenses/LICENSE-2.0
*  Unless required by applicable law or agreed to in writing,
*  software distributed under the License is distributed on an
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
*  KIND, either express or implied.  See the License for the
*  specific language governing permissions and limitations
*  under the License.
*/
package org.apache.directory.server.ldap.gui;


import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JButton;
import javax.swing.BoxLayout;
import javax.swing.JTextField;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import org.apache.directory.server.i18n.I18n;
import org.apache.directory.server.ldap.LdapServer;
import org.apache.directory.server.ldap.LdapSession;
import org.apache.directory.server.ldap.handlers.extended.GracefulShutdownHandler;
import org.apache.directory.shared.ldap.message.extended.GracefulDisconnect;
import org.apache.directory.shared.ldap.message.extended.NoticeOfDisconnect;
import org.apache.mina.core.future.CloseFuture;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IoSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class SessionsFrame extends JFrame
{
    private static final Logger LOG = LoggerFactory.getLogger( SessionsFrame.class );
    private static final long serialVersionUID = -863445561454536133L;
    private static final String REFRESH_COMMAND = "Refresh";

    boolean isServiceBound = true;
    private IoSession requestor;
    private IoHandler ldapProvider;
    private JPanel jContentPane;
    private JPanel mainPanel;
    private JScrollPane sessionsPane;
    private JTable sessionsTable;
    private JPanel filterPanel;
    private JButton filterButton;
    private JTextField filterText;
    private JMenuBar menuBar;
    private JMenu menuFile;
    private JMenuItem exitItem;
    private JMenu menuSession;
    private JMenuItem closeItem;
    private JMenu menuSendNoD;
    private JMenuItem unavailableItem;
    private JMenuItem protocolErrorItem;
    private JMenuItem strongAuthRequiredItem;
    private JPanel southPanel;
    private JMenuItem showRequests;
    private JButton refreshButton;

    private LdapSession selected;
    private JMenuItem unbindItem;
    private JMenuItem bindItem;
    private LdapServer ldapServer;


    /**
     * This is the default constructor
     * @param ldapServer the session registry
     */
    public SessionsFrame( LdapServer ldapServer )
    {
        super();
        this.ldapServer = ldapServer;
        initialize();
    }


    /**
     * This method initializes this
     */
    private void initialize()
    {
        this.setSize( 789, 436 );
        this.setJMenuBar( getMainMenuBar() );
        this.setContentPane( getJContentPane() );
        this.setTitle( "Sessions" );
        this.addWindowListener( new java.awt.event.WindowAdapter()
        {
            public void windowClosing( java.awt.event.WindowEvent e )
            {
                SessionsFrame.this.setVisible( false );
                SessionsFrame.this.dispose();
            }
        } );
    }


    /**
     * This method initializes jContentPane
     *
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane()
    {
        if ( jContentPane == null )
        {
            jContentPane = new JPanel();
            jContentPane.setLayout( new BorderLayout() );
            jContentPane.add( getMainPanel(), java.awt.BorderLayout.CENTER );
        }
        return jContentPane;
    }


    /**
     * This method initializes jPanel   
     *    
     * @return javax.swing.JPanel   
     */
    private JPanel getMainPanel()
    {
        if ( mainPanel == null )
        {
            mainPanel = new JPanel();
            mainPanel.setLayout( new BorderLayout() );
            mainPanel.add( getFilterPanel(), java.awt.BorderLayout.NORTH );
            mainPanel.add( getSessionsPane(), java.awt.BorderLayout.CENTER );
            mainPanel.add( getSouthPanel(), java.awt.BorderLayout.SOUTH );
        }
        return mainPanel;
    }


    /**
     * This method initializes jScrollPane   
     *    
     * @return javax.swing.JScrollPane   
     */
    private JScrollPane getSessionsPane()
    {
        if ( sessionsPane == null )
        {
            sessionsPane = new JScrollPane();
            sessionsPane.setName( "jScrollPane" );
            sessionsPane.setViewportView( getSessionsTable() );
        }
        return sessionsPane;
    }


    /**
     * This method initializes jTable   
     *    
     * @return javax.swing.JTable   
     */
    private JTable getSessionsTable()
    {
        if ( sessionsTable == null )
        {
            sessionsTable = new JTable();
            sessionsTable.setSelectionMode( javax.swing.ListSelectionModel.SINGLE_SELECTION );
            sessionsTable.setModel( new SessionsModel( ldapServer.getLdapSessionManager().getSessions() ) );
            sessionsTable.getSelectionModel().addListSelectionListener( new ListSelectionListener()
            {
                public void valueChanged( ListSelectionEvent e )
                {
                    int row = sessionsTable.getSelectedRow();
                    if ( row == -1 )
                    {
                        selected = null;
                    }
                    else
                    {
                        selected = ( ( SessionsModel ) sessionsTable.getModel() ).getLdapSession( row );
                        closeItem.setEnabled( true );
                        menuSendNoD.setEnabled( true );
                        showRequests.setEnabled( true );
                    }
                }
            } );
        }
        return sessionsTable;
    }


    /**
     * This method initializes jPanel   
     *    
     * @return javax.swing.JPanel   
     */
    private JPanel getFilterPanel()
    {
        if ( filterPanel == null )
        {
            filterPanel = new JPanel();
            filterPanel.setLayout( new BoxLayout( getFilterPanel(), BoxLayout.X_AXIS ) );
            filterPanel.setBorder( javax.swing.BorderFactory
                .createEtchedBorder( javax.swing.border.EtchedBorder.RAISED ) );
            filterPanel.add( getFilterButton(), null );
            filterPanel.add( getFilterText(), null );
        }
        return filterPanel;
    }


    /**
     * This method initializes jButton   
     *    
     * @return javax.swing.JButton   
     */
    private JButton getFilterButton()
    {
        if ( filterButton == null )
        {
            filterButton = new JButton();
            filterButton.setText( "Filter" );
        }
        return filterButton;
    }


    /**
     * This method initializes jTextField   
     *    
     * @return javax.swing.JTextField   
     */
    private JTextField getFilterText()
    {
        if ( filterText == null )
        {
            filterText = new JTextField();
        }
        return filterText;
    }


    /**
     * This method initializes jJMenuBar   
     *    
     * @return javax.swing.JMenuBar   
     */
    private JMenuBar getMainMenuBar()
    {
        if ( menuBar == null )
        {
            menuBar = new JMenuBar();
            menuBar.add( getMenuFile() );
            menuBar.add( getMenuSession() );
        }
        return menuBar;
    }


    /**
     * This method initializes jMenu   
     *    
     * @return javax.swing.JMenu   
     */
    private JMenu getMenuFile()
    {
        if ( menuFile == null )
        {
            menuFile = new JMenu();
            menuFile.setText( "File" );
            menuFile.add( getExitItem() );
        }
        return menuFile;
    }


    /**
     * This method initializes jMenuItem   
     *    
     * @return javax.swing.JMenuItem   
     */
    private JMenuItem getExitItem()
    {
        if ( exitItem == null )
        {
            exitItem = new JMenuItem();
            exitItem.setText( "exit" );
            exitItem.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    SessionsFrame.this.setVisible( false );
                    SessionsFrame.this.dispose();
                }
            } );
        }
        return exitItem;
    }


    /**
     * This method initializes jMenu   
     *    
     * @return javax.swing.JMenu   
     */
    private JMenu getMenuSession()
    {
        if ( menuSession == null )
        {
            menuSession = new JMenu();
            menuSession.setText( "Session" );
            menuSession.add( getCloseItem() );
            closeItem.setEnabled( false );
            menuSession.add( getMenuSendNoD() );
            menuSendNoD.setEnabled( false );
            menuSession.add( getShowRequests() );
            menuSession.add( getUnbindItem() );
            menuSession.add( getBindItem() );
            showRequests.setEnabled( false );
        }
        return menuSession;
    }


    /**
     * This method initializes jMenuItem   
     *    
     * @return javax.swing.JMenuItem   
     */
    private JMenuItem getCloseItem()
    {
        if ( closeItem == null )
        {
            closeItem = new JMenuItem();
            closeItem.setText( "close" );
            closeItem.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    ldapServer.getLdapSessionManager().removeLdapSession( selected.getIoSession() );
                    try
                    {
                        Thread.sleep( 250 );
                    }
                    catch ( InterruptedException e1 )
                    {
                        LOG.error( "", e1 );
                    }
                    refresh();
                }
            } );
        }
        return closeItem;
    }


    /**
     * This method initializes jMenu   
     *    
     * @return javax.swing.JMenu   
     */
    private JMenu getMenuSendNoD()
    {
        if ( menuSendNoD == null )
        {
            menuSendNoD = new JMenu();
            menuSendNoD.setText( "Send NoD" );
            menuSendNoD.add( getUnavailableItem() );
            menuSendNoD.add( getProtocolErrorItem() );
            menuSendNoD.add( getStrongAuthRequiredItem() );
        }
        return menuSendNoD;
    }


    /**
     * This method initializes jMenuItem   
     *    
     * @return javax.swing.JMenuItem   
     */
    private JMenuItem getUnavailableItem()
    {
        if ( unavailableItem == null )
        {
            unavailableItem = new JMenuItem();
            unavailableItem.setText( "unavailable" );
            unavailableItem.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    selected.getIoSession().write( NoticeOfDisconnect.UNAVAILABLE );
                    try
                    {
                        Thread.sleep( 250 );
                    }
                    catch ( InterruptedException e1 )
                    {
                        LOG.error( "", e1 );
                    }
                    refresh();
                }
            } );
        }
        return unavailableItem;
    }


    /**
     * This method initializes jMenuItem   
     *    
     * @return javax.swing.JMenuItem   
     */
    private JMenuItem getProtocolErrorItem()
    {
        if ( protocolErrorItem == null )
        {
            protocolErrorItem = new JMenuItem();
            protocolErrorItem.setText( "protocolError" );
            protocolErrorItem.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    selected.getIoSession().write( NoticeOfDisconnect.PROTOCOLERROR );
                    try
                    {
                        Thread.sleep( 250 );
                    }
                    catch ( InterruptedException e1 )
                    {
                        LOG.error( "", e1 );
                    }
                    refresh();
                }
            } );
        }
        return protocolErrorItem;
    }


    /**
     * This method initializes jMenuItem   
     *    
     * @return javax.swing.JMenuItem   
     */
    private JMenuItem getStrongAuthRequiredItem()
    {
        if ( strongAuthRequiredItem == null )
        {
            strongAuthRequiredItem = new JMenuItem();
            strongAuthRequiredItem.setText( "strongAuthRequired" );
            strongAuthRequiredItem.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    WriteFuture future = selected.getIoSession().write( NoticeOfDisconnect.STRONGAUTHREQUIRED );
                    try
                    {
                        future.awaitUninterruptibly( 1000L );
                        CloseFuture cfuture = selected.getIoSession().close( true );
                        cfuture.awaitUninterruptibly( 1000L );
                    }
                    catch ( Exception e1 )
                    {
                        LOG.error( "", e1 );
                    }
                    refresh();
                }
            } );
        }
        return strongAuthRequiredItem;
    }


    //    /**
    //     * This method initializes jPopupMenu   
    //     *    
    //     * @return javax.swing.JPopupMenu   
    //     */
    //    private JPopupMenu getSessionsPopupMenu()
    //    {
    //        if ( popupMenu == null )
    //        {
    //            popupMenu = new JPopupMenu();
    //            popupMenu.add(getJMenuItem());
    //            popupMenu.add(getJMenu());
    //            popupMenu.add(getJMenuItem4());
    //        }
    //        return popupMenu;
    //    }

    /**
     * This method initializes jPanel   
     *    
     * @return javax.swing.JPanel   
     */
    private JPanel getSouthPanel()
    {
        if ( southPanel == null )
        {
            southPanel = new JPanel();
            southPanel
                .setBorder( javax.swing.BorderFactory.createEtchedBorder( javax.swing.border.EtchedBorder.RAISED ) );
            southPanel.add( getRefreshButton(), null );
        }
        return southPanel;
    }


    /**
     * This method initializes jMenuItem   
     *    
     * @return javax.swing.JMenuItem   
     */
    private JMenuItem getShowRequests()
    {
        if ( showRequests == null )
        {
            showRequests = new JMenuItem();
            showRequests.setText( "show requests" );
            showRequests.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    OutstandingRequestsDialog dialog =
                            new OutstandingRequestsDialog( SessionsFrame.this, selected, ldapServer );
                    dialog.addWindowListener( new WindowAdapter()
                    {
                        public void windowClosed( WindowEvent e )
                        {
                            e.getWindow().dispose();
                        }
                    } );
                    dialog.setVisible( true );
                }
            } );
        }
        return showRequests;
    }


    //    /**
    //     * This method initializes jMenuItem   
    //     *    
    //     * @return javax.swing.JMenuItem   
    //     */
    //    private JMenuItem getJMenuItem()
    //    {
    //        if ( jMenuItem == null )
    //        {
    //            jMenuItem = new JMenuItem();
    //            jMenuItem.setText("close");
    //        }
    //        return jMenuItem;
    //    }
    //
    //
    //    /**
    //     * This method initializes jMenu   
    //     *    
    //     * @return javax.swing.JMenu   
    //     */
    //    private JMenu getJMenu()
    //    {
    //        if ( jMenu == null )
    //        {
    //            jMenu = new JMenu();
    //            jMenu.setText("Send NoD");
    //            jMenu.add(getJMenuItem1());
    //            jMenu.add(getJMenuItem2());
    //            jMenu.add(getJMenuItem3());
    //        }
    //        return jMenu;
    //    }
    //
    //
    //    /**
    //     * This method initializes jMenuItem1   
    //     *    
    //     * @return javax.swing.JMenuItem   
    //     */
    //    private JMenuItem getJMenuItem1()
    //    {
    //        if ( jMenuItem1 == null )
    //        {
    //            jMenuItem1 = new JMenuItem();
    //            jMenuItem1.setText("unavailable");
    //        }
    //        return jMenuItem1;
    //    }
    //
    //
    //    /**
    //     * This method initializes jMenuItem2   
    //     *    
    //     * @return javax.swing.JMenuItem   
    //     */
    //    private JMenuItem getJMenuItem2()
    //    {
    //        if ( jMenuItem2 == null )
    //        {
    //            jMenuItem2 = new JMenuItem();
    //            jMenuItem2.setText("protocolError");
    //        }
    //        return jMenuItem2;
    //    }
    //
    //
    //    /**
    //     * This method initializes jMenuItem3   
    //     *    
    //     * @return javax.swing.JMenuItem   
    //     */
    //    private JMenuItem getJMenuItem3()
    //    {
    //        if ( jMenuItem3 == null )
    //        {
    //            jMenuItem3 = new JMenuItem();
    //            jMenuItem3.setText("strongAuthRequired");
    //        }
    //        return jMenuItem3;
    //    }
    //
    //
    //    /**
    //     * This method initializes jMenuItem4   
    //     *    
    //     * @return javax.swing.JMenuItem   
    //     */
    //    private JMenuItem getJMenuItem4()
    //    {
    //        if ( jMenuItem4 == null )
    //        {
    //            jMenuItem4 = new JMenuItem();
    //            jMenuItem4.setText("show requests");
    //        }
    //        return jMenuItem4;
    //    }

    /**
     * This method initializes jButton2   
     *    
     * @return javax.swing.JButton   
     */
    private JButton getRefreshButton()
    {
        if ( refreshButton == null )
        {
            refreshButton = new JButton();
            refreshButton.setText( REFRESH_COMMAND );
            refreshButton.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    if ( e.getActionCommand().equals( REFRESH_COMMAND ) )
                    {
                        refresh();
                    }
                }
            } );
        }
        return refreshButton;
    }


    private void refresh()
    {
        LOG.info( "Refreshing Sessions UI" );
        sessionsTable.setModel( new SessionsModel( ldapServer.getLdapSessionManager().getSessions() ) );
        closeItem.setEnabled( false );
        menuSendNoD.setEnabled( false );
        showRequests.setEnabled( false );
        unbindItem.setEnabled( isServiceBound );
        bindItem.setEnabled( !isServiceBound );
    }

    public void setRequestor( IoSession requestor )
    {
        this.requestor = requestor;
    }

    /**
     * This method initializes jMenuItem   
     *    
     * @return javax.swing.JMenuItem   
     */
    private JMenuItem getUnbindItem()
    {
        if ( unbindItem == null )
        {
            unbindItem = new JMenuItem();
            unbindItem.setText( "Unbind Service" );
            unbindItem.setEnabled( isServiceBound );
            unbindItem.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    int input = JOptionPane.showConfirmDialog( SessionsFrame.this,
                        "Selecting no will send a notice of disconnect ONLY.  "
                            + "\nSelecting yes will send both.  Cancel will abort unbind.",
                        "Send graceful disconnect before disconnect notice?", JOptionPane.YES_NO_CANCEL_OPTION );
                    IoAcceptor acceptor = ( IoAcceptor ) requestor.getService();
                    List<IoSession> sessions = new ArrayList<IoSession>(
                            acceptor.getManagedSessions().values() );

                    if ( input == JOptionPane.CANCEL_OPTION )
                    {
                    }
                    else if ( input == JOptionPane.NO_OPTION )
                    {
                        GracefulShutdownHandler.sendNoticeOfDisconnect( sessions, requestor );
                        acceptor.unbind( requestor.getServiceAddress() );
                        isServiceBound = false;
                        unbindItem.setEnabled( isServiceBound );
                        bindItem.setEnabled( !isServiceBound );
                        JOptionPane.showMessageDialog( SessionsFrame.this, "Ldap service for "
                            + requestor.getLocalAddress() + " has been successfully unbound.", "Success!",
                            JOptionPane.INFORMATION_MESSAGE );
                        refresh();
                    }
                    else
                    {
                        ShutdownDialog dialog = new ShutdownDialog();
                        setCenteredPosition( SessionsFrame.this, dialog );
                        dialog.setModal( true );
                        dialog.setVisible( true );

                        if ( dialog.isSendCanceled() )
                        {
                            LOG.debug( "GracefulShutdown was canceled." );
                            JOptionPane.showMessageDialog( SessionsFrame.this, "Shutdown has been canceled.",
                                "Graceful Shutdown Aborted", JOptionPane.OK_OPTION );
                            return;
                        }

                        LOG.debug( "GracefulShutdown parameters captured." );
                        int timeOffline = dialog.getTimeOffline();
                        int delay = dialog.getDelay();
                        GracefulDisconnect graceful = new GracefulDisconnect( timeOffline, delay );
                        GracefulShutdownHandler.sendGracefulDisconnect( sessions, graceful, requestor );
                        acceptor.unbind( requestor.getServiceAddress() );
                        isServiceBound = false;
                        unbindItem.setEnabled( isServiceBound );
                        bindItem.setEnabled( !isServiceBound );

                        // do progress dialog with bypass button to wait for delay time
                        if ( delay > 0 )
                        {
                            ShutdownProgress progress = new ShutdownProgress();
                            setCenteredPosition( SessionsFrame.this, progress );
                            progress.setModal( true );
                            progress.setTime( delay * 1000 );
                            Thread t = new Thread( progress );
                            t.start();
                            progress.setVisible( true );
                        }

                        // now send the notice of disconnect
                        GracefulShutdownHandler.sendNoticeOfDisconnect( sessions, requestor );
                        JOptionPane.showMessageDialog( SessionsFrame.this, "Ldap service for "
                            + requestor.getLocalAddress() + " has been successfully unbound.", "Success!",
                            JOptionPane.OK_OPTION );
                        refresh();
                    }
                }
            } );
        }
        return unbindItem;
    }


    private void setCenteredPosition( JFrame frame, Component comp )
    {
        Point pt = new Point();
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension screenSize = tk.getScreenSize();
        pt.x = ( screenSize.width - frame.getWidth() ) / 2;
        pt.y = ( screenSize.height - frame.getHeight() ) / 2;

        pt.x += ( frame.getWidth() - comp.getWidth() ) / 2;
        pt.y += ( frame.getHeight() - comp.getHeight() ) / 2;
        comp.setLocation( pt );
    }


    /**
     * This method initializes jMenuItem   
     *    
     * @return javax.swing.JMenuItem   
     */
    private JMenuItem getBindItem()
    {
        if ( bindItem == null )
        {
            bindItem = new JMenuItem();
            bindItem.setText( "Bind Service" );
            unbindItem.setEnabled( !isServiceBound );
            bindItem.addActionListener( new java.awt.event.ActionListener()
            {
                public void actionPerformed( java.awt.event.ActionEvent e )
                {
                    try
                    {
                        ( ( IoAcceptor ) requestor.getService() ).setHandler( getLdapProvider() );
                        ( ( IoAcceptor ) requestor.getService() ).bind( requestor.getServiceAddress() );
                        JOptionPane.showMessageDialog( SessionsFrame.this, "Ldap service " + requestor.getServiceAddress()
                            + " has been successfully bound.\n" + " Clients may now connect to the server once again.",
                            "Success!", JOptionPane.INFORMATION_MESSAGE );
                        isServiceBound = true;
                        unbindItem.setEnabled( isServiceBound );
                        bindItem.setEnabled( !isServiceBound );
                    }
                    catch ( IOException e1 )
                    {
                        LOG.error( I18n.err( I18n.ERR_158 ), e1 );
                        JOptionPane.showMessageDialog( SessionsFrame.this, e1.getLocalizedMessage(), "Error encountered!",
                            JOptionPane.ERROR_MESSAGE );
                    }
                }
            } );
        }
        return bindItem;
    }


    public void setLdapProvider( IoHandler ldapProvider )
    {
        this.ldapProvider = ldapProvider;
    }


    public IoHandler getLdapProvider()
    {
        return ldapProvider;
    }
} //  @jve:decl-index=0:visual-constraint="10,10"
TOP

Related Classes of org.apache.directory.server.ldap.gui.SessionsFrame

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.