/*
* Copyright, Aspect Security, Inc.
*
* This file is part of JavaSnoop.
*
* JavaSnoop is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JavaSnoop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with JavaSnoop. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aspect.snoop.ui.choose.process;
import com.aspect.snoop.JavaSnoop;
import com.aspect.snoop.SnoopSession;
import com.aspect.snoop.agent.manager.SmartURLClassPath;
import com.aspect.snoop.util.SimpleFileFilter;
import com.aspect.snoop.util.UIUtil;
import java.awt.FileDialog;
import java.io.File;
import java.io.FileFilter;
import java.net.MalformedURLException;
import java.util.List;
import javassist.ClassPath;
import javassist.ClassPool;
import javax.swing.JFileChooser;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import org.apache.log4j.Logger;
import org.jdesktop.application.Action;
public class NewProcessInfoView extends javax.swing.JDialog {
private static final Logger logger = Logger.getLogger(NewProcessInfoView.class);
private static final String userDir = System.getProperty("user.dir");
public static boolean quitResolving;
ClasspathTreeModel classpath;
ClassPool cp = new ClassPool();
SimpleFileFilter fileFilter = new SimpleFileFilter("jar", "JAR Java Archives");
File lastSelectedDir;
SnoopSession model;
public NewProcessInfoView(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
classpath = new ClasspathTreeModel(new DefaultMutableTreeNode(null));
treeClasspath.setCellRenderer(new ClasspathTreeCellRenderer());
treeClasses.setCellRenderer(new ClassesTreeCellRenderer());
//initializeLoadDialogListeners();
String lastCpDir = JavaSnoop.getProperty(JavaSnoop.LAST_SELECTED_DIR);
if ( lastCpDir != null ) {
File dir = new File(lastCpDir);
if ( dir.exists() && dir.isDirectory() )
lastSelectedDir = dir;
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
txtMainClass = new javax.swing.JTextField();
pnlMainClass = new javax.swing.JPanel();
btnSearch = new javax.swing.JButton();
jLabelMainClass = new javax.swing.JLabel();
pnlClasspathView = new javax.swing.JPanel();
tabClasspath = new javax.swing.JTabbedPane();
pnlJarView = new javax.swing.JPanel();
btnRemoveEntry = new javax.swing.JButton();
btnAddEntry = new javax.swing.JButton();
pnlClasspath = new javax.swing.JScrollPane();
treeClasspath = new javax.swing.JTree();
jLabel4 = new javax.swing.JLabel();
pnlClassesView = new javax.swing.JPanel();
pnlClasspath1 = new javax.swing.JScrollPane();
treeClasses = new javax.swing.JTree();
pnlExecutionInfo = new javax.swing.JPanel();
jLabel3 = new javax.swing.JLabel();
txtWorkingDir = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
txtArguments = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
txtJvmArguments = new javax.swing.JTextField();
btnStartProcess = new javax.swing.JButton();
btnCancel = new javax.swing.JButton();
pnlGui = new javax.swing.JPanel();
jLabel5 = new javax.swing.JLabel();
txtGuiDelay = new javax.swing.JTextField();
jLabel6 = new javax.swing.JLabel();
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(com.aspect.snoop.JavaSnoop.class).getContext().getResourceMap(NewProcessInfoView.class);
txtMainClass.setText(resourceMap.getString("txtMainClass.text")); // NOI18N
txtMainClass.setName("txtMainClass"); // NOI18N
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle(resourceMap.getString("Form.title")); // NOI18N
setName("Form"); // NOI18N
pnlMainClass.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("pnlMainClass.border.title"))); // NOI18N
pnlMainClass.setName("pnlMainClass"); // NOI18N
javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(com.aspect.snoop.JavaSnoop.class).getContext().getActionMap(NewProcessInfoView.class, this);
btnSearch.setAction(actionMap.get("searchForMainClasses")); // NOI18N
btnSearch.setText(resourceMap.getString("btnSearch.text")); // NOI18N
btnSearch.setToolTipText(resourceMap.getString("btnSearch.toolTipText")); // NOI18N
btnSearch.setName("btnSearch"); // NOI18N
jLabelMainClass.setText(resourceMap.getString("jLabelMainClass.text")); // NOI18N
jLabelMainClass.setName("jLabelMainClass"); // NOI18N
javax.swing.GroupLayout pnlMainClassLayout = new javax.swing.GroupLayout(pnlMainClass);
pnlMainClass.setLayout(pnlMainClassLayout);
pnlMainClassLayout.setHorizontalGroup(
pnlMainClassLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlMainClassLayout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabelMainClass, javax.swing.GroupLayout.DEFAULT_SIZE, 524, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(btnSearch)
.addContainerGap())
);
pnlMainClassLayout.setVerticalGroup(
pnlMainClassLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlMainClassLayout.createSequentialGroup()
.addGroup(pnlMainClassLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnSearch)
.addComponent(jLabelMainClass, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pnlClasspathView.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("pnlClasspathView.border.title"))); // NOI18N
pnlClasspathView.setName("pnlClasspathView"); // NOI18N
tabClasspath.setName("tabClasspath"); // NOI18N
pnlJarView.setName("pnlJars"); // NOI18N
btnRemoveEntry.setAction(actionMap.get("removeClasspathEntry")); // NOI18N
btnRemoveEntry.setText(resourceMap.getString("btnRemoveEntry.text")); // NOI18N
btnRemoveEntry.setToolTipText(resourceMap.getString("btnRemoveEntry.toolTipText")); // NOI18N
btnRemoveEntry.setName("btnRemoveEntry"); // NOI18N
btnAddEntry.setAction(actionMap.get("addClasspathEntry")); // NOI18N
btnAddEntry.setText(resourceMap.getString("btnAddEntry.text")); // NOI18N
btnAddEntry.setToolTipText(resourceMap.getString("btnAddEntry.toolTipText")); // NOI18N
btnAddEntry.setName("btnAddEntry"); // NOI18N
pnlClasspath.setName("pnlClasspath"); // NOI18N
javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("root");
treeClasspath.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
treeClasspath.setToolTipText(resourceMap.getString("treeClasspath.toolTipText")); // NOI18N
treeClasspath.setName("treeClasspath"); // NOI18N
treeClasspath.setRootVisible(false);
pnlClasspath.setViewportView(treeClasspath);
jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
jLabel4.setName("jLabel4"); // NOI18N
javax.swing.GroupLayout pnlJarViewLayout = new javax.swing.GroupLayout(pnlJarView);
pnlJarView.setLayout(pnlJarViewLayout);
pnlJarViewLayout.setHorizontalGroup(
pnlJarViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlJarViewLayout.createSequentialGroup()
.addContainerGap()
.addGroup(pnlJarViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(pnlClasspath, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)
.addGroup(pnlJarViewLayout.createSequentialGroup()
.addComponent(btnAddEntry, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnRemoveEntry)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE)))
.addContainerGap())
);
pnlJarViewLayout.setVerticalGroup(
pnlJarViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlJarViewLayout.createSequentialGroup()
.addContainerGap()
.addComponent(pnlClasspath, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(pnlJarViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnAddEntry, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnRemoveEntry)
.addComponent(jLabel4))
.addGap(47, 47, 47))
);
tabClasspath.addTab(resourceMap.getString("pnlJars.TabConstraints.tabTitle"), pnlJarView); // NOI18N
pnlClassesView.setName("pnlClassesView"); // NOI18N
pnlClasspath1.setName("pnlClasspath1"); // NOI18N
treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("root");
treeClasses.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
treeClasses.setName("treeClasses"); // NOI18N
treeClasses.setRootVisible(false);
pnlClasspath1.setViewportView(treeClasses);
javax.swing.GroupLayout pnlClassesViewLayout = new javax.swing.GroupLayout(pnlClassesView);
pnlClassesView.setLayout(pnlClassesViewLayout);
pnlClassesViewLayout.setHorizontalGroup(
pnlClassesViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 594, Short.MAX_VALUE)
.addGroup(pnlClassesViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlClassesViewLayout.createSequentialGroup()
.addContainerGap()
.addComponent(pnlClasspath1, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)
.addContainerGap()))
);
pnlClassesViewLayout.setVerticalGroup(
pnlClassesViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 152, Short.MAX_VALUE)
.addGroup(pnlClassesViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlClassesViewLayout.createSequentialGroup()
.addContainerGap()
.addComponent(pnlClasspath1, javax.swing.GroupLayout.DEFAULT_SIZE, 130, Short.MAX_VALUE)
.addContainerGap()))
);
tabClasspath.addTab(resourceMap.getString("pnlClassesView.TabConstraints.tabTitle"), pnlClassesView); // NOI18N
javax.swing.GroupLayout pnlClasspathViewLayout = new javax.swing.GroupLayout(pnlClasspathView);
pnlClasspathView.setLayout(pnlClasspathViewLayout);
pnlClasspathViewLayout.setHorizontalGroup(
pnlClasspathViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlClasspathViewLayout.createSequentialGroup()
.addContainerGap()
.addComponent(tabClasspath, javax.swing.GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE)
.addContainerGap())
);
pnlClasspathViewLayout.setVerticalGroup(
pnlClasspathViewLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tabClasspath, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
);
pnlExecutionInfo.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("pnlExecutionInfo.border.title"))); // NOI18N
pnlExecutionInfo.setName("pnlExecutionInfo"); // NOI18N
jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
jLabel3.setName("jLabel3"); // NOI18N
txtWorkingDir.setText(resourceMap.getString("txtWorkingDir.text")); // NOI18N
txtWorkingDir.setName("txtWorkingDir"); // NOI18N
jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
jLabel1.setName("jLabel1"); // NOI18N
txtArguments.setText(resourceMap.getString("txtArguments.text")); // NOI18N
txtArguments.setName("txtArguments"); // NOI18N
jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
jLabel2.setName("jLabel2"); // NOI18N
txtJvmArguments.setText(resourceMap.getString("txtJvmArguments.text")); // NOI18N
txtJvmArguments.setName("txtJvmArguments"); // NOI18N
javax.swing.GroupLayout pnlExecutionInfoLayout = new javax.swing.GroupLayout(pnlExecutionInfo);
pnlExecutionInfo.setLayout(pnlExecutionInfoLayout);
pnlExecutionInfoLayout.setHorizontalGroup(
pnlExecutionInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlExecutionInfoLayout.createSequentialGroup()
.addContainerGap()
.addGroup(pnlExecutionInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(txtWorkingDir, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE)
.addComponent(jLabel3)
.addComponent(jLabel1)
.addComponent(txtArguments, javax.swing.GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE)
.addComponent(jLabel2)
.addComponent(txtJvmArguments, javax.swing.GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE))
.addContainerGap())
);
pnlExecutionInfoLayout.setVerticalGroup(
pnlExecutionInfoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlExecutionInfoLayout.createSequentialGroup()
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtWorkingDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtArguments, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtJvmArguments, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
btnStartProcess.setAction(actionMap.get("startProcess")); // NOI18N
btnStartProcess.setText(resourceMap.getString("btnStartProcess.text")); // NOI18N
btnStartProcess.setToolTipText(resourceMap.getString("btnStartProcess.toolTipText")); // NOI18N
btnStartProcess.setName("btnStartProcess"); // NOI18N
btnCancel.setAction(actionMap.get("close")); // NOI18N
btnCancel.setText(resourceMap.getString("btnCancel.text")); // NOI18N
btnCancel.setToolTipText(resourceMap.getString("btnCancel.toolTipText")); // NOI18N
btnCancel.setName("btnCancel"); // NOI18N
pnlGui.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("pnlGui.border.title"))); // NOI18N
pnlGui.setName("pnlGui"); // NOI18N
jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
jLabel5.setName("jLabel5"); // NOI18N
txtGuiDelay.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
txtGuiDelay.setText(resourceMap.getString("txtGuiDelay.text")); // NOI18N
txtGuiDelay.setName("txtGuiDelay"); // NOI18N
jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
jLabel6.setName("jLabel6"); // NOI18N
javax.swing.GroupLayout pnlGuiLayout = new javax.swing.GroupLayout(pnlGui);
pnlGui.setLayout(pnlGuiLayout);
pnlGuiLayout.setHorizontalGroup(
pnlGuiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlGuiLayout.createSequentialGroup()
.addContainerGap()
.addGroup(pnlGuiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel6)
.addGroup(pnlGuiLayout.createSequentialGroup()
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(txtGuiDelay, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(32, Short.MAX_VALUE))
);
pnlGuiLayout.setVerticalGroup(
pnlGuiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(pnlGuiLayout.createSequentialGroup()
.addComponent(jLabel6)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(pnlGuiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel5)
.addComponent(txtGuiDelay, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(4, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(pnlGui, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(pnlClasspathView, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(pnlExecutionInfo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(pnlMainClass, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(btnStartProcess)
.addGap(5, 5, 5)
.addComponent(btnCancel)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(pnlMainClass, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(4, 4, 4)
.addComponent(pnlClasspathView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(pnlExecutionInfo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(pnlGui, javax.swing.GroupLayout.DEFAULT_SIZE, 71, Short.MAX_VALUE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(btnStartProcess)
.addComponent(btnCancel))
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
NewProcessInfoView dialog = new NewProcessInfoView(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}
});
}
public SnoopSession getSnoopSession() {
return model;
}
@Action
public void addClasspathEntry() {
JFileChooser fc = new JFileChooser();
if ( lastSelectedDir != null )
fc.setCurrentDirectory(lastSelectedDir);
else
fc.setCurrentDirectory(new File(userDir));
fc.setApproveButtonText("Select");
fc.setDialogTitle("Select root folders or JAR files");
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fc.setFileFilter(fileFilter);
fc.setMultiSelectionEnabled(true);
int rc = fc.showOpenDialog(getParent());
if (rc != JFileChooser.APPROVE_OPTION)
return;
File[] selectedFiles = fc.getSelectedFiles();
// Append the selected paths to our list of source roots
for (File selectedFile : selectedFiles) {
if ( selectedFile.isFile()) {
try {
ClassPath entry = new SmartURLClassPath(selectedFile.toURL());
cp.appendClassPath(entry);
classpath.addEntry(new ClasspathEntry(selectedFile.getAbsolutePath(),entry));
} catch (MalformedURLException ex) {
UIUtil.showErrorMessage(this, "Failed to add classpath entry: " + cp);
logger.error("Error adding to classpath: " + cp, ex);
}
} else if ( selectedFile.isDirectory() ) {
FileFilter jarFilter = new FileFilter() {
public boolean accept(File f) {
return f.isFile() && f.getName().endsWith(".jar");
}
};
for(File file : selectedFile.listFiles(jarFilter)) {
try {
ClassPath entry = new SmartURLClassPath(file.toURL());
cp.appendClassPath(entry);
classpath.addEntry(new ClasspathEntry(file.getAbsolutePath(),entry));
} catch (MalformedURLException ex) {
UIUtil.showErrorMessage(this, "Failed to add classpath entry: " + cp);
logger.error("Error adding to classpath: " + cp, ex);
}
}
}
}
if ( selectedFiles[0].isDirectory() ) {
lastSelectedDir = selectedFiles[0];
} else {
lastSelectedDir = selectedFiles[0].getParentFile();
}
JavaSnoop.setProperty(JavaSnoop.LAST_SELECTED_DIR, lastSelectedDir.getAbsolutePath());
JavaSnoop.saveProperties();
classpath.reload();
treeClasspath.setModel(null);
treeClasspath.setModel(classpath);
List<String> classes = classpath.getClassesSeen();
ClassesTreeModel classModel = new ClassesTreeModel(new DefaultMutableTreeNode(null));
classModel.setClasses(classes);
classModel.reload();
treeClasses.setModel(null);
treeClasses.setModel(classModel);
}
@Action
public void removeClasspathEntry() {
// Remove the paths selected in the treeClasspath from sourceRoots
TreePath[] paths = treeClasspath.getSelectionPaths();
if ( paths.length == 0 )
return;
boolean changed = false;
for (TreePath path : paths) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) (path.getLastPathComponent());
if (node.getLevel() == 1) {
ClasspathEntry entry = (ClasspathEntry)node.getUserObject();
cp.removeClassPath(entry.getEntry());
classpath.removeEntry(entry);
changed = true;
}
}
if ( changed ) {
classpath.reload();
treeClasspath.setModel(null);
treeClasspath.setModel(classpath);
List<String> classes = classpath.getClassesSeen();
ClassesTreeModel classModel = new ClassesTreeModel(new DefaultMutableTreeNode(null));
classModel.setClasses(classes);
classModel.reload();
treeClasses.setModel(null);
treeClasses.setModel(classModel);
}
}
@Action
public void searchForMainClasses() {
if ( classpath.getEntries().isEmpty() ) {
UIUtil.showErrorMessage(
this,
"Please add classpath entries before searching for a main class");
return;
}
ClassPool pool = new ClassPool(true);
for(ClasspathEntry entry : classpath.getEntries()) {
try {
pool.appendClassPath(entry.getStringEntry());
} catch(Exception e) {
logger.error(e);
}
}
final SearchMainMethodsView searchMainMethodsView = new SearchMainMethodsView(
new javax.swing.JFrame(), true, pool, classpath.getClassesSeen());
searchMainMethodsView.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
String selectedClass = (String) e.getSource();
logger.trace("Setting program's main class to: " + selectedClass);
jLabelMainClass.setText(selectedClass);
}
});
searchMainMethodsView.setVisible(true);
}
@Action
public void close() {
model = null;
dispose();
}
@Action
public void startProcess() {
String mainClass = jLabelMainClass.getText();
if ( mainClass.length() == 0 ) {
if ( classpath.getEntries().size() != 1 ) {
UIUtil.showErrorMessage(this,
"Please select a main class or " +
"a single jar");
return;
}
}
model = new SnoopSession();
model.setMainClass(mainClass);
model.setArguments(txtArguments.getText());
model.setJavaArguments(txtJvmArguments.getText());
model.setWorkingDir(txtWorkingDir.getText());
model.setClasspathString(Util.convertListToString(classpath.getEntries(), ";"));
try {
model.setGuiDelay(Integer.parseInt(txtGuiDelay.getText()));
} catch (Exception e) {
UIUtil.showErrorMessage(this,
"Please enter an integer value for the GUI delay");
return;
}
dispose();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnAddEntry;
private javax.swing.JButton btnCancel;
private javax.swing.JButton btnRemoveEntry;
private javax.swing.JButton btnSearch;
private javax.swing.JButton btnStartProcess;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabelMainClass;
private javax.swing.JPanel pnlClassesView;
private javax.swing.JScrollPane pnlClasspath;
private javax.swing.JScrollPane pnlClasspath1;
private javax.swing.JPanel pnlClasspathView;
private javax.swing.JPanel pnlExecutionInfo;
private javax.swing.JPanel pnlGui;
private javax.swing.JPanel pnlJarView;
private javax.swing.JPanel pnlMainClass;
private javax.swing.JTabbedPane tabClasspath;
private javax.swing.JTree treeClasses;
private javax.swing.JTree treeClasspath;
private javax.swing.JTextField txtArguments;
private javax.swing.JTextField txtGuiDelay;
private javax.swing.JTextField txtJvmArguments;
private javax.swing.JTextField txtMainClass;
private javax.swing.JTextField txtWorkingDir;
// End of variables declaration//GEN-END:variables
}