Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2012 Harald Wellmann
   *
   * 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.ops4j.pax.exam.jboss;
 
 import java.io.File;
 import java.net.URI;
 import java.net.URL;
 import java.util.UUID;
 
 

Author(s):
Harald Wellmann
Since:
3.0.0
 
 public class JBossTestContainer implements TestContainer {
    
    
Configuration property specifying the download URL for a JBoss AS distribution. The default value is JBOSS_DIST_URL_DEFAULT.
 
     public static final String JBOSS_DIST_URL_KEY = "pax.exam.jboss.dist.url";

    
Default download URL for JBoss AS distribution.
 
     public static final String JBOSS_DIST_URL_DEFAULT = "mvn:org.jboss.as/jboss-as-dist/7.1.1.Final/zip";

    
Configuration property key for additional JBoss AS modules to be installed. The value is a comma-separated list of URLs. Each URL refers to a zipped module structure which will be unpacked under $JBOSS_HOME/modules.
 
     public static final String JBOSS_MODULES_KEY = "pax.exam.jboss.modules";
     
     public static final String JBOSS_SYSTEM_PROPERTIES_KEY = "pax.exam.jboss.system.properties";
 
     private static final Logger LOG = LoggerFactory.getLogger(JBossTestContainer.class);
 
     private static final String HTTP_PORT_XPATH = "/server/socket-binding-group/socket-binding[@name='http']/@port";
     
     private static final String MGMT_PORT_XPATH = "/server/socket-binding-group/socket-binding[@name='management-native']/@port";
     
    private final Stack<Stringdeployed = new Stack<String>();
    
    private String warProbe;
    private final ExamSystem system;
    private final TestDirectory testDirectory;
    private String jBossHome;
    private StandaloneServer server;
    private int httpPort;
    private int mgmtPort;
    private ConfigurationManager cm;
    public JBossTestContainer(ExamSystem systemFrameworkFactory frameworkFactory) {
        this. = system;
        this. = TestDirectory.getInstance();
        this. = new ConfigurationManager();
    }
    public synchronized void call(TestAddress address) {
        TestInstantiationInstruction instruction = .lookup(address);
        ProbeInvokerFactory probeInvokerFactory = ServiceProviderFinder
            .loadUniqueServiceProvider(ProbeInvokerFactory.class);
        ProbeInvoker invoker = probeInvokerFactory.createProbeInvoker(nullinstruction.toString());
        invoker.call(address.arguments());
    }
    public synchronized long install(String locationInputStream stream) {
        // just make sure we don't get an "option not recognized" warning
        .getOptions(WarProbeOption.class);
        deployModule("Pax-Exam-Probe""war"stream);
        return -1;
    }
    public synchronized long install(InputStream stream) {
        return install("local"stream);
    }
    public void deployModules() {
        UrlDeploymentOption[] deploymentOptions = .getOptions(UrlDeploymentOption.class);
        int numModules = 0;
        for (UrlDeploymentOption option : deploymentOptions) {
            numModules++;
            if (option.getName() == null) {
                option.name("app" + numModules);
            }
            deployModule(option);
        }
    }
    private void deployModule(UrlDeploymentOption option) {
        try {
            URL applUrl = new URL(option.getURL());
            deployModule(option.getName(), option.getType(), applUrl.openStream());
        }
        catch (MalformedURLException exc) {
            throw new TestContainerException("Problem deploying " + optionexc);
        }
        catch (IOException exc) {
            throw new TestContainerException("Problem deploying " + optionexc);
        }
    }
    private void deployModule(String applicationNameString deploymentTypeInputStream stream) {
        try {
            String warName = String.format("%s.%s"applicationNamedeploymentType);
            DeploymentPlan plan = builder.add(warNamestream).deploy(warName).build();
            ServerDeploymentPlanResult result = .execute(plan).get();
            UUID actionId = plan.getDeploymentActions().get(0).getId();
            ServerDeploymentActionResult actionResult = result.getDeploymentActionResult(actionId);
            if (actionResult.getResult() != .) {
                throw new TestContainerException("problem deploying " + applicationName);
            }
            .push(warName);
        }
        catch (ExecutionException exc) {
            throw new TestContainerException("Problem deploying " + applicationNameexc);
        }
        catch (InterruptedException exc) {
            throw new TestContainerException("Problem deploying " + applicationNameexc);
        }
    }
    public void cleanup() {
        undeployModules();
        if ( != null) {
            .stop();
        }
    }
    private void undeployModules() {
        while (!.isEmpty()) {
            String applicationName = .pop();
            undeployModule(applicationName);
        }
    }
    private void undeployModule(String applName) {
        DeploymentPlan plan = builder.undeploy(applName).andRemoveUndeployed().build();
        ServerDeploymentPlanResult result;
        try {
            result = .execute(plan).get();
        }
        catch (InterruptedException exc) {
            throw new TestContainerException("problem undeploying " + applNameexc);
        }
        catch (ExecutionException exc) {
            throw new TestContainerException("problem undeploying " + applNameexc);
        }
        UUID actionId = plan.getDeploymentActions().get(0).getId();
        ServerDeploymentActionResult actionResult = result.getDeploymentActionResult(actionId);
        if (actionResult.getResult() != .) {
            throw new TestContainerException("problem undeploying " + applName);
        }
    }
    public TestContainer start() {
        installContainer();
        File tempDir = .getTempFolder();
        File dataDir = new File(tempDir"data");
        dataDir.mkdir();
        File configDir = new File("src/test/resources/jboss-config");
        File configFile = new File(configDir"standalone.xml");
        if (!configFile.exists()) {
            throw new TestContainerException(configFile + " does not exist");
        }
        parseServerConfiguration(configFile);
        System.setProperty("jboss.server.config.dir"configDir.getAbsolutePath());
        System.setProperty("jboss.server.data.dir"dataDir.getAbsolutePath());
         = EmbeddedServerFactory.create(new File(), System.getProperties(),
            System.getenv(),
            // packages to be loaded from system class loader
            "org.jboss.logmanager""org.jboss.logging""org.jboss.threads""org.slf4j",
            "org.slf4j.cal10n""ch.qos.cal10n");
        try {
            .start();
             = ServerDeploymentManager.Factory.create(
                InetAddress.getByName("localhost"), );
            .setAccessPoint(new URI("http://localhost:" + 
                + "/Pax-Exam-Probe/"));
            deployModules();
        }
        catch (ServerStartException exc) {
            throw new TestContainerException("Problem starting test container."exc);
        }
        catch (URISyntaxException exc) {
            throw new TestContainerException("Problem starting test container."exc);
        }
        catch (UnknownHostException exc) {
            throw new TestContainerException("Problem starting test container."exc);
        }
        return this;
    }
    public void installContainer() {
        System.setProperty("java.protocol.handler.pkgs""org.ops4j.pax.url");
        System.setProperty("java.util.logging.manager""org.jboss.logmanager.LogManager");
         = .getProperty("pax.exam.jboss.home");
        if ( == null) {
            throw new TestContainerException(
                "System property pax.exam.jboss.home must be set to JBoss AS install root");
        }
        File installDir = new File();
        if (installDir.exists()) {
            File moduleLoader = new File(installDir"jboss-modules.jar");
            if (moduleLoader.exists()) {
                .info("using JBoss AS installation in {}");
            }
            else {
                String msg = String.format("%s exists, but %s does not. "
                    + "This does not look like a valid JBoss AS installation.",
                    moduleLoader);
                throw new TestContainerException(msg);
            }
        }
        else {
            .info("installing JBoss AS in {}");
            String distUrl = .getProperty();
            .info("installing JBoss AS from {} in {}"distUrl);
            try {
                URL url = new URL(distUrl);
                File installParent = installDir.getParentFile();
                File tempInstall = new File(installParent, UUID.randomUUID().toString());
                ZipInstaller installer = new ZipInstaller(urltempInstall.getAbsolutePath());
                installer.downloadAndInstall();
                File unpackedRoot = tempInstall.listFiles()[0];
                unpackedRoot.renameTo(installDir);
                installJbossModules();
            }
            catch (MalformedURLException exc) {
                throw new TestContainerException(exc);
            }
            catch (IOException exc) {
                throw new TestContainerException("error during JBoss AS installation"exc);
            }
        }
    }
    private void installJbossModules() {
        String modulesList = .getProperty();
        if (modulesList == null) {
            return;
        }
        File addOnsDir = new File("modules");
        addOnsDir.mkdirs();
        String[] modules = modulesList.split(",\\s*");
        for (String module : modules) {
            installJbossModule(moduleaddOnsDir);
        }
    }
    private void installJbossModule(String moduleFile moduleDir) {
        try {
            URL moduleUrl = new URL(module);
            .info("installing add-on module {}"module);
            ZipInstaller installer = new ZipInstaller(moduleUrlmoduleDir.getAbsolutePath());
            installer.downloadAndInstall();
        }
        catch (MalformedURLException exc) {
            throw new TestContainerException("invalid module URL: " + moduleexc);
        }
        catch (IOException exc) {
            throw new TestContainerException(exc);
        }
    }
    private void parseServerConfiguration(File serverConfig) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder;
            builder = factory.newDocumentBuilder();
            Document doc = builder.parse(serverConfig);
            XPathFactory xpf = XPathFactory.newInstance();
            XPath xPath = xpf.newXPath();
            String httpPortString = substituteProperties(xPath.evaluate(doc));
            String mgmtPortString = substituteProperties(xPath.evaluate(doc));
            String portOffsetString = System.getProperty("jboss.socket.binding.port-offset""0");
             = Integer.parseInt(httpPortString);
             = Integer.parseInt(mgmtPortString);
            int portOffset = Integer.parseInt(portOffsetString);
             += portOffset;
             += portOffset;
        }
        catch (ParserConfigurationException exc) {
            throw new IllegalArgumentException(exc);
        }
        catch (SAXException exc) {
            throw new IllegalArgumentException(exc);
        }
        catch (IOException exc) {
            throw new IllegalArgumentException(exc);
        }
        catch (XPathExpressionException exc) {
            throw new IllegalArgumentException(exc);
        }
    }
    public String substituteProperties(String value) {
        String result = value;
        if (value.startsWith("${") && value.endsWith("}")) {
            String propWithDefault = value.substring(2, value.length() - 1);
            int colon = propWithDefault.indexOf(':');
            String defaultValue = "";
            String propertyKey = propWithDefault;
            if (colon >= 0) {
                propertyKey = propWithDefault.substring(0, colon);
                defaultValue = propWithDefault.substring(colon + 1);
            }
            result = System.getProperty(propertyKeydefaultValue);
        }
        return result;
    }
    public TestContainer stop() {
        cleanup();
        .clear();
        return this;
    }
    @Override
    public String toString() {
        return "JBoss";
    }
    @Override
    public long installProbe(InputStream stream) {
        install(stream);
        this. = .pop();
        return -1;
    }
    @Override
    public void uninstallProbe() {
        undeployModule();
        this. = null;        
    }
New to GrepCode? Check out our FAQ X