View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   
8   package org.mule.module.jca;
9   
10  import org.mule.MessageExchangePattern;
11  import org.mule.api.MuleException;
12  import org.mule.api.endpoint.ImmutableEndpoint;
13  import org.mule.api.endpoint.InboundEndpoint;
14  import org.mule.api.model.Model;
15  import org.mule.api.service.Service;
16  import org.mule.model.seda.SedaModel;
17  import org.mule.service.ServiceCompositeMessageSource;
18  import org.mule.tck.junit4.AbstractMuleContextTestCase;
19  
20  import java.lang.reflect.Method;
21  import java.util.Timer;
22  
23  import javax.resource.ResourceException;
24  import javax.resource.spi.ActivationSpec;
25  import javax.resource.spi.BootstrapContext;
26  import javax.resource.spi.InvalidPropertyException;
27  import javax.resource.spi.ResourceAdapter;
28  import javax.resource.spi.UnavailableException;
29  import javax.resource.spi.XATerminator;
30  import javax.resource.spi.endpoint.MessageEndpoint;
31  import javax.resource.spi.endpoint.MessageEndpointFactory;
32  import javax.resource.spi.work.WorkManager;
33  import javax.transaction.xa.XAResource;
34  
35  import org.junit.Test;
36  
37  import static org.junit.Assert.assertEquals;
38  import static org.junit.Assert.assertNotNull;
39  import static org.junit.Assert.assertTrue;
40  import static org.junit.Assert.fail;
41  
42  public class MuleResourceAdapterTestCase extends AbstractMuleContextTestCase
43  {
44      private MuleResourceAdapter resourceAdapter;
45  
46      @Override
47      protected void doSetUp() throws Exception
48      {
49          resourceAdapter = new MuleResourceAdapter();
50          resourceAdapter.muleContext = muleContext;
51          resourceAdapter.bootstrapContext = new MockBoostrapContext();
52      }
53  
54      @Override
55      protected void doTearDown() throws Exception
56      {
57          resourceAdapter = null;
58      }
59  
60      @Test
61      public void testResolveModelName() throws ResourceException
62      {
63          MuleActivationSpec activationSpec = new MuleActivationSpec();
64          activationSpec.setModelName("activationSpecModelName");
65          resourceAdapter.setModelName("resourceAdaptorModelName");
66          String modelName = resourceAdapter.resolveModelName(activationSpec);
67          assertEquals("activationSpecModelName", modelName);
68      }
69  
70      @Test
71      public void testResolveModelNameFromResourceAdaptor() throws ResourceException
72      {
73          MuleActivationSpec activationSpec = new MuleActivationSpec();
74          resourceAdapter.setModelName("resourceAdaptorModelName");
75          String modelName = resourceAdapter.resolveModelName(activationSpec);
76          assertEquals("resourceAdaptorModelName", modelName);
77      }
78  
79      @Test
80      public void testResolveModelNameFromActivationSpec() throws ResourceException
81      {
82          MuleActivationSpec activationSpec = new MuleActivationSpec();
83          activationSpec.setModelName("activationSpecModelName");
84          String modelName = resourceAdapter.resolveModelName(activationSpec);
85          assertEquals("activationSpecModelName", modelName);
86      }
87  
88      @Test
89      public void testResolveModelModelNameMissing()
90      {
91          MuleActivationSpec activationSpec = new MuleActivationSpec();
92          try
93          {
94              resourceAdapter.resolveModelName(activationSpec);
95              fail("Exception expected: No modelName set.");
96          }
97          catch (ResourceException e)
98          {
99              // expected
100         }
101     }
102 
103     @Test
104     public void testGetJcaModelCreateNew() throws MuleException, ResourceException
105     {
106         JcaModel jcaModel = resourceAdapter.getJcaModel("jca");
107         assertEquals("jca", jcaModel.getName());
108     }
109 
110     @Test
111     public void testGetJcaModelUseExisting() throws MuleException, ResourceException
112     {
113         Model jcaModel = new JcaModel();
114         jcaModel.setName("jca");
115         muleContext.getRegistry().registerModel(jcaModel);
116         JcaModel jcaModel2 = resourceAdapter.getJcaModel("jca");
117         assertEquals("jca", jcaModel2.getName());
118         assertEquals(jcaModel, jcaModel2);
119     }
120 
121     @Test
122     public void testGetJcaModel3ExistingWrongType() throws MuleException
123     {
124         Model sedaModel = new SedaModel();
125         sedaModel.setName("jca");
126         muleContext.getRegistry().registerModel(sedaModel);
127         try
128         {
129             resourceAdapter.getJcaModel("jca");
130             fail("Exception Expected: Model is not JcaModel");
131         }
132         catch (Exception e)
133         {
134             // expected
135         }
136     }
137 
138     @Test
139     public void testCreateMessageInflowEndpoint() throws MuleException
140     {
141         MuleActivationSpec activationSpec = new MuleActivationSpec();
142         activationSpec.setEndpoint("test://testEndpoint");
143         ImmutableEndpoint endpoint = resourceAdapter.createMessageInflowEndpoint(activationSpec);
144         assertEndpointAttributes(endpoint);
145     }
146 
147     @Test
148     public void testCreateJcaComponent() throws Exception
149     {
150         MessageEndpointFactory endpointFactory = new MockEndpointFactory();
151         JcaModel jcaModel = resourceAdapter.getJcaModel("jca");
152         MuleActivationSpec activationSpec = new MuleActivationSpec();
153         activationSpec.setEndpoint("test://testEndpoint");
154         InboundEndpoint endpoint = resourceAdapter.createMessageInflowEndpoint(activationSpec);
155 
156         Service service = resourceAdapter.createJcaService(endpointFactory, jcaModel, endpoint);
157 
158         // Check service
159         assertNotNull(service);
160         assertEquals("JcaService#" + endpointFactory.hashCode(), service.getName());
161         assertNotNull(service);
162         assertTrue(service instanceof JcaService);
163         assertNotNull(service.getComponent());
164         assertTrue(service.getComponent() instanceof JcaComponent);
165         assertNotNull(((JcaComponent) service.getComponent()).workManager);
166         testJcaService(service);
167 
168         testEndpoint(service);
169 
170         // Check endpoint
171         ImmutableEndpoint endpoint2 = ((ServiceCompositeMessageSource) service.getMessageSource()).getEndpoints().get(0);
172         assertEquals(endpoint, endpoint2);
173 
174         // Check service implementation
175         assertEquals(endpointFactory, ((JcaComponent) service.getComponent()).messageEndpointFactory);
176     }
177 
178     @Test
179     public void testendpointActivationOK() throws Exception
180     {
181         MuleActivationSpec activationSpec = new MuleActivationSpec();
182         activationSpec.setResourceAdapter(resourceAdapter);
183         activationSpec.setModelName("jcaModel");
184         activationSpec.setEndpoint("test://testEndpoint");
185         MessageEndpointFactory endpointFactory = new MockEndpointFactory();
186 
187         assertEquals(0, resourceAdapter.endpoints.size());
188 
189         resourceAdapter.endpointActivation(endpointFactory, activationSpec);
190         assertEquals(1, resourceAdapter.endpoints.size());
191 
192         MuleEndpointKey key = new MuleEndpointKey(endpointFactory, activationSpec);
193         Service service = resourceAdapter.endpoints.get(key);
194 
195         assertEquals("JcaService#" + endpointFactory.hashCode(), service.getName());
196         testJcaService(service);
197         testEndpoint(service);
198         
199         assertTrue(service.getComponent() instanceof JcaComponent);
200         
201         assertEquals(endpointFactory, ((JcaComponent) service.getComponent()).messageEndpointFactory);
202 
203         // Additional activation with same endpointFactory does not increase size of
204         // endpoint cache.
205         resourceAdapter.endpointActivation(endpointFactory, activationSpec);
206         assertEquals(1, resourceAdapter.endpoints.size());
207 
208         // Additional activation with new DefaultEndpointFactory instance increments size of
209         // endpoint cahce
210         resourceAdapter.endpointActivation(new MockEndpointFactory(), activationSpec);
211         assertEquals(2, resourceAdapter.endpoints.size());
212 
213     }
214 
215     @Test
216     public void testendpointActivationIncorrectActivationSpec()
217     {
218         try
219         {
220             ActivationSpec activationSpec = new MockActivationSpec();
221             activationSpec.setResourceAdapter(resourceAdapter);
222             resourceAdapter.endpointActivation(new MockEndpointFactory(), activationSpec);
223             fail("Exception expected: Invalid ActivationSpec type");
224         }
225         catch (ResourceException e)
226         {
227             // expected
228         }
229         assertEquals(0, resourceAdapter.endpoints.size());
230     }
231 
232     @Test
233     public void testendpointDeactivationOK() throws ResourceException
234     {
235         MuleActivationSpec activationSpec = new MuleActivationSpec();
236         activationSpec.setResourceAdapter(resourceAdapter);
237         activationSpec.setModelName("jcaModel");
238         activationSpec.setEndpoint("test://test");
239         MessageEndpointFactory endpointFactory = new MockEndpointFactory();
240         assertEquals(0, resourceAdapter.endpoints.size());
241         resourceAdapter.endpointActivation(endpointFactory, activationSpec);
242         assertEquals(1, resourceAdapter.endpoints.size());
243         resourceAdapter.endpointDeactivation(endpointFactory, activationSpec);
244         assertEquals(0, resourceAdapter.endpoints.size());
245     }
246 
247     protected void testEndpoint(Service service)
248     {
249         ServiceCompositeMessageSource inboundRouterCollection = (ServiceCompositeMessageSource) service.getMessageSource();
250         ImmutableEndpoint endpoint = inboundRouterCollection.getEndpoints().get(0);
251         assertEndpointAttributes(endpoint);
252     }
253 
254     protected void assertEndpointAttributes(ImmutableEndpoint endpoint)
255     {
256         assertNotNull(endpoint);
257         assertNotNull(endpoint.getConnector());
258         assertEquals("testEndpoint", endpoint.getEndpointURI().getAddress());
259         assertEquals(MessageExchangePattern.ONE_WAY, endpoint.getExchangePattern());
260     }
261 
262     protected void testJcaService(Service service)
263     {
264         // Check for a single inbound router, no outbound routers and no nested
265         // routers
266         assertNotNull(service);
267 
268         assertNotNull(service.getMessageSource());
269 
270         // InboundPassThroughRouter is now set in runtime rather than in service creation as in 1.4.x
271         // assertEquals(1, service.getInboundRouter().getRouters().size());
272         assertEquals(0, ((ServiceCompositeMessageSource) service.getMessageSource()).getMessageProcessors().size());
273     }
274 
275 }
276 
277 class MockEndpointFactory implements MessageEndpointFactory
278 {
279 
280     public MessageEndpoint createEndpoint(XAResource arg0) throws UnavailableException
281     {
282         return null;
283     }
284 
285     public boolean isDeliveryTransacted(Method arg0) throws NoSuchMethodException
286     {
287         return false;
288     }
289 }
290 
291 class MockActivationSpec implements ActivationSpec
292 {
293 
294     public void validate() throws InvalidPropertyException
295     {
296         // do nothing
297     }
298 
299     public ResourceAdapter getResourceAdapter()
300     {
301         return null;
302     }
303 
304     public void setResourceAdapter(ResourceAdapter arg0) throws ResourceException
305     {
306         // do nothing
307     }
308 }
309 
310 class MockBoostrapContext implements BootstrapContext
311 {
312 
313     public Timer createTimer() throws UnavailableException
314     {
315         return null;
316     }
317 
318     public WorkManager getWorkManager()
319     {
320         return new TestJCAWorkManager();
321     }
322 
323     public XATerminator getXATerminator()
324     {
325         return null;
326     }
327 }