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.geronimo.tomcat;
018
019 import java.util.Collection;
020 import java.util.Iterator;
021 import java.util.Map;
022
023 import org.apache.catalina.Cluster;
024 import org.apache.catalina.Engine;
025 import org.apache.catalina.Host;
026 import org.apache.catalina.LifecycleListener;
027 import org.apache.catalina.Manager;
028 import org.apache.catalina.Realm;
029 import org.apache.catalina.Valve;
030 import org.apache.catalina.core.StandardEngine;
031 import org.apache.commons.logging.Log;
032 import org.apache.commons.logging.LogFactory;
033 import org.apache.geronimo.gbean.GBeanInfo;
034 import org.apache.geronimo.gbean.GBeanInfoBuilder;
035 import org.apache.geronimo.gbean.GBeanLifecycle;
036 import org.apache.geronimo.gbean.ReferenceCollection;
037 import org.apache.geronimo.gbean.ReferenceCollectionEvent;
038 import org.apache.geronimo.gbean.ReferenceCollectionListener;
039 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
040 import org.apache.geronimo.system.jmx.MBeanServerReference;
041 import org.apache.geronimo.tomcat.cluster.CatalinaClusterGBean;
042 import org.apache.tomcat.util.modeler.Registry;
043
044 /**
045 * @version $Rev: 554952 $ $Date: 2007-07-10 10:07:16 -0400 (Tue, 10 Jul 2007) $
046 */
047 public class EngineGBean extends BaseGBean implements GBeanLifecycle, ObjectRetriever {
048
049 private static final Log log = LogFactory.getLog(EngineGBean.class);
050
051 private static final String NAME = "name";
052 private static final String DEFAULTHOST = "defaultHost";
053
054 private final Engine engine;
055
056 public EngineGBean(String className,
057 Map initParams,
058 HostGBean defaultHost,
059 Collection hosts,
060 ObjectRetriever realmGBean,
061 ValveGBean tomcatValveChain,
062 LifecycleListenerGBean listenerChain,
063 CatalinaClusterGBean clusterGBean,
064 ManagerGBean manager,
065 MBeanServerReference mbeanServerReference) throws Exception {
066 super(); // TODO: make it an attribute
067
068 if (className == null){
069 className = "org.apache.geronimo.tomcat.TomcatEngine";
070 }
071
072 if (initParams == null){
073 throw new IllegalArgumentException("Must have 'name' value in initParams.");
074 }
075
076 //Be sure the defaulthost has been declared.
077 if (defaultHost == null){
078 throw new IllegalArgumentException("Must have a 'defaultHost' attribute.");
079 }
080
081 //Be sure the name has been declared.
082 if (!initParams.containsKey(NAME)){
083 throw new IllegalArgumentException("Must have a 'name' value initParams.");
084 }
085
086 //Deprecate the defaultHost initParam
087 if (initParams.containsKey(DEFAULTHOST)){
088 log.warn("The " + DEFAULTHOST + " initParams value is no longer used and will be ignored.");
089 initParams.remove(DEFAULTHOST);
090 }
091
092 engine = (Engine)Class.forName(className).newInstance();
093
094 //Set the parameters
095 setParameters(engine, initParams);
096
097 //Set realm (must be before Hosts)
098 if (realmGBean != null){
099 engine.setRealm((Realm)realmGBean.getInternalObject());
100 }
101
102 //Set the default Host
103 final String defaultHostName = ((Host)defaultHost.getInternalObject()).getName();
104 engine.setDefaultHost(defaultHostName);
105 addHost(defaultHost);
106
107 if (manager != null)
108 engine.setManager((Manager)manager.getInternalObject());
109
110 //Add the valve and listener lists
111 if (engine instanceof StandardEngine){
112 if (tomcatValveChain != null){
113 ValveGBean valveGBean = tomcatValveChain;
114 while(valveGBean != null){
115 ((StandardEngine)engine).addValve((Valve)valveGBean.getInternalObject());
116 valveGBean = valveGBean.getNextValve();
117 }
118 }
119
120 if (listenerChain != null){
121 LifecycleListenerGBean listenerGBean = listenerChain;
122 while(listenerGBean != null){
123 ((StandardEngine)engine).addLifecycleListener((LifecycleListener)listenerGBean.getInternalObject());
124 listenerGBean = listenerGBean.getNextListener();
125 }
126 }
127 }
128
129 if(mbeanServerReference != null) {
130 Registry.setServer(mbeanServerReference.getMBeanServer());
131 }
132
133 //Add the hosts
134 if (hosts instanceof ReferenceCollection) {
135 ReferenceCollection refs = (ReferenceCollection)hosts;
136 refs.addReferenceCollectionListener(new ReferenceCollectionListener() {
137
138 public void memberAdded(ReferenceCollectionEvent event) {
139 Object o = event.getMember();
140 ObjectRetriever objectRetriever = (ObjectRetriever) o;
141 String hostName = ((Host)objectRetriever.getInternalObject()).getName();
142 if (!hostName.equals(defaultHostName))
143 addHost(objectRetriever);
144 }
145
146 public void memberRemoved(ReferenceCollectionEvent event) {
147 Object o = event.getMember();
148 ObjectRetriever objectRetriever = (ObjectRetriever) o;
149 String hostName = ((Host)objectRetriever.getInternalObject()).getName();
150 if (!hostName.equals(defaultHostName))
151 removeHost(objectRetriever);
152 }
153 });
154 Iterator iterator = refs.iterator();
155 while (iterator.hasNext()){
156 ObjectRetriever objRetriever = (ObjectRetriever)iterator.next();
157 String hostName = ((Host)objRetriever.getInternalObject()).getName();
158 if (!hostName.equals(defaultHostName))
159 addHost(objRetriever);
160 }
161 }
162
163
164 //Add clustering
165 if (clusterGBean != null){
166 engine.setCluster((Cluster)clusterGBean.getInternalObject());
167 }
168 }
169
170 private void removeHost(ObjectRetriever objRetriever) {
171 Host host = (Host)objRetriever.getInternalObject();
172 engine.removeChild(host);
173 }
174
175 private void addHost(ObjectRetriever objRetriever) {
176 Host host = (Host)objRetriever.getInternalObject();
177
178 //If we didn't set a realm, then use the default
179 if (host.getRealm() == null) {
180 host.setRealm(engine.getRealm());
181 }
182 engine.addChild(host);
183 }
184
185 public Object getInternalObject() {
186 return engine;
187 }
188
189 public void doFail() {
190 log.warn("Failed");
191 }
192
193 public void doStart() throws Exception {
194 log.debug("Started");
195 }
196
197 public void doStop() throws Exception {
198 log.debug("Stopped");
199 }
200
201 public static final GBeanInfo GBEAN_INFO;
202
203 static {
204 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("TomcatEngine", EngineGBean.class);
205 infoFactory.addAttribute("className", String.class, true);
206 infoFactory.addAttribute("initParams", Map.class, true);
207 infoFactory.addReference("DefaultHost", HostGBean.class, HostGBean.J2EE_TYPE);
208 infoFactory.addReference("Hosts", ObjectRetriever.class, HostGBean.J2EE_TYPE);
209 infoFactory.addReference("RealmGBean", ObjectRetriever.class, NameFactory.GERONIMO_SERVICE);
210 infoFactory.addReference("TomcatValveChain", ValveGBean.class, ValveGBean.J2EE_TYPE);
211 infoFactory.addReference("LifecycleListenerChain", LifecycleListenerGBean.class, LifecycleListenerGBean.J2EE_TYPE);
212 infoFactory.addReference("CatalinaCluster", CatalinaClusterGBean.class, CatalinaClusterGBean.J2EE_TYPE);
213 infoFactory.addReference("Manager", ManagerGBean.class, ManagerGBean.J2EE_TYPE);
214 infoFactory.addReference("MBeanServerReference", MBeanServerReference.class);
215 infoFactory.addOperation("getInternalObject");
216 infoFactory.setConstructor(new String[] {
217 "className",
218 "initParams",
219 "DefaultHost",
220 "Hosts",
221 "RealmGBean",
222 "TomcatValveChain",
223 "LifecycleListenerChain",
224 "CatalinaCluster",
225 "Manager",
226 "MBeanServerReference"});
227 GBEAN_INFO = infoFactory.getBeanInfo();
228 }
229
230 public static GBeanInfo getGBeanInfo() {
231 return GBEAN_INFO;
232 }
233 }