package org.netbeans.gradle.project.util;
import java.io.File;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jtrim.event.ListenerRef;
import org.jtrim.property.PropertySource;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.project.api.config.PropertyReference;
import org.netbeans.gradle.project.properties.global.CommonGlobalSettings;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
public final class GradleFileUtils {
private static final Logger LOGGER = Logger.getLogger(GradleFileUtils.class.getName());
private static final File NORM_USER_HOME = getUserHome();
public static final PropertySource<File> GRADLE_USER_HOME = getGradleUserHome();
public static final NbSupplier<File> GRADLE_USER_HOME_PROVIDER = new NbSupplier<File>() {
@Override
public File get() {
return GRADLE_USER_HOME.getValue();
}
};
public static final Set<String> BINARY_DIR_NAMES = Collections.unmodifiableSet(
new HashSet<>(Arrays.asList("jar", "bundle")));
public static final String POM_DIR_NAME = "pom";
public static final String JAVADOC_DIR_NAME = "javadoc";
public static final String SOURCE_DIR_NAME = "source";
public static final String SOURCES_CLASSIFIER = "-sources";
public static final String JAVADOC_CLASSIFIER = "-javadoc";
public static final String SOURCES_SUFFIX = SOURCES_CLASSIFIER + ".jar";
private static File getUserHome() {
String userHome = System.getProperty("user.home");
if (userHome == null) {
LOGGER.severe("user.home property is missing.");
return null;
}
File notNormalizedResult = new File(userHome);
File result = FileUtil.normalizeFile(notNormalizedResult);
if (result == null) {
LOGGER.log(Level.SEVERE, "Could not normalize path: {0}", notNormalizedResult);
return null;
}
return result;
}
private static File getDefaultGradleUserHome() {
return new File(NORM_USER_HOME, ".gradle");
}
private static PropertyReference<File> gradleUserHomeDir() {
return CommonGlobalSettings.getDefault().gradleUserHomeDir();
}
private static PropertySource<File> getGradleUserHome() {
return new PropertySource<File>() {
@Override
public File getValue() {
File value = gradleUserHomeDir().getActiveValue();
if (value == null) {
value = getDefaultGradleUserHome();
}
return value;
}
@Override
public ListenerRef addChangeListener(Runnable listener) {
return gradleUserHomeDir().getActiveSource().addChangeListener(listener);
}
};
}
public static FileObject getGradleUserHomeFileObject() {
File result = GRADLE_USER_HOME.getValue();
return result != null
? FileUtil.toFileObject(result)
: null;
}
public static boolean isKnownBinaryDirName(String dirName) {
ExceptionHelper.checkNotNullArgument(dirName, "dirName");
String lowerDirName = dirName.toLowerCase(Locale.US);
return BINARY_DIR_NAMES.contains(lowerDirName);
}
public static boolean isSourceFile(FileObject sourcePath) {
String name = sourcePath.getNameExt();
return name.endsWith(SOURCES_SUFFIX);
}
public static String binaryToSourceName(FileObject binaryPath) {
String binFileName = binaryPath.getName();
String binFileExt = binaryPath.getExt();
return binFileName + SOURCES_CLASSIFIER + "." + binFileExt;
}
public static String binaryToJavadocName(FileObject binaryPath) {
String binFileName = binaryPath.getName();
String binFileExt = binaryPath.getExt();
return binFileName + JAVADOC_CLASSIFIER + "." + binFileExt;
}
public static String sourceToBinaryName(FileObject sourcePath) {
String srcFileName = sourcePath.getName();
if (!srcFileName.endsWith(SOURCES_CLASSIFIER)) {
return null;
}
String srcFileExt = sourcePath.getExt();
return srcFileName.substring(0, srcFileName.length() - SOURCES_CLASSIFIER.length())
+ "." + srcFileExt;
}
// We assume that the gradle home directory looks like this:
//
// binaries: GRADLE_HOME\\lib\\*.jar
// sources for all binaries: GRADLE_HOME\\src
public static File getLibDirOfGradle(File gradleHome) {
return new File(gradleHome, "lib");
}
public static FileObject getLibDirOfGradle(FileObject gradleHome) {
return gradleHome.getFileObject("lib");
}
public static File getSrcDirOfGradle(File gradleHome) {
return new File(gradleHome, "src");
}
public static FileObject getSrcDirOfGradle(FileObject gradleHome) {
return gradleHome.getFileObject("src");
}
public static Path toPath(FileObject fileObj) {
return NbFileUtils.asPath(FileUtil.toFile(fileObj));
}
private GradleFileUtils() {
throw new AssertionError();
}
}