/* * 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.forceclass; import com.aspect.snoop.agent.AgentLogger; import com.aspect.snoop.util.UIUtil; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import javax.swing.JFileChooser; import org.jdesktop.application.Action; /** * * @author adabirsiaghi */ public class ForceLoadClassesView extends javax.swing.JDialog { /** Creates new form ForceClassesLoadView */ public ForceLoadClassesView(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); txtClasses = new javax.swing.JTextArea(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); btnAddFromJar = new javax.swing.JButton(); btnClear = new javax.swing.JButton(); btnLoad = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(com.aspect.snoop.JavaSnoop.class).getContext().getResourceMap(ForceLoadClassesView.class); setTitle(resourceMap.getString("Form.title")); // NOI18N setModal(true); setName("Form"); // NOI18N setResizable(false); jScrollPane1.setName("jScrollPane1"); // NOI18N txtClasses.setColumns(20); txtClasses.setRows(5); txtClasses.setName("txtClasses"); // NOI18N jScrollPane1.setViewportView(txtClasses); jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N jLabel1.setName("jLabel1"); // NOI18N jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N jLabel2.setName("jLabel2"); // NOI18N jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N jLabel3.setName("jLabel3"); // NOI18N jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N jLabel4.setName("jLabel4"); // NOI18N javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(com.aspect.snoop.JavaSnoop.class).getContext().getActionMap(ForceLoadClassesView.class, this); btnAddFromJar.setAction(actionMap.get("addFromJar")); // NOI18N btnAddFromJar.setText(resourceMap.getString("btnAddFromJar.text")); // NOI18N btnAddFromJar.setToolTipText(resourceMap.getString("btnAddFromJar.toolTipText")); // NOI18N btnAddFromJar.setName("btnAddFromJar"); // NOI18N btnClear.setAction(actionMap.get("clear")); // NOI18N btnClear.setText(resourceMap.getString("btnClear.text")); // NOI18N btnClear.setName("btnClear"); // NOI18N btnLoad.setAction(actionMap.get("done")); // NOI18N btnLoad.setText(resourceMap.getString("btnLoad.text")); // NOI18N btnLoad.setToolTipText(resourceMap.getString("btnLoad.toolTipText")); // NOI18N btnLoad.setName("btnLoad"); // NOI18N 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(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 592, Short.MAX_VALUE) .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 592, Short.MAX_VALUE) .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnAddFromJar, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE) .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(btnClear, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE) .addComponent(btnLoad, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 452, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel3) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addComponent(jLabel4) .addGap(23, 23, 23) .addComponent(btnAddFromJar) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnClear) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btnLoad)) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { ForceLoadClassesView dialog = new ForceLoadClassesView(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); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnAddFromJar; private javax.swing.JButton btnClear; private javax.swing.JButton btnLoad; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea txtClasses; // End of variables declaration//GEN-END:variables List<String> classes = null; public List<String> getClassesToLoad() { return classes; } String lastJarFile = ""; @Action public void addFromJar() { JFileChooser fc = null; if ( lastJarFile.length() > 0 ) { File f = new File(lastJarFile); if ( f.exists() ) { fc = new JFileChooser(f.getParentFile()); } else { fc = new JFileChooser(); } } else { fc = new JFileChooser(); } fc.setMultiSelectionEnabled(true); int rc = fc.showOpenDialog(this); if (rc == JFileChooser.APPROVE_OPTION) { File[] of = fc.getSelectedFiles(); try { for(File f : of) { lastJarFile = f.getAbsolutePath(); addJarClasses(f.getAbsolutePath()); } } catch(IOException ioe) { UIUtil.showErrorMessage(this, "Couldn't load classes from jar: " + ioe.getMessage()); AgentLogger.error(ioe); } } } @Action public void clear() { txtClasses.setText(""); } @Action public void done() { classes = new ArrayList<String>(); String txt = txtClasses.getText(); String[] classArray = txt.split("\n"); for(String cls : classArray) { classes.add(cls.trim()); } setVisible(false); } public boolean userCanceled() { return classes == null; } private void addJarClasses(String lastJarFile) throws IOException { JarFile jar = new JarFile(lastJarFile); StringBuilder sb = new StringBuilder(2000); String nl = System.getProperty("line.separator"); for (Enumeration e = jar.entries(); e.hasMoreElements();) { JarEntry entry = (JarEntry) e.nextElement(); if (!entry.isDirectory()) { String name = entry.getName(); if (name.endsWith(".class")) { name = name.substring(0, name.length() - 6); name = name.replace('/', '.'); sb.append(name); sb.append(nl); } } } String currentText = txtClasses.getText(); if ( currentText.length() > 0 && ! currentText.endsWith(nl) ) { currentText += nl; } txtClasses.setText(currentText + sb.toString().trim()); } }