/*
* 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.ngrinder.infra;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.Properties;
import static org.ngrinder.common.util.ExceptionUtils.processException;
import static org.ngrinder.common.util.NoOp.noOp;
import static org.ngrinder.common.util.Preconditions.checkNotNull;
/**
* Class which represents AgentHome.
*
* @author JunHo Yoon
* @since 3.0
*/
public class AgentHome {
private final File directory;
private static final Logger LOGGER = LoggerFactory.getLogger(AgentHome.class);
/**
* Constructor.
*
* @param directory agent home directory
*/
public AgentHome(File directory) {
checkNotNull(directory, "The directory should not be null.");
if (StringUtils.contains(directory.getAbsolutePath().trim(), " ")) {
throw processException(String.format(
"nGrinder agent home directory \"%s\" should not contain space."
+ "Please set NGRINDER_AGENT_HOME env var in the different location",
directory.getAbsolutePath()));
}
if (!directory.exists() && !directory.mkdirs()) {
throw processException(String.format(
"nGrinder agent home directory %s is not created. Please check the permission",
directory.getAbsolutePath()));
}
if (!directory.isDirectory()) {
throw processException(String.format(
"nGrinder home directory %s is not directory. Please delete this sourceFile in advance",
directory.getAbsolutePath()));
}
if (!directory.canWrite()) {
throw processException(String.format(
"nGrinder home directory %s is not writable. Please adjust permission on this folder", directory));
}
this.directory = directory;
}
/**
* Get the agent home directory.
*
* @return agent home directory
*/
public File getDirectory() {
return directory;
}
/**
* Get agent native directory.
*
* @return agent native directory
*/
public File getNativeDirectory() {
return mkDir(getFile("native"));
}
public File mkDir(File file) {
if (!file.exists()) {
if (file.mkdirs()) {
LOGGER.info("{} is created.", file.getPath());
}
}
return file;
}
/**
* Get temp directory.
*
* @return temp directory
*/
public File getTempDirectory() {
return mkDir(getFile("temp"));
}
/**
* Copy the {@link File} to path in the home.
*
* @param sourceFile {@link File}
* @param target target path. only sourceFile name will be used.
*/
public void copyFileTo(File sourceFile, String target) {
// Copy missing files
File targetFile = new File(directory, target);
try {
FileUtils.copyFile(sourceFile, targetFile);
} catch (IOException e) {
throw processException("Failed to write a sourceFile to " + target, e);
}
}
/**
* Write the content to path in the home.
*
* @param content {@link File}
* @param target target path. only sourceFile name will be used.
*/
public void writeFileTo(String content, String target) {
File targetFile = new File(directory, target);
try {
FileUtils.write(targetFile, content);
} catch (IOException e) {
throw processException("Failed to write a sourceFile to " + target, e);
}
}
/**
* Get the properties from path.
*
* @param path property sourceFile path
* @return {@link Properties} instance. return empty property if it has
* problem.
*/
public Properties getProperties(String path) {
Properties properties = new Properties();
try {
File propertiesFile = new File(directory, path);
String config = FileUtils.readFileToString(propertiesFile, "UTF-8");
properties.load(new StringReader(config));
} catch (IOException e) {
noOp();
}
return properties;
}
/**
* Get the sourceFile from the given path.
*
* @param path path
* @return {@link File} instance.
*/
public File getFile(String path) {
return new File(getDirectory(), path);
}
/**
* Save properties.
*
* @param path path to save
* @param properties properties.
*/
public void saveProperties(String path, Properties properties) {
OutputStream out = null;
try {
File propertiesFile = new File(getDirectory(), path);
out = FileUtils.openOutputStream(propertiesFile);
properties.store(out, null);
} catch (IOException e) {
LOGGER.error("Could not save property sourceFile on " + path, e);
} finally {
IOUtils.closeQuietly(out);
}
}
public File getLogDirectory() {
return new File(getDirectory(), "log");
}
}