Repository: incubator-juneau Updated Branches: refs/heads/master 30947fd7a -> 2c3a7cb59
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/2c3a7cb5/com.ibm.team.juno/src/main/java/org/apache/juneau/ini/ConfigMgr.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno/src/main/java/org/apache/juneau/ini/ConfigMgr.java b/com.ibm.team.juno/src/main/java/org/apache/juneau/ini/ConfigMgr.java deleted file mode 100644 index 64c19b7..0000000 --- a/com.ibm.team.juno/src/main/java/org/apache/juneau/ini/ConfigMgr.java +++ /dev/null @@ -1,314 +0,0 @@ -/*************************************************************************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - ***************************************************************************************************************************/ -package org.apache.juneau.ini; - -import static org.apache.juneau.ini.ConfigFileFormat.*; - -import java.io.*; -import java.nio.charset.*; -import java.util.*; -import java.util.concurrent.*; - -import org.apache.juneau.internal.*; -import org.apache.juneau.json.*; -import org.apache.juneau.parser.*; -import org.apache.juneau.serializer.*; -import org.apache.juneau.utils.*; - -/** - * Manager for retrieving shared instances of {@link ConfigFile ConfigFiles}. - * <p> - * Example: - * <p class='bcode'> - * ConfigFile cf = ConfigMgr.<jsf>DEFAULT</jsf>.get(<js>"MyConfig.cfg"</js>); - * String setting = cf.get(<js>"MySection/mysetting"</js>); - * </p> - */ -public class ConfigMgr { - - /** - * Default reusable configuration manager. - * <ul class='spaced-list'> - * <li>Read-only: <jk>false</jk>. - * <li>Encoder: {@link XorEncoder}. - * <li>Serializer: {@link JsonSerializer#DEFAULT}. - * <li>Parser: {@link JsonParser#DEFAULT}. - * <li>Charset: {@link Charset#defaultCharset()}. - * <li>Search paths: [<js>"."</js>]. - * </ul> - */ - public static final ConfigMgr DEFAULT = new ConfigMgr(false, new XorEncoder(), JsonSerializer.DEFAULT, JsonParser.DEFAULT, Charset.defaultCharset(), new String[]{"."}); - - private ConcurrentHashMap<String,File> files = new ConcurrentHashMap<String,File>(); - private ConcurrentHashMap<File,ConfigFile> configs = new ConcurrentHashMap<File,ConfigFile>(); - private final WriterSerializer serializer; - private final ReaderParser parser; - private final Encoder encoder; - private final boolean readOnly; - private final Charset charset; - private final List<File> searchPaths = new LinkedList<File>(); - - /** - * Create a custom configuration manager. - * - * @param readOnly Make {@link ConfigFile ConfigFiles} read-only. - * @param encoder Optional. Specify the encoder to use for encoded config file entries (e.g. <js>"mySecret*={...}"</js>). - * @param serializer Optional. Specify the serializer to use for serializing POJOs when using {@link ConfigFile#put(String, Object)}. - * @param parser Optional. Specify the parser to use for parsing POJOs when using {@link ConfigFile#getObject(Class,String)}. - * @param charset Optional. Specify the config file character encoding. If <jk>null</jk>, uses {@link Charset#defaultCharset()}. - * @param searchPaths Specify the search paths for config files. Can contain relative or absolute paths. - */ - public ConfigMgr(boolean readOnly, Encoder encoder, WriterSerializer serializer, ReaderParser parser, Charset charset, String[] searchPaths) { - this.readOnly = readOnly; - this.encoder = encoder; - this.serializer = serializer; - this.parser = parser; - this.charset = charset; - if (searchPaths != null) - for (String p : searchPaths) - this.searchPaths.add(new File(p)); - } - - /** - * Returns the config file with the specified absolute or relative path. - * <p> - * Multiple calls to the same path return the same <code>ConfigFile</code> instance. - * - * @param path The absolute or relative path of the config file. - * @return The config file. - * @throws IOException If config file could not be parsed. - * @throws FileNotFoundException If config file could not be found. - */ - public ConfigFile get(String path) throws IOException { - return get(path, false); - } - - /** - * Returns the config file with the specified absolute or relative path. - * <p> - * Multiple calls to the same path return the same <code>ConfigFile</code> instance. - * <p> - * If file doesn't exist and <code>create</code> is <jk>true</jk>, the configuration file will be - * create in the location identified by the first entry in the search paths. - * - * @param path The absolute or relative path of the config file. - * @param create Create the config file if it doesn't exist. - * @return The config file. - * @throws IOException If config file could not be parsed. - * @throws FileNotFoundException If config file could not be found or could not be created. - */ - public ConfigFile get(String path, boolean create) throws IOException { - - File f = resolve(path, create); - - ConfigFile cf = configs.get(f); - if (cf != null) - return cf; - - cf = new ConfigFileImpl(f, readOnly, encoder, serializer, parser, charset); - configs.putIfAbsent(f, cf); - return configs.get(f); - } - - /** - * Create a new empty config file not backed by any file. - * - * @return A new config file. - * @throws IOException - */ - public ConfigFile create() throws IOException { - return new ConfigFileImpl(null, false, encoder, serializer, parser, charset); - } - - /** - * Create a new config file backed by the specified file. - * Note that {@link #get(String)} is the preferred method for getting access to config files - * since this method will create a new config file each time it is called. - * This method is provided primarily for testing purposes. - * - * @param f The file to create a config file from. - * @return A new config file. - * @throws IOException - */ - public ConfigFile create(File f) throws IOException { - return new ConfigFileImpl(f, false, encoder, serializer, parser, charset); - } - - /** - * Create a new config file not backed by a file. - * - * @param r The reader containing an INI-formatted file to initialize the config file from. - * @return A new config file. - * @throws IOException - */ - public ConfigFile create(Reader r) throws IOException { - return new ConfigFileImpl(null, false, encoder, serializer, parser, charset).load(r); - } - - /** - * Reloads any config files that were modified. - * @throws IOException - */ - public void loadIfModified() throws IOException { - for (ConfigFile cf : configs.values()) - cf.loadIfModified(); - } - - /** - * Delete all configuration files registered with this config manager. - */ - public void deleteAll() { - for (File f : configs.keySet()) - FileUtils.delete(f); - files.clear(); - configs.clear(); - } - - private File resolve(String path, boolean create) throws IOException { - - // See if it's cached. - File f = files.get(path); - if (f != null) - return f; - - // Handle absolute file. - f = new File(path); - if (f.isAbsolute()) { - if (create) - FileUtils.create(f); - if (f.exists()) - return addFile(path, f); - throw new FileNotFoundException("Could not find config file '"+path+"'"); - } - - if (searchPaths.isEmpty()) - throw new FileNotFoundException("No search paths specified on ConfigMgr."); - - // Handle paths relative to search paths. - for (File sf : searchPaths) { - f = new File(sf.getAbsolutePath() + "/" + path); - if (f.exists()) - return addFile(path, f); - } - - if (create) { - f = new File(searchPaths.get(0).getAbsolutePath() + "/" + path); - FileUtils.create(f); - return addFile(path, f); - } - - throw new FileNotFoundException("Could not find config file '"+path+"'"); - } - - private File addFile(String path, File f) { - files.putIfAbsent(path, f); - return files.get(path); - } - - /** - * Implements command-line features for working with INI configuration files. - * <p> - * Invoke as a normal Java program... - * <p> - * <p class='bcode'> - * java org.apache.juneau.ini.ConfigMgr [args] - * </p> - * <p> - * Arguments can be any of the following... - * <ul class='spaced-list'> - * <li>No arguments<br> - * Prints usage message.<br> - * <li><code>createBatchEnvFile -configfile <configFile> -envfile <batchFile> [-verbose]</code><br> - * Creates a batch file that will set each config file entry as an environment variable.<br> - * Characters in the keys that are not valid as environment variable names (e.g. <js>'/'</js> and <js>'.'</js>) - * will be converted to underscores.<br> - * <li><code>createShellEnvFile -configFile <configFile> -envFile <configFile> [-verbose]</code> - * Creates a shell script that will set each config file entry as an environment variable.<br> - * Characters in the keys that are not valid as environment variable names (e.g. <js>'/'</js> and <js>'.'</js>) - * will be converted to underscores.<br> - * <li><code>setVals -configFile <configFile> -vals [var1=val1 [var2=val2...]] [-verbose]</code> - * Sets values in config files.<br> - * </ul> - * <p> - * For example, the following command will create the file <code>'MyConfig.bat'</code> from the contents of the file <code>'MyConfig.cfg'</code>. - * <p class='bcode'> - * java org.apache.juneau.ini.ConfigMgr createBatchEnvFile -configfile C:\foo\MyConfig.cfg -batchfile C:\foo\MyConfig.bat - * </p> - * - * @param args Command-line arguments - */ - public static void main(String[] args) { - - Args a = new Args(args); - String command = a.getArg(0); - String configFile = a.getArg("configFile"); - String envFile = a.getArg("envFile"); - List<String> vals = a.getArgs("vals"); - - if (command == null || ! (command.equals("createBatchEnvFile") || command.equals("createShellEnvFile") || command.equals("setVals"))) - printUsageAndExit(); - else if (configFile.isEmpty()) - printUsageAndExit(); - else if (command.equals("setVals") && vals.isEmpty()) - printUsageAndExit(); - else if ((command.equals("createBatchEnvFile") || command.equals("createShellEnvFile")) && envFile.isEmpty()) - printUsageAndExit(); - else { - try { - ConfigFile cf = ConfigMgr.DEFAULT.get(configFile); - - if (command.equalsIgnoreCase("setVals")) { - for (String val : vals) { - String[] x = val.split("\\="); - if (x.length != 2) - throw new RuntimeException("Invalid format for value: '"+val+"'. Must be in the format 'key=value'"); - cf.put(x[0], x[1]); - } - cf.save(); - return; - - } else if (command.equalsIgnoreCase("createBatchEnvFile")) { - Writer fw = new OutputStreamWriter(new FileOutputStream(envFile), Charset.defaultCharset()); - try { - cf.serializeTo(fw, BATCH); - } finally { - fw.close(); - } - return; - - } else if (command.equalsIgnoreCase("createShellEnvFile")) { - Writer fw = new OutputStreamWriter(new FileOutputStream(envFile), Charset.defaultCharset()); - try { - cf.serializeTo(fw, SHELL); - } finally { - fw.close(); - } - return; - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - private static void printUsageAndExit() { - System.err.println("---Usage---"); - System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createBatchEnvFile -configFile <configFile> -envFile <envFile> [-verbose]"); - System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createShellEnvFile -configFile <configFile> -envFile <envFile> [-verbose]"); - System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile setVals -configFile <configFile> -vals [var1 val1 [var2 val2...]] [-verbose]"); - int rc = Integer.getInteger("exit.2", 2); - if (rc != 0) - System.exit(rc); - } -}
