/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2006-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) 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 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) 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 OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.test;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.regex.Matcher;
import junit.framework.Assert;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
/**
* <p>ConfigurationTestUtils class.</p>
*
* @author ranger
* @version $Id: $
*/
public abstract class ConfigurationTestUtils extends Assert {
private static final String POM_FILE = "pom.xml";
// TODO: rename this constant
private static final String DAEMON_DIRECTORY = "opennms-base-assembly";
/**
* <p>getUrlForResource</p>
*
* @param obj a {@link java.lang.Object} object.
* @param resource a {@link java.lang.String} object.
* @return a {@link java.net.URL} object.
*/
public static URL getUrlForResource(Object obj, String resource) {
URL url = getClass(obj).getResource(resource);
assertNotNull("could not get resource '" + resource + "' as a URL", url);
return url;
}
private static Class<? extends Object> getClass(Object obj) {
return (obj != null) ? obj.getClass() : ConfigurationTestUtils.class;
}
/**
* <p>getSpringResourceForResource</p>
*
* @param obj a {@link java.lang.Object} object.
* @param resource a {@link java.lang.String} object.
* @return a {@link org.springframework.core.io.Resource} object.
*/
public static Resource getSpringResourceForResource(Object obj, String resource) {
try {
return new FileSystemResource(getFileForResource(obj, resource));
} catch (Throwable t) {
return new InputStreamResource(getInputStreamForResource(obj, resource));
}
}
public static Resource getSpringResourceForResourceWithReplacements(final Object obj, final String resource, final String[] ... replacements) throws IOException {
try {
String config = getConfigForResourceWithReplacements(obj, resource, replacements);
File tmp = File.createTempFile("testConfigFile", ".xml");
tmp.deleteOnExit();
FileWriter fw = new FileWriter(tmp);
fw.write(config);
fw.close();
return new FileSystemResource(tmp);
} catch (final Throwable t) {
return new InputStreamResource(getInputStreamForResourceWithReplacements(obj, resource, replacements));
}
}
/**
* <p>getFileForResource</p>
*
* @param obj a {@link java.lang.Object} object.
* @param resource a {@link java.lang.String} object.
* @return a {@link java.io.File} object.
*/
public static File getFileForResource(Object obj, String resource) {
URL url = getUrlForResource(obj, resource);
String path = url.getFile();
assertNotNull("could not get resource '" + resource + "' as a file", path);
File file = new File(path);
assertTrue("could not get resource '" + resource + "' as a file--the file at path '" + path + "' does not exist", file.exists());
return file;
}
/**
* @deprecated Use getInputStreamForResource instead.
*
* @param obj a {@link java.lang.Object} object.
* @param resource a {@link java.lang.String} object.
* @return a {@link java.io.Reader} object.
*/
public static Reader getReaderForResource(Object obj, String resource) {
Reader retval = null;
try {
retval = new InputStreamReader(getInputStreamForResource(obj, resource), "UTF-8");
} catch (UnsupportedEncodingException e) {
fail("Your JVM doesn't support UTF-8 encoding, which is pretty much impossible.");
}
return retval;
}
/**
* <p>getInputStreamForResource</p>
*
* @param obj a {@link java.lang.Object} object.
* @param resource a {@link java.lang.String} object.
* @return a {@link java.io.InputStream} object.
*/
public static InputStream getInputStreamForResource(Object obj, String resource) {
assertFalse("obj should not be an instance of java.lang.Class; you usually want to use 'this'", obj instanceof Class<?>);
InputStream is = getClass(obj).getResourceAsStream(resource);
assertNotNull("could not get resource '" + resource + "' as an input stream", is);
return is;
}
/**
* <p>getReaderForResourceWithReplacements</p>
*
* @param obj a {@link java.lang.Object} object.
* @param resource a {@link java.lang.String} object.
* @param replacements an array of {@link java.lang.String} objects.
* @return a {@link java.io.Reader} object.
* @throws java.io.IOException if any.
*/
public static Reader getReaderForResourceWithReplacements(Object obj,
String resource, String[] ... replacements) throws IOException {
String newConfig = getConfigForResourceWithReplacements(obj, resource,
replacements);
return new StringReader(newConfig);
}
/**
* <p>getInputStreamForResourceWithReplacements</p>
*
* @param obj a {@link java.lang.Object} object.
* @param resource a {@link java.lang.String} object.
* @param replacements an array of {@link java.lang.String} objects.
* @return a {@link java.io.InputStream} object.
* @throws java.io.IOException if any.
*/
public static InputStream getInputStreamForResourceWithReplacements(Object obj,
String resource, String[] ... replacements) throws IOException {
String newConfig = getConfigForResourceWithReplacements(obj, resource,
replacements);
return new ByteArrayInputStream(newConfig.getBytes());
}
/**
* <p>getConfigForResourceWithReplacements</p>
*
* @param obj a {@link java.lang.Object} object.
* @param resource a {@link java.lang.String} object.
* @param replacements an array of {@link java.lang.String} objects.
* @return a {@link java.lang.String} object.
* @throws java.io.IOException if any.
*/
public static String getConfigForResourceWithReplacements(Object obj,
String resource, String[] ... replacements) throws IOException {
Reader inputReader = getReaderForResource(obj, resource);
BufferedReader bufferedReader = new BufferedReader(inputReader);
StringBuffer buffer = new StringBuffer();
String line;
while ((line = bufferedReader.readLine()) != null) {
buffer.append(line);
buffer.append("\n");
}
String newConfig = buffer.toString();
for (String[] replacement : replacements) {
// The quoting around the replacement is necessary for file paths to work
// correctly on Windows.
// @see http://issues.opennms.org/browse/NMS-4853
newConfig = newConfig.replaceAll(replacement[0], Matcher.quoteReplacement(replacement[1]));
}
return newConfig;
}
/**
* Use getInputStreamForConfigFile instead.
*
* @param configFile a {@link java.lang.String} object.
* @return a {@link java.io.Reader} object.
* @throws java.io.FileNotFoundException if any.
*/
public static Reader getReaderForConfigFile(String configFile) throws FileNotFoundException {
Reader retval = null;
try {
retval = new InputStreamReader(getInputStreamForConfigFile(configFile), "UTF-8");
} catch (UnsupportedEncodingException e) {
fail("Your JVM doesn't support UTF-8 encoding, which is pretty much impossible.");
}
return retval;
}
/**
* <p>getInputStreamForConfigFile</p>
*
* @param configFile a {@link java.lang.String} object.
* @return a {@link java.io.InputStream} object.
* @throws java.io.FileNotFoundException if any.
*/
public static InputStream getInputStreamForConfigFile(String configFile) throws FileNotFoundException {
return new FileInputStream(getFileForConfigFile(configFile));
}
/**
* <p>getFileForConfigFile</p>
*
* @param configFile a {@link java.lang.String} object.
* @return a {@link java.io.File} object.
*/
public static File getFileForConfigFile(String configFile) {
File file = new File(getDaemonEtcDirectory(), configFile);
assertTrue("configuration file '" + configFile + "' does not exist at " + file.getAbsolutePath(), file.exists());
return file;
}
/**
* <p>getDaemonEtcDirectory</p>
*
* @return a {@link java.io.File} object.
*/
public static File getDaemonEtcDirectory() {
String etcPath =
"src"+File.separator+
"main"+File.separator+
"filtered"+File.separator+
"etc";
return new File(getDaemonProjectDirectory(), etcPath);
}
/**
* <p>setRelativeHomeDirectory</p>
*
* @param relativeHomeDirectory a {@link java.lang.String} object.
*/
public static void setRelativeHomeDirectory(String relativeHomeDirectory) {
setAbsoluteHomeDirectory(new File(getCurrentDirectory().getAbsolutePath(), relativeHomeDirectory).getAbsolutePath());
}
/**
* <p>setAbsoluteHomeDirectory</p>
*
* @param absoluteHomeDirectory a {@link java.lang.String} object.
*/
public static void setAbsoluteHomeDirectory(final String absoluteHomeDirectory) {
System.setProperty("opennms.home", absoluteHomeDirectory);
}
/**
* <p>getTopProjectDirectory</p>
*
* @return a {@link java.io.File} object.
*/
public static File getTopProjectDirectory() {
File currentDirectory = getCurrentDirectory();
File pomFile = new File(currentDirectory, POM_FILE);
assertTrue("pom.xml in current directory should exist: " + pomFile.getAbsolutePath(), pomFile.exists());
return findTopProjectDirectory(currentDirectory);
}
private static File getCurrentDirectory() {
File currentDirectory = new File(System.getProperty("user.dir"));
assertTrue("current directory should exist: " + currentDirectory.getAbsolutePath(), currentDirectory.exists());
assertTrue("current directory should be a directory: " + currentDirectory.getAbsolutePath(), currentDirectory.isDirectory());
return currentDirectory;
}
/**
* <p>getDaemonProjectDirectory</p>
*
* @return a {@link java.io.File} object.
*/
public static File getDaemonProjectDirectory() {
File topLevelDirectory = getTopProjectDirectory();
File daemonDirectory = new File(topLevelDirectory, DAEMON_DIRECTORY);
if (!daemonDirectory.exists()) {
throw new IllegalStateException("Could not find a " + DAEMON_DIRECTORY + " in the location top-level directory: " + topLevelDirectory);
}
File pomFile = new File(daemonDirectory, POM_FILE);
assertTrue("pom.xml in " + DAEMON_DIRECTORY + " directory should exist: " + pomFile.getAbsolutePath(), pomFile.exists());
return daemonDirectory;
}
private static File findTopProjectDirectory(File currentDirectory) {
File buildFile = new File(currentDirectory, "compile.pl");
if (buildFile.exists()) {
File pomFile = new File(currentDirectory, POM_FILE);
assertTrue("pom.xml in " + DAEMON_DIRECTORY + " directory should exist: " + pomFile.getAbsolutePath(), pomFile.exists());
return currentDirectory;
} else {
File parentDirectory = currentDirectory.getParentFile();
if (parentDirectory == null || parentDirectory == currentDirectory) {
return null;
} else {
return findTopProjectDirectory(parentDirectory);
}
}
}
/**
* <p>setRrdBinary</p>
*
* @param path a {@link java.lang.String} object.
*/
public static void setRrdBinary(String path) {
System.setProperty("rrd.binary", path);
}
/**
* <p>setRelativeRrdBaseDirectory</p>
*
* @param relativePath a {@link java.lang.String} object.
*/
public static void setRelativeRrdBaseDirectory(String relativePath) {
File rrdDir = new File(getCurrentDirectory(), relativePath);
if (!rrdDir.exists()) {
rrdDir.mkdirs();
}
System.setProperty("rrd.base.dir", rrdDir.getAbsolutePath());
}
/**
* <p>setRelativeImporterDirectory</p>
*
* @param relativeImporterDirectory a {@link java.lang.String} object.
*/
public static void setRelativeImporterDirectory(String relativeImporterDirectory) {
File cacheDir = new File(getCurrentDirectory(), relativeImporterDirectory);
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
System.setProperty("importer.requisition.dir", cacheDir.getAbsolutePath());
}
/**
* <p>setRelativeForeignSourceDirectory</p>
*
* @param relativeForeignSourceDirectory a {@link java.lang.String} object.
*/
public static void setRelativeForeignSourceDirectory(String relativeForeignSourceDirectory) {
File xmlDir = new File(getCurrentDirectory(), relativeForeignSourceDirectory);
if (!xmlDir.exists()) {
xmlDir.mkdirs();
}
System.setProperty("importer.foreign-source.dir", xmlDir.getAbsolutePath());
}
}