/**
* 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.cdi;
import org.apache.openejb.junit.ApplicationComposer;
import org.apache.openejb.testing.Module;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.spi.ContextsService;
import org.apache.webbeans.spi.ConversationService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.ejb.Stateful;
import javax.el.BeanELResolver;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.FunctionMapper;
import javax.el.ValueExpression;
import javax.el.VariableMapper;
import javax.enterprise.context.ConversationScoped;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import javax.inject.Named;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@RunWith(ApplicationComposer.class)
public class StatefulConversationScopedTOMEE1138Test {
@Module
public Class<?>[] beans() {
return new Class<?>[]{MyConversation.class};
}
@Inject
private BeanManager bm;
@Inject
private MyConversation conversation;
@Inject
@Named("myConversation")
private MyConversation conversationByName;
@Before
public void startConversation() {
final WebBeansContext webBeansContext = WebBeansContext.currentInstance();
webBeansContext.registerService(ConversationService.class, new ConversationService() {
@Override
public String getConversationId() {
return "conversation-test";
}
@Override
public String generateConversationId() {
return "cid_1";
}
});
webBeansContext.getService(ContextsService.class).startContext(ConversationScoped.class, null);
}
@After
public void stopConversation() {
WebBeansContext.currentInstance().getService(ContextsService.class).endContext(ConversationScoped.class, null);
}
private static void doTest(final MyConversation conversation) {
assertEquals("John", conversation.getName());
conversation.setName("foo1");
assertEquals("foo1", conversation.getName());
}
@Test
public void injectionByType() {
assertNotNull(conversation);
doTest(conversation);
}
@Test
public void injectionByName() {
assertNotNull(conversationByName);
doTest(conversationByName);
}
@Test
public void injectionByNameLookup() {
final Bean<?> myConversation = bm.resolve(bm.getBeans("myConversation"));
final MyConversation conv = MyConversation.class.cast(bm.getReference(myConversation, Object.class, null));
doTest(conv);
}
@Test
public void el() {
final BeanELResolver elResolver = new BeanELResolver();
assertEquals("John", elResolver.getValue(new ELContext() {
@Override
public ELResolver getELResolver() {
return elResolver;
}
@Override
public FunctionMapper getFunctionMapper() {
return new FunctionMapper() {
@Override
public Method resolveFunction(final String prefix, final String localName) {
return null;
}
};
}
@Override
public VariableMapper getVariableMapper() {
return new VariableMapper() {
@Override
public ValueExpression resolveVariable(final String variable) {
return null;
}
@Override
public ValueExpression setVariable(final String variable, final ValueExpression expression) {
return null;
}
};
}
}, conversationByName, "name"));
}
@Test
public void properties() throws IntrospectionException {
final BeanInfo info = Introspector.getBeanInfo(conversationByName.getClass());
final PropertyDescriptor[] pds = info.getPropertyDescriptors();
assertEquals(2, pds.length); // class and name
}
@Named
@Stateful
@ConversationScoped
public static class MyConversation implements Serializable {
private String name = "John";
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
}