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.jetty6;
018    
019    import java.util.Map;
020    
021    import org.apache.geronimo.gbean.GBeanInfo;
022    import org.apache.geronimo.gbean.GBeanInfoBuilder;
023    import org.apache.geronimo.gbean.GBeanLifecycle;
024    import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
025    import org.apache.geronimo.jetty6.handler.LifecycleCommand;
026    import org.mortbay.jetty.servlet.FilterHolder;
027    
028    /**
029     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
030     */
031    public class JettyFilterHolder implements GBeanLifecycle {
032    
033        private final FilterHolder filterHolder;
034    
035        //todo consider an interface instead of this constructor for endpoint use.
036        public JettyFilterHolder() {
037            filterHolder = null;
038        }
039    
040        public JettyFilterHolder(String filterName, String filterClass, Map initParams, JettyServletRegistration jettyServletRegistration) throws Exception {
041            filterHolder = new InternalFilterHolder(jettyServletRegistration);
042            if (jettyServletRegistration != null) {
043                filterHolder.setName(filterName);
044                filterHolder.setClassName(filterClass);
045                filterHolder.setInitParameters(initParams);
046                (jettyServletRegistration.getServletHandler()).addFilter(filterHolder);
047            }
048        }
049    
050        public String getFilterName() {
051            return filterHolder.getName();
052        }
053    
054        public void doStart() throws Exception {
055            filterHolder.start();
056        }
057    
058        public void doStop() throws Exception {
059            filterHolder.stop();
060        }
061    
062        public void doFail() {
063            try {
064                filterHolder.stop();
065            } catch (Exception e) {
066                //ignore?
067            }
068        }
069    
070        private static class InternalFilterHolder extends FilterHolder {
071            private final JettyServletRegistration servletRegistration;
072            private boolean destroyed;
073    
074            public InternalFilterHolder(JettyServletRegistration servletRegistration) {
075                this.servletRegistration = servletRegistration;
076            }
077    
078    
079            public synchronized Object newInstance() throws InstantiationException, IllegalAccessException {
080                return servletRegistration.newInstance(_className);
081            }
082    
083            public void destroyInstance(Object o) throws Exception {
084                if (!destroyed) {
085                    super.destroyInstance(o);
086                    servletRegistration.destroyInstance(o);
087                    destroyed = true;
088                }
089            }
090            
091            public void doStop() {
092                LifecycleCommand lifecycleCommand = (new LifecycleCommand() {
093                    public void lifecycleMethod() throws Exception {
094                        internalDoStop();
095                    }
096                });
097                try {
098                    this.servletRegistration.getLifecycleChain().lifecycleCommand(lifecycleCommand);
099                } catch (Exception e) {
100                    //ignore????
101                }
102            }
103            
104            public void doStart() throws Exception {
105                LifecycleCommand lifecycleCommand = (new LifecycleCommand() {
106                    public void lifecycleMethod() throws Exception {
107                        internalDoStart();
108                    }
109                });
110                this.servletRegistration.getLifecycleChain().lifecycleCommand(lifecycleCommand);
111            }
112            
113            private void internalDoStart() throws Exception {
114                super.doStart();
115            }
116    
117            private void internalDoStop() {
118                super.doStop();
119            }
120    
121        }
122    
123        public static final GBeanInfo GBEAN_INFO;
124    
125        static {
126            GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(JettyFilterHolder.class, NameFactory.WEB_FILTER);
127            infoBuilder.addAttribute("filterName", String.class, true);
128            infoBuilder.addAttribute("filterClass", String.class, true);
129            infoBuilder.addAttribute("initParams", Map.class, true);
130    
131            infoBuilder.addReference("JettyServletRegistration", JettyServletRegistration.class, NameFactory.WEB_MODULE);
132    
133            infoBuilder.setConstructor(new String[]{"filterName", "filterClass", "initParams", "JettyServletRegistration"});
134    
135            GBEAN_INFO = infoBuilder.getBeanInfo();
136    
137        }
138    
139        public static GBeanInfo getGBeanInfo() {
140            return GBEAN_INFO;
141        }
142    
143    }