/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package jpa.tools.swing;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* Searches for a given class in the set of directories recursively.
* If a given directory contains jar file then searches inside the jar.
*
* Usage
* $ java find.Finder class dir1 dir2...
* where
* class is fully qualified class name
* dir name of a file system directory
*
* Example
* $ java find.Finder org.eclipse.ui.plugin.AbstractUIPlugin c:\eclipse\plugins
* will print
* org.eclipse.ui.plugin.AbstractUIPlugin found in
* c:\eclipse\plugins\org.eclipse.ui.workbench_3.4.1.M20080827-0800a.jar
*
* @author Pinaki Poddar
*
*/
public class Finder {
private static final String CLASS_SUFFIX = ".class";
private static final String JAR_SUFFIX = ".jar";
private static final char DOT = '.';
private static final boolean DEBUG = false;
private static void usage() {
System.err.println("Searches a given class in the given directories."
+ "\r\nIf a given directory contains jar then searches within the jar."
+ "\r\nIf a given directory contains other directories then searches "
+ "recursively.\r\n");
System.err.println("\r\n Usage:");
System.err.println(" $ java find.Finder class dir [dir...]");
System.err.println(" where");
System.err.println(" class fully-qualified class name");
System.err.println(" dir name of a directory");
System.err.println("\r\n Example:");
System.err.println(" $ java find.Finder java.lang.Object c:\\java");
}
public static void main(String[] args) throws Exception {
if (args.length < 2) {
usage();
System.exit(0);
}
Finder finder = new Finder();
for (int i = 1; i < args.length; i++) {
File root = new File(args[i]);
finder.scan(root, args[0]);
}
}
private void scan(File dir, String cls) throws IOException {
File[] classes = dir.listFiles(new FileFilter() {
public boolean accept(File path) {
return path.getName().endsWith(CLASS_SUFFIX);
}
});
String clsName = cls+CLASS_SUFFIX;
for (File c : classes) {
String name = c.getName().replace(File.separatorChar, DOT);
if (name.endsWith(clsName))
System.err.println(cls + " found in " + c.getAbsolutePath());
}
File[] jars = dir.listFiles(new FileFilter() {
public boolean accept(File path) {
return path.getName().endsWith(JAR_SUFFIX);
}
});
for (File jar : jars) {
JarFile jarFile = new JarFile(jar);
scan(jarFile, cls);
}
File[] dirs = dir.listFiles(new FileFilter() {
public boolean accept(File path) {
return path.isDirectory();
}
});
for (File cdir : dirs)
scan(cdir, cls);
}
private void scan(JarFile jar, String cls) {
String clsName = cls.replace('.', '/') + CLASS_SUFFIX;
debug("Scanning " + jar.getName() + " for [" + clsName + "]");
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String entryName = entry.getName();
if (entryName.endsWith(CLASS_SUFFIX))
debug(" " + entryName);
if (entryName.equals(clsName))
System.err.println(cls + " found in " + jar.getName());
}
}
private void debug(String s) {
if (DEBUG)
System.err.println(s);
}
}