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: TurbineConfig.java 1854688 2019-03-03 10:36:42Z tv $
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      * @param path The web application root (i.e. the path for file lookup).
184      * @param properties the relative path to TurbineResources.properties file
185      */
186     public TurbineConfig(String path, String properties)
187     {
188         this(path, new HashMap<String, String>(1));
189         initParams.put(PROPERTIES_PATH_KEY, properties);
190     }
191 
192     /**
193      * Causes this class to initialize itself which in turn initializes
194      * all of the Turbine Services that need to be initialized.
195      */
196     @Override
197     public void initialize()
198     {
199         try
200         {
201             turbine = new Turbine();
202             turbine.init(this);
203         }
204         catch (Exception e)
205         {
206             log.error("TurbineConfig: Initialization failed", e);
207         }
208     }
209 
210     /**
211      * Initialization requiring a HTTP <code>GET</code> request.
212      * @param data the Turbine request
213      */
214     public void init(RunData data)
215     {
216         if (turbine != null)
217         {
218             turbine.init(data);
219         }
220     }
221 
222     /**
223      * Shutdown the Turbine System, lifecycle style
224      *
225      */
226     @Override
227     public void dispose()
228     {
229         if (turbine != null)
230         {
231             turbine.destroy();
232         }
233     }
234 
235     /**
236      * Returns a reference to the Turbine servlet that was initialized.
237      *
238      * @return a ServletContext reference
239      */
240     public Turbine getTurbine()
241     {
242         return turbine;
243     }
244 
245     /**
246      * Returns a reference to the object cast onto ServletContext type.
247      *
248      * @return a ServletContext reference
249      */
250     @Override
251     public ServletContext getServletContext()
252     {
253         return this;
254     }
255 
256     /**
257      * Translates a path relative to the web application root into an
258      * absolute path.
259      *
260      * @param path A path relative to the web application root.
261      * @return An absolute version of the supplied path, or <code>null</code>
262      * if the translated path doesn't map to a file or directory.
263      */
264     @Override
265     public String getRealPath(String path)
266     {
267         String result = null;
268         File f = new File(root, path);
269 
270         if (log.isDebugEnabled())
271         {
272             log.debug("TurbineConfig.getRealPath: path '{}' translated to '{}' {}found",
273                     path, f.getPath(), f.exists() ? "" : "not ");
274         }
275 
276         if (f.exists())
277         {
278           result = f.getPath();
279         }
280         else
281         {
282             log.error("getRealPath(\"{}\") is undefined, returning null", path);
283         }
284 
285         return result;
286     }
287 
288     /**
289      * Retrieves an initialization parameter.
290      *
291      * @param name the name of the parameter.
292      * @return the value of the parameter.
293      */
294     @Override
295     public String getInitParameter(String name)
296     {
297         return initParams.get(name);
298     }
299 
300     /**
301      * Retrieves an Enumeration of initialization parameter names.
302      *
303      * @return an Enumeration of initialization parameter names.
304      */
305     @Override
306     public Enumeration<String> getInitParameterNames()
307     {
308         return new Vector<String>(initParams.keySet()).elements();
309     }
310 
311     /**
312      * Returns the servlet name.
313      *
314      * Fixed value "Turbine" is returned.
315      *
316      * @return the servlet name.
317      */
318     @Override
319     public String getServletName()
320     {
321         return "Turbine";
322     }
323 
324     /**
325      * Returns the context name.
326      *
327      * Fixed value "Turbine" is returned
328      *
329      * @return the context name
330      */
331     @Override
332     public String getServletContextName()
333     {
334         return "Turbine";
335     }
336 
337     /**
338      * Returns the context path.
339      *
340      * Fixed value "/turbine" is returned
341      *
342      * @return the context path
343      */
344     @Override
345     public String getContextPath()
346     {
347         return "/turbine";
348 	}
349 
350 	/**
351      * Returns a URL to the resource that is mapped to a specified
352      * path. The path must begin with a "/" and is interpreted
353      * as relative to the current context root.
354      *
355      * @param s the path to the resource
356      * @return a URL pointing to the resource
357      * @throws MalformedURLException if unable to parse path
358      */
359     @Override
360     public URL getResource(String s)
361             throws MalformedURLException
362     {
363         return new URL("file://" + getRealPath(s));
364     }
365 
366     /**
367      * Returns the resource located at the named path as
368      * an <code>InputStream</code> object.
369      *
370      * @param s the path to the resource
371      * @return an InputStream object from which the resource can be read
372      */
373     @Override
374     public InputStream getResourceAsStream(String s)
375     {
376         try
377         {
378             FileInputStream fis = new FileInputStream(getRealPath(s));
379             return new BufferedInputStream(fis);
380         }
381         catch (FileNotFoundException e)
382         {
383             return null;
384         }
385     }
386 
387     /**
388      * Logs an error message.
389      *
390      * @param e an Exception.
391      * @param m a message.
392      * @deprecated use log(String,Throwable) instead
393      */
394     @Override
395     @Deprecated
396     public void log(Exception e, String m)
397     {
398         log.info(m, e);
399     }
400 
401     /**
402      * Logs a message.
403      *
404      * @param m a message.
405      */
406     @Override
407     public void log(String m)
408     {
409         log.info(m);
410     }
411 
412     /**
413      * Logs an error message.
414      *
415      * @param t a Throwable object.
416      * @param m a message.
417      */
418     @Override
419     public void log(String m, Throwable t)
420     {
421         log.info(m, t);
422     }
423 
424     /**
425      * Returns the servlet container attribute with the given name, or
426      * null if there is no attribute by that name.
427      */
428     @Override
429     public Object getAttribute(String s)
430     {
431         return attributes.get(s);
432     }
433 
434     /**
435      * Returns an Enumeration containing the attribute names available
436      * within this servlet context.
437      */
438     @Override
439     public Enumeration<String> getAttributeNames()
440     {
441         return new Vector<String>(attributes.keySet()).elements();
442     }
443 
444     // Unimplemented methods follow
445 
446     /**
447      * Not implemented.
448      *
449      * A method in ServletConfig or ServletContext interface that is not
450      * implemented and will throw <code>UnsuportedOperationException</code>
451      * upon invocation
452      */
453     @Override
454     public ServletContext getContext(String s)
455     {
456         throw new UnsupportedOperationException();
457     }
458 
459     /**
460      * Not implemented.
461      *
462      * A method in ServletConfig or ServletContext interface that is not
463      * implemented and will throw <code>UnsuportedOperationException</code>
464      * upon invocation
465      */
466     @Override
467     public int getMajorVersion()
468     {
469         throw new UnsupportedOperationException();
470     }
471 
472     /**
473      * Not implemented.
474      *
475      * A method in ServletConfig or ServletContext interface that is not
476      * implemented and will throw <code>UnsuportedOperationException</code>
477      * upon invocation
478      */
479     @Override
480     public String getMimeType(String s)
481     {
482         throw new UnsupportedOperationException();
483     }
484 
485     /**
486      * Not implemented.
487      *
488      * A method in ServletConfig or ServletContext interface that is not
489      * implemented and will throw <code>UnsuportedOperationException</code>
490      * upon invocation
491      */
492     @Override
493     public int getMinorVersion()
494     {
495         throw new UnsupportedOperationException();
496     }
497 
498     /**
499      * Not implemented.
500      *
501      * A method in ServletConfig or ServletContext interface that is not
502      * implemented and will throw <code>UnsuportedOperationException</code>
503      * upon invocation
504      */
505     @Override
506     public RequestDispatcher getNamedDispatcher(String s)
507     {
508         throw new UnsupportedOperationException();
509     }
510 
511     /**
512      * Not implemented.
513      *
514      * A method in ServletConfig or ServletContext interface that is not
515      * implemented and will throw <code>UnsuportedOperationException</code>
516      * upon invocation
517      */
518     @Override
519     public RequestDispatcher getRequestDispatcher(String s)
520     {
521         throw new UnsupportedOperationException();
522     }
523 
524     /**
525      * Not implemented.
526      *
527      * A method in ServletContext (2.3) interface that is not implemented and
528      * will throw <code>UnsuportedOperationException</code> upon invocation
529      */
530     @Override
531     public Set<String> getResourcePaths(String s)
532     {
533         throw new UnsupportedOperationException();
534     }
535 
536     /**
537      * Not implemented.
538      *
539      * A method in ServletContext (2.3) interface that is not implemented and
540      * will throw <code>UnsuportedOperationException</code> upon invocation
541      */
542     @Override
543     public String getServerInfo()
544     {
545         throw new UnsupportedOperationException();
546     }
547 
548     /**
549      * Not implemented.
550      *
551      * A method in ServletContext interface that is not implemented and will
552      * throw <code>UnsuportedOperationException</code> upon invocation
553      * @deprecated As of Java Servlet API 2.1, with no direct replacement.
554      */
555     @Override
556     @Deprecated
557     public Servlet getServlet(String s)
558     {
559         throw new UnsupportedOperationException();
560     }
561 
562     /**
563      * Not implemented.
564      *
565      * A method in ServletContext interface that is not implemented and will
566      * throw <code>UnsuportedOperationException</code> upon invocation
567      * @deprecated As of Java Servlet API 2.1, with no replacement.
568      */
569     @Override
570     @Deprecated
571     public Enumeration<String> getServletNames()
572     {
573         throw new UnsupportedOperationException();
574     }
575 
576     /**
577      * Not implemented.
578      *
579      * A method in ServletContext interface that is not implemented and will
580      * throw <code>UnsuportedOperationException</code> upon invocation
581      * @deprecated As of Java Servlet API 2.0, with no replacement.
582      */
583     @Override
584     @Deprecated
585     public Enumeration<Servlet> getServlets()
586     {
587         throw new UnsupportedOperationException();
588     }
589 
590     /**
591      * Not implemented.
592      *
593      * A method in ServletContext interface that is not implemented and will
594      * throw <code>UnsuportedOperationException</code> upon invocation
595      */
596     @Override
597     public void removeAttribute(String s)
598     {
599         throw new UnsupportedOperationException();
600     }
601 
602     /**
603      * Not implemented.
604      *
605      * A method in ServletContext interface that is not implemented and will
606      * throw <code>UnsuportedOperationException</code> upon invocation
607      */
608     @Override
609     public void setAttribute(String s, Object o)
610     {
611         throw new UnsupportedOperationException();
612     }
613 
614     /**
615      * Not implemented.
616      *
617      * A method in ServletContext interface that is not implemented and will
618      * throw <code>UnsuportedOperationException</code> upon invocation
619      */
620     @Override
621     public int getEffectiveMajorVersion()
622     {
623         throw new UnsupportedOperationException();
624     }
625 
626     /**
627      * Not implemented.
628      *
629      * A method in ServletContext interface that is not implemented and will
630      * throw <code>UnsuportedOperationException</code> upon invocation
631      */
632     @Override
633     public int getEffectiveMinorVersion()
634     {
635         throw new UnsupportedOperationException();
636     }
637 
638     /**
639      * Not implemented.
640      *
641      * A method in ServletContext interface that is not implemented and will
642      * throw <code>UnsuportedOperationException</code> upon invocation
643      */
644     @Override
645     public boolean setInitParameter(String name, String value)
646     {
647         throw new UnsupportedOperationException();
648     }
649 
650     /**
651      * Not implemented.
652      *
653      * A method in ServletContext interface that is not implemented and will
654      * throw <code>UnsuportedOperationException</code> upon invocation
655      */
656     @Override
657     public Dynamic addServlet(String servletName, String className)
658     {
659         throw new UnsupportedOperationException();
660     }
661 
662     /**
663      * Not implemented.
664      *
665      * A method in ServletContext interface that is not implemented and will
666      * throw <code>UnsuportedOperationException</code> upon invocation
667      */
668     @Override
669     public Dynamic addServlet(String servletName, Servlet servlet)
670     {
671         throw new UnsupportedOperationException();
672     }
673 
674     /**
675      * Not implemented.
676      *
677      * A method in ServletContext interface that is not implemented and will
678      * throw <code>UnsuportedOperationException</code> upon invocation
679      */
680     @Override
681     public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass)
682     {
683         throw new UnsupportedOperationException();
684     }
685 
686     /**
687      * Not implemented.
688      *
689      * A method in ServletContext interface that is not implemented and will
690      * throw <code>UnsuportedOperationException</code> upon invocation
691      */
692     @Override
693     public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException
694     {
695         throw new UnsupportedOperationException();
696     }
697 
698     /**
699      * Not implemented.
700      *
701      * A method in ServletContext interface that is not implemented and will
702      * throw <code>UnsuportedOperationException</code> upon invocation
703      */
704     @Override
705     public ServletRegistration getServletRegistration(String servletName)
706     {
707         throw new UnsupportedOperationException();
708     }
709 
710     /**
711      * Not implemented.
712      *
713      * A method in ServletContext interface that is not implemented and will
714      * throw <code>UnsuportedOperationException</code> upon invocation
715      */
716     @Override
717     public Map<String, ? extends ServletRegistration> getServletRegistrations()
718     {
719         throw new UnsupportedOperationException();
720     }
721 
722     /**
723      * Not implemented.
724      *
725      * A method in ServletContext interface that is not implemented and will
726      * throw <code>UnsuportedOperationException</code> upon invocation
727      */
728     @Override
729     public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className)
730     {
731         throw new UnsupportedOperationException();
732     }
733 
734     /**
735      * Not implemented.
736      *
737      * A method in ServletContext interface that is not implemented and will
738      * throw <code>UnsuportedOperationException</code> upon invocation
739      */
740     @Override
741     public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter)
742     {
743         throw new UnsupportedOperationException();
744     }
745 
746     /**
747      * Not implemented.
748      *
749      * A method in ServletContext interface that is not implemented and will
750      * throw <code>UnsuportedOperationException</code> upon invocation
751      */
752     @Override
753     public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass)
754     {
755         throw new UnsupportedOperationException();
756     }
757 
758     /**
759      * Not implemented.
760      *
761      * A method in ServletContext interface that is not implemented and will
762      * throw <code>UnsuportedOperationException</code> upon invocation
763      */
764     @Override
765     public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException
766     {
767         throw new UnsupportedOperationException();
768     }
769 
770     /**
771      * Not implemented.
772      *
773      * A method in ServletContext interface that is not implemented and will
774      * throw <code>UnsuportedOperationException</code> upon invocation
775      */
776     @Override
777     public FilterRegistration getFilterRegistration(String filterName)
778     {
779         throw new UnsupportedOperationException();
780     }
781 
782     /**
783      * Not implemented.
784      *
785      * A method in ServletContext interface that is not implemented and will
786      * throw <code>UnsuportedOperationException</code> upon invocation
787      */
788     @Override
789     public Map<String, ? extends FilterRegistration> getFilterRegistrations()
790     {
791         throw new UnsupportedOperationException();
792     }
793 
794     /**
795      * Not implemented.
796      *
797      * A method in ServletContext interface that is not implemented and will
798      * throw <code>UnsuportedOperationException</code> upon invocation
799      */
800     @Override
801     public SessionCookieConfig getSessionCookieConfig()
802     {
803         throw new UnsupportedOperationException();
804     }
805 
806     /**
807      * Not implemented.
808      *
809      * A method in ServletContext interface that is not implemented and will
810      * throw <code>UnsuportedOperationException</code> upon invocation
811      */
812     @Override
813     public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes)
814     {
815         throw new UnsupportedOperationException();
816     }
817 
818     /**
819      * Not implemented.
820      *
821      * A method in ServletContext interface that is not implemented and will
822      * throw <code>UnsuportedOperationException</code> upon invocation
823      */
824     @Override
825     public Set<SessionTrackingMode> getDefaultSessionTrackingModes()
826     {
827         throw new UnsupportedOperationException();
828     }
829 
830     /**
831      * Not implemented.
832      *
833      * A method in ServletContext interface that is not implemented and will
834      * throw <code>UnsuportedOperationException</code> upon invocation
835      */
836     @Override
837     public Set<SessionTrackingMode> getEffectiveSessionTrackingModes()
838     {
839         throw new UnsupportedOperationException();
840     }
841 
842     /**
843      * Not implemented.
844      *
845      * A method in ServletContext interface that is not implemented and will
846      * throw <code>UnsuportedOperationException</code> upon invocation
847      */
848     @Override
849     public void addListener(String className)
850     {
851         throw new UnsupportedOperationException();
852     }
853 
854     /**
855      * Not implemented.
856      *
857      * A method in ServletContext interface that is not implemented and will
858      * throw <code>UnsuportedOperationException</code> upon invocation
859      */
860     @Override
861     public <T extends EventListener> void addListener(T t)
862     {
863         throw new UnsupportedOperationException();
864     }
865 
866     /**
867      * Not implemented.
868      *
869      * A method in ServletContext interface that is not implemented and will
870      * throw <code>UnsuportedOperationException</code> upon invocation
871      */
872     @Override
873     public void addListener(Class<? extends EventListener> listenerClass)
874     {
875         throw new UnsupportedOperationException();
876     }
877 
878     /**
879      * Not implemented.
880      *
881      * A method in ServletContext interface that is not implemented and will
882      * throw <code>UnsuportedOperationException</code> upon invocation
883      */
884     @Override
885     public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException
886     {
887         throw new UnsupportedOperationException();
888     }
889 
890     /**
891      * Not implemented.
892      *
893      * A method in ServletContext interface that is not implemented and will
894      * throw <code>UnsuportedOperationException</code> upon invocation
895      */
896     @Override
897     public JspConfigDescriptor getJspConfigDescriptor()
898     {
899         throw new UnsupportedOperationException();
900     }
901 
902     /**
903      * Not implemented.
904      *
905      * A method in ServletContext interface that is not implemented and will
906      * throw <code>UnsuportedOperationException</code> upon invocation
907      */
908     @Override
909     public ClassLoader getClassLoader()
910     {
911         throw new UnsupportedOperationException();
912     }
913 
914     /**
915      * Not implemented.
916      *
917      * A method in ServletContext interface that is not implemented and will
918      * throw <code>UnsuportedOperationException</code> upon invocation
919      */
920     @Override
921     public void declareRoles(String... roleNames)
922     {
923         throw new UnsupportedOperationException();
924     }
925 
926     /**
927      * Not implemented.
928      *
929      * A method in ServletContext interface that is not implemented and will
930      * throw <code>UnsuportedOperationException</code> upon invocation
931      */
932     @Override
933     public String getVirtualServerName()
934     {
935         throw new UnsupportedOperationException();
936     }
937 
938 }