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.gbean;
019
020 import java.util.Properties;
021 import javax.jms.JMSException;
022 import org.apache.commons.logging.Log;
023 import org.apache.commons.logging.LogFactory;
024 import org.apache.geronimo.gbean.GBeanInfo;
025 import org.apache.geronimo.gbean.GBeanInfoBuilder;
026 import org.apache.geronimo.gbean.GBeanLifecycle;
027 import org.apache.geronimo.management.geronimo.JMSManager;
028 import org.apache.geronimo.management.geronimo.NetworkConnector;
029 import org.activemq.broker.BrokerAdmin;
030 import org.activemq.broker.BrokerContainer;
031 import org.activemq.broker.BrokerContext;
032 import org.activemq.broker.impl.BrokerContainerImpl;
033 import org.activemq.security.jassjacc.JassJaccSecurityAdapter;
034 import org.activemq.security.jassjacc.PropertiesConfigLoader;
035 import org.activemq.store.PersistenceAdapter;
036
037 /**
038 * Default implementation of the ActiveMQ Message Server
039 *
040 * @version $Revision: 1.1.1.1 $
041 */
042 public class ActiveMQContainerGBean implements GBeanLifecycle, ActiveMQContainer {
043
044 private Log log = LogFactory.getLog(getClass().getName());
045
046 private final String brokerName;
047 private final String objectName;
048
049 private BrokerContext context = BrokerContext.getInstance();
050 private BrokerContainer container;
051
052 private final PersistenceAdapter persistenceAdapter;
053 private final String jaasConfiguration;
054 private final Properties securityRoles;
055 private final JMSManager manager;
056
057 //default constructor for use as gbean endpoint.
058 public ActiveMQContainerGBean() {
059 brokerName = null;
060 jaasConfiguration = null;
061 securityRoles = null;
062 persistenceAdapter=null;
063 objectName = null;
064 manager = null;
065 }
066
067 public ActiveMQContainerGBean(String brokerName, PersistenceAdapter persistenceAdapter, String jaasConfiguration, Properties securityRoles, String objectName, JMSManager manager) {
068
069 assert brokerName != null;
070 assert persistenceAdapter != null;
071
072 this.brokerName = brokerName;
073 this.jaasConfiguration=jaasConfiguration;
074 this.persistenceAdapter = persistenceAdapter;
075 this.securityRoles = securityRoles;
076 this.objectName = objectName;
077 this.manager = manager;
078 }
079
080 public synchronized BrokerContainer getBrokerContainer() {
081 return container;
082 }
083
084 public String getObjectName() {
085 return objectName;
086 }
087
088 public boolean isStateManageable() {
089 return true;
090 }
091
092 public boolean isStatisticsProvider() {
093 return false; // todo: return true once stats are integrated
094 }
095
096 public boolean isEventProvider() {
097 return true;
098 }
099
100 public NetworkConnector[] getConnectors() {
101 return manager.getConnectorsForContainer(this);
102 }
103
104 public NetworkConnector[] getConnectors(String protocol) {
105 return manager.getConnectorsForContainer(this, protocol);
106 }
107
108 /**
109 * @see org.activemq.gbean.ActiveMQContainer#getBrokerAdmin()
110 */
111 public BrokerAdmin getBrokerAdmin() {
112 return container.getBroker().getBrokerAdmin();
113 }
114
115 public synchronized void doStart() throws Exception {
116 ClassLoader old = Thread.currentThread().getContextClassLoader();
117 Thread.currentThread().setContextClassLoader(ActiveMQContainerGBean.class.getClassLoader());
118 try {
119 if (container == null) {
120 container = createContainer();
121 container.start();
122 }
123 } finally {
124 Thread.currentThread().setContextClassLoader(old);
125 }
126 }
127
128 public synchronized void doStop() throws Exception {
129 if (container != null) {
130 BrokerContainer temp = container;
131 container = null;
132 temp.stop();
133 }
134 }
135
136 public synchronized void doFail() {
137 if (container != null) {
138 BrokerContainer temp = container;
139 container = null;
140 try {
141 temp.stop();
142 }
143 catch (JMSException e) {
144 log.info("Caught while closing due to failure: " + e, e);
145 }
146 }
147 }
148
149 protected BrokerContainer createContainer() throws Exception {
150 BrokerContainerImpl answer = new BrokerContainerImpl(brokerName, context);
151 answer.setPersistenceAdapter( persistenceAdapter );
152 if( jaasConfiguration != null ) {
153 answer.setSecurityAdapter(new JassJaccSecurityAdapter(jaasConfiguration));
154 }
155 if( securityRoles != null ) {
156 // Install JACC configuration.
157 PropertiesConfigLoader loader = new PropertiesConfigLoader(brokerName, securityRoles);
158 loader.installSecurity();
159 }
160 return answer;
161 }
162
163 public static final GBeanInfo GBEAN_INFO;
164
165 static {
166 GBeanInfoBuilder infoFactory = new GBeanInfoBuilder("ActiveMQ Message Broker", ActiveMQContainerGBean.class, "JMSServer");
167 infoFactory.addAttribute("brokerName", String.class, true);
168 infoFactory.addReference("persistenceAdapter", PersistenceAdapter.class);
169 infoFactory.addReference("JMSManager", JMSManager.class);
170 infoFactory.addAttribute("jaasConfiguration", String.class, true);
171 infoFactory.addAttribute("securityRoles", Properties.class, true);
172 infoFactory.addAttribute("objectName", String.class, false);
173 infoFactory.addInterface(ActiveMQContainer.class);
174 infoFactory.setConstructor(new String[]{"brokerName", "persistenceAdapter", "jaasConfiguration", "securityRoles", "objectName", "JMSManager"});
175 GBEAN_INFO = infoFactory.getBeanInfo();
176 }
177
178 public static GBeanInfo getGBeanInfo() {
179 return GBEAN_INFO;
180 }
181
182 /**
183 * @return Returns the brokerName.
184 */
185 public String getBrokerName() {
186 return brokerName;
187 }
188
189 /**
190 * @return Returns the jassConfiguration.
191 */
192 public String getJaasConfiguration() {
193 return jaasConfiguration;
194 }
195
196 /**
197 * @return Returns the securityRoles.
198 */
199 public Properties getSecurityRoles() {
200 return securityRoles;
201 }
202
203 }