package com.baselet.control.util;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.baselet.control.constants.SystemInfo;
import com.baselet.control.enums.Os;
import com.baselet.control.enums.Program;
import com.baselet.element.interfaces.GridElement;
public class Path {
private final static Logger log = LoggerFactory.getLogger(Path.class);
private static String tempDir;
private static String homeProgramDir;
public static boolean hasOsConformConfig() {
try {
File file = new File(osConformConfig());
return file.exists();
} catch (Exception e) {
log.error("Cannot load os conform config or cannot create UMLet parent dir in os conform home dir", e);
return false;
}
}
public static String osConformConfig() {
String programConfigDir = combine(osConformConfigDirectory(), Program.getInstance().getProgramName());
ensureDirectoryIsExisting(programConfigDir);
return combine(programConfigDir, Program.getInstance().getConfigName());
}
@Deprecated // #273: legacy cfg is read for some versions; should be removed in v15 or sooner (only use osConformConfig() instead)
public static boolean hasLegacyConfig() {
File file = new File(legacyConfig());
return file.exists();
}
@Deprecated // #273: legacy cfg is read for some versions; should be removed in v15 or sooner (only use osConformConfig() instead)
public static String legacyConfig() {
String programConfigDirectory = combine(userHomeDirectory(), Program.getInstance().getProgramName());
return combine(programConfigDirectory, Program.getInstance().getConfigName());
}
private static void ensureDirectoryIsExisting(String path) {
File file = new File(path);
if (!file.exists()) {
Path.safeMkDir(file, true);
}
}
private static String osConformConfigDirectory() {
String configDir = userHomeDirectory();
if (SystemInfo.OS == Os.WINDOWS) {
configDir = windowsConfigDirectory();
}
else if (SystemInfo.OS == Os.MAC) {
configDir = macOSXConfigDirectory();
}
else if (SystemInfo.OS == Os.LINUX || SystemInfo.OS == Os.UNIX) {
configDir = xgdConfigDirectory();
}
return configDir;
}
private static String windowsConfigDirectory() {
String configPath = System.getenv("LOCALAPPDATA");
if (configPath == null) {
configPath = userHomeDirectory();
}
return configPath;
}
private static String macOSXConfigDirectory() {
return combine(userHomeDirectory(), "Library/Preferences");
}
private static String xgdConfigDirectory() {
String configPath = System.getenv("XDG_CONFIG_HOME");
if (configPath == null) {
configPath = combine(userHomeDirectory(), ".config");
}
return configPath;
}
private static String userHomeDirectory() {
return System.getProperty("user.home");
}
private static String combine(String path, String childPath) {
return new File(path, childPath).getPath();
}
public static String customElements() {
return homeProgram() + "custom_elements/";
}
public static String temp() {
if (tempDir == null) {
String tmp = System.getProperty("java.io.tmpdir");
if (!tmp.endsWith(File.separator)) {
tmp = tmp + File.separator;
}
tempDir = tmp;
}
return tempDir;
}
/**
* <ul>
* <li>{@literal STANDALONE NOJAR: <programpath>}</li>
* <li>{@literal STANDALONE JAR: <programpath>}</li>
* <li>{@literal ECLIPSE NOJAR: <programpath>}</li>
* <li>{@literal ECLIPSE JAR: <eclipse-path>/<configuration>/<dirToStoreCustomStuff>}</li>
* </ul>
*/
public static String homeProgram() {
return homeProgramDir;
}
public static void setHomeProgram(String homeProgramDir) {
Path.homeProgramDir = homeProgramDir;
}
/**
* <ul>
* <li>{@literal STANDALONE NOJAR: <umlet-swing-path>/target/classes/}</li>
* <li>{@literal STANDALONE JAR: <program-path>/<progname>.jar}</li>
* <li>{@literal ECLIPSE NOJAR: <umlet-eclipse-plugin-path>}</li>
* <li>{@literal ECLIPSE JAR: <eclipse-path>/<pluginname>.jar}</li>
* </ul>
*/
public static String executable() {
return executableHelper(Path.class);
}
public static String executableShared() {
return executableHelper(GridElement.class);
}
private static String executableHelper(Class<?> c) {
String path = null;
URL codeSourceUrl = c.getProtectionDomain().getCodeSource().getLocation();
try { // Convert URL to URI to avoid HTML problems with special characters like space,ä,ö,ü,...
path = codeSourceUrl.toURI().getPath();
} catch (URISyntaxException e) {/* path stays null */}
if (path == null) { // URI2URL Conversion failed, because URI.getPath() returned null OR because of an URISyntaxException
// In this case use the URL and replace special characters manually (for now only space)
path = codeSourceUrl.getPath().replace("%20", " ");
}
return path;
}
public static void safeCreateFile(File file, boolean errorIfFileExists) {
try {
boolean success = file.createNewFile();
if (!success && errorIfFileExists) {
throw new RuntimeException("Cannot create file " + file.getAbsolutePath() + " because it already exists");
}
} catch (IOException e) {
throw new RuntimeException("Cannot create file " + file.getAbsolutePath());
}
}
public static void safeDeleteFile(File file, boolean errorIfFailed) {
boolean success = file.delete();
if (!success && errorIfFailed) {
throw new RuntimeException("Cannot delete file " + file.getAbsolutePath());
}
}
public static void safeMkDir(File file, boolean errorIfFailed) {
boolean success = file.mkdir();
if (!success && errorIfFailed) {
throw new RuntimeException("Cannot make dir " + file.getAbsolutePath());
}
}
}