/*
* This file is part of LaTeXDraw.
* Copyright (c) 2005-2017 Arnaud BLOUIN
* LaTeXDraw is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later version.
* LaTeXDraw is distributed without any warranty; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/
package net.sf.latexdraw.util;
import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import net.sf.latexdraw.badaboom.BadaboomCollector;
/**
* Defines paths used in LaTeXDraw.
* @author Arnaud BLOUIN
*/
public final class LPath {
/** The singleton. */
public static final LPath INSTANCE = new LPath();
/** The name of the cache directory */
public static final String CACHE_DIR = ".cache";//$NON-NLS-1$
/** The name of the cache directory for shared templates */
public static final String CACHE_SHARED_DIR = ".cacheShared";//$NON-NLS-1$
/** The name of the templates directory */
public static final String TEMPLATE_DIR = "templates";//$NON-NLS-1$
public static final String PATH_LOCAL_USER = INSTANCE.getPathLocalUser();
public static final String PATH_TEMPLATES_DIR_USER = PATH_LOCAL_USER + File.separator + TEMPLATE_DIR;
public static final String PATH_PREFERENCES_XML_FILE = PATH_LOCAL_USER + File.separator + ".preferences.xml";//$NON-NLS-1$
public static final String PATH_CACHE_DIR = PATH_LOCAL_USER + File.separator + CACHE_DIR;
public static final String PATH_CACHE_SHARE_DIR = PATH_LOCAL_USER + File.separator + CACHE_SHARED_DIR;
public static final String PATH_TEMPLATES_SHARED = INSTANCE.getPathTemplatesShared();
public static final String PATH_SHARED = INSTANCE.getPathShared();
private LPath() {
super();
}
/**
* Normalises the given namespace URI: if the given namespace is null or empty, an empty
* string is returned. Otherwise, the namespace followed by character ':' is returned.
* @param nsURI The namespace to normalise.
* @return The normalised namespace.
* @since 3.0
*/
public String getNormaliseNamespaceURI(final String nsURI) {
return nsURI==null || nsURI.isEmpty() ? "" : nsURI + ':'; //$NON-NLS-1$
}
/**
* @return The home directory of the user depending of his operating system.
* @since 3.0
*/
private String getPathLocalUser() {
final String home = System.getProperty("user.home");//$NON-NLS-1$
final String path;
if(LSystem.INSTANCE.isVista() || LSystem.INSTANCE.isSeven() || LSystem.INSTANCE.is8() || LSystem.INSTANCE.is10())
path = home + "\\AppData\\Local\\latexdraw";//$NON-NLS-1$
else if(LSystem.INSTANCE.isXP())
path = home + "\\Application Data\\latexdraw";//$NON-NLS-1$
else if(LSystem.INSTANCE.isMacOSX())
path = home + "/Library/Preferences/latexdraw";//$NON-NLS-1$
else path = home + "/.latexdraw";//$NON-NLS-1$
return path;
}
/**
* @return The path of the directory where the templates shared by the different users are located.
* @since 3.0
*/
private String getPathTemplatesShared() {
return getPathShared()+File.separator+TEMPLATE_DIR;
}
/**
* @return The path where files are shared by users.
* @since 3.0
*/
private String getPathShared() {
final String home = System.getProperty("user.home");//$NON-NLS-1$
if(LSystem.INSTANCE.isMacOSX())
return "/Users/Shared/latexdraw";//$NON-NLS-1$
if(LSystem.INSTANCE.isVista()) {
File dir = new File("C:\\ProgramData");//$NON-NLS-1$
int cpt = 0;
final int max = 10;
while(!dir.exists() && cpt<max)
dir = new File((char)('C'+cpt++)+":\\ProgramData");//$NON-NLS-1$
if(dir.exists())
return dir.getPath()+"\\latexdraw";//$NON-NLS-1$
return home.substring(0, 1+home.lastIndexOf('\\'))+"All Users\\Application Data\\latexdraw";//$NON-NLS-1$
}
if(LSystem.INSTANCE.isSeven() || LSystem.INSTANCE.is8() || LSystem.INSTANCE.is10())
return home.substring(0, 1+home.lastIndexOf('\\'))+"Default\\AppData\\Local\\latexdraw";//$NON-NLS-1$
if(LSystem.INSTANCE.isXP())
return home.substring(0, 1+home.lastIndexOf('\\'))+"All Users\\Application Data\\latexdraw";//$NON-NLS-1$
return "/usr/share/latexdraw";//$NON-NLS-1$
}
/**
* Creates the necessary directories for the installation of LaTeXDraw.
* @since 1.9.2
*/
public void checkInstallDirectories() {
try {
new File(PATH_SHARED).mkdirs();
new File(PATH_TEMPLATES_SHARED).mkdirs();
}
catch(final SecurityException e) { BadaboomCollector.INSTANCE.add(e); }
}
/**
* Creates the necessary directories for the execution of LaTeXDraw.
* @since 1.9.2
*/
public void checkDirectories() {
try {
new File(PATH_LOCAL_USER).mkdirs();
new File(PATH_TEMPLATES_DIR_USER).mkdirs();
new File(PATH_CACHE_DIR).mkdirs();
new File(PATH_CACHE_SHARE_DIR).mkdirs();
}
catch(final SecurityException e) { BadaboomCollector.INSTANCE.add(e); }
}
/**
* Allows to get the path of the project where the class LaTeXDrawPath is located.
* @return The path or null.
* @since 1.9.2
*/
public String getPathJar() {
try {
String path = LPath.class.getSimpleName() + ".class";//$NON-NLS-1$
final URL url = LPath.class.getResource(path);
path = URLDecoder.decode(url.toString(), "UTF-8");//$NON-NLS-1$
int index = path.lastIndexOf('/');
path = path.substring(0, index);
final String jar = "jar:file:";//$NON-NLS-1$
final String file = "file:"; //$NON-NLS-1$
if(path.startsWith(jar)) {
index = path.lastIndexOf('!');
path = path.substring(jar.length(), path.substring(0, index).lastIndexOf('/'));
}
else {
path = path.substring(file.length(), path.length());
final Package pack = LPath.class.getPackage();
if(pack != null) {
final String packPath = pack.getName().replace('.', '/');
if(path.endsWith(packPath))
path = path.substring(0, path.length() - packPath.length());
}
}
return path;
}catch(final Exception e) {
BadaboomCollector.INSTANCE.add(e);
return null;
}
}
}