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 import java.util.Set;
021
022 import javax.security.auth.Subject;
023
024 import org.apache.geronimo.gbean.GBeanInfo;
025 import org.apache.geronimo.gbean.GBeanInfoBuilder;
026 import org.apache.geronimo.gbean.GBeanLifecycle;
027 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
028 import org.apache.geronimo.management.Servlet;
029 import org.mortbay.jetty.servlet.ServletHolder;
030
031
032 /**
033 * This ServletHolder's sole purpose is to provide the thread's current
034 * ServletHolder for realms that are interested in the current servlet, e.g.
035 * current servlet name.
036 * <p/>
037 * It is also being our servlet gbean for now. We could gbean-ize the superclass to avoid the thread local access.
038 *
039 * @version $Rev: 556217 $ $Date: 2007-07-13 23:39:06 -0400 (Fri, 13 Jul 2007) $
040 * @see JAASJettyRealm#isUserInRole(java.security.Principal, String)
041 */
042 public class JettyServletHolder implements Servlet, GBeanLifecycle {
043
044
045 private final JettyServletRegistration servletRegistration;
046 private final ServletHolder servletHolder;
047 private final String objectName;
048
049 //todo consider interface instead of this constructor for endpoint use.
050 public JettyServletHolder() {
051 servletRegistration = null;
052 servletHolder = null;
053 objectName = null;
054 }
055
056 public JettyServletHolder(String objectName,
057 String servletName,
058 String servletClassName,
059 String jspFile,
060 Map initParams,
061 Integer loadOnStartup,
062 Set<String> servletMappings,
063 String runAsRole,
064 JettyServletRegistration context) throws Exception {
065 servletRegistration = context;
066 Subject runAsSubject = context == null? null: context.getSubjectForRole(runAsRole);
067 servletHolder = new InternalJettyServletHolder(context == null? null: context.getLifecycleChain(), runAsSubject, servletRegistration);
068 servletHolder.setName(servletName);
069 servletHolder.setClassName(servletClassName);
070 //context will be null only for use as "default servlet info holder" in deployer.
071
072 if (context != null) {
073 servletHolder.setInitParameters(initParams);
074 servletHolder.setForcedPath(jspFile);
075 if (loadOnStartup != null) {
076 //This has no effect on the actual start order, the gbean references "previous" control that.
077 servletHolder.setInitOrder(loadOnStartup);
078 }
079 //this now starts the servlet in the appropriate context
080 context.registerServletHolder(servletHolder, servletName, servletMappings, objectName);
081 }
082 this.objectName = objectName;
083 }
084
085 public String getServletName() {
086 return servletHolder.getName();
087 }
088
089 public String getServletClassName() {
090 return servletHolder.getClassName();
091 }
092
093 public String getObjectName() {
094 return objectName;
095 }
096
097 public boolean isStateManageable() {
098 return false;
099 }
100
101 public boolean isStatisticsProvider() {
102 return false;
103 }
104
105 public boolean isEventProvider() {
106 return false;
107 }
108
109 public void doStart() throws Exception {
110 //start actually handled in constructor
111 // servletHolder.start();
112 }
113
114 public void doStop() throws Exception {
115 servletHolder.stop();
116 if (servletRegistration != null) {
117 servletRegistration.unregisterServletHolder(servletHolder, servletHolder.getName(), null, objectName);
118 }
119 }
120
121 public void doFail() {
122 try {
123 doStop();
124 } catch (Exception e) {
125 //?? ignore
126 }
127 }
128
129 public static final GBeanInfo GBEAN_INFO;
130
131 static {
132 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(JettyServletHolder.class, NameFactory.SERVLET);
133 //todo replace with interface
134 // infoBuilder.addInterface(ServletHolder.class);
135
136 infoBuilder.addAttribute("servletName", String.class, true);
137 infoBuilder.addAttribute("servletClass", String.class, true);
138 infoBuilder.addAttribute("jspFile", String.class, true);
139 infoBuilder.addAttribute("initParams", Map.class, true);
140 infoBuilder.addAttribute("loadOnStartup", Integer.class, true);
141 infoBuilder.addAttribute("servletMappings", Set.class, true);
142 infoBuilder.addAttribute("runAsRole", String.class, true);
143 infoBuilder.addAttribute("objectName", String.class, false);
144 infoBuilder.addInterface(Servlet.class);
145
146 infoBuilder.addReference("JettyServletRegistration", JettyServletRegistration.class, NameFactory.WEB_MODULE);
147
148 infoBuilder.setConstructor(new String[]{"objectName",
149 "servletName",
150 "servletClass",
151 "jspFile",
152 "initParams",
153 "loadOnStartup",
154 "servletMappings",
155 "runAsRole",
156 "JettyServletRegistration"});
157
158 GBEAN_INFO = infoBuilder.getBeanInfo();
159 }
160
161 public static GBeanInfo getGBeanInfo() {
162 return GBEAN_INFO;
163 }
164
165 }