Package org.jtestserver.client

Source Code of org.jtestserver.client.ConfigReader

/*
JTestServer is a client/server framework for testing any JVM implementation.

Copyright (C) 2008  Fabien DUMINY (fduminy@jnode.org)

JTestServer 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 2
of the License, or (at your option) any later version.

JTestServer 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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
package org.jtestserver.client;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import org.jtestserver.client.process.VMConfig;
import org.jtestserver.client.process.jvm.JVMConfig;
import org.jtestserver.client.process.kvm.KVMConfig;
import org.jtestserver.client.process.vmware.VMwareConfig;
import org.jtestserver.common.ConfigUtils;

/**
* Utility class used to read the JTestServer configuration and the VM configuration.
* @author Fabien DUMINY (fduminy@jnode.org)
*
*/
public class ConfigReader {
    /**
     * Key name in the property file that specify the type of the VM (vmware, kvm, ...)
     */
    protected static final String VM_TYPE = "type";
   
    /**
     * Value assigned to {@link ConfigReader#VM_TYPE} key for a VMware machine.
     */
    public static final String VMWARE_TYPE = "vmware";
   
    /**
     * Value assigned to {@link ConfigReader#VM_TYPE} key for a KVM machine.
     */
    public static final String KVM_TYPE = "kvm";

    /**
     * Value assigned to {@link ConfigReader#VM_TYPE} key for a new JVM machine.
     */
    public static final String JVM_TYPE = "jvm";

   
    private static final String BEGIN_VARIABLE_REF = "${";
    private static final String END_VARIABLE_REF = "}";
   
    /**
     * Read the JTestServer configuration and the VM configuration.
     * @param configFile File where configuration is stored.
     * @return the configuration.
     * @throws IOException
     */
    public Config read(File configFile) throws IOException {
        Properties properties = readProperties(configFile);
       
        // read the vm configuration
        String vm = ConfigUtils.getString(properties, "use.vm");
        Properties vmProperties = readProperties(new File(configFile.getParentFile(), vm + ".properties"));
        VMConfig vmConfig = createVMConfig(vmProperties, vm);
           
        return new Config(properties, vmConfig);
    }

    /**
     * Read the configuration of the VM.
     * @param vmProperties properties of the VM
     * @param vm name of the VM
     * @return
     * @throws IOException
     */
    protected VMConfig createVMConfig(Properties vmProperties, String vm) throws IOException {
        String type = ConfigUtils.getString(vmProperties, VM_TYPE);
        final VMConfig vmConfig;
        if (KVM_TYPE.equals(type)) {
            vmConfig = new KVMConfig(vmProperties);
        } else if (VMWARE_TYPE.equals(type)) {
            vmConfig = new VMwareConfig(vmProperties);
        } else if (JVM_TYPE.equals(type)) {
            vmConfig = new JVMConfig(vmProperties);
        } else {
            throw new IllegalArgumentException("unsupported type for " + vm + " vm : " + type);
        }
       
        return vmConfig;
    }
   
    /**
     * Read a properties file.
     *
     * @param configFile File where configuration is stored.
     * @return the properties file.
     * @throws IOException
     */
    private Properties readProperties(File configFile) throws IOException {
        Properties properties = new Properties();
        properties.load(new FileInputStream(configFile));
        expandVariables(properties);
        return properties;
    }
   
    private void expandVariables(Properties properties) {
        int nbReplace;
       
        do {
            nbReplace = 0;
            for (String key : properties.stringPropertyNames()) {
                nbReplace += expandVariables(properties, key);
            }
        } while (nbReplace > 0);
    }
   
    private int expandVariables(Properties properties, String key) {
        int nbReplace = 0;       
        String value = properties.getProperty(key);
       
        boolean replaced;       
        do {
            replaced = false;
            int begin = value.indexOf(BEGIN_VARIABLE_REF);
            if (begin >= 0) {
                int beginVariable = begin + BEGIN_VARIABLE_REF.length();
                int endVariable = value.indexOf(END_VARIABLE_REF, beginVariable + 1);
                if (endVariable >= 0) {
                    String variable = value.substring(beginVariable, endVariable);
                    if (!variable.equals(key)) { // avoid infinite loop on current variable/key
                        String variableValue = properties.getProperty(variable);
                        if (variableValue != null) {
                            value = value.substring(0, begin) + variableValue +
                                value.substring(endVariable + END_VARIABLE_REF.length());
                            properties.put(key, value);
                            replaced = true;
                            nbReplace++;
                        }
                    }
                }
            }
        } while (replaced);
       
        return nbReplace;
    }
}
TOP

Related Classes of org.jtestserver.client.ConfigReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.