1   /*
2    * $Id: LoanBrokerEsbConfigurationBuilder.java 11569 2008-04-11 13:31:43Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.example.loanbroker.esb;
12  
13  import org.mule.api.MuleContext;
14  import org.mule.api.config.ConfigurationBuilder;
15  import org.mule.api.endpoint.EndpointBuilder;
16  import org.mule.api.model.Model;
17  import org.mule.api.registry.Registry;
18  import org.mule.api.routing.InboundRouterCollection;
19  import org.mule.api.routing.OutboundRouterCollection;
20  import org.mule.api.routing.ResponseRouterCollection;
21  import org.mule.api.service.Service;
22  import org.mule.api.transformer.Transformer;
23  import org.mule.component.PooledJavaComponent;
24  import org.mule.component.builder.ReflectionMessageBuilder;
25  import org.mule.config.builders.AbstractConfigurationBuilder;
26  import org.mule.config.builders.DefaultsConfigurationBuilder;
27  import org.mule.endpoint.EndpointURIEndpointBuilder;
28  import org.mule.endpoint.URIBuilder;
29  import org.mule.example.loanbroker.AsynchronousLoanBroker;
30  import org.mule.example.loanbroker.bank.Bank;
31  import org.mule.example.loanbroker.lender.DefaultLender;
32  import org.mule.example.loanbroker.routers.BankQuotesResponseAggregator;
33  import org.mule.example.loanbroker.transformers.CreditProfileXmlToCreditProfile;
34  import org.mule.example.loanbroker.transformers.LoanQuoteRequestToCreditProfileArgs;
35  import org.mule.example.loanbroker.transformers.RestRequestToCustomerRequest;
36  import org.mule.example.loanbroker.transformers.SetLendersAsRecipients;
37  import org.mule.model.seda.SedaModel;
38  import org.mule.model.seda.SedaService;
39  import org.mule.object.PrototypeObjectFactory;
40  import org.mule.routing.filters.MessagePropertyFilter;
41  import org.mule.routing.inbound.DefaultInboundRouterCollection;
42  import org.mule.routing.outbound.DefaultOutboundRouterCollection;
43  import org.mule.routing.outbound.FilteringOutboundRouter;
44  import org.mule.routing.outbound.OutboundPassThroughRouter;
45  import org.mule.routing.outbound.StaticRecipientList;
46  import org.mule.routing.response.DefaultResponseRouterCollection;
47  import org.mule.transport.ejb.EjbConnector;
48  import org.mule.transport.jms.activemq.ActiveMQJmsConnector;
49  import org.mule.transport.jms.transformers.ObjectToJMSMessage;
50  
51  import java.util.ArrayList;
52  import java.util.HashMap;
53  import java.util.List;
54  import java.util.Map;
55  
56  public class LoanBrokerEsbConfigurationBuilder extends AbstractConfigurationBuilder implements ConfigurationBuilder
57  {
58  
59      @Override
60      protected void doConfigure(MuleContext muleContext) throws Exception
61      {
62          // Set defaults
63          new DefaultsConfigurationBuilder().configure(muleContext);
64  
65          Registry registry = muleContext.getRegistry();
66  
67          // Connectors
68          EjbConnector ejbConnector = new EjbConnector();
69          ejbConnector.setName("ejbConnector");
70          ejbConnector.setSecurityPolicy("security.policy");
71          ejbConnector.setJndiInitialFactory("org.openejb.client.LocalInitialContextFactory");
72          Map<String, String> jndiProviderProperties = new HashMap<String, String>();
73          jndiProviderProperties.put("openejb.base", "${openejb.base}");
74          jndiProviderProperties.put("openejb.configuration", "${openejb.configuration}");
75          jndiProviderProperties.put("logging.conf", "${logging.conf}");
76          jndiProviderProperties.put("openejb.nobanner", "${openejb.nobanner}");
77          ejbConnector.setJndiProviderProperties(jndiProviderProperties);
78  
79          ActiveMQJmsConnector activeMQJmsConnector = new ActiveMQJmsConnector();
80          activeMQJmsConnector.setName("activeMQJmsConnector");
81          registry.registerConnector(activeMQJmsConnector);
82  
83          // Global Transformers
84          Transformer RestRequestToCustomerRequest = new RestRequestToCustomerRequest();
85          RestRequestToCustomerRequest.setName("RestRequestToCustomerRequest");
86          registry.registerTransformer(RestRequestToCustomerRequest);
87          Transformer LoanQuoteRequestToCreditProfileArgs = new LoanQuoteRequestToCreditProfileArgs();
88          registry.registerTransformer(LoanQuoteRequestToCreditProfileArgs);
89          Transformer CreditProfileXmlToCreditProfile = new CreditProfileXmlToCreditProfile();
90          registry.registerTransformer(CreditProfileXmlToCreditProfile);
91          Transformer SetLendersAsRecipients = new SetLendersAsRecipients();
92          registry.registerTransformer(SetLendersAsRecipients);
93          Transformer ObjectToJMSMessage = new ObjectToJMSMessage();
94          registry.registerTransformer(ObjectToJMSMessage);
95  
96          // Global Endpoints
97          EndpointBuilder CustomerRequestsREST = new EndpointURIEndpointBuilder(new URIBuilder(
98              "jetty:rest://localhost:8888/loanbroker"), muleContext);
99          registry.registerEndpointBuilder("CustomerRequestsREST", CustomerRequestsREST);
100         EndpointBuilder CustomerRequests = new EndpointURIEndpointBuilder(new URIBuilder("vm://customer.requests"),
101             muleContext);
102         registry.registerEndpointBuilder("CustomerRequests", CustomerRequests);
103         EndpointBuilder LoanQuotes = new EndpointURIEndpointBuilder(new URIBuilder("axis:http://localhost:10080/mule"),
104             muleContext);
105         registry.registerEndpointBuilder("LoanQuotes", LoanQuotes);
106         EndpointBuilder CustomerResponses = LoanQuotes;
107         registry.registerEndpointBuilder("CustomerResponses", CustomerResponses);
108         EndpointBuilder CreditAgencyGateway = new EndpointURIEndpointBuilder(new URIBuilder("jms://esb.credit.agency"),
109             muleContext);
110         registry.registerEndpointBuilder("CreditAgencyGateway", CreditAgencyGateway);
111         EndpointBuilder CreditAgency = new EndpointURIEndpointBuilder(new URIBuilder(
112             "ejb://localhost:1099/local/CreditAgency?method=getCreditProfile"), muleContext);
113         registry.registerEndpointBuilder("CreditAgency", CreditAgency);
114         EndpointBuilder LenderGateway = new EndpointURIEndpointBuilder(new URIBuilder("jms://esb.lender.service"),
115             muleContext);
116         registry.registerEndpointBuilder("LenderGateway", LenderGateway);
117         EndpointBuilder LenderService = new EndpointURIEndpointBuilder(new URIBuilder("vm://lender.service"),
118             muleContext);
119         registry.registerEndpointBuilder("LenderService", LenderService);
120         EndpointBuilder BankingGateway = new EndpointURIEndpointBuilder(new URIBuilder("jms://esb.banks"), muleContext);
121 
122         EndpointBuilder bank1 = new EndpointURIEndpointBuilder(new URIBuilder(
123             "axis:http://localhost:10080/mule/TheBank1?method=getLoanQuote"), muleContext);
124         registry.registerEndpointBuilder("bank1", bank1);
125         EndpointBuilder bank2 = new EndpointURIEndpointBuilder(new URIBuilder(
126             "axis:http://localhost:20080/mule/TheBank2?method=getLoanQuote"), muleContext);
127         registry.registerEndpointBuilder("bank2", bank2);
128         EndpointBuilder bank3 = new EndpointURIEndpointBuilder(new URIBuilder(
129             "axis:http://localhost:30080/mule/TheBank3?method=getLoanQuote"), muleContext);
130         registry.registerEndpointBuilder("bank3", bank3);
131         EndpointBuilder bank4 = new EndpointURIEndpointBuilder(new URIBuilder(
132             "axis:http://localhost:40080/mule/TheBank4?method=getLoanQuote"), muleContext);
133         registry.registerEndpointBuilder("bank4", bank4);
134 
135         EndpointBuilder bank1In = new EndpointURIEndpointBuilder(new URIBuilder("axis:http://localhost:10080/mule"),
136             muleContext);
137         registry.registerEndpointBuilder("bank1In", bank1In);
138         EndpointBuilder bank2In = new EndpointURIEndpointBuilder(new URIBuilder("axis:http://localhost:20080/mule"),
139             muleContext);
140         registry.registerEndpointBuilder("bank2In", bank2In);
141         EndpointBuilder bank3In = new EndpointURIEndpointBuilder(new URIBuilder("axis:http://localhost:30080/mule"),
142             muleContext);
143         registry.registerEndpointBuilder("bank3In", bank3In);
144         EndpointBuilder bank4In = new EndpointURIEndpointBuilder(new URIBuilder("axis:http://localhost:40080/mule"),
145             muleContext);
146         registry.registerEndpointBuilder("bank4In", bank4In);
147 
148         // Model
149         Model model = new SedaModel();
150         model.setName("model");
151         registry.registerModel(model);
152 
153         // LoanBroker Service
154         Service loanBrokerService = new SedaService();
155         loanBrokerService.setName("LoanBroker");
156         loanBrokerService.setModel(model);
157         loanBrokerService.setComponent(new PooledJavaComponent(new PrototypeObjectFactory(AsynchronousLoanBroker.class)));
158         // in
159         InboundRouterCollection loanBrokerServiceInbound = new DefaultInboundRouterCollection();
160         loanBrokerServiceInbound.addEndpoint(CustomerRequestsREST.buildInboundEndpoint());
161         EndpointBuilder eb = (EndpointBuilder) CustomerRequests.clone();
162         eb.addTransformer(RestRequestToCustomerRequest);
163         loanBrokerServiceInbound.addEndpoint(eb.buildInboundEndpoint());
164         loanBrokerService.setInboundRouter(loanBrokerServiceInbound);
165         // out
166         OutboundRouterCollection loanBrokerServiceOutbound = new DefaultOutboundRouterCollection();
167         OutboundPassThroughRouter outboundPassThroughRouter = new OutboundPassThroughRouter();
168         outboundPassThroughRouter.addEndpoint(CreditAgency.buildOutboundEndpoint());
169         loanBrokerServiceOutbound.addRouter(outboundPassThroughRouter);
170         loanBrokerService.setOutboundRouter(loanBrokerServiceOutbound);
171         // reply
172         ResponseRouterCollection responseRouterCollection = new DefaultResponseRouterCollection();
173         responseRouterCollection.addEndpoint(LoanQuotes.buildInboundEndpoint());
174         responseRouterCollection.addRouter(new BankQuotesResponseAggregator());
175         loanBrokerService.setResponseRouter(responseRouterCollection);
176 
177         registry.registerService(loanBrokerService);
178 
179         // CreditAgencyGatewayService Service
180         Service creditAgencyGatewayService = new SedaService();
181         creditAgencyGatewayService.setName("CreditAgencyGatewayService");
182         creditAgencyGatewayService.setModel(model);
183         creditAgencyGatewayService.setComponent(new PooledJavaComponent(new PrototypeObjectFactory(ReflectionMessageBuilder.class)));
184         // in
185         InboundRouterCollection creditAgencyGatewayServiceInbound = new DefaultInboundRouterCollection();
186         creditAgencyGatewayServiceInbound.addEndpoint(CreditAgencyGateway.buildInboundEndpoint());
187         creditAgencyGatewayService.setInboundRouter(creditAgencyGatewayServiceInbound);
188         // out
189         OutboundRouterCollection creditAgencyGatewayServiceOutbound = new DefaultOutboundRouterCollection();
190         FilteringOutboundRouter creditAgencyGatewayServiceOutboundRouter = new FilteringOutboundRouter();
191         EndpointBuilder eb2 = (EndpointBuilder) CreditAgency.clone();
192         eb2.addTransformer(LoanQuoteRequestToCreditProfileArgs);
193         eb2.setRemoteSync(true);
194         List<Transformer> responseTransformers = new ArrayList<Transformer>();
195         responseTransformers.add(CreditProfileXmlToCreditProfile);
196         eb2.setResponseTransformers(responseTransformers);
197         creditAgencyGatewayServiceOutboundRouter.addEndpoint(eb2.buildOutboundEndpoint());
198         creditAgencyGatewayServiceOutboundRouter.addEndpoint(LenderGateway.buildOutboundEndpoint());
199         creditAgencyGatewayServiceOutbound.addRouter(creditAgencyGatewayServiceOutboundRouter);
200         creditAgencyGatewayService.setOutboundRouter(creditAgencyGatewayServiceOutbound);
201 
202         registry.registerService(creditAgencyGatewayService);
203 
204         // LenderGatewayService Service
205         Service lenderGatewayService = new SedaService();
206         lenderGatewayService.setName("CreditAgencyGatewayService");
207         lenderGatewayService.setModel(model);
208         // in
209         InboundRouterCollection lenderGatewayServiceInbound = new DefaultInboundRouterCollection();
210         lenderGatewayServiceInbound.addEndpoint(LenderGateway.buildInboundEndpoint());
211         lenderGatewayService.setInboundRouter(lenderGatewayServiceInbound);
212         // out
213         OutboundRouterCollection lenderGatewayServiceInboundOutbound = new DefaultOutboundRouterCollection();
214         FilteringOutboundRouter lenderGatewayServiceInboundOutboundRouter = new FilteringOutboundRouter();
215         EndpointBuilder eb3 = (EndpointBuilder) LenderService.clone();
216         eb3.setRemoteSync(true);
217         lenderGatewayServiceInboundOutboundRouter.addEndpoint(eb3.buildOutboundEndpoint());
218         EndpointBuilder eb4 = (EndpointBuilder) BankingGateway.clone();
219         eb4.addTransformer(SetLendersAsRecipients);
220         eb4.addTransformer(ObjectToJMSMessage);
221         lenderGatewayServiceInboundOutboundRouter.addEndpoint(eb4.buildOutboundEndpoint());
222         lenderGatewayServiceInboundOutbound.addRouter(lenderGatewayServiceInboundOutboundRouter);
223         lenderGatewayService.setOutboundRouter(lenderGatewayServiceInboundOutbound);
224 
225         registry.registerService(lenderGatewayService);
226 
227         // LenderServiceService Service
228         Service lenderServiceService = new SedaService();
229         lenderServiceService.setName("LenderServiceService");
230         lenderServiceService.setModel(model);
231         lenderGatewayService.setComponent(new PooledJavaComponent(new PrototypeObjectFactory(DefaultLender.class)));
232         // in
233         InboundRouterCollection lenderServiceServiceInbound = new DefaultInboundRouterCollection();
234         lenderServiceServiceInbound.addEndpoint(LenderService.buildInboundEndpoint());
235         lenderServiceService.setInboundRouter(lenderServiceServiceInbound);
236 
237         registry.registerService(lenderGatewayService);
238 
239         // BankingGatewayService Service
240         Service bankingGatewayService = new SedaService();
241         bankingGatewayService.setName("BankingGatewayService");
242         bankingGatewayService.setModel(model);
243         // in
244         InboundRouterCollection bankingGatewayServiceInbound = new DefaultInboundRouterCollection();
245         bankingGatewayServiceInbound.addEndpoint(BankingGateway.buildInboundEndpoint());
246         bankingGatewayService.setInboundRouter(bankingGatewayServiceInbound);
247         // out
248         OutboundRouterCollection bankingGatewayServiceOutbound = new DefaultOutboundRouterCollection();
249         StaticRecipientList staticRecipientList = new StaticRecipientList();
250         staticRecipientList.setReplyTo("LoanQuotes");
251         staticRecipientList.setFilter(new MessagePropertyFilter("recipients!=null"));
252 
253         registry.registerService(lenderGatewayService);
254 
255         // Bank 1 Service
256         Service bank1Service = new SedaService();
257         bank1Service.setName("TheBank1");
258         bank1Service.setModel(model);
259         bank1Service.setComponent(new PooledJavaComponent(new PrototypeObjectFactory(Bank.class)));
260         InboundRouterCollection bank1ServiceInbound = new DefaultInboundRouterCollection();
261         bank1ServiceInbound.addEndpoint(bank1In.buildInboundEndpoint());
262         bank1Service.setInboundRouter(bank1ServiceInbound);
263         registry.registerService(bank1Service);
264 
265         // Bank 2 Service
266         Service bank2Service = new SedaService();
267         bank2Service.setName("TheBank2");
268         bank2Service.setModel(model);
269         bank2Service.setComponent(new PooledJavaComponent(new PrototypeObjectFactory(Bank.class)));
270         InboundRouterCollection bank2ServiceInbound = new DefaultInboundRouterCollection();
271         bank2ServiceInbound.addEndpoint(bank2In.buildInboundEndpoint());
272         bank2Service.setInboundRouter(bank2ServiceInbound);
273         registry.registerService(bank2Service);
274 
275         // Bank 3 Service
276         Service bank3Service = new SedaService();
277         bank3Service.setName("TheBank3");
278         bank3Service.setModel(model);
279         bank3Service.setComponent(new PooledJavaComponent(new PrototypeObjectFactory(Bank.class)));
280         InboundRouterCollection bank3ServiceInbound = new DefaultInboundRouterCollection();
281         bank3ServiceInbound.addEndpoint(bank3In.buildInboundEndpoint());
282         bank3Service.setInboundRouter(bank3ServiceInbound);
283         registry.registerService(bank3Service);
284 
285         // Bank 4 Service
286         Service bank4Service = new SedaService();
287         bank4Service.setName("TheBank4");
288         bank4Service.setModel(model);
289         bank4Service.setComponent(new PooledJavaComponent(new PrototypeObjectFactory(Bank.class)));
290         InboundRouterCollection bank4ServiceInbound = new DefaultInboundRouterCollection();
291         bank4ServiceInbound.addEndpoint(bank4In.buildInboundEndpoint());
292         bank4Service.setInboundRouter(bank4ServiceInbound);
293         registry.registerService(bank4Service);
294 
295     }
296 }