DependencyExtractAction.java

  1. /*
  2.  *  Copyright (c) 2001-2024, Jean Tessier
  3.  *  All rights reserved.
  4.  *  
  5.  *  Redistribution and use in source and binary forms, with or without
  6.  *  modification, are permitted provided that the following conditions
  7.  *  are met:
  8.  *  
  9.  *      * Redistributions of source code must retain the above copyright
  10.  *        notice, this list of conditions and the following disclaimer.
  11.  *  
  12.  *      * Redistributions in binary form must reproduce the above copyright
  13.  *        notice, this list of conditions and the following disclaimer in the
  14.  *        documentation and/or other materials provided with the distribution.
  15.  *  
  16.  *      * Neither the name of Jean Tessier nor the names of his contributors
  17.  *        may be used to endorse or promote products derived from this software
  18.  *        without specific prior written permission.
  19.  *  
  20.  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21.  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22.  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23.  *  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR
  24.  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25.  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26.  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27.  *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28.  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29.  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30.  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31.  */

  32. package com.jeantessier.dependencyfinder.gui;

  33. import com.jeantessier.classreader.ClassfileLoader;
  34. import com.jeantessier.classreader.ClassfileScanner;
  35. import com.jeantessier.classreader.TransientClassfileLoader;
  36. import com.jeantessier.dependency.LinkMaximizer;
  37. import com.jeantessier.dependency.LinkMinimizer;

  38. import javax.swing.*;
  39. import java.awt.event.ActionEvent;
  40. import java.io.File;
  41. import java.util.Date;

  42. public class DependencyExtractAction extends AbstractAction implements Runnable {
  43.     private final DependencyFinder model;

  44.     public DependencyExtractAction(DependencyFinder model) {
  45.         this.model = model;

  46.         putValue(Action.LONG_DESCRIPTION, "Extract dependencies from compiled classes");
  47.         putValue(Action.NAME, "Extract");
  48.         putValue(Action.SMALL_ICON, new ImageIcon(getClass().getResource("icons/extract.gif")));
  49.     }

  50.     public void actionPerformed(ActionEvent e) {
  51.         JFileChooser chooser;
  52.         if (model.getInputFiles().isEmpty()) {
  53.             chooser = new JFileChooser(new File("."));
  54.         } else {
  55.             chooser = new JFileChooser(model.getInputFiles().iterator().next());
  56.         }
  57.         chooser.addChoosableFileFilter(new JavaBytecodeFileFilter());
  58.         chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
  59.         chooser.setMultiSelectionEnabled(true);
  60.         int returnValue = chooser.showDialog(model, "Extract");
  61.         if (returnValue == JFileChooser.APPROVE_OPTION) {
  62.             for (File file : chooser.getSelectedFiles()) {
  63.                 model.addInputFile(file);
  64.             }
  65.             new Thread(this).start();
  66.         }
  67.     }

  68.     public void run() {
  69.         Date start = new Date();

  70.         model.getStatusLine().showInfo("Scanning ...");
  71.         ClassfileScanner scanner = new ClassfileScanner();
  72.         scanner.load(model.getInputFiles());

  73.         model.getProgressBar().setMaximum(scanner.getNbFiles());

  74.         model.getMonitor().setClosedSession(false);

  75.         ClassfileLoader loader = new TransientClassfileLoader(model.getClassfileLoaderDispatcher());
  76.         loader.addLoadListener(new VerboseListener(model.getStatusLine(), model.getProgressBar()));
  77.         loader.addLoadListener(model.getMonitor());
  78.         loader.load(model.getInputFiles());

  79.         if (model.getMaximize()) {
  80.             model.getStatusLine().showInfo("Maximizing ...");
  81.             new LinkMaximizer().traverseNodes(model.getPackages());
  82.         } else if (model.getMinimize()) {
  83.             model.getStatusLine().showInfo("Minimizing ...");
  84.             new LinkMinimizer().traverseNodes(model.getPackages());
  85.         }

  86.         Date stop = new Date();

  87.         model.getStatusLine().showInfo("Done (" + ((stop.getTime() - start.getTime()) / (double) 1000) + " secs).");
  88.         model.setTitle("Dependency Finder - Extractor");
  89.     }
  90. }