package net.ayld.facade.dependency.resolver.impl;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.JarFile;
import net.ayld.facade.bundle.JarExploder;
import net.ayld.facade.dependency.matcher.DependencyMatcherStrategy;
import net.ayld.facade.dependency.resolver.DependencyBundleResolver;
import net.ayld.facade.model.ClassFile;
import net.ayld.facade.model.ClassName;
import net.ayld.facade.model.ExplodedJar;
import net.ayld.facade.util.annotation.ThreadSafe;
import org.springframework.beans.factory.annotation.Required;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
@ThreadSafe
public class ManualDependencyBundleResolver implements DependencyBundleResolver{
private JarExploder jarExploder;
private DependencyMatcherStrategy dependencyMatcher;
@Override
public Set<JarFile> resolve(ClassName className, Set<JarFile> bundles) throws IOException {
final Set<JarFile> result = Sets.newHashSet();
for (ExplodedJar explodedJar : jarExploder.explode(bundles)) {
final File extractedJarDir = new File(explodedJar.getExtractedPath());
if (containsDependency(extractedJarDir, className.toString(), new HashSet<Boolean>())) {
result.add(explodedJar.getArchive());
}
}
return ImmutableSet.copyOf(result);
}
private boolean containsDependency(File dir, String dependencyClassName, Set<Boolean> results) throws IOException {
final File root = new File(dir.getAbsolutePath());
final File[] children = root.listFiles();
for (File child : children) {
if (child.isDirectory()) {
results.add(containsDependency(child, dependencyClassName, results));
}
else {
try {
if (ClassFile.isClassfile(child)) {
if (dependencyMatcher.matches(new ClassName(dependencyClassName), ClassFile.fromFilepath(child.getAbsolutePath()))) {
return true;
}
}
} catch (URISyntaxException e) {
throw new IOException(e);
}
}
}
return results.contains(Boolean.TRUE);
}
@Required
public void setDependencyMatcher(DependencyMatcherStrategy matcher) {
this.dependencyMatcher = matcher;
}
@Required
public void setJarExploder(JarExploder jarExploder) {
this.jarExploder = jarExploder;
}
}