001    /**
002    *
003    * Copyright 2003-2005 The Apache Software Foundation
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    package org.apache.geronimo.tomcat.cluster;
018    
019    import java.util.Map;
020    
021    import org.apache.catalina.Valve;
022    import org.apache.catalina.cluster.CatalinaCluster;
023    import org.apache.catalina.cluster.ClusterDeployer;
024    import org.apache.catalina.cluster.ClusterReceiver;
025    import org.apache.catalina.cluster.ClusterSender;
026    import org.apache.catalina.cluster.MembershipService;
027    import org.apache.catalina.cluster.MessageListener;
028    import org.apache.commons.logging.Log;
029    import org.apache.commons.logging.LogFactory;
030    import org.apache.geronimo.gbean.GBeanInfo;
031    import org.apache.geronimo.gbean.GBeanInfoBuilder;
032    import org.apache.geronimo.gbean.GBeanLifecycle;
033    import org.apache.geronimo.tomcat.BaseGBean;
034    import org.apache.geronimo.tomcat.ObjectRetriever;
035    import org.apache.geronimo.tomcat.ValveGBean;
036    
037    /**
038    * @version $Rev: 356897 $ $Date: 2005-12-14 14:45:55 -0800 (Wed, 14 Dec 2005) $
039    */
040    public class CatalinaClusterGBean extends BaseGBean implements GBeanLifecycle, ObjectRetriever {
041    
042       private static final Log log = LogFactory.getLog(CatalinaClusterGBean.class);
043       
044       public static final String J2EE_TYPE = "Cluster";
045       
046       private final CatalinaCluster cluster;
047       
048       public CatalinaClusterGBean(){
049           cluster=null;
050       }
051    
052       public CatalinaClusterGBean(String className, 
053               Map initParams,            
054               MembershipServiceGBean membership,
055               ReceiverGBean receiver,
056               SenderGBean sender,
057               MessageListenerGBean messageListenerChain,
058               ValveGBean tomcatValveChain,
059               ClusterDeployerGBean deployer) throws Exception {
060           
061           super(); // TODO: make it an attribute
062           
063           //Validate
064           if (className == null){
065               throw new IllegalArgumentException("Must have a 'className' attribute.");
066           }
067                  
068           //Create the CatalinaCluster object
069           cluster = (CatalinaCluster)Class.forName(className).newInstance();
070           
071           //Set the parameters
072           setParameters(cluster, initParams);
073           
074           //Add the MembershipService
075           if (membership != null){
076               cluster.setMembershipService((MembershipService)membership.getInternalObject());
077           }
078           
079           //Add Receiver
080           if (receiver != null){
081               cluster.setClusterReceiver((ClusterReceiver)receiver.getInternalObject());
082           }
083           
084           //Add Sender
085           if (sender != null){
086               cluster.setClusterSender((ClusterSender)sender.getInternalObject());
087           }
088    
089           //Add the message listeners list
090           if (messageListenerChain != null){
091               MessageListenerGBean messageListenerGBean = messageListenerChain;
092               while(messageListenerGBean != null){
093                   cluster.addClusterListener((MessageListener)messageListenerGBean.getInternalObject());
094                   messageListenerGBean = messageListenerGBean.getNextValve();
095               }
096           }
097    
098           //Add the valve list
099           if (tomcatValveChain != null){
100               ValveGBean valveGBean = tomcatValveChain;
101               while(valveGBean != null){
102                   cluster.addValve((Valve)valveGBean.getInternalObject());
103                   valveGBean = valveGBean.getNextValve();
104               }
105           }
106           
107           //Add deployer
108           if (deployer != null){
109               cluster.setClusterDeployer((ClusterDeployer)deployer.getInternalObject());
110           }
111       }
112    
113       public Object getInternalObject() {
114           return cluster;
115       }
116    
117       public void doFail() {
118           log.warn("Failed");
119       }
120    
121       public void doStart() throws Exception {
122           log.debug("Started cluster gbean.");
123       }
124    
125       public void doStop() throws Exception {
126           log.debug("Stopped cluster gbean.");
127       }
128    
129       public static final GBeanInfo GBEAN_INFO;
130    
131       static {
132           GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("CatalinaCluster", CatalinaClusterGBean.class, J2EE_TYPE);
133           infoFactory.addAttribute("className", String.class, true);
134           infoFactory.addAttribute("initParams", Map.class, true);
135           infoFactory.addReference("Membership", MembershipServiceGBean.class, MembershipServiceGBean.J2EE_TYPE);
136           infoFactory.addReference("Receiver", ReceiverGBean.class, ReceiverGBean.J2EE_TYPE);
137           infoFactory.addReference("Sender", SenderGBean.class, SenderGBean.J2EE_TYPE);
138           infoFactory.addReference("MessageListenerChain", MessageListenerGBean.class, MessageListenerGBean.J2EE_TYPE);
139           infoFactory.addReference("TomcatValveChain", ValveGBean.class, ValveGBean.J2EE_TYPE);
140           infoFactory.addReference("ClusterDeployer", ClusterDeployerGBean.class, ClusterDeployerGBean.J2EE_TYPE);
141           infoFactory.addOperation("getInternalObject");
142           infoFactory.setConstructor(new String[] { 
143                   "className", 
144                   "initParams", 
145                   "Membership", 
146                   "Receiver",
147                   "Sender",
148                   "MessageListenerChain",
149                   "TomcatValveChain",
150                   "ClusterDeployer" });
151           GBEAN_INFO = infoFactory.getBeanInfo();
152       }
153    
154       public static GBeanInfo getGBeanInfo() {
155           return GBEAN_INFO;
156       }
157    }