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 }