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: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
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    }