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.ArrayList;
020 import java.util.Iterator;
021 import java.util.Map;
022
023 import org.apache.catalina.Cluster;
024 import org.apache.catalina.Host;
025 import org.apache.catalina.LifecycleListener;
026 import org.apache.catalina.Manager;
027 import org.apache.catalina.Realm;
028 import org.apache.catalina.Valve;
029 import org.apache.catalina.core.StandardEngine;
030 import org.apache.catalina.core.StandardHost;
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.j2ee.j2eeobjectnames.NameFactory;
037 import org.apache.geronimo.tomcat.cluster.CatalinaClusterGBean;
038
039 /**
040 * @version $Rev: 551692 $ $Date: 2007-06-28 16:36:09 -0400 (Thu, 28 Jun 2007) $
041 */
042 public class HostGBean extends BaseGBean implements GBeanLifecycle, ObjectRetriever {
043
044 private static final Log log = LogFactory.getLog(HostGBean.class);
045
046 public static final String J2EE_TYPE = "Host";
047 private static final String WORKDIR = "workDir";
048 private static final String NAME = "name";
049
050 private final Host host;
051
052 public HostGBean(){
053 host = null;
054 }
055
056 public HostGBean(String className,
057 Map initParams,
058 ArrayList aliases,
059 ObjectRetriever realmGBean,
060 ValveGBean tomcatValveChain,
061 LifecycleListenerGBean listenerChain,
062 CatalinaClusterGBean clusterGBean,
063 ManagerGBean manager) throws Exception {
064 super(); // TODO: make it an attribute
065
066 //Validate
067 if (className == null){
068 className = "org.apache.catalina.core.StandardHost";
069 }
070
071 if (initParams == null){
072 throw new IllegalArgumentException("Must have a 'name' value in initParams.");
073 }
074
075 //Be sure the name has been declared.
076 if (!initParams.containsKey(NAME)){
077 throw new IllegalArgumentException("Must have a 'name' value initParams.");
078 }
079
080 //Be sure we have a default working directory
081 if (!initParams.containsKey(WORKDIR)){
082 initParams.put(WORKDIR, "work");
083 }
084
085 //Create the Host object
086 host = (Host)Class.forName(className).newInstance();
087
088 //Set the parameters
089 setParameters(host, initParams);
090
091 //Add aliases, if any
092 if (aliases != null){
093 for (Iterator iter = aliases.iterator(); iter.hasNext();) {
094 String alias = (String) iter.next();
095 host.addAlias(alias);
096 }
097 }
098
099 if (realmGBean != null)
100 host.setRealm((Realm)realmGBean.getInternalObject());
101
102 //Add the valve list
103 if (host instanceof StandardHost){
104
105 if (tomcatValveChain != null){
106 ValveGBean valveGBean = tomcatValveChain;
107 while(valveGBean != null){
108 ((StandardHost)host).addValve((Valve)valveGBean.getInternalObject());
109 valveGBean = valveGBean.getNextValve();
110 }
111 }
112
113 if (listenerChain != null){
114 LifecycleListenerGBean listenerGBean = listenerChain;
115 while(listenerGBean != null){
116 ((StandardHost)host).addLifecycleListener((LifecycleListener)listenerGBean.getInternalObject());
117 listenerGBean = listenerGBean.getNextListener();
118 }
119 }
120
121 }
122
123 //Add clustering
124 if (clusterGBean != null){
125 host.setCluster((Cluster)clusterGBean.getInternalObject());
126 }
127
128 //Add manager
129 if (manager != null)
130 host.setManager((Manager)manager.getInternalObject());
131 }
132
133 public Object getInternalObject() {
134 return host;
135 }
136
137 public void doFail() {
138 log.warn("Failed");
139 }
140
141 public void doStart() throws Exception {
142 log.debug("Started host name '" + host.getName() + "'");
143 }
144
145 public void doStop() throws Exception {
146 log.debug("Stopped host '" + host.getName() + "'");
147 }
148
149 public static final GBeanInfo GBEAN_INFO;
150
151 static {
152 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("TomcatHost", HostGBean.class, J2EE_TYPE);
153 infoFactory.addAttribute("className", String.class, true);
154 infoFactory.addAttribute("initParams", Map.class, true);
155 infoFactory.addAttribute("aliases", ArrayList.class, true);
156 infoFactory.addReference("RealmGBean", ObjectRetriever.class, NameFactory.GERONIMO_SERVICE);
157 infoFactory.addReference("TomcatValveChain", ValveGBean.class, ValveGBean.J2EE_TYPE);
158 infoFactory.addReference("LifecycleListenerChain", LifecycleListenerGBean.class, LifecycleListenerGBean.J2EE_TYPE);
159 infoFactory.addReference("CatalinaCluster", CatalinaClusterGBean.class, CatalinaClusterGBean.J2EE_TYPE);
160 infoFactory.addReference("Manager", ManagerGBean.class, ManagerGBean.J2EE_TYPE);
161 infoFactory.addOperation("getInternalObject");
162 infoFactory.setConstructor(new String[] {
163 "className",
164 "initParams",
165 "aliases",
166 "RealmGBean",
167 "TomcatValveChain",
168 "LifecycleListenerChain",
169 "CatalinaCluster",
170 "Manager"});
171 GBEAN_INFO = infoFactory.getBeanInfo();
172 }
173
174 public static GBeanInfo getGBeanInfo() {
175 return GBEAN_INFO;
176 }
177 }