/** * */ package vnet.sms.gateway.nettysupport.publish.outgoing.spring; import static org.apache.commons.lang.Validate.notNull; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.jboss.netty.channel.group.ChannelGroup; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Required; import vnet.sms.gateway.nettysupport.publish.outgoing.DefaultOutgoingMessagesSender; import vnet.sms.gateway.nettysupport.publish.outgoing.OutgoingMessagesSender; /** * @author obergner * */ public class OutgoingMessagesSenderFactory<ID extends Serializable> implements FactoryBean<OutgoingMessagesSender<ID>>, DisposableBean, InitializingBean { // ------------------------------------------------------------------------ // Instance // ------------------------------------------------------------------------ private ChannelGroup allConnectedChannels; private final List<OutgoingMessagesSender.Listener> listeners = new ArrayList<OutgoingMessagesSender.Listener>(); private OutgoingMessagesSender<ID> product; // ------------------------------------------------------------------------ // Properties // ------------------------------------------------------------------------ /** * @param allConnectedChannels * the allConnectedChannels to set */ @Required public final void setAllConnectedChannels( final ChannelGroup allConnectedChannels) { notNull(allConnectedChannels, "Argument 'allConnectedChannels' must not be null"); this.allConnectedChannels = allConnectedChannels; } /** * @param listeners * the listeners to set */ public final void setListeners( final List<OutgoingMessagesSender.Listener> listeners) { notNull(listeners, "Argument 'listeners' must not be null"); this.listeners.clear(); this.listeners.addAll(listeners); } // ------------------------------------------------------------------------ // InitializingBean // ------------------------------------------------------------------------ /** * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() */ @Override public void afterPropertiesSet() throws Exception { checkState(); final OutgoingMessagesSender<ID> sender = new DefaultOutgoingMessagesSender<ID>( this.allConnectedChannels); for (final OutgoingMessagesSender.Listener listener : this.listeners) { sender.addListener(listener); } this.product = sender; } private void checkState() throws IllegalStateException { if (this.product != null) { throw new IllegalStateException( "Illegal attempt to build OutgoingMessagesSender more than once"); } if (this.allConnectedChannels == null) { throw new IllegalStateException("No ChannelGroup has been set"); } } // ------------------------------------------------------------------------ // FactoryBean // ------------------------------------------------------------------------ /** * @see org.springframework.beans.factory.FactoryBean#getObject() */ @Override public OutgoingMessagesSender<ID> getObject() throws Exception { if (this.product == null) { throw new IllegalStateException( "No OutgoingMessagesSender has been built yet - did you remember to call afterPropertiesSet() when using this factory outside Spring?"); } return this.product; } /** * @see org.springframework.beans.factory.FactoryBean#getObjectType() */ @Override public Class<?> getObjectType() { return this.product != null ? this.product.getClass() : OutgoingMessagesSender.class; } /** * @see org.springframework.beans.factory.FactoryBean#isSingleton() */ @Override public boolean isSingleton() { return true; } // ------------------------------------------------------------------------ // DisposableBean // ------------------------------------------------------------------------ /** * @see org.springframework.beans.factory.DisposableBean#destroy() */ @Override public void destroy() throws Exception { if (this.product == null) { throw new IllegalStateException( "No OutgoingMessagesSender has been built yet - did you remember to call afterPropertiesSet() when using this factory outside Spring?"); } this.product.close(); } }