/* * 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.openwebbeans; import java.io.File; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.net.URLClassLoader; import java.util.UUID; import org.apache.deltaspike.cdise.api.CdiContainer; import org.apache.deltaspike.cdise.api.CdiContainerLoader; import org.ops4j.pax.exam.ConfigurationManager; import org.ops4j.pax.exam.Constants; import org.ops4j.pax.exam.ExamSystem; import org.ops4j.pax.exam.TestAddress; import org.ops4j.pax.exam.TestContainer; import org.ops4j.pax.exam.TestContainerException; import org.ops4j.pax.exam.options.JarProbeOption; import org.ops4j.pax.exam.spi.war.JarBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Harald Wellmann * @since 3.0.0 */ public class OpenWebBeansTestContainer implements TestContainer { private static final Logger LOG = LoggerFactory.getLogger(OpenWebBeansTestContainer.class); private static CdiContainer container; private boolean isValid; private ExamSystem system; private ClassLoader contextClassLoader; private File probeDir; public OpenWebBeansTestContainer(ExamSystem system) { this.system = system; } @Override public void call(TestAddress address) { } @Override public long install(String location, InputStream stream) { return -1; } @Override public long install(InputStream stream) { return -1; } @Override public TestContainer start() { validateConfiguration(); setProbeClassLoader(); LOG.debug("starting OpenWebBeans container"); container = CdiContainerLoader.getCdiContainer(); container.boot(); container.getContextControl().startContexts(); isValid = true; return this; } private void setProbeClassLoader() { JarProbeOption probeOption = system.getSingleOption(JarProbeOption.class); if (probeOption == null) { return; } probeDir = new File(system.getTempFolder(), UUID.randomUUID().toString()); probeDir.mkdir(); JarBuilder builder = new JarBuilder(probeDir, probeOption); URI jar = builder.buildJar(); try { URLClassLoader classLoader = new URLClassLoader(new URL[] { jar.toURL() }); contextClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(classLoader); } catch (MalformedURLException exc) { throw new TestContainerException(exc); } } private void validateConfiguration() { ConfigurationManager cm = new ConfigurationManager(); String systemType = cm.getProperty(Constants.EXAM_SYSTEM_KEY); if (!Constants.EXAM_SYSTEM_CDI.equals(systemType)) { String msg = "OpenWebBeansTestContainer requires pax.exam.system = cdi"; throw new TestContainerException(msg); } } @Override public TestContainer stop() { if (container != null && isValid) { LOG.debug("stopping OpenWebBeans container"); container.getContextControl().stopContexts(); container.shutdown(); unsetProbeClassLoader(); } return this; } private void unsetProbeClassLoader() { if (contextClassLoader != null) { Thread.currentThread().setContextClassLoader(contextClassLoader); } } @Override public String toString() { return "OpenWebBeans"; } public static CdiContainer getCdiContainer() { return container; } @Override public long installProbe(InputStream stream) { return -1; } @Override public void uninstallProbe() { // not used } }