001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. 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 package org.apache.activemq.xbean;
018
019 import java.beans.PropertyEditorManager;
020 import java.net.URI;
021
022 import org.apache.activemq.broker.BrokerService;
023 import org.apache.xbean.spring.context.ResourceXmlApplicationContext;
024 import org.apache.xbean.spring.context.impl.URIEditor;
025 import org.springframework.beans.BeansException;
026 import org.springframework.beans.factory.DisposableBean;
027 import org.springframework.beans.factory.FactoryBean;
028 import org.springframework.beans.factory.InitializingBean;
029 import org.springframework.context.ApplicationContext;
030 import org.springframework.context.ApplicationContextAware;
031 import org.springframework.core.io.Resource;
032
033 /**
034 * A Spring {@link FactoryBean} which creates an embedded broker inside a Spring
035 * XML using an external <a href="http://gbean.org/Custom+XML">XBean Spring XML
036 * configuration file</a> which provides a much neater and more concise XML
037 * format.
038 *
039 *
040 */
041 public class BrokerFactoryBean implements FactoryBean, InitializingBean, DisposableBean, ApplicationContextAware {
042
043 static {
044 PropertyEditorManager.registerEditor(URI.class, URIEditor.class);
045 }
046
047 private Resource config;
048 private XBeanBrokerService broker;
049 private boolean start;
050 private ResourceXmlApplicationContext context;
051 private ApplicationContext parentContext;
052
053 private boolean systemExitOnShutdown;
054 private int systemExitOnShutdownExitCode;
055
056 public BrokerFactoryBean() {
057 }
058
059 public BrokerFactoryBean(Resource config) {
060 this.config = config;
061 }
062
063 public Object getObject() throws Exception {
064 return broker;
065 }
066
067 public Class getObjectType() {
068 return BrokerService.class;
069 }
070
071 public boolean isSingleton() {
072 return true;
073 }
074
075 public void setApplicationContext(ApplicationContext parentContext) throws BeansException {
076 this.parentContext = parentContext;
077 }
078
079 public void afterPropertiesSet() throws Exception {
080 if (config == null) {
081 throw new IllegalArgumentException("config property must be set");
082 }
083 context = new ResourceXmlApplicationContext(config, parentContext);
084
085 try {
086 broker = (XBeanBrokerService)context.getBean("broker");
087 } catch (BeansException e) {
088 // ignore...
089 // log.trace("No bean named broker available: " + e, e);
090 }
091 if (broker == null) {
092 // lets try find by type
093 String[] names = context.getBeanNamesForType(BrokerService.class);
094 for (int i = 0; i < names.length; i++) {
095 String name = names[i];
096 broker = (XBeanBrokerService)context.getBean(name);
097 if (broker != null) {
098 break;
099 }
100 }
101 }
102 if (broker == null) {
103 throw new IllegalArgumentException("The configuration has no BrokerService instance for resource: " + config);
104 }
105
106 if( systemExitOnShutdown ) {
107 broker.addShutdownHook(new Runnable(){
108 public void run() {
109 System.exit(systemExitOnShutdownExitCode);
110 }
111 });
112 }
113 if (start) {
114 broker.start();
115 }
116 }
117
118 public void destroy() throws Exception {
119 if (context != null) {
120 context.close();
121 }
122 if (broker != null) {
123 broker.stop();
124 }
125 }
126
127 public Resource getConfig() {
128 return config;
129 }
130
131 public void setConfig(Resource config) {
132 this.config = config;
133 }
134
135 public BrokerService getBroker() {
136 return broker;
137 }
138
139 public boolean isStart() {
140 return start;
141 }
142
143 public void setStart(boolean start) {
144 this.start = start;
145 }
146
147 public boolean isSystemExitOnStop() {
148 return systemExitOnShutdown;
149 }
150
151 public void setSystemExitOnStop(boolean systemExitOnStop) {
152 this.systemExitOnShutdown = systemExitOnStop;
153 }
154
155 public boolean isSystemExitOnShutdown() {
156 return systemExitOnShutdown;
157 }
158
159 public void setSystemExitOnShutdown(boolean systemExitOnShutdown) {
160 this.systemExitOnShutdown = systemExitOnShutdown;
161 }
162
163 public int getSystemExitOnShutdownExitCode() {
164 return systemExitOnShutdownExitCode;
165 }
166
167 public void setSystemExitOnShutdownExitCode(int systemExitOnShutdownExitCode) {
168 this.systemExitOnShutdownExitCode = systemExitOnShutdownExitCode;
169 }
170
171 }