// Path: jar-analyzer/src/main/java/mb/jar_analyzer/jar/JarUtils.java
// public class JarUtils {
// 
//     public static final void processJarClasses(Iterable<File> files, ClassProcessor processor) throws IOException {
//         for(File file : files) {
//             try(JarFile jar = new JarFile(file)) {
//                 final Enumeration<JarEntry> entries = jar.entries();
//                 while(entries.hasMoreElements()) {
//                     final JarEntry entry = entries.nextElement();
//                     if(entry.getName().endsWith(".class")) {
//                         final ClassReader classReader = new ClassReader(jar.getInputStream(entry));
//                         processor.accept(classReader);
//                     }
//                 }
//             }
//         }
//     }
// 
//     public static final Map<String, ClassNode> readJarClasses(Iterable<File> files) throws IOException {
//         final Map<String, ClassNode> classes = new HashMap<>();
//         processJarClasses(files, cr -> {
//             final ClassNode classNode = new ClassNode();
//             cr.accept(classNode, ClassReader.SKIP_CODE & ClassReader.SKIP_DEBUG & ClassReader.SKIP_FRAMES);
//             if(classes.put(classNode.name, classNode) != null) {
//                 throw new IllegalArgumentException("Duplicate class " + classNode.name);
//             }
//         });
//         return classes;
//     }
// 
//     public static boolean isJavaClass(String name) {
//         // @formatter:off
//         return name.startsWith("java/")
// //                || name.startsWith("javax/")
//                 ;
//         // @formatter:on
//     }
// 
//     public static boolean isJDKClass(String name) {
//         // @formatter:off
//         return name.startsWith("java/")
//                 || name.startsWith("javax/")
//                 || name.startsWith("sun/")
//                 || name.startsWith("jdk/")
//                 || name.startsWith("com/sun/")
//                 || name.startsWith("com/apple/")
//                 || name.startsWith("com/oracle/")
//                 || name.startsWith("org/w3c/")
//                 || name.startsWith("org/xml/")
//                 || name.startsWith("org/omg/")
//                 || name.startsWith("org/ietf/")
//                 || name.startsWith("org/jcp/")
//                 || name.startsWith("apple/")
//                 ;
//         // @formatter:on
//     }
// 
// }


import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.Streams;
import mb.jar_analyzer.jar.JarUtils;
import mb.nabl2.util.TopoSorter;
import mb.nabl2.util.TopoSorter.TopoSortedComponents;
package mb.jar_analyzer.deps;




public class DepsCommand implements Runnable {

    private final List<File> files = new ArrayList<>();

    public DepsCommand(List<String> args) {
        Iterator<String> it = args.iterator();
        while(it.hasNext()) {
            String arg = it.next();
            switch(arg) {
                default:
                    files.add(new File(arg));
                case "--":
                    Streams.stream(it).forEach(f -> files.add(new File(f)));
                    break;
            }
        }
    }

    @Override public void run() {
// Path: jar-analyzer/src/main/java/mb/jar_analyzer/jar/JarUtils.java
// public class JarUtils {
// 
//     public static final void processJarClasses(Iterable<File> files, ClassProcessor processor) throws IOException {
//         for(File file : files) {
//             try(JarFile jar = new JarFile(file)) {
//                 final Enumeration<JarEntry> entries = jar.entries();
//                 while(entries.hasMoreElements()) {
//                     final JarEntry entry = entries.nextElement();
//                     if(entry.getName().endsWith(".class")) {
//                         final ClassReader classReader = new ClassReader(jar.getInputStream(entry));
//                         processor.accept(classReader);
//                     }
//                 }
//             }
//         }
//     }
// 
//     public static final Map<String, ClassNode> readJarClasses(Iterable<File> files) throws IOException {
//         final Map<String, ClassNode> classes = new HashMap<>();
//         processJarClasses(files, cr -> {
//             final ClassNode classNode = new ClassNode();
//             cr.accept(classNode, ClassReader.SKIP_CODE & ClassReader.SKIP_DEBUG & ClassReader.SKIP_FRAMES);
//             if(classes.put(classNode.name, classNode) != null) {
//                 throw new IllegalArgumentException("Duplicate class " + classNode.name);
//             }
//         });
//         return classes;
//     }
// 
//     public static boolean isJavaClass(String name) {
//         // @formatter:off
//         return name.startsWith("java/")
// //                || name.startsWith("javax/")
//                 ;
//         // @formatter:on
//     }
// 
//     public static boolean isJDKClass(String name) {
//         // @formatter:off
//         return name.startsWith("java/")
//                 || name.startsWith("javax/")
//                 || name.startsWith("sun/")
//                 || name.startsWith("jdk/")
//                 || name.startsWith("com/sun/")
//                 || name.startsWith("com/apple/")
//                 || name.startsWith("com/oracle/")
//                 || name.startsWith("org/w3c/")
//                 || name.startsWith("org/xml/")
//                 || name.startsWith("org/omg/")
//                 || name.startsWith("org/ietf/")
//                 || name.startsWith("org/jcp/")
//                 || name.startsWith("apple/")
//                 ;
//         // @formatter:on
//     }
// 
// }


// Path: jar-analyzer/src/main/java/mb/jar_analyzer/deps/DepsCommand.java
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.Streams;
import mb.jar_analyzer.jar.JarUtils;
import mb.nabl2.util.TopoSorter;
import mb.nabl2.util.TopoSorter.TopoSortedComponents;

package mb.jar_analyzer.deps;




public class DepsCommand implements Runnable {

    private final List<File> files = new ArrayList<>();

    public DepsCommand(List<String> args) {
        Iterator<String> it = args.iterator();
        while(it.hasNext()) {
            String arg = it.next();
            switch(arg) {
                default:
                    files.add(new File(arg));
                case "--":
                    Streams.stream(it).forEach(f -> files.add(new File(f)));
                    break;
            }
        }
    }

    @Override public void run() {
        final DependencyCollector depsCollector = new DependencyCollector(n -> !JarUtils.isJDKClass(n), false);