001 /**
002 *
003 * Copyright 2004 Protique Ltd
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package org.activemq.spring;
019
020 import org.apache.commons.logging.Log;
021 import org.apache.commons.logging.LogFactory;
022 import org.springframework.beans.BeansException;
023 import org.springframework.beans.factory.BeanFactory;
024 import org.springframework.beans.factory.support.DefaultListableBeanFactory;
025 import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
026 import org.springframework.core.io.InputStreamResource;
027 import org.springframework.core.io.Resource;
028 import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
029
030 import java.io.InputStream;
031
032 /**
033 * A Spring BeanFactory for creating ActiveMQ objects
034 *
035 * @version $Revision$
036 */
037 public class ActiveMQBeanFactory extends DefaultListableBeanFactory {
038 private static final Log log = LogFactory.getLog(ActiveMQBeanFactory.class);
039
040 private XmlBeanDefinitionReader reader;
041
042 /**
043 * A static factory method which can be used easily from spring.xml
044 *
045 * @param resource XML resource to load bean definitions from
046 */
047 public static ActiveMQBeanFactory newInstance(String brokerName, Resource resource) {
048 return new ActiveMQBeanFactory(brokerName, resource);
049 }
050
051 /**
052 * Create a new ActiveMQBeanFactory with the given resource,
053 * which must be parsable using DOM.
054 *
055 * @param resource XML resource to load bean definitions from
056 * @throws org.springframework.beans.BeansException
057 * in case of loading or parsing errors
058 */
059 public ActiveMQBeanFactory(String brokerName, Resource resource) throws BeansException {
060 this(brokerName, resource, null);
061 }
062
063 /**
064 * Create a new ActiveMQBeanFactory with the given InputStream,
065 * which must be parsable using DOM.
066 * <p>It's preferable to use a Resource argument instead of an
067 * InputStream, to retain location information. This constructor
068 * is mainly kept for backward compatibility.
069 *
070 * @param is XML InputStream to load bean definitions from
071 * @throws BeansException in case of loading or parsing errors
072 * @see #ActiveMQBeanFactory(String, Resource)
073 */
074 public ActiveMQBeanFactory(String brokerName, InputStream is) throws BeansException {
075 this(brokerName, new InputStreamResource(is, "(no description)"), null);
076 }
077
078 /**
079 * Create a new ActiveMQBeanFactory with the given input stream,
080 * which must be parsable using DOM.
081 *
082 * @param resource XML resource to load bean definitions from
083 * @param parentBeanFactory parent bean factory
084 * @throws BeansException in case of loading or parsing errors
085 */
086 public ActiveMQBeanFactory(String brokerName, Resource resource, BeanFactory parentBeanFactory) throws BeansException {
087 super(parentBeanFactory);
088 reader = createReader(brokerName);
089 reader.loadBeanDefinitions(resource);
090
091 // Check to see if we have a PropertyPlaceholderConfigurer bean already.
092 if (this.getBeanNamesForType(PropertyPlaceholderConfigurer.class).length == 0) {
093 PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
094 configurer.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_FALLBACK);
095 configurer.postProcessBeanFactory(this);
096 log.debug("Using System properties to configure bean factory.");
097 }
098 else {
099 log.debug("Already have a PropertyPlaceholderConfigurer, using that to configure bean factory.");
100 }
101 }
102
103 protected XmlBeanDefinitionReader getReader() {
104 return reader;
105 }
106
107 /**
108 * A hook to allow custom ActiveMQBeanFactory implementations to provide
109 * their own custom parser of the XML to perform macro processing
110 * or perform XSLT etc
111 *
112 * @return
113 */
114 protected XmlBeanDefinitionReader createReader(String brokerName) {
115 return new ActiveMQBeanDefinitionReader(this, brokerName);
116 }
117 }