/*
* JBoss, Home of Professional Open Source.
* Copyright 2010, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.demo.push;
import static org.richfaces.application.configuration.ConfigurationServiceHelper.getBooleanConfigurationValue;
import static org.richfaces.demo.push.JMSMessageProducer.PUSH_JMS_TOPIC;
import static org.richfaces.demo.push.PushCdiBean.PUSH_CDI_TOPIC;
import static org.richfaces.demo.push.TopicsContextMessageProducer.PUSH_TOPICS_CONTEXT_TOPIC;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import org.richfaces.application.CoreConfiguration;
import org.richfaces.demo.push.provider.AS6MessagingProviderManagement;
import org.richfaces.demo.push.provider.AS7MessagingProviderManagement;
import org.richfaces.demo.push.provider.CustomMessagingServerManagement;
import org.richfaces.demo.push.provider.InitializationFailedException;
import org.richfaces.demo.push.provider.MessagingProviderManagement;
/**
* Initializes JMS server and creates requested topics.
*
* @author <a href="http://community.jboss.org/people/lfryc">Lukas Fryc</a>
*/
public class JMSInitializer extends AbstractCapabilityInitializer {
private static final Logger LOGGER = Logger.getLogger(JMSInitializer.class.getName());
private static final AtomicReference<Boolean> JMS_ENABLED = new AtomicReference<Boolean>(null);
private MessagingProviderManagement provider;
/*
* (non-Javadoc)
*
* @see org.richfaces.demo.push.Initializer#initialize()
*/
public void initializeCapability() throws Exception {
initializeJMS();
}
@Override
public boolean isCapabilityEnabled() {
return isJmsEnabled();
}
private void initializeJMS() throws Exception {
provider = initializeCurrentProvider();
if (provider != null) {
createTopic(PUSH_JMS_TOPIC, "/topic/" + PUSH_JMS_TOPIC);
createTopic(PUSH_TOPICS_CONTEXT_TOPIC, "/topic/" + PUSH_TOPICS_CONTEXT_TOPIC);
createTopic(PUSH_CDI_TOPIC, "/topic/" + PUSH_CDI_TOPIC);
}
}
private void createTopic(String topicName, String jndiName) throws Exception {
try {
LOGGER.info("creating topic " + topicName);
provider.createTopic(topicName, jndiName);
} catch (Exception e) {
throw new RuntimeException("Unable to create topic '" + topicName + "' (JNDI: " + jndiName + ")", e);
}
}
protected static boolean isJmsEnabled() {
if (null == JMS_ENABLED.get()) {
boolean isJmsEnabled = getConfiguration(CoreConfiguration.Items.pushJMSEnabled) != null
&& getConfiguration(CoreConfiguration.Items.pushJMSEnabled);
JMS_ENABLED.compareAndSet(null, isJmsEnabled);
}
return JMS_ENABLED.get();
}
/*
* (non-Javadoc)
*
* @see org.richfaces.demo.push.Initializer#unload()
*/
public void finalizeCapability() throws Exception {
if (provider != null) {
provider.finalizeProvider();
}
}
/**
* Returns all providers which are available from current context
*
* @return all providers which are available from current context
*/
@SuppressWarnings("unchecked")
private Class<? extends MessagingProviderManagement>[] getAvailableProviders() {
if (isConnectionFactoryRegistered()) {
return new Class[] { AS7MessagingProviderManagement.class, AS6MessagingProviderManagement.class };
} else {
return new Class[] { CustomMessagingServerManagement.class };
}
}
/**
* Returns one of providers available from current context which are able to initialize successfully
*
* @return one of providers available from current context which are able to initialize successfully
*/
private MessagingProviderManagement initializeCurrentProvider() {
for (Class<? extends MessagingProviderManagement> c : getAvailableProviders()) {
try {
LOGGER.info("initializing");
MessagingProviderManagement provider = c.newInstance();
provider.initializeProvider();
LOGGER.info(c.getSimpleName() + " initialized");
return provider;
} catch (InitializationFailedException e) {
LOGGER.severe(c.getSimpleName() + " initialization failed");
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
throw new IllegalStateException("no management provider has been successfully initialized");
}
/**
* Returns true if ConnectionFactory is already registered
*
* @return true if ConnectionFactory is already registered
*/
private static boolean isConnectionFactoryRegistered() {
try {
return null != InitialContext.doLookup("java:/ConnectionFactory");
} catch (NamingException e) {
if (!(e instanceof NameNotFoundException)) {
LOGGER.log(Level.SEVERE, "Can't access naming context", e);
}
return false;
}
}
private static Boolean getConfiguration(Enum<?> configuration) {
FacesContext facesContext = FacesContext.getCurrentInstance();
return getBooleanConfigurationValue(facesContext, configuration);
}
}