@SuppressWarnings("unchecked") public void setup(Map<String, Object> properties) { try { final BeanManager manager = (BeanManager) new InitialContext().lookup(STANDARD_BEAN_MANAGER_JNDI_NAME); if (manager != null && Container.available()) { final Bean<BoundSessionContext> sessionContextBean = (Bean<BoundSessionContext>) manager.resolve(manager.getBeans(BoundSessionContext.class, BoundLiteral.INSTANCE)); CreationalContext<?> ctx = manager.createCreationalContext(sessionContextBean); final BoundSessionContext sessionContext = (BoundSessionContext) manager.getReference(sessionContextBean, BoundSessionContext.class, ctx); sessionContext.associate(sessionContexts.get()); sessionContext.activate(); final Bean<BoundRequestContext> requestContextBean = (Bean<BoundRequestContext>) manager.resolve(manager.getBeans(BoundRequestContext.class, BoundLiteral.INSTANCE)); ctx = manager.createCreationalContext(requestContextBean); final BoundRequestContext requestContext = (BoundRequestContext) manager.getReference(requestContextBean, BoundRequestContext.class, ctx); requestContext.associate(requestContexts.get()); requestContext.activate(); final Bean<BoundConversationContext> conversationContextBean = (Bean<BoundConversationContext>) manager.resolve( manager.getBeans(BoundConversationContext.class, BoundLiteral.INSTANCE)); ctx = manager.createCreationalContext(conversationContextBean); final BoundConversationContext conversationContext = (BoundConversationContext) manager.getReference(conversationContextBean, BoundConversationContext.class, ctx); BoundRequest request = new MutableBoundRequest(requestContexts.get(), sessionContexts.get()); boundRequests.set(request); conversationContext.associate(request); conversationContext.activate(); } } catch (NamingException e) { log.error("Failed to setup Weld contexts", e); } }
@SuppressWarnings("unchecked") public void teardown(Map<String, Object> properties) { try { final BeanManager manager = (BeanManager) new InitialContext().lookup("java:comp/BeanManager"); if (manager != null && Container.available()) { final Bean<BoundSessionContext> sessionContextBean = (Bean<BoundSessionContext>) manager.resolve(manager.getBeans(BoundSessionContext.class, BoundLiteral.INSTANCE)); CreationalContext<?> ctx = manager.createCreationalContext(sessionContextBean); final BoundSessionContext sessionContext = (BoundSessionContext) manager.getReference(sessionContextBean, BoundSessionContext.class, ctx); sessionContext.deactivate(); sessionContext.dissociate(sessionContexts.get()); final Bean<BoundRequestContext> requestContextBean = (Bean<BoundRequestContext>) manager.resolve(manager.getBeans(BoundRequestContext.class, BoundLiteral.INSTANCE)); ctx = manager.createCreationalContext(requestContextBean); final BoundRequestContext requestContext = (BoundRequestContext) manager.getReference(requestContextBean, BoundRequestContext.class, ctx); requestContext.deactivate(); requestContext.dissociate(requestContexts.get()); final Bean<BoundConversationContext> conversationContextBean = (Bean<BoundConversationContext>) manager.resolve( manager.getBeans(BoundConversationContext.class, BoundLiteral.INSTANCE)); ctx = manager.createCreationalContext(conversationContextBean); final BoundConversationContext conversationContext = (BoundConversationContext) manager.getReference(conversationContextBean, BoundConversationContext.class, ctx); conversationContext.deactivate(); conversationContext.dissociate(boundRequests.get()); } } catch (NamingException e) { log.error("Failed to tear down Weld contexts", e); } finally { sessionContexts.remove(); requestContexts.remove(); boundRequests.remove(); } }
public void createConversation(@Observes(precedence = -1) Before event, WeldManager manager) { if (!enableConversationScope) { return; } CDIConversationID id = conversationId.get(); if (id == null) { id = new CDIConversationID(null); // when null creates a new empty conversation id. } BoundRequest request = new MutableBoundRequest(requestMap.get(), sessionMap.get()); this.boundRequest.set(request); BoundConversationContext conversationContext = manager.instance().select(BoundConversationContext.class).get(); conversationContext.associate(request); conversationContext.activate(id.getId()); }
public void destroyConversation(@Observes(precedence = 1) After event, WeldManager manager) { if (!enableConversationScope) { return; } BoundConversationContext conversationContext = manager.instance().select(BoundConversationContext.class).get(); if (!conversationContext.getCurrentConversation().isTransient()) { conversationId.set( new CDIConversationID(conversationContext.getCurrentConversation().getId())); } else { conversationId.set(new CDIConversationID(null)); } BoundRequest request = boundRequest.get(); try { conversationContext.invalidate(); conversationContext.deactivate(); } finally { conversationContext.dissociate(request); } }
@Test(description = "A simple test to check conversation replication") public void testConversationReplication() throws Exception { TestContainer container1 = bootstrapContainer(1, Collections.singletonList(Baz.class)); BeanManagerImpl beanManager1 = getBeanManager(container1); TestContainer container2 = bootstrapContainer(2, Collections.singletonList(Baz.class)); BeanManagerImpl beanManager2 = getBeanManager(container2); use(1); // Set up the conversation context BoundRequest request1 = new BoundRequestImpl(container1.getSessionStore()); BoundConversationContext conversationContext1 = Utils.getReference(beanManager1, BoundConversationContext.class); conversationContext1.associate(request1); conversationContext1.activate(); // Set a value into Baz1 Baz baz1 = Utils.getReference(beanManager1, Baz.class); baz1.setName("pete"); // Begin the conversation Conversation conversation1 = Utils.getReference(beanManager1, Conversation.class); conversation1.begin(); // refetch the test bean and check it has the right value baz1 = Utils.getReference(beanManager1, Baz.class); assert baz1.getName().equals("pete"); // Simulate ending the request (from the POV of the conversation only!) assert !conversation1.isTransient(); String cid = conversation1.getId(); conversationContext1.invalidate(); conversationContext1.deactivate(); conversationContext1.dissociate(request1); // and start another, propagating the conversation request1 = new BoundRequestImpl(container1.getSessionStore()); conversationContext1.associate(request1); conversationContext1.activate(cid); // refetch the test bean and check it has the right value baz1 = Utils.getReference(beanManager1, Baz.class); assert baz1.getName().equals("pete"); assert !conversation1.isTransient(); replicateSession(1, container1, 2, container2); use(2); // Set up the conversation context BoundRequest request2 = new BoundRequestImpl(container2.getSessionStore()); BoundConversationContext conversationContext2 = Utils.getReference(beanManager2, BoundConversationContext.class); conversationContext2.associate(request2); conversationContext2.activate(cid); Baz baz2 = Utils.getReference(beanManager2, Baz.class); assert baz2.getName().equals("pete"); Conversation conversation2 = Utils.getReference(beanManager2, Conversation.class); assert !conversation2.isTransient(); use(2); container2.stopContainer(); use(1); container1.stopContainer(); }