// This product is provided under the terms of EPL (Eclipse Public License)
// version 1.0.
//
// The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php
package org.dtangler.javaengine.dependencyengine;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.dtangler.core.configuration.Arguments;
import org.dtangler.core.dependencies.Dependencies;
import org.dtangler.core.dependencies.Scope;
import org.dtangler.core.dependencyengine.AbstractDependencyEngine;
import org.dtangler.core.dependencyengine.DependencyEngine;
import org.dtangler.core.exception.DtException;
import org.dtangler.core.filefinder.FullPathWildCardFileFilter;
import org.dtangler.core.filefinder.RecursiveFileFinder;
import org.dtangler.javaengine.classfileparser.ClassFileParser;
import org.dtangler.javaengine.jarfileparser.JarFileParser;
import org.dtangler.javaengine.types.JavaClass;
import org.dtangler.javaengine.types.JavaScope;
public class JavaDependencyEngine extends AbstractDependencyEngine {
private Scope getDefaultScope(Arguments arguments) {
if (JavaScope.classes.getDisplayName().equalsIgnoreCase(
arguments.getScope()))
return JavaScope.classes;
if (JavaScope.locations.getDisplayName().equalsIgnoreCase(
arguments.getScope()))
return JavaScope.locations;
return JavaScope.packages;
}
public Dependencies getDependencies(Arguments arguments) {
Dependencies dependencies = new ClassDependencies(getJavaClasses(arguments))
.getDependencies();
dependencies.setDefaultScope(getDefaultScope(arguments));
return dependencies;
}
public ArgumentsMatch getArgumentsMatchThisEngineExt(Arguments arguments) {
if (arguments == null)
throw new DtException("invalid arguments: null");
DependencyEngine.ArgumentsMatch argumentsMatch = ArgumentsMatch.no;
for (String path : arguments.getInput()) {
if (path == null)
continue;
if (path.toLowerCase().endsWith(".jar")
|| path.toLowerCase().endsWith(".class")) {
argumentsMatch = DependencyEngine.ArgumentsMatch.yes;
} else {
File file = new File(path);
if (!file.isDirectory()) {
return DependencyEngine.ArgumentsMatch.no;
} else {
if (argumentsMatch == ArgumentsMatch.no)
argumentsMatch = ArgumentsMatch.maybe;
}
}
}
return argumentsMatch;
}
public List<String> getInputFileNameExtensions() {
return Arrays.asList("jar", "class");
}
public boolean isDirectoryInputSupported() {
return true;
}
private Set<JavaClass> getJavaClasses(Arguments arguments) {
RecursiveFileFinder fileFinder = new RecursiveFileFinder();
fileFinder.setFilter(new FullPathWildCardFileFilter(Arrays.asList(
".class", ".jar"), arguments.getIgnoredFileMasks()));
for (String path : arguments.getInput())
fileFinder.findFiles(path);
Set<JavaClass> classes = new HashSet<JavaClass>();
for (File file : fileFinder.getFiles()) {
if (file.getName().endsWith(".class")) {
classes.add(getDataFromClassFile(file, fileFinder));
} else {
classes.addAll(getDataFromJarFile(file, fileFinder));
}
}
return classes;
}
private Set<JavaClass> getDataFromJarFile(File file,
RecursiveFileFinder fileFinder) {
try {
Set<JavaClass> jarContents = new JarFileParser().parse(file);
for (JavaClass clazz : jarContents) {
clazz.setLocation(file.getAbsolutePath());
}
return jarContents;
} catch (IOException e) {
throw new DtException("Jar file could not be read: "
+ file.getAbsolutePath(), e);
}
}
private JavaClass getDataFromClassFile(File file,
RecursiveFileFinder fileFinder) {
JavaClass parsed = new ClassFileParser().parse(file);
parsed.setLocation(fileFinder.getFilesWithPaths().get(file));
return parsed;
}
public String getInputFilesDescription() {
return "Java binary file";
}
}