import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.*;

// javac JavaClassAvlTest.java
// java JavaClassAvlTest

public class JavaClassAvlTest extends Frame {
	Panel fieldPanel, buttonPanel, mainPanel, tempPanel, classInfoPanel;
	Label packageLabel, classLabel, tempLabel;
	TextField packageField, classField;
	TextArea classInfoTextArea;
	Button exitButton, checkButton;
	ScrollPane mainScrollPane;
	GridBagLayout gridBagLayout;
	GridBagConstraints gridBagCons;

	int screenX = 0, screenY = 0, screenHeight = 250, screenWidth = 225;

	public JavaClassAvlTest() {

		setTitle("Java Class Availability Test");

		buildMainPanel();

		setListeners();

		add("Center", mainPanel);

		pack();
		setSize(getPreferredSize());
		show();
	}

	public void buildMainPanel() {
		gridBagLayout = new GridBagLayout();
		gridBagCons = new GridBagConstraints();

		mainPanel = new Panel();
		mainPanel.setLayout(gridBagLayout);

		gridBagCons.fill = GridBagConstraints.NONE;
		gridBagCons.weightx = 1.0;

		packageLabel = new Label("Package");
	 	gridBagLayout.setConstraints(packageLabel, gridBagCons);
         	mainPanel.add(packageLabel);

		packageField = new TextField();
	 	gridBagLayout.setConstraints(packageField, gridBagCons);
         	mainPanel.add(packageField);

  		gridBagCons.gridwidth = GridBagConstraints.REMAINDER;
		tempLabel = new Label("");
	 	gridBagLayout.setConstraints(tempLabel, gridBagCons);
         	mainPanel.add(tempLabel);

 	   	gridBagCons.gridwidth = 1;
		gridBagCons.fill = GridBagConstraints.NONE;
		gridBagCons.weightx = 1.0;

		classLabel = new Label("Class");
	 	gridBagLayout.setConstraints(classLabel, gridBagCons);
         	mainPanel.add(classLabel);

		classField = new TextField();
	 	gridBagLayout.setConstraints(classField, gridBagCons);
         	mainPanel.add(classField);

  		gridBagCons.gridwidth = GridBagConstraints.REMAINDER;
		tempLabel = new Label("");
	 	gridBagLayout.setConstraints(tempLabel, gridBagCons);
         	mainPanel.add(tempLabel);

 	   	gridBagCons.gridwidth = 1;
		gridBagCons.fill = GridBagConstraints.NONE;
		gridBagCons.weightx = 1.0;

		exitButton = new Button("Exit");
	 	gridBagLayout.setConstraints(exitButton, gridBagCons);
         	mainPanel.add(exitButton);

		checkButton = new Button("Check");
	 	gridBagLayout.setConstraints(checkButton, gridBagCons);
		mainPanel.add(checkButton);

  		gridBagCons.gridwidth = GridBagConstraints.REMAINDER;
		tempLabel = new Label("");
	 	gridBagLayout.setConstraints(tempLabel, gridBagCons);
         	mainPanel.add(tempLabel);

  		gridBagCons.gridwidth = GridBagConstraints.REMAINDER;
		gridBagCons.weightx = 0.0;
  		gridBagCons.gridheight = 4;
		classInfoTextArea = new TextArea("", 12, 32, TextArea.SCROLLBARS_BOTH);
		classInfoTextArea.setEditable(false);
	 	gridBagLayout.setConstraints(classInfoTextArea, gridBagCons);
         	mainPanel.add(classInfoTextArea);

		mainPanel.setSize(screenWidth, screenHeight);
	}

	public void setListeners() {

		exitButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				exitAppGracefully();
			}
		});

		checkButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				checkClassAvailable();
			}
		});

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				exitAppGracefully();
			}
		});
	}

	public void exitAppGracefully() {
		System.exit(0);
	}

	public void checkClassAvailable() {
		String classNameStr;
		Class givenClass;
		Constructor classConstructors[];
		Method classMethods[];

		if(packageField.getText().trim().length() == 0) {
			classInfoTextArea.setText("Please specify the Package Name");
			return;
		}

		if(classField.getText().trim().length() == 0) {
			classInfoTextArea.setText("Please specify the Class Name");
			return;
		}

		classNameStr = packageField.getText()
				+ "."
				+ classField.getText();
		classInfoTextArea.setText("Checking for Class : " + classNameStr);

		try {
			givenClass = Class.forName(classNameStr);

		} catch(Exception e) {
			classInfoTextArea.append("\nError encountered \n" + e.toString());
			return;
		}

		classInfoTextArea.append("\nThis is "
			+ (givenClass.isInterface() ? "an Interface\n" : "a Class\n"));

		classInfoTextArea.append("\nConstructors\n");
		classConstructors = givenClass.getConstructors();
		for(int i = 0; i < classConstructors.length; i++) {
			classInfoTextArea.append(classConstructors[i].toString() + "\n");
		}

		classInfoTextArea.append("\nMethods\n");
		classMethods = givenClass.getMethods();
		for(int i = 0; i < classMethods.length; i++) {
			classInfoTextArea.append(classMethods[i].toString() + "\n");
		}

		classInfoTextArea.append("\nDone \n");

		classInfoTextArea.setCaretPosition(10000);
	}

	public static void main(String args[]) {

		new JavaClassAvlTest();
	}

}
