package com.mossle.core.subscribe;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.jms.ConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.jms.listener.adapter.MessageListenerAdapter;
public class SubscribeProcessor implements ApplicationContextAware {
private static Logger logger = LoggerFactory
.getLogger(SubscribeProcessor.class);
private ApplicationContext applicationContext;
private ConnectionFactory connectionFactory;
private List<DefaultMessageListenerContainer> defaultMessageListenerContainers = new ArrayList<DefaultMessageListenerContainer>();
private Map<String, CompositeSubscriber> compositeMap = new HashMap<String, CompositeSubscriber>();
private Properties properties;
private boolean enabled = true;
private String prefix = "subscribe.";
@PostConstruct
public void afterPropertiesSet() throws Exception {
if (!enabled) {
return;
}
this.buildComposite();
for (DefaultMessageListenerContainer defaultMessageListenerContainer : defaultMessageListenerContainers) {
defaultMessageListenerContainer.afterPropertiesSet();
defaultMessageListenerContainer.start();
}
}
@PreDestroy
public void destroy() {
for (DefaultMessageListenerContainer defaultMessageListenerContainer : defaultMessageListenerContainers) {
defaultMessageListenerContainer.destroy();
}
}
public void buildComposite() throws Exception {
if (properties == null) {
return;
}
Map<String, String> map = new HashMap<String, String>();
for (Map.Entry<Object, Object> entry : properties.entrySet()) {
String key = (String) entry.getKey();
String value = (String) entry.getValue();
if ("subscribe.enabled".equals(key)) {
continue;
}
if (key.startsWith(prefix)) {
String name = key.substring(prefix.length());
map.put(name, value);
logger.debug("{} : {}", name, map.get(name));
}
}
for (Map.Entry<String, String> entry : map.entrySet()) {
String subscribeClassName = entry.getKey();
String subscribeName = entry.getValue();
Subscribable subscribable = (Subscribable) applicationContext
.getBean(Class.forName(subscribeClassName));
logger.info("subscribable : " + subscribable);
CompositeSubscriber compositeSubscriber = compositeMap
.get(subscribeName);
if (compositeSubscriber == null) {
compositeSubscriber = new CompositeSubscriber();
compositeMap.put(subscribeName, compositeSubscriber);
}
compositeSubscriber.addSubscribable(subscribable);
DefaultMessageListenerContainer defaultMessageListenerContainer = new DefaultMessageListenerContainer();
defaultMessageListenerContainers
.add(defaultMessageListenerContainer);
defaultMessageListenerContainer.setPubSubDomain(subscribable
.isTopic());
defaultMessageListenerContainer
.setConnectionFactory(connectionFactory);
defaultMessageListenerContainer.setDestinationName(subscribable
.getName());
MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter();
messageListenerAdapter.setDelegate(compositeSubscriber);
defaultMessageListenerContainer
.setMessageListener(messageListenerAdapter);
// defaultMessageListenerContainer.afterPropertiesSet();
// defaultMessageListenerContainer.start();
}
}
public void setConnectionFactory(ConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public static class CompositeSubscriber {
private List<Subscribable> subscribables = new ArrayList<Subscribable>();
public void handleMessage(String text) {
for (Subscribable subscribable : subscribables) {
subscribable.handleMessage(text);
}
}
public void addSubscribable(Subscribable subscribable) {
subscribables.add(subscribable);
}
}
}