/** * Created : Mar 28, 2012 * * @author pquiring */ import java.io.*; import java.util.*; import javaforce.*; import javax.swing.*; import javax.swing.tree.*; public class MainPanel extends javax.swing.JPanel { /** * Creates new form MainPanel */ public MainPanel(String archive) { initComponents(); xml.root.setName("Archive"); tree.setModel(xml.getTreeModel()); if (archive != null) openArchive(archive); } /** * 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(); tree = new javax.swing.JTree(); jToolBar1 = new javax.swing.JToolBar(); createArchive = new javax.swing.JButton(); openArchive = new javax.swing.JButton(); extract = new javax.swing.JButton(); addFiles = new javax.swing.JButton(); stop = new javax.swing.JButton(); jScrollPane1.setViewportView(tree); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); createArchive.setText("Create Archive"); createArchive.setFocusable(false); createArchive.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); createArchive.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); createArchive.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { createArchiveActionPerformed(evt); } }); jToolBar1.add(createArchive); openArchive.setText("Open Archive"); openArchive.setFocusable(false); openArchive.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); openArchive.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); openArchive.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openArchiveActionPerformed(evt); } }); jToolBar1.add(openArchive); extract.setText("Extract"); extract.setEnabled(false); extract.setFocusable(false); extract.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); extract.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); extract.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { extractActionPerformed(evt); } }); jToolBar1.add(extract); addFiles.setText("Add Files/Folders"); addFiles.setEnabled(false); addFiles.setFocusable(false); addFiles.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); addFiles.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); addFiles.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addFilesActionPerformed(evt); } }); jToolBar1.add(addFiles); stop.setText("Stop"); stop.setEnabled(false); stop.setFocusable(false); stop.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); stop.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); stop.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { stopActionPerformed(evt); } }); jToolBar1.add(stop); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 516, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 525, Short.MAX_VALUE)) ); }// </editor-fold>//GEN-END:initComponents private void openArchiveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openArchiveActionPerformed openArchive(); }//GEN-LAST:event_openArchiveActionPerformed private void extractActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractActionPerformed JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.setMultiSelectionEnabled(false); File path = new File(JF.getUserPath()); chooser.setCurrentDirectory(path); if (chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return; File dest = chooser.getSelectedFile(); ExtractDialog dialog = new ExtractDialog(null, true, tree.getSelectionCount() > 0); dialog.setVisible(true); if (!dialog.accepted) return; extractFiles(dest, dialog.getSelectFiles(), dialog.getCreateFolders(), dialog.getOverwriteFiles(), dialog.getNewerOnly()); }//GEN-LAST:event_extractActionPerformed private void addFilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addFilesActionPerformed JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); chooser.setMultiSelectionEnabled(true); File path = new File(JF.getUserPath()); chooser.setCurrentDirectory(path); if (chooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return; File files[] = chooser.getSelectedFiles(); addFiles(files); }//GEN-LAST:event_addFilesActionPerformed private void createArchiveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createArchiveActionPerformed JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setMultiSelectionEnabled(false); File path = new File(JF.getUserPath()); chooser.setCurrentDirectory(path); javax.swing.filechooser.FileFilter ff_zip = new javax.swing.filechooser.FileFilter() { public boolean accept(File file) { return (file.getName().endsWith(".zip")); } public String getDescription() { return "ZIP Files (*.zip)"; } }; chooser.addChoosableFileFilter(ff_zip); javax.swing.filechooser.FileFilter ff_tar = new javax.swing.filechooser.FileFilter() { public boolean accept(File file) { if (file.getName().endsWith(".tar.gz")) return true; if (file.getName().endsWith(".tgz")) return true; if (file.getName().endsWith(".tar.bz2")) return true; if (file.getName().endsWith(".tbz2")) return true; return false; } public String getDescription() { return "TAR Files (*.tar*)"; } }; chooser.addChoosableFileFilter(ff_tar); if (chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return; String filename = chooser.getSelectedFile().getName(); if (filename.endsWith(".zip")) { type = "zip"; } else { boolean ok = false; if (filename.endsWith(".tar.gz")) { tarType = 'z'; ok = true; } else if (filename.endsWith(".tgz")) { tarType = 'z'; ok = true; } else if (filename.endsWith(".tar.bz2")) { tarType = 'j'; ok = true; } else if (filename.endsWith(".tbz2")) { tarType = 'j'; ok = true; } if (!ok) {JF.showError("Error", "Unknown archive type"); return;} type = "tar"; } archive = chooser.getSelectedFile(); xml.deleteAll(); xml.root.setName("Archive"); extract.setEnabled(true); addFiles.setEnabled(true); }//GEN-LAST:event_createArchiveActionPerformed private void stopActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stopActionPerformed abort = true; }//GEN-LAST:event_stopActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addFiles; private javax.swing.JButton createArchive; private javax.swing.JButton extract; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JToolBar jToolBar1; private javax.swing.JButton openArchive; private javax.swing.JButton stop; private javax.swing.JTree tree; // End of variables declaration//GEN-END:variables private XML xml = new XML(); private File archive; private String type; //zip or tar private char tarType; //z=gzip j=bzip2 private volatile boolean abort; private Thread thread; private void openArchive(String filename) { xml.deleteAll(); xml.root.setName("Archive"); extract.setEnabled(false); addFiles.setEnabled(false); archive = new File(filename); boolean typeNotSupported = true; int idx = filename.lastIndexOf('.'); if (idx != -1) { String ext = filename.substring(idx+1).toLowerCase(); if (ext.equals("zip")) { typeNotSupported = false; type = ext; tarType = '-'; } else if (ext.equals("tar")) { typeNotSupported = false; type = "tar"; tarType = '-'; } else if (ext.equals("tgz")) { typeNotSupported = false; type = "tar"; tarType = 'z'; } else if (ext.equals("tbz2")) { typeNotSupported = false; type = "tar"; tarType = 'j'; } else if (ext.equals("gz")) { if (filename.toLowerCase().endsWith(".tar.gz")) { typeNotSupported = false; type = "tar"; tarType = 'z'; } } else if (ext.equals("bz2")) { if (filename.toLowerCase().endsWith(".tar.bz2")) { typeNotSupported = false; type = "tar"; tarType = 'j'; } } } if (!archive.exists() || typeNotSupported) { JF.showError("Error", "That file doesn't exist"); archive = null; return; } listArchive(); } private void openArchive() { JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setMultiSelectionEnabled(false); File path = new File(JF.getUserPath()); chooser.setCurrentDirectory(path); javax.swing.filechooser.FileFilter ff_zip = new javax.swing.filechooser.FileFilter() { public boolean accept(File file) { return (file.getName().endsWith(".zip")); } public String getDescription() { return "ZIP Files (*.zip)"; } }; chooser.addChoosableFileFilter(ff_zip); javax.swing.filechooser.FileFilter ff_tar = new javax.swing.filechooser.FileFilter() { public boolean accept(File file) { if (file.getName().endsWith(".tar.gz")) return true; if (file.getName().endsWith(".tgz")) return true; if (file.getName().endsWith(".tar.bz2")) return true; if (file.getName().endsWith(".tbz2")) return true; return false; } public String getDescription() { return "TAR Files (*.tar*)"; } }; chooser.addChoosableFileFilter(ff_tar); if (chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return; String filename = chooser.getSelectedFile().getAbsolutePath(); openArchive(filename); } private void listArchive() { if (archive == null) return; ShellProcess sp = new ShellProcess(); String cmd[]; if (type.equals("zip")) { cmd = new String[] {"unzip", "-lqq" + tarType, archive.getAbsolutePath()}; } else { cmd = new String[] {"tar", "tf" + tarType, archive.getAbsolutePath()}; } String output = sp.run(cmd, false); String lns[] = output.split("\n"); if (type.equals("zip")) { //unzip format : size data time filename // 105706 2012-03-28 10:03 .xsession-errors for(int a=0;a<lns.length;a++) { lns[a] = lns[a].substring(30); } } XML.XMLTag tag; File file; for(int a=0;a<lns.length;a++) { String f[] = lns[a].split("/"); String path = ""; tag = xml.root; for(int b=0;b<f.length-1;b++) { tag = xml.addSetTag(tag, f[b], "", ""); } xml.addSetTag(tag, f[f.length-1], "", lns[a]); } //make root files visible int cnt = xml.root.getChildCount(); for(int a=0;a<cnt;a++) { tree.makeVisible(new TreePath(xml.root.getChildAt(a).getPath())); } //enable buttons extract.setEnabled(true); addFiles.setEnabled(true); } private File files[]; private void addFiles(File files[]) { this.files = files; createArchive.setEnabled(false); openArchive.setEnabled(false); extract.setEnabled(false); addFiles.setEnabled(false); stop.setEnabled(true); new Thread() { public void run() { addFiles(); listArchive(); createArchive.setEnabled(true); openArchive.setEnabled(true); extract.setEnabled(true); addFiles.setEnabled(true); stop.setEnabled(false); } }.start(); } private void addFiles() { //tar : tar c?f archive files //zip : zip -r archive files String path = files[0].getAbsolutePath(); int idx = path.lastIndexOf('/'); path = path.substring(0, idx+1); ArrayList<String> cmd = new ArrayList<String>(); if (type.equals("zip")) { cmd.add("zip"); cmd.add("-r"); } else { cmd.add("tar"); cmd.add("c" + tarType + "f"); } cmd.add(archive.getAbsolutePath()); for(int a=0;a<files.length;a++) { cmd.add(files[a].getName()); } ShellProcess sp = new ShellProcess(); sp.setFolder(new File(path)); String output = sp.run(cmd, false); //TODO : handle errors listArchive(); } private File dest; private boolean selectFiles, createFolders, overwriteFiles, newerOnly; private void extractFiles(File dest, boolean selectFiles, boolean createFolders, boolean overwriteFiles, boolean newerOnly) { createArchive.setEnabled(false); openArchive.setEnabled(false); extract.setEnabled(false); addFiles.setEnabled(false); stop.setEnabled(true); this.dest = dest; this.selectFiles = selectFiles; this.createFolders = createFolders; this.overwriteFiles = overwriteFiles; this.newerOnly = newerOnly; new Thread() { public void run() { extractFiles(); listArchive(); createArchive.setEnabled(true); openArchive.setEnabled(true); extract.setEnabled(true); addFiles.setEnabled(true); stop.setEnabled(false); } }.start(); } private void extractFiles() { //tar : tar x?f archive [files] -C dest //zip : unzip archive [files] -d dest [-u(newerOnly)] [-n(!overwriteFiles)] [-P password] ArrayList<String> cmd = new ArrayList<String>(); if (type.equals("zip")) { cmd.add("unzip"); cmd.add(archive.getAbsolutePath()); if (selectFiles) { TreePath paths[] = tree.getSelectionPaths(); XML.XMLTag tag; for(int a=0;a<paths.length;a++) { tag = xml.getTag(paths[a]); cmd.add(tag.content); } } cmd.add("-d"); cmd.add(dest.getAbsolutePath()); //TODO : createFolders ??? if (!overwriteFiles) cmd.add("-n"); if (newerOnly) cmd.add("-u"); } else { cmd.add("tar"); cmd.add("x" + tarType + "f"); cmd.add(archive.getAbsolutePath()); if (selectFiles) { TreePath paths[] = tree.getSelectionPaths(); XML.XMLTag tag; for(int a=0;a<paths.length;a++) { tag = xml.getTag(paths[a]); cmd.add(tag.content); } } cmd.add("-C"); cmd.add(dest.getAbsolutePath()); //TODO : createFolders ??? if (overwriteFiles) cmd.add("--overwrite"); if (newerOnly) cmd.add("--keep-newer-files"); } ShellProcess sp = new ShellProcess(); String output = sp.run(cmd, false); //TODO : handle errors } }