1 // ========================================================================
2 // Copyright 1996-2005 Mort Bay Consulting Pty. Ltd.
3 // ------------------------------------------------------------------------
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 // ========================================================================
14
15 package org.mortbay.jetty.servlet;
16
17 import java.io.Serializable;
18 import java.util.Collections;
19 import java.util.Enumeration;
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import javax.servlet.UnavailableException;
24
25 import org.mortbay.component.AbstractLifeCycle;
26 import org.mortbay.log.Log;
27 import org.mortbay.util.Loader;
28
29
30 /* --------------------------------------------------------------------- */
31 /**
32 * @author Greg Wilkins
33 */
34 public class Holder extends AbstractLifeCycle implements Serializable
35 {
36 protected transient Class _class;
37 protected String _className;
38 protected String _displayName;
39 protected Map _initParams;
40 protected boolean _extInstance;
41
42 /* ---------------------------------------------------------------- */
43 protected String _name;
44 protected ServletHandler _servletHandler;
45
46 protected Holder()
47 {}
48
49 /* ---------------------------------------------------------------- */
50 protected Holder(Class held)
51 {
52 _class=held;
53 if (held!=null)
54 {
55 _className=held.getName();
56 _name=held.getName()+"-"+this.hashCode();
57 }
58 }
59
60 /* ------------------------------------------------------------ */
61 public void doStart()
62 throws Exception
63 {
64 //if no class already loaded and no classname, make servlet permanently unavailable
65 if (_class==null && (_className==null || _className.equals("")))
66 throw new UnavailableException("No class for Servlet or Filter", -1);
67
68 //try to load class
69 if (_class==null)
70 {
71 try
72 {
73 _class=Loader.loadClass(Holder.class, _className);
74 if(Log.isDebugEnabled())Log.debug("Holding {}",_class);
75 }
76 catch (Exception e)
77 {
78 Log.warn(e);
79 throw new UnavailableException(e.getMessage(), -1);
80 }
81 }
82 }
83
84 /* ------------------------------------------------------------ */
85 public void doStop()
86 {
87 if (!_extInstance)
88 _class=null;
89 }
90
91 /* ------------------------------------------------------------ */
92 public String getClassName()
93 {
94 return _className;
95 }
96
97 /* ------------------------------------------------------------ */
98 public Class getHeldClass()
99 {
100 return _class;
101 }
102
103 /* ------------------------------------------------------------ */
104 public String getDisplayName()
105 {
106 return _displayName;
107 }
108
109 /* ---------------------------------------------------------------- */
110 public String getInitParameter(String param)
111 {
112 if (_initParams==null)
113 return null;
114 return (String)_initParams.get(param);
115 }
116
117 /* ------------------------------------------------------------ */
118 public Enumeration getInitParameterNames()
119 {
120 if (_initParams==null)
121 return Collections.enumeration(Collections.EMPTY_LIST);
122 return Collections.enumeration(_initParams.keySet());
123 }
124
125 /* ---------------------------------------------------------------- */
126 public Map getInitParameters()
127 {
128 return _initParams;
129 }
130
131 /* ------------------------------------------------------------ */
132 public String getName()
133 {
134 return _name;
135 }
136
137 /* ------------------------------------------------------------ */
138 /**
139 * @return Returns the servletHandler.
140 */
141 public ServletHandler getServletHandler()
142 {
143 return _servletHandler;
144 }
145
146 /* ------------------------------------------------------------ */
147 public synchronized Object newInstance()
148 throws InstantiationException,
149 IllegalAccessException
150 {
151 if (_class==null)
152 throw new InstantiationException("!"+_className);
153 return _class.newInstance();
154 }
155
156 public void destroyInstance(Object instance)
157 throws Exception
158 {
159 }
160
161 /* ------------------------------------------------------------ */
162 /**
163 * @param className The className to set.
164 */
165 public void setClassName(String className)
166 {
167 _className = className;
168 _class=null;
169 }
170
171 /* ------------------------------------------------------------ */
172 /**
173 * @param className The className to set.
174 */
175 public void setHeldClass(Class held)
176 {
177 _class=held;
178 _className = held!=null?held.getName():null;
179 }
180
181 /* ------------------------------------------------------------ */
182 public void setDisplayName(String name)
183 {
184 _displayName=name;
185 }
186
187 /* ------------------------------------------------------------ */
188 public void setInitParameter(String param,String value)
189 {
190 if (_initParams==null)
191 _initParams=new HashMap(3);
192 _initParams.put(param,value);
193 }
194
195 /* ---------------------------------------------------------------- */
196 public void setInitParameters(Map map)
197 {
198 _initParams=map;
199 }
200
201 /* ------------------------------------------------------------ */
202 /**
203 * The name is a primary key for the held object.
204 * Ensure that the name is set BEFORE adding a Holder
205 * (eg ServletHolder or FilterHolder) to a ServletHandler.
206 * @param name The name to set.
207 */
208 public void setName(String name)
209 {
210 _name = name;
211 }
212
213 /* ------------------------------------------------------------ */
214 /**
215 * @param servletHandler The {@link ServletHandler} that will handle requests dispatched to this servlet.
216 */
217 public void setServletHandler(ServletHandler servletHandler)
218 {
219 _servletHandler = servletHandler;
220 }
221
222 /* ------------------------------------------------------------ */
223 public String toString()
224 {
225 return _name;
226 }
227 }
228
229
230
231
232