package ameba.scanner;
import ameba.event.SystemEventBus;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.glassfish.jersey.server.internal.scanning.PackageNamesScanner;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static org.apache.commons.io.IOUtils.closeQuietly;
/**
* <p>PackageScanner class.</p>
*
* @author icode
*
*/
public class PackageScanner {
private Set<String> scanPkgs;
private List<String> acceptClasses = Lists.newArrayList();
private Set<String> foundClasses = Sets.newHashSet();
/**
* <p>Constructor for PackageScanner.</p>
*
* @param scanPkgs a {@link java.util.Set} object.
*/
public PackageScanner(Set<String> scanPkgs) {
this.scanPkgs = scanPkgs;
}
/**
* <p>scan.</p>
*/
public void scan() {
final PackageNamesScanner scanner = new PackageNamesScanner(
scanPkgs.toArray(new String[scanPkgs.size()]), true);
while (scanner.hasNext()) {
String fileName = scanner.next();
if (!fileName.endsWith(".class")) continue;
ClassInfo info = new ClassInfo(fileName) {
InputStream in;
@Override
public InputStream getFileStream() {
if (in == null) {
in = scanner.open();
}
return in;
}
@Override
public void closeFileStream() {
closeQuietly(in);
}
};
String className = info.getCtClass().getName();
if (!foundClasses.contains(className)) {
ClassFoundEvent event = new ClassFoundEvent(info);
SystemEventBus.publish(event);
info.closeFileStream();
if (event.accept) {
acceptClasses.add(className);
}
}
foundClasses.add(className);
}
}
/**
* <p>clear.</p>
*/
public void clear() {
acceptClasses.clear();
foundClasses.clear();
}
/**
* <p>Getter for the field <code>scanPkgs</code>.</p>
*
* @return a {@link java.util.Set} object.
*/
public Set<String> getScanPkgs() {
return Collections.unmodifiableSet(scanPkgs);
}
/**
* <p>Getter for the field <code>acceptClasses</code>.</p>
*
* @return a {@link java.util.List} object.
*/
public List<String> getAcceptClasses() {
return Collections.unmodifiableList(acceptClasses);
}
/**
* <p>Getter for the field <code>foundClasses</code>.</p>
*
* @return a {@link java.util.Set} object.
*/
public Set<String> getFoundClasses() {
return Collections.unmodifiableSet(foundClasses);
}
}