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