View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.orchestra.conversation;
20  
21  import org.apache.myfaces.orchestra.conversation.basic.LogConversationMessager;
22  import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapter;
23  import org.apache.myfaces.orchestra.frameworkAdapter.local.LocalFrameworkAdapter;
24  import org.springframework.aop.scope.ScopedObject;
25  import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
26  
27  /**
28   * Test various aspects of the conversation handling
29   */
30  public class TestConversation extends AbstractDependencyInjectionSpringContextTests implements ConversationBindingListener
31  {
32      protected String[] getConfigLocations()
33      {
34          return new String[]
35              {
36                  "classpath:testApplicationContext.xml"
37              };
38      }
39  
40  
41      private int valueBoundCount = 0;
42      private int valueUnboundCount = 0;
43  
44      protected void onSetUp() throws Exception
45      {
46          super.onSetUp();
47  
48          LocalFrameworkAdapter frameworkAdapter = new LocalFrameworkAdapter();
49          frameworkAdapter.setApplicationContext(applicationContext);
50          frameworkAdapter.setConversationMessager(new LogConversationMessager());
51          FrameworkAdapter.setCurrentInstance(frameworkAdapter);
52      }
53  
54      public void testConversation() throws Exception
55      {
56          DummyBean.callback=this;
57          final String BEAN_NAME = "dummyBean";
58  
59          // The Spring configuration for dummyBean does not explicitly set a conversation name,
60          // so conversation-name = bean-name
61          final String CONVERSATION_NAME = BEAN_NAME;
62  
63          valueBoundCount = 0;
64          valueUnboundCount = 0;
65  
66          /* simple create test */
67          DummyBean bean = (DummyBean) applicationContext.getBean(BEAN_NAME);
68  
69          assertTrue("should be a scoped object", bean instanceof ScopedObject);
70  
71          assertFalse("conversation should not have been started yet", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
72          assertEquals("value bound", 0, valueBoundCount);
73          assertEquals("value unbound", 0, valueUnboundCount);
74          bean.touch();
75          assertEquals("value bound", 1, valueBoundCount);
76          assertEquals("value unbound", 0, valueUnboundCount);
77          assertTrue("conversation should have been started", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
78  
79          /* check if correct conversation has been started */
80          Conversation conversationHolder = bean.checkCurrentConversation();
81          assertNotNull("current conversation", conversationHolder);
82          assertEquals("conversation name", CONVERSATION_NAME, conversationHolder.getName());
83  
84          /* invalidate conversation */
85          bean.invalidateSelf();
86  
87          assertFalse("conversation should not be running", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
88          assertTrue("conversation should be marked invalid", conversationHolder.isInvalid());
89          assertEquals("value bound", 1, valueBoundCount);
90          assertEquals("value unbound", 1, valueUnboundCount);
91  
92          bean.touch();
93          assertTrue("conversation should have been started", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
94          assertEquals("value bound", 2, valueBoundCount);
95  
96  
97          /* check if a new conversation bean has been created */
98          bean.setData("check");
99  
100         bean.invalidateAndRestartSelf();
101 
102         assertEquals("value bound", 2, valueBoundCount);
103         assertEquals("value unbound", 2, valueUnboundCount);
104 
105         assertTrue("conversation should still be running", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
106 
107         DummyBean beanNew = (DummyBean) applicationContext.getBean(BEAN_NAME);
108 
109         assertNotNull("should have got a new conversation", beanNew);
110         assertNull("the conversation is not new", bean.getData());
111 
112         beanNew.touch();
113 
114         assertEquals("value bound", 3, valueBoundCount);
115 
116         /* clear the whole conversation context */
117 
118         ConversationManager.getInstance().clearCurrentConversationContext();
119 
120         assertEquals("value unbound", 3, valueUnboundCount);
121         assertFalse("conversation should not be running", ConversationManager.getInstance().hasConversation(CONVERSATION_NAME));
122     }
123 
124     public void valueBound(ConversationBindingEvent event)
125     {
126         valueBoundCount++;
127     }
128 
129     public void valueUnbound(ConversationBindingEvent event)
130     {
131         valueUnboundCount++;
132     }
133 }