package org.netbeans.gradle.project.query;
import java.io.File;
import javax.swing.event.ChangeListener;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.project.properties.global.CommonGlobalSettings;
import org.netbeans.gradle.project.util.GradleFileUtils;
import org.netbeans.gradle.project.util.NbSupplier;
import org.netbeans.spi.java.queries.SourceForBinaryQueryImplementation;
import org.netbeans.spi.java.queries.SourceForBinaryQueryImplementation2;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.lookup.ServiceProvider;
import org.openide.util.lookup.ServiceProviders;
@ServiceProviders({
@ServiceProvider(service = SourceForBinaryQueryImplementation2.class),
@ServiceProvider(service = SourceForBinaryQueryImplementation.class)})
public final class GradleHomeSourceForBinaryQuery extends AbstractSourceForBinaryQuery {
private final NbSupplier<? extends FileObject> gradleHomeProvider;
public GradleHomeSourceForBinaryQuery() {
this(new NbSupplier<FileObject>() {
@Override
public FileObject get() {
return CommonGlobalSettings.getDefault().tryGetGradleInstallation();
}
});
}
public GradleHomeSourceForBinaryQuery(NbSupplier<? extends FileObject> gradleHomeProvider) {
ExceptionHelper.checkNotNullArgument(gradleHomeProvider, "gradleHomeProvider");
this.gradleHomeProvider = gradleHomeProvider;
}
@Override
protected Result tryFindSourceRoot(File binaryRoot) {
final FileObject binaryRootObj = FileUtil.toFileObject(binaryRoot);
if (binaryRootObj == null) {
return null;
}
FileObject gradleHomeObj = gradleHomeProvider.get();
if (gradleHomeObj == null) {
return null;
}
File gradleHome = FileUtil.toFile(gradleHomeObj);
if (gradleHome == null) {
return null;
}
FileObject gradleLibs = GradleFileUtils.getLibDirOfGradle(gradleHomeObj);
if (gradleLibs == null) {
return null;
}
if (!FileUtil.isParentOf(gradleLibs, binaryRootObj)) {
return null;
}
final FileObject gradleSrc = GradleFileUtils.getSrcDirOfGradle(gradleHomeObj);
if (gradleSrc == null) {
return null;
}
return new Result() {
@Override
public boolean preferSources() {
return false;
}
@Override
public FileObject[] getRoots() {
return new FileObject[]{gradleSrc};
}
@Override
public void addChangeListener(ChangeListener l) {
}
@Override
public void removeChangeListener(ChangeListener l) {
}
};
}
}