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.cluster;
018
019 import java.util.Map;
020
021 import org.apache.catalina.tribes.Channel;
022 import org.apache.catalina.tribes.ChannelInterceptor;
023 import org.apache.catalina.tribes.ChannelReceiver;
024 import org.apache.catalina.tribes.ChannelSender;
025 import org.apache.catalina.tribes.MembershipService;
026 import org.apache.catalina.tribes.group.GroupChannel;
027 import org.apache.commons.logging.Log;
028 import org.apache.commons.logging.LogFactory;
029 import org.apache.geronimo.gbean.GBeanInfo;
030 import org.apache.geronimo.gbean.GBeanInfoBuilder;
031 import org.apache.geronimo.gbean.GBeanLifecycle;
032 import org.apache.geronimo.tomcat.BaseGBean;
033 import org.apache.geronimo.tomcat.ObjectRetriever;
034
035 /**
036 * @version $Rev: 511136 $ $Date: 2007-02-23 17:12:09 -0500 (Fri, 23 Feb 2007) $
037 */
038 public class ChannelGBean extends BaseGBean implements GBeanLifecycle, ObjectRetriever {
039
040 private static final Log log = LogFactory.getLog(ChannelGBean.class);
041
042 public static final String J2EE_TYPE = "Channel";
043
044 private final Channel channel;
045
046 public ChannelGBean(){
047 channel=null;
048 }
049
050 public ChannelGBean(String className,
051 Map initParams,
052 MembershipServiceGBean membership,
053 ReceiverGBean receiver,
054 SenderGBean sender,
055 ChannelInterceptorGBean interceptorChain) throws Exception {
056
057 super(); // TODO: make it an attribute
058
059 //Validate
060 if (className == null){
061 throw new IllegalArgumentException("Must have a 'className' attribute.");
062 }
063
064 //Create the Channel object
065 channel = (Channel)Class.forName(className).newInstance();
066
067 //Set the parameters
068 setParameters(channel, initParams);
069
070 // if the channel is a GroupChannel then add the sender, receiver, and membership service
071 if (channel instanceof GroupChannel) {
072 GroupChannel groupChannel = (GroupChannel)channel;
073 //Add the MembershipService
074 if (membership != null){
075 groupChannel.setMembershipService((MembershipService)membership.getInternalObject());
076 }
077
078 //Add Receiver
079 if (receiver != null){
080 groupChannel.setChannelReceiver((ChannelReceiver)receiver.getInternalObject());
081 }
082
083 //Add Sender
084 if (sender != null){
085 groupChannel.setChannelSender((ChannelSender)sender.getInternalObject());
086 }
087 } else {
088 log.warn(className + " is not an instance of GroupChannel. Did not set Receiver, Sender, or MembershipService");
089 }
090
091
092 //Add the interceptros
093 if (interceptorChain != null){
094 ChannelInterceptorGBean channelInterceptorGBean = interceptorChain;
095 while(channelInterceptorGBean != null){
096 channel.addInterceptor((ChannelInterceptor)channelInterceptorGBean.getInternalObject());
097 channelInterceptorGBean = channelInterceptorGBean.getNextInterceptor();
098 }
099 }
100
101 }
102
103 public Object getInternalObject() {
104 return channel;
105 }
106
107 public void doFail() {
108 log.warn("Failed");
109 }
110
111 public void doStart() throws Exception {
112 log.debug("Started channel gbean.");
113 }
114
115 public void doStop() throws Exception {
116 log.debug("Stopped channel gbean.");
117 }
118
119 public static final GBeanInfo GBEAN_INFO;
120
121 static {
122 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("Channel", ChannelGBean.class, J2EE_TYPE);
123 infoFactory.addAttribute("className", String.class, true);
124 infoFactory.addAttribute("initParams", Map.class, true);
125 infoFactory.addReference("Membership", MembershipServiceGBean.class, MembershipServiceGBean.J2EE_TYPE);
126 infoFactory.addReference("Receiver", ReceiverGBean.class, ReceiverGBean.J2EE_TYPE);
127 infoFactory.addReference("Sender", SenderGBean.class, SenderGBean.J2EE_TYPE);
128 infoFactory.addReference("ChannelInterceptor", ChannelInterceptorGBean.class, ChannelInterceptorGBean.J2EE_TYPE);
129 infoFactory.addOperation("getInternalObject", "Object");
130 infoFactory.setConstructor(new String[] {
131 "className",
132 "initParams",
133 "Membership",
134 "Receiver",
135 "Sender",
136 "ChannelInterceptor"});
137 GBEAN_INFO = infoFactory.getBeanInfo();
138 }
139
140 public static GBeanInfo getGBeanInfo() {
141 return GBEAN_INFO;
142 }
143 }