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.net.InetSocketAddress;
025    import java.util.Map;
026    
027    import javax.swing.JFrame;
028    import javax.swing.JPanel;
029    import javax.swing.JDialog;
030    import javax.swing.JScrollPane;
031    import javax.swing.JTable;
032    import javax.swing.JButton;
033    
034    import org.apache.directory.server.ldap.LdapServer;
035    import org.apache.directory.server.ldap.LdapSession;
036    import org.apache.directory.shared.ldap.message.internal.InternalAbandonableRequest;
037    
038    import javax.swing.JTextArea;
039    import javax.swing.event.ListSelectionEvent;
040    import javax.swing.event.ListSelectionListener;
041    
042    
043    public class OutstandingRequestsDialog extends JDialog
044    {
045        private static final long serialVersionUID = -3777123348215825711L;
046        private static final InternalAbandonableRequest[] EMPTY_REQUEST_ARRAY = new InternalAbandonableRequest[0];
047        private JPanel jContentPane;
048        private JPanel jPanel;
049        private JScrollPane jScrollPane;
050        private JTable jTable;
051        private JPanel jPanel1;
052        private JButton jButton;
053    
054        final LdapSession session;
055        final LdapServer ldapServer;
056    
057        private JPanel jPanel2;
058        private JTextArea jTextArea;
059        private JButton jButton1;
060        private JButton jButton2;
061    
062    
063        /**
064         * This is the default constructor
065         * @param owner the owning frame
066         * @param session the MINA IoSession to get outstanding requests for
067         * @param sessionRegistry the session registry
068         */
069        public OutstandingRequestsDialog( JFrame owner, LdapSession session, LdapServer ldapServer )
070        {
071            super( owner, true );
072            this.session = session;
073            this.ldapServer = ldapServer;
074    
075            StringBuffer buf = new StringBuffer();
076            buf.append( "Outstanding Requests: " );
077            buf.append( ( ( InetSocketAddress ) session.getIoSession().getRemoteAddress() ).getHostName() );
078            buf.append( ":" );
079            buf.append( ( ( InetSocketAddress ) session.getIoSession().getRemoteAddress() ).getPort() );
080            setTitle( buf.toString() );
081            initialize();
082        }
083    
084    
085        /**
086         * This method initializes this
087         */
088        private void initialize()
089        {
090            this.setSize( 549, 341 );
091            this.setContentPane( getJContentPane() );
092        }
093    
094    
095        /**
096         * This method initializes jContentPane
097         * 
098         * @return javax.swing.JPanel
099         */
100        private JPanel getJContentPane()
101        {
102            if ( jContentPane == null )
103            {
104                jContentPane = new JPanel();
105                jContentPane.setLayout( new BorderLayout() );
106                jContentPane.add( getJPanel(), java.awt.BorderLayout.CENTER );
107            }
108            return jContentPane;
109        }
110    
111    
112        /**
113         * This method initializes jPanel    
114         *     
115         * @return javax.swing.JPanel    
116         */
117        private JPanel getJPanel()
118        {
119            if ( jPanel == null )
120            {
121                jPanel = new JPanel();
122                jPanel.setLayout( new BorderLayout() );
123                jPanel.add( getJScrollPane(), java.awt.BorderLayout.CENTER );
124                jPanel.add( getJPanel1(), java.awt.BorderLayout.SOUTH );
125                jPanel.add( getJPanel2(), java.awt.BorderLayout.NORTH );
126            }
127            return jPanel;
128        }
129    
130    
131        /**
132         * This method initializes jScrollPane    
133         *     
134         * @return javax.swing.JScrollPane    
135         */
136        private JScrollPane getJScrollPane()
137        {
138            if ( jScrollPane == null )
139            {
140                jScrollPane = new JScrollPane();
141                jScrollPane.setViewportView( getJTable() );
142            }
143            return jScrollPane;
144        }
145    
146    
147        /**
148         * This method initializes jTable    
149         *     
150         * @return javax.swing.JTable    
151         */
152        private JTable getJTable()
153        {
154            if ( jTable == null )
155            {
156                jTable = new JTable();
157            }
158    
159            setRequestsModel();
160            jTable.getSelectionModel().addListSelectionListener( new ListSelectionListener()
161            {
162                public void valueChanged( ListSelectionEvent e )
163                {
164                    int row = jTable.getSelectedRow();
165                    if ( row > -1 )
166                    {
167                        jButton2.setEnabled( true );
168                        InternalAbandonableRequest req = ( ( OutstandingRequestsModel ) jTable.getModel() )
169                            .getAbandonableRequest( row );
170                        jTextArea.setText( req.toString() );
171                        jTextArea.setEnabled( true );
172                    }
173                    else
174                    {
175                        jButton2.setEnabled( false );
176                        jTextArea.setText( "" );
177                        jTextArea.setEnabled( false );
178                    }
179                }
180            } );
181            return jTable;
182        }
183    
184    
185        private void setRequestsModel()
186        {
187            InternalAbandonableRequest[] requests;
188            Map<Integer, InternalAbandonableRequest> reqsMap = session.getOutstandingRequests();
189            
190            if ( reqsMap != null )
191            {
192                requests = new InternalAbandonableRequest[reqsMap.size()];
193                //noinspection unchecked
194                requests = (org.apache.directory.shared.ldap.message.internal.InternalAbandonableRequest[] ) reqsMap.values().toArray( requests );
195            }
196            else
197            {
198                requests = EMPTY_REQUEST_ARRAY;
199            }
200    
201            jTable.setModel( new OutstandingRequestsModel( requests ) );
202        }
203    
204    
205        /**
206         * This method initializes jPanel1    
207         *     
208         * @return javax.swing.JPanel    
209         */
210        private JPanel getJPanel1()
211        {
212            if ( jPanel1 == null )
213            {
214                jPanel1 = new JPanel();
215                jPanel1.add( getJButton(), null );
216                jPanel1.add( getJButton1(), null );
217            }
218            return jPanel1;
219        }
220    
221    
222        /**
223         * This method initializes jButton    
224         *     
225         * @return javax.swing.JButton    
226         */
227        private JButton getJButton()
228        {
229            if ( jButton == null )
230            {
231                jButton = new JButton();
232                jButton.setText( "Done" );
233                jButton.addActionListener( new java.awt.event.ActionListener()
234                {
235                    public void actionPerformed( java.awt.event.ActionEvent e )
236                    {
237                        OutstandingRequestsDialog.this.setVisible( false );
238                        OutstandingRequestsDialog.this.dispose();
239                    }
240                } );
241            }
242            return jButton;
243        }
244    
245    
246        /**
247         * This method initializes jPanel2    
248         *     
249         * @return javax.swing.JPanel    
250         */
251        private JPanel getJPanel2()
252        {
253            if ( jPanel2 == null )
254            {
255                jPanel2 = new JPanel();
256                jPanel2.setLayout( new BorderLayout() );
257                jPanel2.setBorder( javax.swing.BorderFactory.createTitledBorder( null, "Request",
258                    javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
259                    javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null ) );
260                jPanel2.add( getJButton2(), java.awt.BorderLayout.WEST );
261                jPanel2.add( getJTextArea(), java.awt.BorderLayout.CENTER );
262            }
263            return jPanel2;
264        }
265    
266    
267        /**
268         * This method initializes jTextArea    
269         *     
270         * @return javax.swing.JTextArea    
271         */
272        private JTextArea getJTextArea()
273        {
274            if ( jTextArea == null )
275            {
276                jTextArea = new JTextArea();
277            }
278    
279            jTextArea.setEnabled( false );
280            jTextArea.setEditable( false );
281            return jTextArea;
282        }
283    
284    
285        /**
286         * This method initializes jButton1    
287         *     
288         * @return javax.swing.JButton    
289         */
290        private JButton getJButton1()
291        {
292            if ( jButton1 == null )
293            {
294                jButton1 = new JButton();
295                jButton1.setText( "Refresh" );
296                jButton1.addActionListener( new java.awt.event.ActionListener()
297                {
298                    public void actionPerformed( java.awt.event.ActionEvent e )
299                    {
300                        setRequestsModel();
301                        jTextArea.setText( "" );
302                        jTextArea.setEnabled( false );
303                        jButton2.setEnabled( false );
304                    }
305                } );
306            }
307            return jButton1;
308        }
309    
310    
311        /**
312         * This method initializes jButton2    
313         *     
314         * @return javax.swing.JButton    
315         */
316        private JButton getJButton2()
317        {
318            if ( jButton2 == null )
319            {
320                jButton2 = new JButton();
321                jButton2.setText( "Abandon" );
322                jButton2.setEnabled( false );
323                jButton2.addActionListener( new java.awt.event.ActionListener()
324                {
325                    public void actionPerformed( java.awt.event.ActionEvent e )
326                    {
327                        int row = jTable.getSelectedRow();
328                        InternalAbandonableRequest req = ( ( OutstandingRequestsModel ) jTable.getModel() )
329                            .getAbandonableRequest( row );
330                        req.abandon();
331                        session.abandonOutstandingRequest( req.getMessageId() );
332                        setRequestsModel();
333                    }
334                } );
335            }
336            return jButton2;
337        }
338    } //  @jve:decl-index=0:visual-constraint="10,10"