org.ngrinder.infra.AgentHome.java Source code

Java tutorial

Introduction

Here is the source code for org.ngrinder.infra.AgentHome.java

Source

/* 
 * 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");
    }
}