package org.netbeans.gradle.project.query;
import java.net.URI;
import java.nio.file.FileSystemNotFoundException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.jtrim.property.PropertySource;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.api.queries.SharabilityQuery.Sharability;
import org.netbeans.gradle.project.model.NbGradleModel;
import org.netbeans.gradle.project.properties.SettingsFiles;
import org.netbeans.spi.queries.SharabilityQueryImplementation2;
public final class GradleSharabilityQuery implements SharabilityQueryImplementation2 {
private final PropertySource<? extends NbGradleModel> modelRef;
public GradleSharabilityQuery(PropertySource<? extends NbGradleModel> modelRef) {
ExceptionHelper.checkNotNullArgument(modelRef, "modelRef");
this.modelRef = modelRef;
}
private static boolean isInDirectory(Path dir, Path queriedFile) {
return queriedFile.startsWith(dir);
}
private static boolean isInBuildDir(NbGradleModel model, Path queriedFile) {
Path buildDir = model.getGenericInfo().getBuildDir().toPath();
return isInDirectory(buildDir, queriedFile);
}
private static Path tryConvertToPath(URI uri) {
try {
return Paths.get(uri);
} catch (IllegalArgumentException | FileSystemNotFoundException e) {
return null;
}
}
@Override
public Sharability getSharability(URI uri) {
Path queriedPath = tryConvertToPath(uri);
if (queriedPath == null) {
return Sharability.UNKNOWN;
}
NbGradleModel model = modelRef.getValue();
Path rootProjectDir = model.getSettingsDir();
if (isInBuildDir(model, queriedPath)) {
return Sharability.NOT_SHARABLE;
}
if (isInDirectory(SettingsFiles.getSettingsDir(rootProjectDir), queriedPath)) {
return Sharability.NOT_SHARABLE;
}
if (isInDirectory(SettingsFiles.getPrivateSettingsDir(rootProjectDir), queriedPath)) {
return Sharability.NOT_SHARABLE;
}
Path projectDir = model.getProjectDir().toPath();
if (isInDirectory(projectDir, queriedPath)) {
return Sharability.SHARABLE;
}
return Sharability.UNKNOWN;
}
}