From 62012ac6bf156e9a1bc2c405d4327a500793596e Mon Sep 17 00:00:00 2001 From: Josh Long Date: Thu, 13 Sep 2012 13:56:29 +0200 Subject: [PATCH] updated the web app to support profiles, as well. --- .../GoogleFinanceStockSymbolLookupClient.java | 1 + .../stocks/MockStockSymbolLookupClient.java | 8 +-- .../client/ClientConfiguration.java | 54 ++++++++++--------- ...StockWebApplicationContextInitializer.java | 45 ++++++++++++++++ .../src/main/webapp/WEB-INF/web.xml | 4 ++ 5 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 cf-workers-integration-webclient/src/main/java/org/cloudfoundry/workers/stocks/web/StockWebApplicationContextInitializer.java diff --git a/cf-workers-core/src/main/java/org/cloudfoundry/workers/stocks/GoogleFinanceStockSymbolLookupClient.java b/cf-workers-core/src/main/java/org/cloudfoundry/workers/stocks/GoogleFinanceStockSymbolLookupClient.java index 56874c6..62bd0ff 100644 --- a/cf-workers-core/src/main/java/org/cloudfoundry/workers/stocks/GoogleFinanceStockSymbolLookupClient.java +++ b/cf-workers-core/src/main/java/org/cloudfoundry/workers/stocks/GoogleFinanceStockSymbolLookupClient.java @@ -53,6 +53,7 @@ public StockSymbolLookup lookupSymbol(String symbol) throws Throwable { JsonNode node = new ObjectMapper().readTree(response); return convertJsonNodeInToSymbolLookup(node); } + private StockSymbolLookup convertJsonNodeInToSymbolLookup(JsonNode jsonNode) throws Throwable { Number id = jsonNode.get("id").getValueAsLong(); Double changeWhileOpen = jsonNode.get("c").getValueAsDouble(); diff --git a/cf-workers-core/src/main/java/org/cloudfoundry/workers/stocks/MockStockSymbolLookupClient.java b/cf-workers-core/src/main/java/org/cloudfoundry/workers/stocks/MockStockSymbolLookupClient.java index 5ae5327..9112e73 100644 --- a/cf-workers-core/src/main/java/org/cloudfoundry/workers/stocks/MockStockSymbolLookupClient.java +++ b/cf-workers-core/src/main/java/org/cloudfoundry/workers/stocks/MockStockSymbolLookupClient.java @@ -34,13 +34,9 @@ private Long randomLong() { return new Random().nextLong(); } - private StockSymbolLookup fabricateForSymbol(String ticker, String exchange) { - return new StockSymbolLookup(randomLong(), randomDouble(), ticker, - StringUtils.hasText(exchange) ? exchange : "NYSE", randomDouble(), randomDouble(), randomDouble()); - } - @Override public StockSymbolLookup lookupSymbol(String symbol) throws Throwable { - return fabricateForSymbol(symbol, null); + return new StockSymbolLookup(randomLong(), randomDouble(), symbol, + StringUtils.hasText(null) ? null : "NYSE", randomDouble(), randomDouble(), randomDouble()); } } diff --git a/cf-workers-integration-webclient/src/main/java/org/cloudfoundry/workers/stocks/integration/client/ClientConfiguration.java b/cf-workers-integration-webclient/src/main/java/org/cloudfoundry/workers/stocks/integration/client/ClientConfiguration.java index 0a45f64..cf61628 100644 --- a/cf-workers-integration-webclient/src/main/java/org/cloudfoundry/workers/stocks/integration/client/ClientConfiguration.java +++ b/cf-workers-integration-webclient/src/main/java/org/cloudfoundry/workers/stocks/integration/client/ClientConfiguration.java @@ -24,6 +24,7 @@ import org.cloudfoundry.runtime.service.messaging.RabbitServiceCreator; import org.cloudfoundry.workers.common.config.CloudRabbitConnectionFactoryConfiguration; import org.cloudfoundry.workers.common.config.LocalRabbitConnectionFactoryConfiguration; +import org.cloudfoundry.workers.common.config.RabbitConnectionFactoryConfiguration; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; @@ -45,6 +46,8 @@ import org.springframework.integration.annotation.ServiceActivator; import org.springframework.util.Assert; +import javax.inject.Inject; + /** * Configures the service's gateway client which in turn communicates with the * remote service through a Spring Integration gateway implementation. @@ -58,39 +61,42 @@ public class ClientConfiguration { private String tickers = "tickers"; - @Autowired + @Inject + private RabbitConnectionFactoryConfiguration rabbitConnectionFactoryConfiguration ; + + @Inject private Environment environment; @Bean - public RabbitTemplate amqpTemplate() { - RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory()); + public RabbitTemplate amqpTemplate() throws Throwable { + RabbitTemplate rabbitTemplate = new RabbitTemplate( rabbitConnectionFactoryConfiguration.connectionFactory()); rabbitTemplate.setMessageConverter(mc()); return rabbitTemplate; } @Bean - public RabbitTransactionManager amqpTransactionManager() { - return new RabbitTransactionManager(this.connectionFactory()); + public RabbitTransactionManager amqpTransactionManager() throws Throwable { + return new RabbitTransactionManager(rabbitConnectionFactoryConfiguration.connectionFactory()); } @Bean public MessageConverter mc() { return new JsonMessageConverter(); } - - @Bean - public ConnectionFactory connectionFactory() { - - CloudEnvironment cloudEnvironment = this.cloudEnvironment(); - Collection rabbitServiceInfoList = cloudEnvironment - .getServiceInfos(RabbitServiceInfo.class); - Assert.isTrue(rabbitServiceInfoList.size() > 0, - "the rabbitService infos collection should be > 0"); - RabbitServiceInfo rabbitServiceInfo = rabbitServiceInfoList.iterator() - .next(); - RabbitServiceCreator rabbitServiceCreator = new RabbitServiceCreator(); - return rabbitServiceCreator.createService(rabbitServiceInfo); - } +// +// @Bean +// public ConnectionFactory connectionFactory() { +// +// CloudEnvironment cloudEnvironment = this.cloudEnvironment(); +// Collection rabbitServiceInfoList = cloudEnvironment +// .getServiceInfos(RabbitServiceInfo.class); +// Assert.isTrue(rabbitServiceInfoList.size() > 0, +// "the rabbitService infos collection should be > 0"); +// RabbitServiceInfo rabbitServiceInfo = rabbitServiceInfoList.iterator() +// .next(); +// RabbitServiceCreator rabbitServiceCreator = new RabbitServiceCreator(); +// return rabbitServiceCreator.createService(rabbitServiceInfo); +// } @Bean public CloudEnvironment cloudEnvironment() { @@ -98,26 +104,26 @@ public CloudEnvironment cloudEnvironment() { } @Bean - public AmqpAdmin amqpAdmin() { - return new RabbitAdmin(this.connectionFactory()); + public AmqpAdmin amqpAdmin() throws Throwable { + return new RabbitAdmin( rabbitConnectionFactoryConfiguration.connectionFactory()); } @Bean - public Queue customerQueue() { + public Queue customerQueue() throws Throwable { Queue q = new Queue(this.tickers); amqpAdmin().declareQueue(q); return q; } @Bean - public DirectExchange customerExchange() { + public DirectExchange customerExchange() throws Throwable { DirectExchange directExchange = new DirectExchange(tickers); this.amqpAdmin().declareExchange(directExchange); return directExchange; } @Bean - public Binding marketDataBinding() { + public Binding marketDataBinding() throws Throwable { return BindingBuilder.bind(customerQueue()).to(customerExchange()) .with(this.tickers); } diff --git a/cf-workers-integration-webclient/src/main/java/org/cloudfoundry/workers/stocks/web/StockWebApplicationContextInitializer.java b/cf-workers-integration-webclient/src/main/java/org/cloudfoundry/workers/stocks/web/StockWebApplicationContextInitializer.java new file mode 100644 index 0000000..6e15d8b --- /dev/null +++ b/cf-workers-integration-webclient/src/main/java/org/cloudfoundry/workers/stocks/web/StockWebApplicationContextInitializer.java @@ -0,0 +1,45 @@ +package org.cloudfoundry.workers.stocks.web; + +import org.cloudfoundry.runtime.env.CloudEnvironment; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +/** + * this class is called before the DispatcherServlet machinery is created, + * and gives us a chance to influence the {@link org.springframework.context.ApplicationContext} + * profiles. + * + * @author Josh Long + */ +public class StockWebApplicationContextInitializer implements ApplicationContextInitializer { + + private CloudEnvironment cloudEnvironment = new CloudEnvironment(); + + private boolean isCloudFoundry() { + return cloudEnvironment.isCloudFoundry(); + } + + @Override + public void initialize(AnnotationConfigWebApplicationContext applicationContext) { + + + String profile; + if (isCloudFoundry()) { + profile = "cloud"; + } else { + profile = "local"; + } + + applicationContext.getEnvironment().setActiveProfiles(profile); + + + Class[] configs = {WebMvcConfiguration.class}; + String[] basePkgs = new String[configs.length]; + int i = 0; + for (Class pkg : configs) + basePkgs[i++] = pkg.getPackage().getName(); + + applicationContext.scan(basePkgs); + applicationContext.refresh(); + } +} diff --git a/cf-workers-integration-webclient/src/main/webapp/WEB-INF/web.xml b/cf-workers-integration-webclient/src/main/webapp/WEB-INF/web.xml index 3a5b7e9..cf6ecd4 100644 --- a/cf-workers-integration-webclient/src/main/webapp/WEB-INF/web.xml +++ b/cf-workers-integration-webclient/src/main/webapp/WEB-INF/web.xml @@ -18,6 +18,10 @@ appServlet org.springframework.web.servlet.DispatcherServlet + + contextInitializerClasses + org.cloudfoundry.workers.stocks.web.StockWebApplicationContextInitializer + contextClass org.springframework.web.context.support.AnnotationConfigWebApplicationContext