/* * Copyright 1999-2008 University of Chicago * * Licensed 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.nimbustools.auto_config.confmgr; import org.nimbustools.auto_config.TextFile; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Properties; /** * This class lets you find and replace values in the *.conf files. * Comments preserved with changes. */ public class GenericConfUtil { // ------------------------------------------------------------------------- // INSTANCE VARIABLES // ------------------------------------------------------------------------- protected final File nimbusConfDir; protected final File workspConfDir; // ------------------------------------------------------------------------- // CONSTRUCTORS // ------------------------------------------------------------------------- public GenericConfUtil(String nimbusConfLocationPath) throws Exception { if (nimbusConfLocationPath == null) { throw new IllegalArgumentException( "nimbusConfLocationPath may not be null"); } this.nimbusConfDir = new File(nimbusConfLocationPath); if (!this.nimbusConfDir.exists()) { throw new Exception("Nimbus configuration directory does not " + "exist: " + this.nimbusConfDir.getAbsolutePath()); } this.workspConfDir = new File(this.nimbusConfDir, "workspace-service"); if (!this.workspConfDir.exists()) { throw new Exception("workspace-service configuration directory " + "does not exist: " + this.workspConfDir.getAbsolutePath()); } } // ------------------------------------------------------------------------- // INFO // ------------------------------------------------------------------------- public String getNimbusConfDirAbsolutePath() { return nimbusConfDir.getAbsolutePath(); } public String getWorkspaceServiceConfDirAbsolutePath() { return workspConfDir.getAbsolutePath(); } // ------------------------------------------------------------------------- // LOCATE PARTICULAR CONF FILE // ------------------------------------------------------------------------- public File getWorkspConfFile(String localName) throws Exception { final File conf = new File(this.getWorkspaceServiceConfDirAbsolutePath() + File.separator + localName); this.checkFile(conf); return conf; } protected void checkFile(File conf) throws Exception { if (conf == null) { throw new FileNotFoundException("conf may not be null"); } final String abspath = conf.getAbsolutePath(); if (!conf.exists()) { throw new FileNotFoundException("Cannot find file: " + abspath); } if (!conf.isFile()) { throw new FileNotFoundException("Is not a file: " + abspath); } if (!conf.canRead()) { throw new Exception("Can not read file: " + abspath); } if (!conf.canWrite()) { throw new Exception("Can not write to file: " + abspath); } } // ------------------------------------------------------------------------- // GET PROPERTY // ------------------------------------------------------------------------- /** * @param conf configuration file * @param keyword name of property * @return null if not found, empty if present but empty * @throws Exception problem with conf file or input */ public String getProperty(File conf, String keyword) throws Exception { if (keyword == null || keyword.trim().length() == 0) { throw new Exception("no keyword provided"); } this.checkFile(conf); final Properties props = new Properties(); props.load(new FileInputStream(conf)); final String value = props.getProperty(keyword); if (value == null) { return null; } else { return value.trim(); } } // ------------------------------------------------------------------------- // SET PROPERTY // ------------------------------------------------------------------------- /* * Several constraints: won't work if key is not present, undefined behavior * if multiple keys present. This is done in an effort to maintain comments * and all formatting. */ public void setProperty(File conf, String keyword, String newvalue) throws Exception { final String oldvalue = this.getProperty(conf, keyword); // conf and keyword checked non-null via getProperty if (oldvalue == null) { throw new Exception("Can not alter the configuration file, no '" + keyword + "' setting present in the file '" + conf.getAbsolutePath() + "'"); } final String compare; if (newvalue != null) { compare = newvalue.trim(); } else { compare = null; } if (oldvalue.equals(compare)) { System.out.println("[*] The '" + keyword + "' configuration does not need to be changed."); final String setString; if (oldvalue.trim().length() == 0) { setString = "be blank"; } else { setString = "'" + oldvalue + "'"; } System.out.println(" ... already set to " + setString); System.out.println(" ... in the file '" + conf.getCanonicalPath() + "'"); return; // *** EARLY RETURN *** } final TextFile textFile = new TextFile(conf.getAbsolutePath()); if (textFile.isEmpty()) { throw new Exception("File is empty? '" + conf.getAbsolutePath() + "'"); } boolean replaced = false; final int size = textFile.size(); for (int i = 0; i < size; i++) { final String line = (String) textFile.get(i); if (line != null && line.trim().length() > 0) { if (line.trim().startsWith(keyword)) { final String newline; if (newvalue == null) { newline = "#" + keyword + "="; } else { newline = keyword + "=" + newvalue.trim(); } textFile.set(i, newline); replaced = true; break; } } } if (!replaced) { // race condition with getProperty() on file contents? throw new Exception("Could not alter the configuration file, no '" + keyword + "' setting present in the file '" + conf.getAbsolutePath() + "' (?)"); } textFile.writeFile(conf); System.out.println("[*] The '" + keyword + "' configuration was:"); if (newvalue == null) { System.out.println(" ... commented out"); } else if (newvalue.trim().length() == 0) { System.out.print(" ... set to be blank"); } else { System.out.println(" ... set to '" + newvalue.trim() + "'"); } if (oldvalue.length() == 0) { System.out.println(" ... (it used to be set blank)"); } else { System.out.println(" ... (it used to be set to '" + oldvalue + "')"); } System.out.println(" ... in the file '" + conf.getCanonicalPath() + "'"); } }