package pl.com.it_crowd.arquillian.mock_contexts.test; import javax.annotation.PreDestroy; import javax.enterprise.context.ContextNotActiveException; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.enterprise.inject.Alternative; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; @Alternative @ConversationScoped public class MockConversation implements Conversation, Serializable { // ------------------------------ FIELDS ------------------------------ private static Set<String> ACTIVE_CONVERSATIONS = new HashSet<String>(); private static long CONVERSATION_ID_COUNTER = 1; private static final Logger log = Logger.getLogger(MockConversationb.class.getName()); private boolean _transient; private BeanManager beanManager; private String id; private long timeout; // --------------------------- CONSTRUCTORS --------------------------- public MockConversation() { } @Inject public MockConversation(BeanManager beanManager) { this.beanManager = beanManager; this._transient = true; this.timeout = 0; } // --------------------- GETTER / SETTER METHODS --------------------- public long getTimeout() { verifyConversationContextActive(); return timeout; } public void setTimeout(long timeout) { verifyConversationContextActive(); this.timeout = timeout; } // ------------------------ CANONICAL METHODS ------------------------ @Override public String toString() { if (_transient) { return "Transient conversation"; } else { return "Conversation with id: " + id; } } // ------------------------ INTERFACE METHODS ------------------------ // --------------------- Interface Conversation --------------------- public void begin() { verifyConversationContextActive(); if (!_transient) { throw new IllegalStateException("BEGIN_CALLED_ON_LONG_RUNNING_CONVERSATION"); } _transient = false; if (this.id == null) { // This a conversation that was made transient previously in this request this.id = "" + CONVERSATION_ID_COUNTER++; ACTIVE_CONVERSATIONS.add(this.id); } } public void begin(String id) { verifyConversationContextActive(); if (!_transient) { throw new IllegalStateException("BEGIN_CALLED_ON_LONG_RUNNING_CONVERSATION"); } if (ACTIVE_CONVERSATIONS.contains(id)) { throw new IllegalStateException("CONVERSATION_ID_ALREADY_IN_USE:" + id); } _transient = false; this.id = id; } public void end() { if (_transient) { throw new IllegalStateException("END_CALLED_ON_TRANSIENT_CONVERSATION"); } _transient = true; ACTIVE_CONVERSATIONS.remove(this.id); } public String getId() { verifyConversationContextActive(); if (!_transient) { return id; } else { return null; } } public boolean isTransient() { verifyConversationContextActive(); return _transient; } @PreDestroy private void onDestroy() { ACTIVE_CONVERSATIONS.remove(this.id); } private void verifyConversationContextActive() { try { beanManager.getContext(ConversationScoped.class); } catch (ContextNotActiveException e) { throw new ContextNotActiveException("Conversation Context not active when method called on conversation " + this, e); } } }Now you need to register it as alternative in beans.xml you ship with deployment:
@Deployment public static Archive getArchive() { final String beansDescriptor = Descriptors.create(BeansDescriptor.class) .createAlternatives() .clazz(MockConversation.class.getCanonicalName()) .up() .exportAsString(); return ShrinkWrap.create(WebArchive.class, SampleTest.class.getSimpleName() + ".war") .addAsWebInfResource(new StringAsset(beansDescriptor), "beans.xml") .addClass(...) .addClass(MockConversation.class); }
No comments:
Post a Comment