001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *  http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    package org.apache.geronimo.tomcat.connector;
020    
021    import java.util.HashMap;
022    import java.util.Map;
023    
024    import javax.management.j2ee.statistics.Stats;
025    
026    import org.apache.catalina.LifecycleException;
027    import org.apache.catalina.connector.Connector;
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.j2ee.j2eeobjectnames.NameFactory;
034    import org.apache.geronimo.management.geronimo.NetworkConnector;
035    import org.apache.geronimo.system.serverinfo.ServerInfo;
036    import org.apache.geronimo.tomcat.BaseGBean;
037    import org.apache.geronimo.tomcat.ObjectRetriever;
038    import org.apache.geronimo.tomcat.TomcatContainer;
039    
040    public abstract class ConnectorGBean extends BaseGBean implements CommonProtocol, GBeanLifecycle, ObjectRetriever, TomcatWebConnector {
041    
042        private static final Log log = LogFactory.getLog(ConnectorGBean.class);
043    
044        public final static String CONNECTOR_CONTAINER_REFERENCE = "TomcatContainer";
045    
046        protected final ServerInfo serverInfo;
047        
048        protected final Connector connector;
049    
050        private final TomcatContainer container;
051    
052        private String name;
053    
054        public ConnectorGBean(String name, Map initParams, String tomcatProtocol, TomcatContainer container, ServerInfo serverInfo) throws Exception {
055            
056            //Relief for new Tomcat-only parameters that may come in the future
057            if (initParams == null){
058                initParams = new HashMap();
059            }
060    
061            // Do we really need this?? For Tomcat I don't think so...
062            // validateProtocol(protocol);
063    
064            if (name == null) {
065                throw new IllegalArgumentException("name cannot be null.");
066            }
067    
068            if (container == null) {
069                throw new IllegalArgumentException("container cannot be null.");
070            }
071    
072            if (serverInfo == null){
073                throw new IllegalArgumentException("serverInfo cannot be null.");
074            }
075            
076            tomcatProtocol = validateProtocol(tomcatProtocol);
077    
078            this.name = name;
079            this.container = container;
080            this.serverInfo = serverInfo;
081    
082            // Create the Connector object
083            connector = new Connector(tomcatProtocol);
084            
085            setParameters(connector, initParams);
086    
087        }
088    
089        public void doFail() {
090            log.warn(name + " connector failed");
091            doStop();
092        }
093    
094        public void doStart() throws LifecycleException {
095            container.addConnector(connector);
096            connector.start();
097            if (log.isDebugEnabled())
098                log.debug(name + " connector started");
099        }
100    
101        public void doStop() {
102            try {
103                connector.stop();
104            } catch (LifecycleException e) {
105                log.error(e);
106            }
107    
108            container.removeConnector(connector);
109    
110            if (log.isDebugEnabled())
111                log.debug(name + " connector stopped");
112        }
113        
114        /**
115         * Ensures that this implementation can handle the requested protocol.
116         * @param protocol
117         */
118        protected String validateProtocol(String tomcatProtocol) { return tomcatProtocol;}
119        
120        public abstract int getDefaultPort();
121        
122        public abstract String getGeronimoProtocol();
123        
124        public abstract Stats getStats();
125        
126        public abstract void resetStats();
127        
128        public Object getInternalObject() {
129            return connector;
130        }
131    
132        public String getName() {
133            return name;
134        }
135    
136        public void setAllowTrace(boolean allow) {
137            connector.setAllowTrace(allow);
138        }
139    
140        public boolean getAllowTrace() {
141            return connector.getAllowTrace();
142        }
143    
144        public void setEmptySessionPath(boolean emptySessionPath) {
145            connector.setEmptySessionPath(emptySessionPath);
146        }
147    
148        public void setEnableLookups(boolean enabled) {
149            connector.setEnableLookups(enabled);
150        }
151    
152        public int getMaxPostSize() {
153            int value = connector.getMaxPostSize();
154            return value == 0 ? 2097152 : value;
155        }
156    
157        public void setMaxPostSize(int bytes) {
158            connector.setMaxPostSize(bytes);
159        }
160    
161        public String getProtocol() {
162            //This is totally wrong on the Geronimo side and needs to be re-thought out.
163            //This was done to shoe horn in gerneric Geronimo protocols which should have no relation
164            //to the container's scheme.  This whole idea needs rework.
165            return getGeronimoProtocol();
166        }
167        
168        public String getTomcatProtocol() {
169            return connector.getProtocol();
170        }
171    
172        public String getProxyName() {
173            return connector.getProxyName();
174        }
175    
176        public int getProxyPort() {
177            return connector.getProxyPort();
178        }
179    
180        public int getRedirectPort() {
181            return connector.getRedirectPort();
182        }
183    
184        public String getScheme() {
185            return connector.getScheme();
186        }
187    
188        public boolean getSecure() {
189            return connector.getSecure();
190        }
191    
192        public String getUriEncoding() {
193            return connector.getURIEncoding();
194        }
195    
196        public boolean getUseBodyEncodingForURI() {
197            return connector.getUseBodyEncodingForURI();
198        }
199    
200        public boolean getUseIPVHosts() {
201            return connector.getUseIPVHosts();
202        }
203    
204        public void setMaxSavePostSize(int maxSavePostSize) {
205            connector.setMaxSavePostSize(maxSavePostSize);
206        }
207    
208        public void setProxyName(String proxyName) {
209            if (proxyName.equals(""))
210                proxyName = null;
211            connector.setProxyName(proxyName);
212        }
213    
214        public void setProxyPort(int port) {
215            connector.setProxyPort(port);
216        }
217    
218        public void setRedirectPort(int port) {
219            connector.setRedirectPort(port);
220        }
221    
222        public void setScheme(String scheme) {
223            connector.setScheme(scheme);
224        }
225    
226        public void setSecure(boolean secure) {
227            connector.setSecure(secure);
228        }
229        
230        public boolean getSslEnabled() {
231            Object value = connector.getAttribute("SSLEnabled");
232            return value == null ? false : new Boolean(value.toString()).booleanValue();
233        }
234    
235        public void setSslEnabled(boolean sslEnabled) {
236            connector.setAttribute("SSLEnabled", sslEnabled);
237        }
238    
239        public void setUriEncoding(String uriEncoding) {
240            connector.setURIEncoding(uriEncoding);
241        }
242    
243        public void setUseBodyEncodingForURI(boolean useBodyEncodingForURI) {
244            connector.setUseBodyEncodingForURI(useBodyEncodingForURI);
245        }
246    
247        public void setUseIPVHosts(boolean useIPVHosts) {
248            connector.setUseIPVHosts(useIPVHosts);
249        }
250    
251        public void setXpoweredBy(boolean xpoweredBy) {
252            connector.setXpoweredBy(xpoweredBy);
253        }
254    
255        public boolean getEnableLookups() {
256            return connector.getEnableLookups();
257        }
258    
259        public int getMaxSavePostSize() {
260            int value = connector.getMaxSavePostSize();
261            return value == 0 ? 4096 : value;
262        }
263    
264        public boolean getEmptySessionPath() {
265            return connector.getEmptySessionPath();
266        }
267    
268        public boolean getXpoweredBy() {
269            return connector.getXpoweredBy();
270        }
271    
272        public static final GBeanInfo GBEAN_INFO;
273    
274        static {
275            GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic("Tomcat Connector", ConnectorGBean.class);
276    
277            infoFactory.addAttribute("name", String.class, true);
278            infoFactory.addAttribute("initParams", Map.class, true);
279            infoFactory.addAttribute("protocol", String.class, true);
280            infoFactory.addReference(CONNECTOR_CONTAINER_REFERENCE, TomcatContainer.class, NameFactory.GERONIMO_SERVICE);
281            infoFactory.addReference("ServerInfo", ServerInfo.class, "GBean");
282            infoFactory.addInterface(ObjectRetriever.class);
283            infoFactory.addInterface(TomcatWebConnector.class);
284            infoFactory.addInterface(CommonProtocol.class,
285                    
286                    new String[]{
287                            "allowTrace",
288                            "emptySessionPath",
289                            "enableLookups",
290                            "maxPostSize",
291                            "maxSavePostSize",
292                            "protocol",
293                            "tomcatProtocol",
294                            "proxyName",
295                            "proxyPort",
296                            "redirectPort",
297                            "scheme",
298                            "secure",
299                            "sslEnabled",
300                            "uriEncoding",
301                            "useBodyEncodingForURI",
302                            "useIPVHosts",
303                            "xpoweredBy"
304                    },
305    
306                    new String[]{
307                            "allowTrace",
308                            "emptySessionPath",
309                            "enableLookups",
310                            "maxPostSize",
311                            "maxSavePostSize",
312                            "protocol",
313                            "tomcatProtocol",
314                            "proxyName",
315                            "proxyPort",
316                            "redirectPort",
317                            "scheme",
318                            "secure",
319                            "sslEnabled",
320                            "uriEncoding",
321                            "useBodyEncodingForURI",
322                            "useIPVHosts",
323                            "xpoweredBy"
324                    }
325            );
326            infoFactory.setConstructor(new String[] { "name", "initParams", "protocol", "TomcatContainer", "ServerInfo" });
327            GBEAN_INFO = infoFactory.getBeanInfo();
328        }
329    
330        public static GBeanInfo getGBeanInfo() {
331            return GBEAN_INFO;
332        }
333    
334    }