package org.netbeans.gradle.project.java.model;
import java.io.File;
import java.util.List;
import org.jtrim.property.PropertyFactory;
import org.jtrim.property.PropertySource;
import org.jtrim.property.ValueConverter;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.api.project.Project;
import org.netbeans.gradle.model.java.JavaSourceSet;
import org.netbeans.gradle.project.java.JavaExtension;
import org.netbeans.gradle.project.properties.NbProperties;
import org.netbeans.gradle.project.util.NbFunction;
public final class ProjectDependencyCandidate {
private static final PropertySource<JavaProjectDependencyDef> NO_DEPENDENCY
= PropertyFactory.<JavaProjectDependencyDef>constSource(null);
private final Project project;
private final File dependency;
private final PropertySource<JavaProjectDependencyDef> projectDependency;
public ProjectDependencyCandidate(Project project, File dependency) {
ExceptionHelper.checkNotNullArgument(project, "project");
ExceptionHelper.checkNotNullArgument(dependency, "dependency");
this.project = project;
this.dependency = dependency;
this.projectDependency = javaModelOfProject(dependency, JavaExtension.extensionOfProject(project));
}
private static PropertySource<JavaProjectDependencyDef> javaModelOfProject(
final File dependency,
PropertySource<JavaExtension> extRef) {
return NbProperties.propertyOfProperty(extRef, new NbFunction<JavaExtension, PropertySource<JavaProjectDependencyDef>>() {
@Override
public PropertySource<JavaProjectDependencyDef> apply(JavaExtension ext) {
return ext != null
? asProjectDepedencyDef(dependency, ext, ext.currentModel())
: NO_DEPENDENCY;
}
});
}
private static PropertySource<JavaProjectDependencyDef> asProjectDepedencyDef(
final File dependency,
final JavaExtension ext,
final PropertySource<NbJavaModel> modelRef) {
return PropertyFactory.convert(modelRef, new ValueConverter<NbJavaModel, JavaProjectDependencyDef>() {
@Override
public JavaProjectDependencyDef convert(NbJavaModel input) {
if (input == null) {
return null;
}
NbJavaModule module = input.getMainModule();
List<JavaSourceSet> sourceSets = module.getSourceSetsForOutput(dependency);
if (sourceSets.isEmpty()) {
return null;
}
return new JavaProjectDependencyDef(ext, sourceSets);
}
});
}
public Project getProject() {
return project;
}
public PropertySource<JavaProjectDependencyDef> projectDependency() {
return projectDependency;
}
public File getDependency() {
return dependency;
}
@Override
public String toString() {
return "ProjectDependencyCandidate{" + dependency + '}';
}
}