From: David ‘Bombe’ Roden Date: Tue, 16 Aug 2011 19:22:01 +0000 (+0200) Subject: Locator for the configuration file. X-Git-Tag: 0.10-rc1~62 X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=465077535b431004c056301dd9576120fdc58876;p=jSite.git Locator for the configuration file. --- diff --git a/src/de/todesbaum/jsite/main/ConfigurationLocator.java b/src/de/todesbaum/jsite/main/ConfigurationLocator.java new file mode 100644 index 0000000..2d7ed45 --- /dev/null +++ b/src/de/todesbaum/jsite/main/ConfigurationLocator.java @@ -0,0 +1,179 @@ +/* + * jSite - ConfigurationLocator.java - Copyright © 2011 David Roden + * + * This program 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. + * + * This program is distributed in the hope that it will be useful, + * but 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package de.todesbaum.jsite.main; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +/** + * Locator for configuration files in different places. + * + * @author David ‘Bombe’ Roden <bombe@freenetproject.org> + */ +public class ConfigurationLocator { + + /** + * The location of the configuration directory. + * + * @author David ‘Bombe’ Roden <bombe@freenetproject.org> + */ + public enum ConfigurationLocation { + + /** The configuration is in the same directory as the JAR file. */ + NEXT_TO_JAR_FILE, + + /** + * The configuration is in the user’s home directory. This is the + * pre-0.9.3 default. + */ + HOME_DIRECTORY, + + /** Custom location. */ + CUSTOM, + + } + + /** The possible configuration locations. */ + private final Map configurationFiles = new HashMap(); + + /** + * Creates a new configuration locator. If this class is loaded from a JAR + * file, {@link ConfigurationLocation#NEXT_TO_JAR_FILE} is added to the + * list of possible configuration file locations. + * {@link ConfigurationLocation#HOME_DIRECTORY} is always added to this + * list, {@link ConfigurationLocation#CUSTOM} has to be enabled by calling + * {@link #setCustomLocation(String)}. + */ + public ConfigurationLocator() { + /* are we executed from a JAR file? */ + String resource = getClass().getResource("/" + getClass().getName().replace(".", "/") + ".class").toString(); + if (resource.startsWith("jar:")) { + String jarFileLocation = resource.substring(9, resource.indexOf(".jar!") + 4); + String jarFileDirectory = new File(jarFileLocation).getParent(); + File configurationFile = new File(jarFileDirectory, "jSite.conf"); + configurationFiles.put(ConfigurationLocation.NEXT_TO_JAR_FILE, configurationFile.getPath()); + } + File homeDirectoryFile = new File(System.getProperty("user.home"), ".jSite/config7"); + configurationFiles.put(ConfigurationLocation.HOME_DIRECTORY, homeDirectoryFile.getPath()); + } + + // + // ACCESSORS + // + + /** + * Sets the location of the custom configuration file. + * + * @param customFile + * The custom location of the configuration file + */ + public void setCustomLocation(String customFile) { + configurationFiles.put(ConfigurationLocation.CUSTOM, customFile); + } + + /** + * Returns whether the given location is valid. Certain locations (such as + * {@link ConfigurationLocation#NEXT_TO_JAR_FILE}) may be invalid in + * certain circumstances (such as the application not being run from a JAR + * file). A location being valid does not imply that a configuration file + * does exist at the given location, use + * {@link #hasFile(ConfigurationLocation)} to check for a configuration + * file at the desired location. + * + * @param configurationLocation + * The configuration location + * @return {@code true} if the location is valid, {@code false} otherwise + */ + public boolean isValidLocation(ConfigurationLocation configurationLocation) { + return configurationFiles.containsKey(configurationLocation); + } + + /** + * Checks whether a configuration file exists at the given location. + * + * @param configurationLocation + * The configuration location + * @return {@code true} if a configuration file exists at the given + * location, {@code false} otherwise + */ + public boolean hasFile(ConfigurationLocation configurationLocation) { + if (!isValidLocation(configurationLocation)) { + return false; + } + return new File(configurationFiles.get(configurationLocation)).exists(); + } + + /** + * Returns the configuration file for the given location. + * + * @param configurationLocation + * The location to get the file for + * @return The name of the configuration file at the given location, or + * {@code null} if the given location is invalid + */ + public String getFile(ConfigurationLocation configurationLocation) { + return configurationFiles.get(configurationLocation); + } + + // + // ACTIONS + // + + /** + * Finds the preferred location of the configuration file. + * + * @see #findPreferredLocation(ConfigurationLocation) + * @return The preferred location of the configuration file + */ + public ConfigurationLocation findPreferredLocation() { + return findPreferredLocation(ConfigurationLocation.NEXT_TO_JAR_FILE); + } + + /** + * Finds the preferred location of the configuration file. The following + * checks are performed: if a custom configuration location has been defined + * (by calling {@link #setCustomLocation(String)}) + * {@link ConfigurationLocation#CUSTOM} is returned. If the application is + * run from a JAR file and a configuration file is found next to the JAR + * file (i.e. in the same directory), + * {@link ConfigurationLocation#NEXT_TO_JAR_FILE} is returned. If a + * configuration file exists in the user’s home directory, + * {@link ConfigurationLocation#HOME_DIRECTORY} is returned. Otherwise, the + * given {@code defaultLocation} is returned. + * + * @param defaultLocation + * The default location to return if no other configuration file + * is found + * @return The configuration location to load the configuration from + */ + public ConfigurationLocation findPreferredLocation(ConfigurationLocation defaultLocation) { + if (hasFile(ConfigurationLocation.CUSTOM)) { + return ConfigurationLocation.CUSTOM; + } + if (hasFile(ConfigurationLocation.NEXT_TO_JAR_FILE)) { + return ConfigurationLocation.NEXT_TO_JAR_FILE; + } + if (hasFile(ConfigurationLocation.HOME_DIRECTORY)) { + return ConfigurationLocation.HOME_DIRECTORY; + } + return defaultLocation; + } + +}