org.eclipse.virgo.server.svt.hostedrepo.RemoteHostedRepositoryOtherThan8080Tests.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.virgo.server.svt.hostedrepo.RemoteHostedRepositoryOtherThan8080Tests.java

Source

/*******************************************************************************
 * Copyright (c) 2008, 2010 VMware Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   VMware Inc. - initial contribution
 *******************************************************************************/

package org.eclipse.virgo.server.svt.hostedrepo;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.eclipse.virgo.server.svt.AbstractWebTests;
import org.eclipse.virgo.server.svt.UrlWaitLatch;
import org.eclipse.virgo.util.io.FileCopyUtils;
import org.eclipse.virgo.util.io.FileSystemUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class RemoteHostedRepositoryOtherThan8080Tests extends AbstractWebTests {

    private static String serverHomeDir1 = null;
    private static String usrDir1 = null;
    private static String binDir1 = null;
    private static String configDir1 = null;

    private static String serverHomeDir2 = null;
    private static String usrDir2 = null;
    private static String binDir2 = null;
    private static String configDir2 = null;
    private static String pickupDir = null;
    private static String hostedDir = null;

    protected static final String HOSTED_REPO_SPLASHURL = "http://localhost:8084/";
    protected static final String HOSTED_REPO_ADMINURL = "http://localhost:8084/admin";
    protected static final String CLIENT_SPLASHURL = "http://localhost:8083/";
    protected static final String CLEINT_ADMINURL = "http://localhost:8083/admin";

    private static final String APP_URI_PLAN_UNSCOPED = "./../org.eclipse.virgo.server.svt/apps/helloworld_unscoped-1.0.0.RELEASE.plan";
    private static final String APP_URI_SHAREDSERVICES_WAR1 = "./../org.eclipse.virgo.server.svt/apps/hello_war_shared_services.war";
    private static final String APP_URI_SHAREDSERVICES_WAR2 = "./../org.eclipse.virgo.server.svt/apps/formtags-shared-services-war-2.0.1.BUILD-20100413113234.war";
    private static final String APP_URI_PAR = "./../org.eclipse.virgo.server.svt/apps/greenpages-solution-2.0.1.SNAPSHOT.par";
    private static final String APP_URI_PLAN = "./../test-apps/scopedplan.plan";

    private static final String resourcesDir1 = "./../org.eclipse.virgo.server.svt/bundles";
    private static final String resourcesDir2 = "./../org.eclipse.virgo.server.svt/src/test/resources/bundles";
    private static final String downloadDir = "target/bundles";

    private static String[] bundleNames1 = new String[] {
            // "com.springsource.org.antlr-3.0.1.jar", deleted from git as not covered by a full CQ
            "com.springsource.javassist-3.9.0.GA.jar", "com.springsource.net.sf.cglib-2.2.0.jar",
            "com.springsource.org.apache.commons.collections-3.2.1.jar",
            "com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar",
            "com.springsource.org.apache.commons.logging-1.1.1.jar",
            "com.springsource.org.apache.commons.pool-1.3.0.jar", "com.springsource.org.dom4j-1.6.1.jar",
            "com.springsource.org.eclipse.persistence-1.0.0.jar",
            "com.springsource.org.eclipse.persistence.antlr-1.0.0.jar",
            "com.springsource.org.eclipse.persistence.asm-1.0.0.jar",
            "com.springsource.org.eclipse.persistence.jpa-1.0.0.jar", "com.springsource.org.hsqldb-1.8.0.9.jar",
            "com.springsource.org.objectweb.asm-1.5.3.jar", "com.springsource.org.objectweb.asm.attrs-1.5.3.jar" };

    private static String[] downloadBundleNames1 = new String[] { "com.springsource.org.hibernate-3.2.6.ga.jar" };

    private static String[] bundleNames2 = new String[] {
            "formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar",
            "com.springsource.freemarker-2.3.15.jar", "com.springsource.javax.persistence-1.0.0.jar",
            "com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar",
            "com.springsource.org.apache.commons.pool-1.3.0.jar",
            "com.springsource.org.eclipse.persistence-1.0.0.jar",
            "com.springsource.org.eclipse.persistence.antlr-1.0.0.jar",
            "com.springsource.org.eclipse.persistence.asm-1.0.0.jar",
            "com.springsource.org.eclipse.persistence.jpa-1.0.0.jar", "com.springsource.org.h2-1.0.71.jar",
            "hello.domain.jar", "hello.service.api.jar", "hello.service.impl-en.jar", "bundleA.jar", "bundleB.war",
            "foo.properties" };

    private static Process process = null;
    private static ProcessBuilder pb = null;
    private static File startup = null;
    private static File startupURI = null;
    private static File shutdownURI = null;
    private static String startupFileName = null;
    private static File shutdown = null;
    private static String shutdownFileName = null;
    private static OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();

    private static MBeanServerConnection connection = null;
    private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:4444/jmxrmi";
    private static final String KEYSTORE = "/config/keystore";
    private static final String KEYPASSWORD = "changeit";
    public static final long HALF_SECOND = 500;
    public static final long TWO_MINUTES = 120 * 1000;

    private static String[] signature = null;
    private static Object[] params = null;

    private static String artifactType1 = null;
    private static String artifactName1 = null;
    private static String artifactVersion1 = null;

    private static String artifactType4 = null;
    private static String artifactName4 = null;
    private static String artifactVersion4 = null;

    private static String artifactType5 = null;
    private static String artifactName5 = null;
    private static String artifactVersion5 = null;

    private static String artifactType6 = null;
    private static String artifactName6 = null;
    private static String artifactVersion6 = null;

    private static String artifactType7 = null;
    private static String artifactName7 = null;
    private static String artifactVersion7 = null;

    @BeforeClass
    public static void testSetUp() throws IOException, Exception {
        FileCopyUtils.copy(new File("src/test/resources/tomcat-server1.xml"),
                new File(getConfiguredRemoteServerConfigDir1(), "tomcat-server.xml"));
        new File(getConfiguredRemoteServerConfigDir1(), "tomcat-server1.xml")
                .renameTo(new File(getConfiguredRemoteServerConfigDir1(), "tomcat-server.xml"));
        FileCopyUtils.copy(new File("src/test/resources/org.eclipse.virgo.kernel4.properties"),
                new File(getConfiguredRemoteServerConfigDir1(), "org.eclipse.virgo.kernel.properties"));
        new File(getConfiguredRemoteServerConfigDir1(), "org.eclipse.virgo.kernel4.properties")
                .renameTo(new File(getConfiguredRemoteServerConfigDir1(), "org.eclipse.virgo.kernel.properties"));
        copyBundlesToHostedRepository(getConfiguredRemoteServerHostedBundlesDir());
        new Thread(new StartUpThread1()).start();
        Thread.sleep(5000);
        UrlWaitLatch.waitFor(HOSTED_REPO_SPLASHURL);

        FileSystemUtils.deleteRecursively(new File(getConfiguredRemoteServerBundlesUsrDir2()));
        new File(getConfiguredRemoteServerBundlesUsrDir2()).mkdir();
        FileSystemUtils.deleteRecursively(
                new File(getConfiguredRemoteServerConfigDir2(), "org.eclipse.virgo.apps.repository.properties"));
        FileCopyUtils.copy(new File("src/test/resources/org.eclipse.virgo.repository1.properties"),
                new File(getConfiguredRemoteServerConfigDir2(), "org.eclipse.virgo.repository.properties"));
        new File(getConfiguredRemoteServerConfigDir2(), "org.eclipse.virgo.repository1.properties").renameTo(
                new File(getConfiguredRemoteServerConfigDir2(), "org.eclipse.virgo.repository.properties"));
        copyDependentBundlesToRepository(getConfiguredRemoteServerBundlesUsrDir2());
        FileCopyUtils.copy(new File("src/test/resources/tomcat-server2.xml"),
                new File(getConfiguredRemoteServerConfigDir2(), "tomcat-server.xml"));
        new File(getConfiguredRemoteServerConfigDir2(), "tomcat-server2.xml")
                .renameTo(new File(getConfiguredRemoteServerConfigDir2(), "tomcat-server.xml"));
        FileCopyUtils.copy(new File("src/test/resources/org.eclipse.virgo.kernel5.properties"),
                new File(getConfiguredRemoteServerConfigDir2(), "org.eclipse.virgo.kernel.properties"));
        new File(getConfiguredRemoteServerConfigDir2(), "org.eclipse.virgo.kernel5.properties")
                .renameTo(new File(getConfiguredRemoteServerConfigDir2(), "org.eclipse.virgo.kernel.properties"));
        new Thread(new StartUpThread2()).start();
        Thread.sleep(5000);
        UrlWaitLatch.waitFor(CLIENT_SPLASHURL);
    }

    protected static String getConfiguredRemoteServerHomeDir1() throws Exception {
        if (serverHomeDir1 == null) {
            File testExpanded = new File("src/test/resources");
            for (File candidate : testExpanded.listFiles()) {
                if (candidate.isDirectory() && candidate.getName().equals("virgo-web-server1")) {
                    serverHomeDir1 = new File(candidate.getCanonicalPath()).getCanonicalPath();
                    break;
                }
            }
        }
        return serverHomeDir1;
    }

    protected static String getConfiguredRemoteServerHomeDir2() throws Exception {
        if (serverHomeDir2 == null) {
            File testExpanded = new File("src/test/resources");
            for (File candidate : testExpanded.listFiles()) {
                if (candidate.isDirectory() && candidate.getName().equals("virgo-web-server2")) {
                    serverHomeDir2 = new File(candidate.getCanonicalPath()).getCanonicalPath();
                    break;
                }
            }
        }
        return serverHomeDir2;
    }

    protected static String getConfiguredRemoteServerPickupDir() throws Exception {
        if (pickupDir == null) {
            File testExpanded = new File(getConfiguredRemoteServerHomeDir2());
            for (File candidate : testExpanded.listFiles()) {
                if (candidate.isDirectory() && candidate.getName().equals("pickup")) {
                    pickupDir = new File(candidate.getCanonicalPath()).getCanonicalPath();
                    break;
                }
            }
        }
        return pickupDir;
    }

    public static String getConfiguredRemoteServerBinDir1() throws Exception {
        if (binDir1 == null) {
            File testExpanded = new File(getConfiguredRemoteServerHomeDir1());
            for (File candidate : testExpanded.listFiles()) {
                if (candidate.isDirectory() && candidate.getName().equals("bin")) {
                    binDir1 = new File(candidate.getCanonicalPath()).getCanonicalPath();
                    break;
                }
            }
        }
        return binDir1;
    }

    public static String getConfiguredRemoteServerConfigDir1() throws Exception {
        if (configDir1 == null) {
            File testExpanded = new File(getConfiguredRemoteServerHomeDir1());
            for (File candidate : testExpanded.listFiles()) {
                if (candidate.isDirectory() && candidate.getName().equals("config")) {
                    configDir1 = new File(candidate.getCanonicalPath()).getCanonicalPath();
                    break;
                }
            }
        }
        return configDir1;
    }

    public static String getConfiguredRemoteServerConfigDir2() throws Exception {
        if (configDir2 == null) {
            File testExpanded = new File(getConfiguredRemoteServerHomeDir2());
            for (File candidate : testExpanded.listFiles()) {
                if (candidate.isDirectory() && candidate.getName().equals("config")) {
                    configDir2 = new File(candidate.getCanonicalPath()).getCanonicalPath();
                    break;
                }
            }
        }
        return configDir2;
    }

    public static String getConfiguredRemoteServerBinDir2() throws Exception {
        if (binDir2 == null) {
            File testExpanded = new File(getConfiguredRemoteServerHomeDir2());
            for (File candidate : testExpanded.listFiles()) {
                if (candidate.isDirectory() && candidate.getName().equals("bin")) {
                    binDir2 = new File(candidate.getCanonicalPath()).getCanonicalPath();
                    break;
                }
            }
        }
        return binDir2;
    }

    public static void copyFile(File source, File dest) throws IOException {
        if (!dest.exists()) {
            dest.createNewFile();
        }
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(source);
            out = new FileOutputStream(dest);
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        }

        finally {
            in.close();
            out.close();
        }
    }

    protected static String getConfiguredRemoteServerBundlesUsrDir1() throws Exception {
        if (usrDir1 == null) {
            File serverHomeDir = new File(getConfiguredRemoteServerHomeDir1());
            if (serverHomeDir.isDirectory()) {
                File repositoryDir = new File(serverHomeDir, "repository").getCanonicalFile();
                usrDir1 = new File(repositoryDir, "usr").getCanonicalPath();
            }
        }

        return usrDir1;
    }

    protected static String getConfiguredRemoteServerBundlesUsrDir2() throws Exception {
        if (usrDir2 == null) {
            File serverHomeDir = new File(getConfiguredRemoteServerHomeDir2());
            if (serverHomeDir.isDirectory()) {
                File repositoryDir = new File(serverHomeDir, "repository").getCanonicalFile();
                usrDir2 = new File(repositoryDir, "usr").getCanonicalPath();
            }
        }

        return usrDir2;
    }

    protected static String getConfiguredRemoteServerHostedBundlesDir() throws Exception {
        if (hostedDir == null) {
            File testExpanded = new File(getConfiguredRemoteServerHomeDir1());
            for (File mainDir : testExpanded.listFiles()) {
                if (mainDir.isDirectory() && mainDir.getName().equals("repository")) {
                    new File(mainDir, "hosted").mkdir();
                    hostedDir = new File(mainDir, "hosted").getCanonicalPath();
                    break;
                }
            }
        }

        return hostedDir;
    }

    protected static void copyDependentBundlesToRepository(String bundlesUsrDir) throws Exception {

        for (String bundleName : bundleNames1) {

            FileCopyUtils.copy(new File(resourcesDir1, bundleName), new File(bundlesUsrDir, bundleName));
        }

        for (String bundleName : downloadBundleNames1) {

            FileCopyUtils.copy(new File(downloadDir, bundleName), new File(bundlesUsrDir, bundleName));
        }
    }

    protected static void copyBundlesToHostedRepository(String bundlesUsrDir) throws Exception {

        for (String bundleName : bundleNames2) {

            FileCopyUtils.copy(new File(resourcesDir2, bundleName), new File(bundlesUsrDir, bundleName));
        }
    }

    @Test
    public void testScopedPlanArtifactDeployThatDependsUponArtifactsInRemoteHostedRepo() throws Exception {
        signature = new String[] { String.class.getName() };
        params = new Object[] { new File(APP_URI_PLAN).toURI().toString() };
        CompositeData compositeData = deploy(signature, params);
        artifactName1 = compositeData.get("symbolicName").toString();
        artifactType1 = compositeData.get("type").toString();
        artifactVersion1 = compositeData.get("version").toString();

        waitForMBeanRegister(artifactType1, artifactName1, artifactVersion1, HALF_SECOND, TWO_MINUTES);
        assertArtifactExists(artifactType1, artifactName1, artifactVersion1);
        waitForArtifactState("plan", "scoped.plan", "1.0.0", "ACTIVE", HALF_SECOND, TWO_MINUTES);
        ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
                .getAttribute(getObjectName(artifactType1, artifactName1, artifactVersion1), "Dependents");
        for (ObjectName objectName : objectNameList) {
            assertPlanReferencedArtifacts(objectName);
        }
        assertArtifactState(artifactType1, artifactName1, artifactVersion1, "ACTIVE");
    }

    @Test
    public void testScopedPlanArtifactUndeployThatDependsUponArtifactsInRemoteHostedRepo() throws Exception {
        signature = new String[] { String.class.getName(), String.class.getName() };
        params = new Object[] { artifactName1, artifactVersion1 };
        getMBeanServerConnection().invoke(new ObjectName("org.eclipse.virgo.kernel:category=Control,type=Deployer"),
                "undeploy", params, signature);
        waitForMBeanDeRegister(artifactType1, artifactName1, artifactVersion1, HALF_SECOND, TWO_MINUTES);
        assertArtifactNotExists(artifactType1, artifactName1, artifactVersion1);
    }

    @Test
    public void testUnscopedPlanThatDependsUponArtifactsInRemoteHostedRepo() throws IOException, Exception {
        signature = new String[] { String.class.getName() };
        params = new Object[] { new File(APP_URI_PLAN_UNSCOPED).toURI().toString() };
        CompositeData compositeData = deploy(signature, params);
        artifactName4 = compositeData.get("symbolicName").toString();
        artifactType4 = compositeData.get("type").toString();
        artifactVersion4 = compositeData.get("version").toString();

        waitForMBeanRegister(artifactType4, artifactName4, artifactVersion4, HALF_SECOND, TWO_MINUTES);
        assertArtifactExists(artifactType4, artifactName4, artifactVersion4);
        assertArtifactState(artifactType4, artifactName4, artifactVersion4, "ACTIVE");
    }

    @Test
    public void testDeploymentOfSharedServicesWarDependsOnArtfiactsInUnscopedPlan() throws IOException, Exception {
        signature = new String[] { String.class.getName() };
        params = new Object[] { new File(APP_URI_SHAREDSERVICES_WAR1).toURI().toString() };
        CompositeData compositeData = deploy(signature, params);
        artifactName5 = compositeData.get("symbolicName").toString();
        artifactType5 = compositeData.get("type").toString();
        artifactVersion5 = compositeData.get("version").toString();

        waitForMBeanRegister(artifactType5, artifactName5, artifactVersion5, HALF_SECOND, TWO_MINUTES);
        UrlWaitLatch.waitFor("http://localhost:8083/hello_war_shared_services/");
        assertArtifactExists(artifactType5, artifactName5, artifactVersion5);
        assertArtifactState(artifactType5, artifactName5, artifactVersion5, "ACTIVE");
    }

    @Test
    public void testUnDeploymentOfSharedServicesWarDependsOnArtfiactsInUnscopedPlan() throws Exception {
        signature = new String[] { String.class.getName(), String.class.getName() };
        params = new Object[] { artifactName5, artifactVersion5 };
        getMBeanServerConnection().invoke(new ObjectName("org.eclipse.virgo.kernel:category=Control,type=Deployer"),
                "undeploy", params, signature);
        waitForMBeanDeRegister(artifactType5, artifactName5, artifactVersion5, HALF_SECOND, TWO_MINUTES);
        UrlWaitLatch.waitForNotExistence("http://localhost:8083/hello_war_shared_services");
        assertArtifactNotExists(artifactType5, artifactName5, artifactVersion5);
    }

    @Test
    public void testSharedServicesWarDeployThatDependsUponArtifactsInRemoteHostedRepo() throws Exception {
        signature = new String[] { String.class.getName() };
        params = new Object[] { new File(APP_URI_SHAREDSERVICES_WAR2).toURI().toString() };
        CompositeData compositeData = deploy(signature, params);
        artifactName6 = compositeData.get("symbolicName").toString();
        artifactType6 = compositeData.get("type").toString();
        artifactVersion6 = compositeData.get("version").toString();

        waitForMBeanRegister(artifactType6, artifactName6, artifactVersion6, HALF_SECOND, TWO_MINUTES);
        UrlWaitLatch.waitFor("http://localhost:8083/formtags-shared-services-war-2.0.1.BUILD-20100413113234");
        UrlWaitLatch
                .waitFor("http://localhost:8083/formtags-shared-services-war-2.0.1.BUILD-20100413113234/list.htm");
        UrlWaitLatch.waitFor(
                "http://localhost:8083/formtags-shared-services-war-2.0.1.BUILD-20100413113234/form.htm?id=1");
        assertArtifactExists(artifactType6, artifactName6, artifactVersion6);
        assertArtifactState(artifactType6, artifactName6, artifactVersion6, "ACTIVE");
    }

    @Test
    public void testSharedServicesWarUnDeployThatDependsUponArtifactsInRemoteHostedRepo() throws Exception {
        signature = new String[] { String.class.getName(), String.class.getName() };
        params = new Object[] { artifactName6, artifactVersion6 };
        getMBeanServerConnection().invoke(new ObjectName("org.eclipse.virgo.kernel:category=Control,type=Deployer"),
                "undeploy", params, signature);
        waitForMBeanDeRegister(artifactType6, artifactName6, artifactVersion6, HALF_SECOND, TWO_MINUTES);
        UrlWaitLatch.waitForNotExistence(
                "http://localhost:8083/formtags-shared-services-war-2.0.1.BUILD-20100413113234");
        assertArtifactNotExists(artifactType6, artifactName6, artifactVersion6);
    }

    @Test
    public void testParDeployThatDependsUponArtifactsInRemoteHostedRepo() throws Exception {
        signature = new String[] { String.class.getName() };
        params = new Object[] { new File(APP_URI_PAR).toURI().toString() };
        CompositeData compositeData = deploy(signature, params);
        artifactName7 = compositeData.get("symbolicName").toString();
        artifactType7 = compositeData.get("type").toString();
        artifactVersion7 = compositeData.get("version").toString();

        waitForMBeanRegister(artifactType7, artifactName7, artifactVersion7, HALF_SECOND, TWO_MINUTES);
        assertArtifactExists(artifactType7, artifactName7, artifactVersion7);
        UrlWaitLatch.waitFor("http://localhost:8083/greenpages/app/home.htm");
        assertArtifactState(artifactType7, artifactName7, artifactVersion7, "ACTIVE");
    }

    @Test
    public void testParUnDeployThatDependsUponArtifactsInRemoteHostedRepo() throws Exception {
        signature = new String[] { String.class.getName(), String.class.getName() };
        params = new Object[] { artifactName7, artifactVersion7 };
        getMBeanServerConnection().invoke(new ObjectName("org.eclipse.virgo.kernel:category=Control,type=Deployer"),
                "undeploy", params, signature);
        waitForMBeanDeRegister(artifactType7, artifactName7, artifactVersion7, HALF_SECOND, TWO_MINUTES);
        UrlWaitLatch.waitForNotExistence("http://localhost:8083/greenpages");
        assertArtifactNotExists(artifactType7, artifactName7, artifactVersion7);
    }

    @AfterClass
    public static void shutdownRemoteInstance() throws Exception {
        new Thread(new ShutdownThread1()).start();
        UrlWaitLatch.waitForServerShutdownFully(HOSTED_REPO_SPLASHURL);
        FileSystemUtils.deleteRecursively(new File(getConfiguredRemoteServerHomeDir1()));
        new Thread(new ShutdownThread2()).start();
        UrlWaitLatch.waitForServerShutdownFully(CLIENT_SPLASHURL);
        FileSystemUtils.deleteRecursively(new File(getConfiguredRemoteServerHomeDir2()));
    }

    private static CompositeData deploy(String[] signature, Object[] params) throws Exception {
        CompositeData compsiteData = (CompositeData) getMBeanServerConnection().invoke(
                new ObjectName("org.eclipse.virgo.kernel:category=Control,type=Deployer"), "deploy", params,
                signature);
        return compsiteData;
    }

    private static MBeanServerConnection getMBeanServerConnection() throws Exception {
        String severDir = null;
        String[] creds = { "admin", "springsource" };
        Map<String, String[]> env = new HashMap<String, String[]>();

        File testExpanded = new File("src/test/resources");
        for (File mainDir : testExpanded.listFiles()) {
            if (mainDir.isDirectory() && mainDir.getName().equals("virgo-web-server2")) {
                severDir = new File(mainDir.toURI()).getCanonicalPath();
            }
        }
        env.put(JMXConnector.CREDENTIALS, creds);
        System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
        System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
        JMXServiceURL url = new JMXServiceURL(JMXURL);
        connection = JMXConnectorFactory.connect(url, env).getMBeanServerConnection();
        return connection;
    }

    private void waitForMBeanRegister(String type, String name, String version, long interval, long duration)
            throws Exception {
        long startTime = System.currentTimeMillis();
        boolean mbeanStatus = false;
        while (System.currentTimeMillis() - startTime < duration) {
            mbeanStatus = getMBeanServerConnection().isRegistered(getObjectName(type, name, version));
            if (mbeanStatus) {
                return;
            }
            Thread.sleep(interval);
        }
        fail(String.format("After %d ms, artifact %s mbean Status was", duration, name) + mbeanStatus);
    }

    private void waitForMBeanDeRegister(String type, String name, String version, long interval, long duration)
            throws Exception {
        long startTime = System.currentTimeMillis();
        boolean mbeanStatus = true;
        while (System.currentTimeMillis() - startTime < duration) {
            mbeanStatus = getMBeanServerConnection().isRegistered(getObjectName(type, name, version));
            if (!mbeanStatus) {
                return;
            }
            Thread.sleep(interval);
        }
        fail(String.format("After %d ms, artifact %s mbean Status was", duration, name) + mbeanStatus);
    }

    private void waitForArtifactState(String type, String name, String version, String state, long interval,
            long duration) throws Exception {
        long startTime = System.currentTimeMillis();
        String artifactstate = null;
        while (System.currentTimeMillis() - startTime < duration) {
            artifactstate = getMBeanServerConnection().getAttribute(getObjectName(type, name, version), "State")
                    .toString();
            if (artifactstate.equals(state)) {
                return;
            }
            Thread.sleep(interval);
        }
        fail(String.format("After %d ms, artifact %s state was", duration, name) + artifactstate);
    }

    private static ObjectName getObjectName(String type, String name, String version)
            throws MalformedObjectNameException {
        return new ObjectName(String.format(
                "org.eclipse.virgo.kernel:type=Model,artifact-type=%s,name=%s,version=%s", type, name, version));
    }

    private void assertArtifactExists(String type, String name, String version)
            throws IOException, Exception, MalformedObjectNameException {
        assertTrue(String.format("Artifact %s:%s:%s does not exist", type, name, version),
                getMBeanServerConnection().isRegistered(getObjectName(type, name, version)));
    }

    private void assertArtifactState(String type, String name, String version, String state)
            throws MalformedObjectNameException, IOException, Exception {
        assertEquals(String.format("Artifact %s:%s:%s is not in state %s", type, name, version, state), state,
                getMBeanServerConnection().getAttribute(getObjectName(type, name, version), "State"));
    }

    private void assertArtifactNotExists(String type, String name, String version)
            throws IOException, Exception, MalformedObjectNameException {
        assertFalse(String.format("Artifact %s:%s:%s is still exists", type, name, version),
                getMBeanServerConnection().isRegistered(getObjectName(type, name, version)));
    }

    private void assertPlanReferencedArtifacts(ObjectName objectName)
            throws MalformedObjectNameException, IOException, Exception {
        assertTrue("plan referenced artifact does not exist", getMBeanServerConnection().isRegistered(objectName));
        assertEquals(String.format("plan referenced artifact is not in state %s", "ACTIVE"), "ACTIVE",
                getMBeanServerConnection().getAttribute(objectName, "State"));
    }

    private static class StartUpThread1 implements Runnable {
        public StartUpThread1() {
        }

        public void run() {
            String[] args = null;
            try {
                if (os.getName().contains("Windows")) {
                    startup = new File(getConfiguredRemoteServerBinDir1(), "startup.bat");
                    startupURI = new File(startup.toURI());
                    startupFileName = startupURI.getCanonicalPath();

                } else {
                    startup = new File(getConfiguredRemoteServerBinDir1(), "startup.sh");
                    startupURI = new File(startup.toURI());
                    startupFileName = startupURI.getCanonicalPath();
                }
                args = new String[] { startupFileName, "-jmxport", "3333", "-clean" };
                pb = new ProcessBuilder(args);
                Map<String, String> env = pb.environment();
                env.put("JAVA_HOME", System.getProperty("java.home"));
                pb.redirectErrorStream(true);

                process = pb.start();

                InputStream is = process.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static class StartUpThread2 implements Runnable {
        public StartUpThread2() {
        }

        public void run() {
            String[] args = null;
            try {
                if (os.getName().contains("Windows")) {
                    startup = new File(getConfiguredRemoteServerBinDir2(), "startup.bat");
                    startupURI = new File(startup.toURI());
                    startupFileName = startupURI.getCanonicalPath();

                } else {
                    startup = new File(getConfiguredRemoteServerBinDir2(), "startup.sh");
                    startupURI = new File(startup.toURI());
                    startupFileName = startupURI.getCanonicalPath();
                }
                args = new String[] { startupFileName, "-jmxport", "4444", "-clean" };
                pb = new ProcessBuilder(args);
                Map<String, String> env = pb.environment();
                env.put("JAVA_HOME", System.getProperty("java.home"));
                pb.redirectErrorStream(true);

                process = pb.start();

                InputStream is = process.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static class ShutdownThread1 implements Runnable {
        public ShutdownThread1() {
        }

        public void run() {
            String[] args = null;
            try {
                if (os.getName().contains("Windows")) {
                    shutdown = new File(getConfiguredRemoteServerBinDir1(), "shutdown.bat");
                    shutdownURI = new File(shutdown.toURI());
                    shutdownFileName = shutdownURI.getCanonicalPath();
                } else {
                    shutdown = new File(getConfiguredRemoteServerBinDir1(), "shutdown.sh");
                    shutdownURI = new File(shutdown.toURI());
                    shutdownFileName = shutdownURI.getCanonicalPath();
                }
                args = new String[] { shutdownFileName, "-jmxport", "3333", "-immediate" };
                pb = new ProcessBuilder(args);
                Map<String, String> env = pb.environment();
                env.put("JAVA_HOME", System.getProperty("java.home"));
                pb.redirectErrorStream(true);

                process = pb.start();

                InputStream is = process.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

    private static class ShutdownThread2 implements Runnable {
        public ShutdownThread2() {
        }

        public void run() {
            String[] args = null;
            try {
                if (os.getName().contains("Windows")) {
                    shutdown = new File(getConfiguredRemoteServerBinDir2(), "shutdown.bat");
                    shutdownURI = new File(shutdown.toURI());
                    shutdownFileName = shutdownURI.getCanonicalPath();
                } else {
                    shutdown = new File(getConfiguredRemoteServerBinDir2(), "shutdown.sh");
                    shutdownURI = new File(shutdown.toURI());
                    shutdownFileName = shutdownURI.getCanonicalPath();
                }
                args = new String[] { shutdownFileName, "-jmxport", "4444", "-immediate" };
                pb = new ProcessBuilder(args);
                Map<String, String> env = pb.environment();
                env.put("JAVA_HOME", System.getProperty("java.home"));
                pb.redirectErrorStream(true);

                process = pb.start();

                InputStream is = process.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line;
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

}