/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.openejb.threads; import org.apache.openejb.core.ThreadContext; import org.apache.openejb.junit.ApplicationComposer; import org.apache.openejb.testing.Module; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.Singleton; import javax.enterprise.concurrent.ManagedExecutorService; import javax.enterprise.context.RequestScoped; import javax.enterprise.inject.Typed; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @RunWith(ApplicationComposer.class) public class ManagedExecutorServiceTest { @EJB private ExecutorFacade facade; @Inject private CdiExecutorFacade cdiFacade; @Module public Class<?>[] bean() { return new Class<?>[]{ExecutorFacade.class, CdiExecutorFacade.class, RequestBean.class, MyCallable.class}; } private ThreadContext ctx; @Before public void cleanUpContext() { ctx = ThreadContext.getThreadContext(); ThreadContext.exit(null); RequestBean.ID = 0; } @After public void reset() { ThreadContext.enter(ctx); } @Test public void checkEjbContext() throws Exception { assertTrue(facade.submit().get()); // assertEquals(1, RequestBean.ID); // CDI is opposed to it in the spirit } @Test public void checkCdiContext() throws Exception { assertTrue(cdiFacade.submit().get()); // assertEquals(1, RequestBean.ID); // CDI is opposed to it in the spirit } @Test public void runnable() throws Exception { assertTrue(cdiFacade.submitRunnable()); } @Singleton @Typed(ExecutorFacade.class) public static class ExecutorFacade extends CdiExecutorFacade { @Resource private ManagedExecutorService es; @Override public boolean isValid() { return ThreadContext.getThreadContext().getBeanContext().getBeanClass() == ExecutorFacade.class; } } public static class CdiExecutorFacade { protected static long id = -1; protected static CdiExecutorFacade current = null; @Resource private ManagedExecutorService es; @Inject private RequestBean bean; @Inject private MyCallable callable; public Future<Boolean> submit() { setContext(); return es.submit(callable); } public boolean submitRunnable() { final CountDownLatch done = new CountDownLatch(1); es.submit(new Runnable() { @Override public void run() { done.countDown(); } }); try { done.await(); } catch (final InterruptedException e) { Thread.interrupted(); } return true; } protected void setContext() { id = bean.getId(); current = this; } public boolean isValid() { return ThreadContext.getThreadContext() == null; } } @Typed(MyCallable.class) public static class MyCallable implements Callable<Boolean> { /*@Inject private RequestBean bean;*/ @Inject private BeanManager bm; @Override public Boolean call() throws Exception { /* final RequestBean currentRequestBean = * RequestBean.class.cast(bm.getReference(bm.resolve(bm.getBeans(RequestBean.class)), * RequestBean.class, null));*/ return /*CdiExecutorFacade.id == bean.getId() && CdiExecutorFacade.id == currentRequestBean.getId() && */CdiExecutorFacade.current.isValid(); } } @RequestScoped public static class RequestBean { private static int ID = 0; private final int id = ID++; public int getId() { return id; } } }