0

Here is my main class:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import java.io.*;
import java.lang.Process.*;

public class FTP {



  public static void main (String []args)
  {
    Runnable runner = new Runnable(){



      public void run()
      {

        LookAndFeel nimbusLook = new LookAndFeel();
        nimbusLook.NimbusLookAndFeel();

        JFrame frame = new JFrame("BNA FTP Diagnose");
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setSize(540, 420);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(150, 150);


        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);

        JMenu fileMenu = new JMenu("File");
        menuBar.add(fileMenu);
        final JMenuItem exitMenuItem = new JMenuItem("Exit");
        fileMenu.add(exitMenuItem);


        JMenu helpMenu = new JMenu("Help");
        menuBar.add(new JPanel());
        menuBar.add(helpMenu);
        final JMenuItem aboutMenuItem = new JMenuItem("About");
        helpMenu.add(aboutMenuItem);



        JPanel titlePanel = new JPanel(new BorderLayout());
        frame.add(titlePanel, BorderLayout.NORTH);

        JLabel titleLabel = new JLabel("FTP Diagnose", JLabel.CENTER);
        titleLabel.setFont(new Font(null, Font.BOLD, 14));
        titleLabel.setForeground(Color.BLUE);
        titlePanel.add(titleLabel);

        JPanel gridPanel = new JPanel(new GridLayout(1, 1));
        frame.add(gridPanel);

        JPanel vendorPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        gridPanel.add(vendorPanel);

        final String vendor [] = {"LLesiant" ,"WK-CCH", "Proquest", "Notes", "Research Institute of America", "Thomson", 
          "BNAI PDF Processing", " TM Portfolios to Indexing", "Postscript to PRODLOGIN1", "www.firstdoor.net", "psp.bna.com", "WEST", "LexisNexis", "McArdle Printing Company", 
          "Breaking News Email", "Ex Libris", "Pandora", "Bloomberg Law", "Acquire Media Site 1", "Acquire Media Site 2", "Quicksite", "QA Quicksite"};
        final JComboBox vendorList = new JComboBox(vendor);
        vendorPanel.add(vendorList);

        JPanel diagnoseButtonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        gridPanel.add(diagnoseButtonPanel);
        final JButton diagnoseButton = new JButton("Diagnose");
        diagnoseButtonPanel.add(diagnoseButton);


        JPanel centerPanel = new JPanel(new BorderLayout());
        frame.add(centerPanel, BorderLayout.SOUTH);
        JPanel commandPanel = new JPanel(new GridLayout(1, 0));
        centerPanel.add(commandPanel);


        final JTextArea commandResultArea = new JTextArea(7, 0);
        JScrollPane scroll = new JScrollPane(commandResultArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        commandPanel.add(scroll);
        commandResultArea.setEditable(false);




        ActionListener buttonListener = new ActionListener(){

          public void actionPerformed(ActionEvent ae)

          {
            int selectedIndex = vendorList.getSelectedIndex();

            String llesiant = "ftp.llesiant.com";
            String wkCCH = "FTP1.cch.com";
            String proquest = "ftp.proquest.com";
            String notes = "notes5.bna.com";


            //String lineThree = null;

            CommandClass readCommand = new CommandClass();

            if (selectedIndex == 0)
            {
              commandResultArea.setText(readCommand.getCommand(llesiant)); //these return strings

            }
            else if (selectedIndex == 1)
            {
              commandResultArea.setText(readCommand.getCommand(wkCCH));
            }
            else if (selectedIndex == 2)
            {
              commandResultArea.setText(readCommand.getCommand(proquest));
            }
            else if (selectedIndex == 3)
            {
              commandResultArea.setText(readCommand.getCommand(notes));
            }

          }

        };
        diagnoseButton.addActionListener(buttonListener);

        ActionListener exitListener = new ActionListener (){

          public void actionPerformed(ActionEvent el)
          {

            if (el.getSource()== exitMenuItem)
            {
              JOptionPane.showMessageDialog(null, "FTP Program will exit now!");
              System.exit(0);
            }

          }

        };

        exitMenuItem.addActionListener(exitListener);

        ActionListener aboutListener = new ActionListener()
        {
          public void actionPerformed(ActionEvent al)
          {

            if (al.getSource()== aboutMenuItem)

            {
              JOptionPane.showMessageDialog(null, "This Software was made for Editors to. \nDiagnose BNA Bloomberg client FTP site.");

            }
          }

        };
        aboutMenuItem.addActionListener(aboutListener);             
      }

    };
    EventQueue.invokeLater(runner);

  }

}

