/* * JBoss, Home of Professional Open Source. * Copyright (c) 2011, 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.jboss.as.test.integration.common.jms; import org.jboss.as.arquillian.container.ManagementClient; import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.as.controller.client.helpers.ClientConstants; import org.jboss.dmr.ModelNode; import org.jboss.logging.Logger; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * Utility class for getting implementations of JMSOperations interface * @author <a href="jmartisk@redhat.com">Jan Martiska</a> */ public class JMSOperationsProvider { private static final Logger logger = Logger.getLogger(JMSOperationsProvider.class); private static final String PROPERTY_NAME = "jmsoperations.implementation.class"; private static final String FILE_NAME = "jmsoperations.properties"; /** * Gets an instance of a JMSOperations implementation for a particular JMS provider based on the classname * given by property "jmsoperations.implementation.class" in jmsoperations.properties somewhere on the classpath * The property should contain a fully qualified name of a class that implements JMSOperations interface * The setting in that file can be overriden by a system property declaration * * @param client {@link ManagementClient} to pass to the JMSOperations implementation class' constructor * * @return a JMSOperations implementation that is JMS-provider-dependent * * @deprecated use {@link #getInstance(org.jboss.as.controller.client.ModelControllerClient)} instead */ @Deprecated public static JMSOperations getInstance(ManagementClient client) { String className; // first try to get the property from system properties className = System.getProperty(PROPERTY_NAME); // if this was not defined, try to get it from jmsoperations.properties if(className == null) { ClassLoader tccl = Thread.currentThread().getContextClassLoader(); InputStream stream = tccl.getResourceAsStream(FILE_NAME); Properties propsFromFile = new Properties(); try { propsFromFile.load(stream); className = propsFromFile.getProperty(PROPERTY_NAME); } catch(IOException ex) { throw new RuntimeException(ex); } } if(className == null) { throw new JMSOperationsException("Please specify a property " + PROPERTY_NAME + " in " + FILE_NAME); } Object jmsOperationsInstance; try { Class clazz = Class.forName(className); jmsOperationsInstance = clazz.getConstructor(ManagementClient.class).newInstance(client); } catch (Exception e) { throw new JMSOperationsException(e); } if(!(jmsOperationsInstance instanceof JMSOperations)) { throw new JMSOperationsException("Class " + className + " does not implement interface JMSOperations"); } return (JMSOperations)jmsOperationsInstance; } /** * Gets an instance of a JMSOperations implementation for a particular JMS provider based on the classname * given by property "jmsoperations.implementation.class" in jmsoperations.properties somewhere on the classpath * The property should contain a fully qualified name of a class that implements JMSOperations interface * The setting in that file can be overriden by a system property declaration * * @param client {@link ModelControllerClient} to pass to the JMSOperations implementation class' constructor * * @return a JMSOperations implementation that is JMS-provider-dependent */ public static JMSOperations getInstance(ModelControllerClient client) { String className; // first try to get the property from system properties className = System.getProperty(PROPERTY_NAME); // if this was not defined, try to get it from jmsoperations.properties if (className == null) { ClassLoader tccl = Thread.currentThread().getContextClassLoader(); InputStream stream = tccl.getResourceAsStream(FILE_NAME); Properties propsFromFile = new Properties(); try { propsFromFile.load(stream); className = propsFromFile.getProperty(PROPERTY_NAME); } catch(IOException ex) { throw new RuntimeException(ex); } } if(className == null) { throw new JMSOperationsException("Please specify a property " + PROPERTY_NAME + " in " + FILE_NAME); } Object jmsOperationsInstance; try { Class clazz = Class.forName(className); jmsOperationsInstance = clazz.getConstructor(ModelControllerClient.class).newInstance(client); } catch (Exception e) { throw new JMSOperationsException(e); } if (!(jmsOperationsInstance instanceof JMSOperations)) { throw new JMSOperationsException("Class " + className + " does not implement interface JMSOperations"); } return (JMSOperations)jmsOperationsInstance; } static void execute(ManagementClient managementClient, final ModelNode operation) throws IOException, JMSOperationsException { execute(managementClient.getControllerClient(), operation); } static void execute(ModelControllerClient client, final ModelNode operation) throws IOException, JMSOperationsException { ModelNode result = client.execute(operation); if (result.hasDefined(ClientConstants.OUTCOME) && ClientConstants.SUCCESS.equals(result.get(ClientConstants.OUTCOME).asString())) { logger.trace("Operation successful for update = " + operation.toString()); } else if (result.hasDefined(ClientConstants.FAILURE_DESCRIPTION)) { final String failureDesc = result.get(ClientConstants.FAILURE_DESCRIPTION).toString(); throw new JMSOperationsException(failureDesc); } else { throw new JMSOperationsException("Operation not successful; outcome = " + result.get(ClientConstants.OUTCOME)); } } }