View Javadoc
1   package org.apache.turbine.util;
2   
3   
4   /*
5    * Licensed to the Apache Software Foundation (ASF) under one
6    * or more contributor license agreements.  See the NOTICE file
7    * distributed with this work for additional information
8    * regarding copyright ownership.  The ASF licenses this file
9    * to you under the Apache License, Version 2.0 (the
10   * "License"); you may not use this file except in compliance
11   * with the License.  You may obtain a copy of the License at
12   *
13   *   http://www.apache.org/licenses/LICENSE-2.0
14   *
15   * Unless required by applicable law or agreed to in writing,
16   * software distributed under the License is distributed on an
17   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18   * KIND, either express or implied.  See the License for the
19   * specific language governing permissions and limitations
20   * under the License.
21   */
22  
23  
24  import java.io.BufferedInputStream;
25  import java.io.File;
26  import java.io.FileInputStream;
27  import java.io.FileNotFoundException;
28  import java.io.InputStream;
29  import java.net.MalformedURLException;
30  import java.net.URL;
31  import java.util.Enumeration;
32  import java.util.EventListener;
33  import java.util.HashMap;
34  import java.util.Map;
35  import java.util.Set;
36  import java.util.Vector;
37  
38  import javax.servlet.Filter;
39  import javax.servlet.FilterRegistration;
40  import javax.servlet.RequestDispatcher;
41  import javax.servlet.Servlet;
42  import javax.servlet.ServletConfig;
43  import javax.servlet.ServletContext;
44  import javax.servlet.ServletException;
45  import javax.servlet.ServletRegistration;
46  import javax.servlet.ServletRegistration.Dynamic;
47  import javax.servlet.SessionCookieConfig;
48  import javax.servlet.SessionTrackingMode;
49  import javax.servlet.descriptor.JspConfigDescriptor;
50  
51  import org.apache.avalon.framework.activity.Disposable;
52  import org.apache.avalon.framework.activity.Initializable;
53  import org.apache.logging.log4j.LogManager;
54  import org.apache.logging.log4j.Logger;
55  import org.apache.turbine.Turbine;
56  import org.apache.turbine.TurbineConstants;
57  import org.apache.turbine.annotation.TurbineConfiguration;
58  
59  /**
60   * A class used for initialization of Turbine without a servlet container.
61   * <p>
62   * If you need to use Turbine outside of a servlet container, you can
63   * use this class for initialization of the Turbine servlet.
64   * </p>
65   *
66   * <pre>
67   * TurbineConfig config = new TurbineConfig(".", "conf/TurbineResources.properties");
68   * </pre>
69   *
70   * <p>
71   * All paths referenced in TurbineResources.properties and the path to
72   * the properties file itself (the second argument) will be resolved
73   * relative to the directory given as the first argument of the constructor,
74   * here - the directory where application was started. Don't worry about
75   * discarding the references to objects created above. They are not needed,
76   * once everything is initialized.
77   * </p>
78   *
79   * <p>
80   * In order to initialize the Services Framework outside of the Turbine Servlet,
81   * you need to call the <code>init()</code> method. By default, this will
82   * initialize the Resource and Logging Services and any other services you
83   * have defined in your TurbineResources.properties file.
84   * </p>
85   *
86   * TODO Make this class enforce the lifecycle contracts
87   *
88   * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
89   * @author <a href="mailto:krzewski@e-point.pl">Rafal Krzewski</a>
90   * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
91   * @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
92   * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
93   * @author <a href="mailto:epugh@upstate.com">Eric Pugh</a>
94   * @version $Id$
95   */
96  public class TurbineConfig
97          implements ServletConfig, ServletContext, Initializable, Disposable
98  {
99  
100     @TurbineConfiguration( TurbineConstants.SESSION_TIMEOUT_KEY )
101     protected int timeout = TurbineConstants.SESSION_TIMEOUT_DEFAULT;
102 
103     /**
104      * Servlet initialization parameter name for the path to
105      * TurbineConfiguration.xml file used by Turbine
106      */
107     public static final String CONFIGURATION_PATH_KEY = "configuration";
108 
109     /**
110      * Servlet initialization parameter name for the path to
111      * Turbine.properties file used by Turbine
112      */
113     public static final String PROPERTIES_PATH_KEY = "properties";
114 
115     /**
116      * Default value of TurbineResources.properties file path
117      * (<code>/WEB-INF/conf/TurbineResources.properties</code>).
118      */
119     public static final String PROPERTIES_PATH_DEFAULT =
120             "/WEB-INF/conf/TurbineResources.properties";
121 
122     /** Filenames are looked up in this directory. */
123     protected File root;
124 
125     /** Servlet container (or emulator) attributes. */
126     protected Map<String, Object> attributes;
127 
128     /** Turbine servlet initialization parameters. */
129     protected Map<String, String> initParams;
130 
131     /** The Turbine servlet instance used for initialization. */
132     private Turbine turbine;
133 
134     /** Logging */
135     private final Logger log = LogManager.getLogger(this.getClass());
136 
137     /**
138      * Constructs a new TurbineConfig.
139      *
140      * This is the general form of the constructor. You can provide
141      * a path to search for files, and a name-value map of init
142      * parameters.
143      *
144      * <p> For the list of recognized init parameters, see
145      * {@link org.apache.turbine.Turbine} class.
146      *
147      * @param path The web application root (i.e. the path for file lookup).
148      * @param attributes Servlet container (or emulator) attributes.
149      * @param initParams initialization parameters.
150      */
151     public TurbineConfig(String path, Map<String, Object> attributes,
152             Map<String, String> initParams)
153     {
154         root = new File(path);
155         this.attributes = attributes;
156         this.initParams = initParams;
157     }
158 
159     /**
160      * Constructs a new TurbineConfig.
161      *
162      * This is the general form of the constructor. You can provide
163      * a path to search for files, and a name-value map of init
164      * parameters.
165      *
166      * <p> For the list of recognized init parameters, see
167      * {@link org.apache.turbine.Turbine} class.
168      *
169      * @param path The web application root (i.e. the path for file lookup).
170      * @param initParams initialization parameters.
171      */
172     public TurbineConfig(String path, Map<String, String> initParams)
173     {
174         this(path, new HashMap<String, Object>(0), initParams);
175     }
176 
177     /**
178      * Constructs a TurbineConfig.
179      *
180      * This is a specialized constructor that allows to configure
181      * Turbine easily in the common setups.
182      *
183      * Check also {@link TurbineXmlConfig} to load a {@link #CONFIGURATION_PATH_KEY}.
184      *
185      * @param path The web application root (i.e. the path for file lookup).
186      * @param properties the relative path to TurbineResources.properties file
187      */
188     public TurbineConfig(String path, String properties)
189     {
190         this(path, new HashMap<String, String>(1));
191         initParams.put(PROPERTIES_PATH_KEY, properties);
192     }
193 
194     /**
195      * Causes this class to initialize itself which in turn initializes
196      * all of the Turbine Services that need to be initialized.
197      */
198     @Override
199     public void initialize()
200     {
201         try
202         {
203             turbine = new Turbine();
204             turbine.init(this);
205         }
206         catch (Exception e)
207         {
208             log.error("TurbineConfig: Initialization failed", e);
209         }
210     }
211 
212     /**
213      * Initialization requiring a HTTP <code>GET</code> request.
214      * @param data the Turbine request
215      */
216     public void init(RunData data)
217     {
218         if (turbine != null)
219         {
220             turbine.init(data);
221         }
222     }
223 
224     /**
225      * Shutdown the Turbine System, lifecycle style
226      *
227      */
228     @Override
229     public void dispose()
230     {
231         if (turbine != null)
232         {
233             turbine.destroy();
234         }
235     }
236 
237     /**
238      * Returns a reference to the Turbine servlet that was initialized.
239      *
240      * @return a ServletContext reference
241      */
242     public Turbine getTurbine()
243     {
244         return turbine;
245     }
246 
247     /**
248      * Returns a reference to the object cast onto ServletContext type.
249      *
250      * @return a ServletContext reference
251      */
252     @Override
253     public ServletContext getServletContext()
254     {
255         return this;
256     }
257 
258     /**
259      * Translates a path relative to the web application root into an
260      * absolute path.
261      *
262      * @param path A path relative to the web application root.
263      * @return An absolute version of the supplied path, or <code>null</code>
264      * if the translated path doesn't map to a file or directory.
265      */
266     @Override
267     public String getRealPath(String path)
268     {
269         String result = null;
270         File f = new File(root, path);
271 
272         if (log.isDebugEnabled())
273         {
274             log.debug("TurbineConfig.getRealPath: path '{}' translated to '{}' {}found",
275                     path, f.getPath(), f.exists() ? "" : "not ");
276         }
277 
278         if (f.exists())
279         {
280           result = f.getPath();
281         }
282         else
283         {
284             log.error("getRealPath(\"{}\") is undefined, returning null", path);
285         }
286 
287         return result;
288     }
289 
290     /**
291      * Retrieves an initialization parameter.
292      *
293      * @param name the name of the parameter.
294      * @return the value of the parameter.
295      */
296     @Override
297     public String getInitParameter(String name)
298     {
299         return initParams.get(name);
300     }
301 
302     /**
303      * Retrieves an Enumeration of initialization parameter names.
304      *
305      * @return an Enumeration of initialization parameter names.
306      */
307     @Override
308     public Enumeration<String> getInitParameterNames()
309     {
310         return new Vector<>(initParams.keySet()).elements();
311     }
312 
313     /**
314      * Returns the servlet name.
315      *
316      * Fixed value "Turbine" is returned.
317      *
318      * @return the servlet name.
319      */
320     @Override
321     public String getServletName()
322     {
323         return "Turbine";
324     }
325 
326     /**
327      * Returns the context name.
328      *
329      * Fixed value "Turbine" is returned
330      *
331      * @return the context name
332      */
333     @Override
334     public String getServletContextName()
335     {
336         return "Turbine";
337     }
338 
339     /**
340      * Returns the context path.
341      *
342      * Fixed value "/turbine" is returned
343      *
344      * @return the context path
345      */
346     @Override
347     public String getContextPath()
348     {
349         return "/turbine";
350 	}
351 
352 	/**
353      * Returns a URL to the resource that is mapped to a specified
354      * path. The path must begin with a "/" and is interpreted
355      * as relative to the current context root.
356      *
357      * @param s the path to the resource
358      * @return a URL pointing to the resource
359      * @throws MalformedURLException if unable to parse path
360      */
361     @Override
362     public URL getResource(String s)
363             throws MalformedURLException
364     {
365         return new URL("file://" + getRealPath(s));
366     }
367 
368     /**
369      * Returns the resource located at the named path as
370      * an <code>InputStream</code> object.
371      *
372      * @param s the path to the resource
373      * @return an InputStream object from which the resource can be read
374      */
375     @Override
376     public InputStream getResourceAsStream(String s)
377     {
378         try
379         {
380             FileInputStream fis = new FileInputStream(getRealPath(s));
381             return new BufferedInputStream(fis);
382         }
383         catch (FileNotFoundException e)
384         {
385             return null;
386         }
387     }
388 
389     /**
390      * Logs an error message.
391      *
392      * @param e an Exception.
393      * @param m a message.
394      * @deprecated use log(String,Throwable) instead
395      */
396     @Override
397     @Deprecated
398     public void log(Exception e, String m)
399     {
400         log.info(m, e);
401     }
402 
403     /**
404      * Logs a message.
405      *
406      * @param m a message.
407      */
408     @Override
409     public void log(String m)
410     {
411         log.info(m);
412     }
413 
414     /**
415      * Logs an error message.
416      *
417      * @param t a Throwable object.
418      * @param m a message.
419      */
420     @Override
421     public void log(String m, Throwable t)
422     {
423         log.info(m, t);
424     }
425 
426     /**
427      * Returns the servlet container attribute with the given name, or
428      * null if there is no attribute by that name.
429      */
430     @Override
431     public Object getAttribute(String s)
432     {
433         return attributes.get(s);
434     }
435 
436     /**
437      * Returns an Enumeration containing the attribute names available
438      * within this servlet context.
439      */
440     @Override
441     public Enumeration<String> getAttributeNames()
442     {
443         return new Vector<>(attributes.keySet()).elements();
444     }
445 
446     // Unimplemented methods follow
447 
448     /**
449      * Not implemented.
450      *
451      * A method in ServletConfig or ServletContext interface that is not
452      * implemented and will throw <code>UnsuportedOperationException</code>
453      * upon invocation
454      */
455     @Override
456     public ServletContext getContext(String s)
457     {
458         throw new UnsupportedOperationException();
459     }
460 
461     /**
462      * Not implemented.
463      *
464      * A method in ServletConfig or ServletContext interface that is not
465      * implemented and will throw <code>UnsuportedOperationException</code>
466      * upon invocation
467      */
468     @Override
469     public int getMajorVersion()
470     {
471         throw new UnsupportedOperationException();
472     }
473 
474     /**
475      * Not implemented.
476      *
477      * A method in ServletConfig or ServletContext interface that is not
478      * implemented and will throw <code>UnsuportedOperationException</code>
479      * upon invocation
480      */
481     @Override
482     public String getMimeType(String s)
483     {
484         throw new UnsupportedOperationException();
485     }
486 
487     /**
488      * Not implemented.
489      *
490      * A method in ServletConfig or ServletContext interface that is not
491      * implemented and will throw <code>UnsuportedOperationException</code>
492      * upon invocation
493      */
494     @Override
495     public int getMinorVersion()
496     {
497         throw new UnsupportedOperationException();
498     }
499 
500     /**
501      * Not implemented.
502      *
503      * A method in ServletConfig or ServletContext interface that is not
504      * implemented and will throw <code>UnsuportedOperationException</code>
505      * upon invocation
506      */
507     @Override
508     public RequestDispatcher getNamedDispatcher(String s)
509     {
510         throw new UnsupportedOperationException();
511     }
512 
513     /**
514      * Not implemented.
515      *
516      * A method in ServletConfig or ServletContext interface that is not
517      * implemented and will throw <code>UnsuportedOperationException</code>
518      * upon invocation
519      */
520     @Override
521     public RequestDispatcher getRequestDispatcher(String s)
522     {
523         throw new UnsupportedOperationException();
524     }
525 
526     /**
527      * Not implemented.
528      *
529      * A method in ServletContext (2.3) interface that is not implemented and
530      * will throw <code>UnsuportedOperationException</code> upon invocation
531      */
532     @Override
533     public Set<String> getResourcePaths(String s)
534     {
535         throw new UnsupportedOperationException();
536     }
537 
538     /**
539      * Not implemented.
540      *
541      * A method in ServletContext (2.3) interface that is not implemented and
542      * will throw <code>UnsuportedOperationException</code> upon invocation
543      */
544     @Override
545     public String getServerInfo()
546     {
547         throw new UnsupportedOperationException();
548     }
549 
550     /**
551      * Not implemented.
552      *
553      * A method in ServletContext interface that is not implemented and will
554      * throw <code>UnsuportedOperationException</code> upon invocation
555      * @deprecated As of Java Servlet API 2.1, with no direct replacement.
556      */
557     @Override
558     @Deprecated
559     public Servlet getServlet(String s)
560     {
561         throw new UnsupportedOperationException();
562     }
563 
564     /**
565      * Not implemented.
566      *
567      * A method in ServletContext interface that is not implemented and will
568      * throw <code>UnsuportedOperationException</code> upon invocation
569      * @deprecated As of Java Servlet API 2.1, with no replacement.
570      */
571     @Override
572     @Deprecated
573     public Enumeration<String> getServletNames()
574     {
575         throw new UnsupportedOperationException();
576     }
577 
578     /**
579      * Not implemented.
580      *
581      * A method in ServletContext interface that is not implemented and will
582      * throw <code>UnsuportedOperationException</code> upon invocation
583      * @deprecated As of Java Servlet API 2.0, with no replacement.
584      */
585     @Override
586     @Deprecated
587     public Enumeration<Servlet> getServlets()
588     {
589         throw new UnsupportedOperationException();
590     }
591 
592     /**
593      * Not implemented.
594      *
595      * A method in ServletContext interface that is not implemented and will
596      * throw <code>UnsuportedOperationException</code> upon invocation
597      */
598     @Override
599     public void removeAttribute(String s)
600     {
601         throw new UnsupportedOperationException();
602     }
603 
604     /**
605      * Not implemented.
606      *
607      * A method in ServletContext interface that is not implemented and will
608      * throw <code>UnsuportedOperationException</code> upon invocation
609      */
610     @Override
611     public void setAttribute(String s, Object o)
612     {
613         throw new UnsupportedOperationException();
614     }
615 
616     /**
617      * Not implemented.
618      *
619      * A method in ServletContext interface that is not implemented and will
620      * throw <code>UnsuportedOperationException</code> upon invocation
621      */
622     @Override
623     public int getEffectiveMajorVersion()
624     {
625         throw new UnsupportedOperationException();
626     }
627 
628     /**
629      * Not implemented.
630      *
631      * A method in ServletContext interface that is not implemented and will
632      * throw <code>UnsuportedOperationException</code> upon invocation
633      */
634     @Override
635     public int getEffectiveMinorVersion()
636     {
637         throw new UnsupportedOperationException();
638     }
639 
640     /**
641      * Not implemented.
642      *
643      * A method in ServletContext interface that is not implemented and will
644      * throw <code>UnsuportedOperationException</code> upon invocation
645      */
646     @Override
647     public boolean setInitParameter(String name, String value)
648     {
649         throw new UnsupportedOperationException();
650     }
651 
652     /**
653      * Not implemented.
654      *
655      * A method in ServletContext interface that is not implemented and will
656      * throw <code>UnsuportedOperationException</code> upon invocation
657      */
658     @Override
659     public Dynamic addServlet(String servletName, String className)
660     {
661         throw new UnsupportedOperationException();
662     }
663 
664     /**
665      * Not implemented.
666      *
667      * A method in ServletContext interface that is not implemented and will
668      * throw <code>UnsuportedOperationException</code> upon invocation
669      */
670     @Override
671     public Dynamic addServlet(String servletName, Servlet servlet)
672     {
673         throw new UnsupportedOperationException();
674     }
675 
676     /**
677      * Not implemented.
678      *
679      * A method in ServletContext interface that is not implemented and will
680      * throw <code>UnsuportedOperationException</code> upon invocation
681      */
682     @Override
683     public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass)
684     {
685         throw new UnsupportedOperationException();
686     }
687 
688     /**
689      * Not implemented.
690      *
691      * A method in ServletContext interface that is not implemented and will
692      * throw <code>UnsuportedOperationException</code> upon invocation
693      */
694     @Override
695     public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException
696     {
697         throw new UnsupportedOperationException();
698     }
699 
700     /**
701      * Not implemented.
702      *
703      * A method in ServletContext interface that is not implemented and will
704      * throw <code>UnsuportedOperationException</code> upon invocation
705      */
706     @Override
707     public ServletRegistration getServletRegistration(String servletName)
708     {
709         throw new UnsupportedOperationException();
710     }
711 
712     /**
713      * Not implemented.
714      *
715      * A method in ServletContext interface that is not implemented and will
716      * throw <code>UnsuportedOperationException</code> upon invocation
717      */
718     @Override
719     public Map<String, ? extends ServletRegistration> getServletRegistrations()
720     {
721         throw new UnsupportedOperationException();
722     }
723 
724     /**
725      * Not implemented.
726      *
727      * A method in ServletContext interface that is not implemented and will
728      * throw <code>UnsuportedOperationException</code> upon invocation
729      */
730     @Override
731     public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className)
732     {
733         throw new UnsupportedOperationException();
734     }
735 
736     /**
737      * Not implemented.
738      *
739      * A method in ServletContext interface that is not implemented and will
740      * throw <code>UnsuportedOperationException</code> upon invocation
741      */
742     @Override
743     public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter)
744     {
745         throw new UnsupportedOperationException();
746     }
747 
748     /**
749      * Not implemented.
750      *
751      * A method in ServletContext interface that is not implemented and will
752      * throw <code>UnsuportedOperationException</code> upon invocation
753      */
754     @Override
755     public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass)
756     {
757         throw new UnsupportedOperationException();
758     }
759 
760     /**
761      * Not implemented.
762      *
763      * A method in ServletContext interface that is not implemented and will
764      * throw <code>UnsuportedOperationException</code> upon invocation
765      */
766     @Override
767     public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException
768     {
769         throw new UnsupportedOperationException();
770     }
771 
772     /**
773      * Not implemented.
774      *
775      * A method in ServletContext interface that is not implemented and will
776      * throw <code>UnsuportedOperationException</code> upon invocation
777      */
778     @Override
779     public FilterRegistration getFilterRegistration(String filterName)
780     {
781         throw new UnsupportedOperationException();
782     }
783 
784     /**
785      * Not implemented.
786      *
787      * A method in ServletContext interface that is not implemented and will
788      * throw <code>UnsuportedOperationException</code> upon invocation
789      */
790     @Override
791     public Map<String, ? extends FilterRegistration> getFilterRegistrations()
792     {
793         throw new UnsupportedOperationException();
794     }
795 
796     /**
797      * Not implemented.
798      *
799      * A method in ServletContext interface that is not implemented and will
800      * throw <code>UnsuportedOperationException</code> upon invocation
801      */
802     @Override
803     public SessionCookieConfig getSessionCookieConfig()
804     {
805         throw new UnsupportedOperationException();
806     }
807 
808     /**
809      * Not implemented.
810      *
811      * A method in ServletContext interface that is not implemented and will
812      * throw <code>UnsuportedOperationException</code> upon invocation
813      */
814     @Override
815     public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes)
816     {
817         throw new UnsupportedOperationException();
818     }
819 
820     /**
821      * Not implemented.
822      *
823      * A method in ServletContext interface that is not implemented and will
824      * throw <code>UnsuportedOperationException</code> upon invocation
825      */
826     @Override
827     public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
828     {
829         throw new UnsupportedOperationException();
830     }
831 
832     /**
833      * Not implemented.
834      *
835      * A method in ServletContext interface that is not implemented and will
836      * throw <code>UnsuportedOperationException</code> upon invocation
837      */
838     @Override
839     public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
840     {
841         throw new UnsupportedOperationException();
842     }
843 
844     /**
845      * Not implemented.
846      *
847      * A method in ServletContext interface that is not implemented and will
848      * throw <code>UnsuportedOperationException</code> upon invocation
849      */
850     @Override
851     public void addListener(String className)
852     {
853         throw new UnsupportedOperationException();
854     }
855 
856     /**
857      * Not implemented.
858      *
859      * A method in ServletContext interface that is not implemented and will
860      * throw <code>UnsuportedOperationException</code> upon invocation
861      */
862     @Override
863     public <T extends EventListener> void addListener(T t)
864     {
865         throw new UnsupportedOperationException();
866     }
867 
868     /**
869      * Not implemented.
870      *
871      * A method in ServletContext interface that is not implemented and will
872      * throw <code>UnsuportedOperationException</code> upon invocation
873      */
874     @Override
875     public void addListener(Class<? extends EventListener> listenerClass)
876     {
877         throw new UnsupportedOperationException();
878     }
879 
880     /**
881      * Not implemented.
882      *
883      * A method in ServletContext interface that is not implemented and will
884      * throw <code>UnsuportedOperationException</code> upon invocation
885      */
886     @Override
887     public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException
888     {
889         throw new UnsupportedOperationException();
890     }
891 
892     /**
893      * Not implemented.
894      *
895      * A method in ServletContext interface that is not implemented and will
896      * throw <code>UnsuportedOperationException</code> upon invocation
897      */
898     @Override
899     public JspConfigDescriptor getJspConfigDescriptor()
900     {
901         throw new UnsupportedOperationException();
902     }
903 
904     /**
905      * Not implemented.
906      *
907      * A method in ServletContext interface that is not implemented and will
908      * throw <code>UnsuportedOperationException</code> upon invocation
909      */
910     @Override
911     public ClassLoader getClassLoader()
912     {
913         throw new UnsupportedOperationException();
914     }
915 
916     /**
917      * Not implemented.
918      *
919      * A method in ServletContext interface that is not implemented and will
920      * throw <code>UnsuportedOperationException</code> upon invocation
921      */
922     @Override
923     public void declareRoles(String... roleNames)
924     {
925         throw new UnsupportedOperationException();
926     }
927 
928     /**
929      * Not implemented.
930      *
931      * A method in ServletContext interface that is not implemented and will
932      * throw <code>UnsuportedOperationException</code> upon invocation
933      */
934     @Override
935     public String getVirtualServerName()
936     {
937         throw new UnsupportedOperationException();
938     }
939 
940 }