Here is my Look and feel class: 

import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class LookAndFeel {


    public void NimbusLookAndFeel()
    {

        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            // If Nimbus is not available, you can set the GUI to another look and feel.
        }


    }




}


Here is my CommandClass: 

import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JOptionPane;


public class CommandClass {



    public String getCommand(String ftpSite){
        String command = "ftp ";
        StringBuffer output = new StringBuffer();
        try{
             Process p = Runtime.getRuntime().exec(command +ftpSite);
            InputStreamReader ir = new InputStreamReader (p.getInputStream());
            int outputChar = 0;
            while((outputChar = ir.read()) != -1){
                output.append((char)outputChar);
            if(!ir.ready()){ // If the next read is not guarenteed, come out of loop.
                break;
            }
                }
              ir.close();
             JOptionPane.showMessageDialog(null, "FTP is connected");

        }catch (IOException e){
            e.printStackTrace();
        }
        return output.toString();
    }


}

I have this FTP GUI which suppose to connect to an FTP site and return the status. If it's connected it shows the connection prompt.

I got the JTextArea to show the message when the FTP connection is established, but when it's not connected to the ftp site such as my 4th ftp site which is notes5.bna.com it freezes the program. Also a small problem is if you have the program FTP to a site like this "shlfsdklaflkhasdlhfas". It returns the ftp site is not found only after the JOptionPane shows that FTP is connected. I am not sure what's wrong with it.

Zach Latta
  • 3,251
  • 5
  • 26
  • 40
Reazur Rahman
  • 151
  • 1
  • 1
  • 12

1 Answers1

3

The reason that notes5.bna.com is freezing is that the site is not responding to FTP connection requests. As you are simply using Runtime#exec to make the connection, this will block indefinitely for a response. Consider using a 3rd party FTP client such as Apache FTPClient which allows you to specify a connection timeout.

A related issue is that some sites are requesting a username & password for access. Again FTPClient allows you to provide login details.

Last but not least, don't let heavyweight non-UI tasks freeze your Swing application. Swing has mechanisms to deal with these such as SwingWorker objects.

Community
  • 1
  • 1
Reimeus
  • 158,255
  • 15
  • 216
  • 276
  • so what could be the fix for it. can you show me what type of modification i need to make when i ftp to nots5.bna.com it says on the command prompt "notconnected". Is there a way to display that when I run into this kind of situation. And what you mean by swing worker and is there a way not to have my program freeze just in case when i run into this kind of problem. If there is can you show me how or give me an example – Reazur Rahman Mar 09 '13 at 00:29
  • You will need to do some refactoring here. Download the jar for `FTPClient`. See the javadoc, it contains a simple example. Get this working first. Then build a simple `SwingWorker` test app. Follow the trail from the above `SwingWorker objects`. Here's [another example](http://docs.oracle.com/javase/tutorial/uiswing/examples/components/ProgressBarDemoProject/src/components/ProgressBarDemo.java). Put the 2 together. – Reimeus Mar 09 '13 at 00:41
  • This seems like i might have to change a lot of codes. Is there a simplier way to just tell the user with Joption prompt that the host is not connected or have it written in my JTextArea rather then going through all this process. – Reazur Rahman Mar 09 '13 at 00:47