1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.webapp;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.net.MalformedURLException;
24 import java.net.URL;
25 import java.security.PermissionCollection;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.Collection;
29 import java.util.Collections;
30 import java.util.EventListener;
31 import java.util.HashMap;
32 import java.util.HashSet;
33 import java.util.List;
34 import java.util.ListIterator;
35 import java.util.Map;
36 import java.util.Set;
37
38 import javax.servlet.ServletContext;
39 import javax.servlet.ServletRegistration.Dynamic;
40 import javax.servlet.ServletSecurityElement;
41 import javax.servlet.http.HttpSessionActivationListener;
42 import javax.servlet.http.HttpSessionAttributeListener;
43 import javax.servlet.http.HttpSessionBindingListener;
44 import javax.servlet.http.HttpSessionListener;
45
46 import org.eclipse.jetty.security.ConstraintAware;
47 import org.eclipse.jetty.security.ConstraintMapping;
48 import org.eclipse.jetty.security.ConstraintSecurityHandler;
49 import org.eclipse.jetty.security.SecurityHandler;
50 import org.eclipse.jetty.server.Connector;
51 import org.eclipse.jetty.server.HandlerContainer;
52 import org.eclipse.jetty.server.Server;
53 import org.eclipse.jetty.server.handler.ContextHandler;
54 import org.eclipse.jetty.server.handler.ErrorHandler;
55 import org.eclipse.jetty.server.session.SessionHandler;
56 import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
57 import org.eclipse.jetty.servlet.ServletContextHandler;
58 import org.eclipse.jetty.servlet.ServletHandler;
59 import org.eclipse.jetty.util.Loader;
60 import org.eclipse.jetty.util.MultiException;
61 import org.eclipse.jetty.util.URIUtil;
62 import org.eclipse.jetty.util.annotation.ManagedAttribute;
63 import org.eclipse.jetty.util.annotation.ManagedObject;
64 import org.eclipse.jetty.util.annotation.Name;
65 import org.eclipse.jetty.util.log.Log;
66 import org.eclipse.jetty.util.log.Logger;
67 import org.eclipse.jetty.util.resource.Resource;
68 import org.eclipse.jetty.util.resource.ResourceCollection;
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 @ManagedObject("Web Application ContextHandler")
84 public class WebAppContext extends ServletContextHandler implements WebAppClassLoader.Context
85 {
86 private static final Logger LOG = Log.getLogger(WebAppContext.class);
87
88 public static final String TEMPDIR = "javax.servlet.context.tempdir";
89 public static final String BASETEMPDIR = "org.eclipse.jetty.webapp.basetempdir";
90 public final static String WEB_DEFAULTS_XML="org/eclipse/jetty/webapp/webdefault.xml";
91 public final static String ERROR_PAGE="org.eclipse.jetty.server.error_page";
92 public final static String SERVER_SYS_CLASSES = "org.eclipse.jetty.webapp.systemClasses";
93 public final static String SERVER_SRV_CLASSES = "org.eclipse.jetty.webapp.serverClasses";
94
95 private String[] __dftProtectedTargets = {"/web-inf", "/meta-inf"};
96
97 public static final String[] DEFAULT_CONFIGURATION_CLASSES =
98 {
99 "org.eclipse.jetty.webapp.WebInfConfiguration",
100 "org.eclipse.jetty.webapp.WebXmlConfiguration",
101 "org.eclipse.jetty.webapp.MetaInfConfiguration",
102 "org.eclipse.jetty.webapp.FragmentConfiguration",
103 "org.eclipse.jetty.webapp.JettyWebXmlConfiguration"
104 } ;
105
106
107
108
109 public final static String[] __dftSystemClasses =
110 {
111 "java.",
112 "javax.",
113 "org.xml.",
114 "org.w3c.",
115 "org.eclipse.jetty.continuation.",
116 "org.eclipse.jetty.jndi.",
117 "org.eclipse.jetty.jaas.",
118 "org.eclipse.jetty.websocket.",
119 "org.eclipse.jetty.servlet.DefaultServlet"
120 } ;
121
122
123
124
125
126 public final static String[] __dftServerClasses =
127 {
128 "-org.eclipse.jetty.continuation.",
129 "-org.eclipse.jetty.jndi.",
130 "-org.eclipse.jetty.jaas.",
131 "-org.eclipse.jetty.servlets.",
132 "-org.eclipse.jetty.servlet.DefaultServlet",
133 "-org.eclipse.jetty.servlet.listener.",
134 "-org.eclipse.jetty.websocket.",
135 "org.eclipse.jetty."
136 } ;
137
138 private final List<String> _configurationClasses = new ArrayList<>();
139 private ClasspathPattern _systemClasses = null;
140 private ClasspathPattern _serverClasses = null;
141
142 private final List<Configuration> _configurations = new ArrayList<>();
143 private String _defaultsDescriptor=WEB_DEFAULTS_XML;
144 private String _descriptor=null;
145 private final List<String> _overrideDescriptors = new ArrayList<>();
146 private boolean _distributable=false;
147 private boolean _extractWAR=true;
148 private boolean _copyDir=false;
149 private boolean _copyWebInf=false;
150 private boolean _logUrlOnStart =false;
151 private boolean _parentLoaderPriority= Boolean.getBoolean("org.eclipse.jetty.server.webapp.parentLoaderPriority");
152 private PermissionCollection _permissions;
153
154 private String[] _contextWhiteList = null;
155
156 private File _tmpDir;
157 private String _war;
158 private String _extraClasspath;
159 private Throwable _unavailableException;
160
161 private Map<String, String> _resourceAliases;
162 private boolean _ownClassLoader=false;
163 private boolean _configurationDiscovered=true;
164 private boolean _allowDuplicateFragmentNames = false;
165 private boolean _throwUnavailableOnStartupException = false;
166
167
168
169 private MetaData _metadata=new MetaData();
170
171 public static WebAppContext getCurrentWebAppContext()
172 {
173 ContextHandler.Context context=ContextHandler.getCurrentContext();
174 if (context!=null)
175 {
176 ContextHandler handler = context.getContextHandler();
177 if (handler instanceof WebAppContext)
178 return (WebAppContext)handler;
179 }
180 return null;
181 }
182
183
184 public WebAppContext()
185 {
186 this(null,null,null,null,null,new ErrorPageErrorHandler(),SESSIONS|SECURITY);
187 }
188
189
190
191
192
193
194 public WebAppContext(String webApp,String contextPath)
195 {
196 this(null,contextPath,null,null,null,new ErrorPageErrorHandler(),SESSIONS|SECURITY);
197 setWar(webApp);
198 }
199
200
201
202
203
204
205
206 public WebAppContext(HandlerContainer parent, String webApp, String contextPath)
207 {
208 this(parent,contextPath,null,null,null,new ErrorPageErrorHandler(),SESSIONS|SECURITY);
209 setWar(webApp);
210 }
211
212
213
214
215
216
217
218
219
220
221
222 public WebAppContext(SessionHandler sessionHandler, SecurityHandler securityHandler, ServletHandler servletHandler, ErrorHandler errorHandler)
223 {
224 this(null, null, sessionHandler, securityHandler, servletHandler, errorHandler,0);
225 }
226
227
228
229
230
231
232
233
234
235
236 public WebAppContext(HandlerContainer parent, String contextPath, SessionHandler sessionHandler, SecurityHandler securityHandler, ServletHandler servletHandler, ErrorHandler errorHandler,int options)
237 {
238 super(parent, contextPath,sessionHandler, securityHandler, servletHandler, errorHandler,options);
239 _scontext = new Context();
240 setErrorHandler(errorHandler != null ? errorHandler : new ErrorPageErrorHandler());
241 setProtectedTargets(__dftProtectedTargets);
242 }
243
244
245
246
247
248 @Override
249 public void setDisplayName(String servletContextName)
250 {
251 super.setDisplayName(servletContextName);
252 ClassLoader cl = getClassLoader();
253 if (cl!=null && cl instanceof WebAppClassLoader && servletContextName!=null)
254 ((WebAppClassLoader)cl).setName(servletContextName);
255 }
256
257
258
259
260
261 public Throwable getUnavailableException()
262 {
263 return _unavailableException;
264 }
265
266
267
268
269
270
271
272
273
274
275 public void setResourceAlias(String alias, String uri)
276 {
277 if (_resourceAliases == null)
278 _resourceAliases= new HashMap<String, String>(5);
279 _resourceAliases.put(alias, uri);
280 }
281
282
283 public Map<String, String> getResourceAliases()
284 {
285 if (_resourceAliases == null)
286 return null;
287 return _resourceAliases;
288 }
289
290
291 public void setResourceAliases(Map<String, String> map)
292 {
293 _resourceAliases = map;
294 }
295
296
297 public String getResourceAlias(String path)
298 {
299 if (_resourceAliases == null)
300 return null;
301 String alias = _resourceAliases.get(path);
302
303 int slash=path.length();
304 while (alias==null)
305 {
306 slash=path.lastIndexOf("/",slash-1);
307 if (slash<0)
308 break;
309 String match=_resourceAliases.get(path.substring(0,slash+1));
310 if (match!=null)
311 alias=match+path.substring(slash+1);
312 }
313 return alias;
314 }
315
316
317 public String removeResourceAlias(String alias)
318 {
319 if (_resourceAliases == null)
320 return null;
321 return _resourceAliases.remove(alias);
322 }
323
324
325
326
327
328 @Override
329 public void setClassLoader(ClassLoader classLoader)
330 {
331 super.setClassLoader(classLoader);
332
333
334
335
336
337
338 if (classLoader!=null && classLoader instanceof WebAppClassLoader && getDisplayName()!=null)
339 ((WebAppClassLoader)classLoader).setName(getDisplayName());
340 }
341
342
343 @Override
344 public Resource getResource(String uriInContext) throws MalformedURLException
345 {
346 if (uriInContext==null || !uriInContext.startsWith(URIUtil.SLASH))
347 throw new MalformedURLException(uriInContext);
348
349 IOException ioe= null;
350 Resource resource= null;
351 int loop=0;
352 while (uriInContext!=null && loop++<100)
353 {
354 try
355 {
356 resource= super.getResource(uriInContext);
357 if (resource != null && resource.exists())
358 return resource;
359
360 uriInContext = getResourceAlias(uriInContext);
361 }
362 catch (IOException e)
363 {
364 LOG.ignore(e);
365 if (ioe==null)
366 ioe= e;
367 }
368 }
369
370 if (ioe != null && ioe instanceof MalformedURLException)
371 throw (MalformedURLException)ioe;
372
373 return resource;
374 }
375
376
377
378
379
380
381
382 public boolean isConfigurationDiscovered()
383 {
384 return _configurationDiscovered;
385 }
386
387
388
389
390
391
392
393
394
395
396
397 public void setConfigurationDiscovered(boolean discovered)
398 {
399 _configurationDiscovered = discovered;
400 }
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417 public void preConfigure() throws Exception
418 {
419
420 loadConfigurations();
421
422
423 loadSystemClasses();
424
425
426 loadServerClasses();
427
428
429 _ownClassLoader=false;
430 if (getClassLoader()==null)
431 {
432 WebAppClassLoader classLoader = new WebAppClassLoader(this);
433 setClassLoader(classLoader);
434 _ownClassLoader=true;
435 }
436
437 if (LOG.isDebugEnabled())
438 {
439 ClassLoader loader = getClassLoader();
440 LOG.debug("Thread Context classloader {}",loader);
441 loader=loader.getParent();
442 while(loader!=null)
443 {
444 LOG.debug("Parent class loader: {} ",loader);
445 loader=loader.getParent();
446 }
447 }
448
449
450 for (Configuration configuration : _configurations)
451 {
452 LOG.debug("preConfigure {} with {}",this,configuration);
453 configuration.preConfigure(this);
454 }
455 }
456
457
458 public void configure() throws Exception
459 {
460
461 for (Configuration configuration : _configurations)
462 {
463 LOG.debug("configure {} with {}",this,configuration);
464 configuration.configure(this);
465 }
466 }
467
468
469 public void postConfigure() throws Exception
470 {
471
472 for (Configuration configuration : _configurations)
473 {
474 LOG.debug("postConfigure {} with {}",this,configuration);
475 configuration.postConfigure(this);
476 }
477 }
478
479
480
481
482
483 @Override
484 protected void doStart() throws Exception
485 {
486 try
487 {
488 _metadata.setAllowDuplicateFragmentNames(isAllowDuplicateFragmentNames());
489 preConfigure();
490 super.doStart();
491 postConfigure();
492
493 if (isLogUrlOnStart())
494 dumpUrl();
495 }
496 catch (Exception e)
497 {
498
499 LOG.warn("Failed startup of context "+this, e);
500 _unavailableException=e;
501 setAvailable(false);
502 if (isThrowUnavailableOnStartupException())
503 throw e;
504 }
505 }
506
507
508
509
510
511 @Override
512 protected void doStop() throws Exception
513 {
514 super.doStop();
515
516 try
517 {
518 for (int i=_configurations.size();i-->0;)
519 _configurations.get(i).deconfigure(this);
520
521 if (_metadata != null)
522 _metadata.clear();
523 _metadata=new MetaData();
524
525 }
526 finally
527 {
528 if (_ownClassLoader)
529 setClassLoader(null);
530
531 setAvailable(true);
532 _unavailableException=null;
533 }
534 }
535
536
537 @Override
538 public void destroy()
539 {
540
541 MultiException mx=new MultiException();
542 if (_configurations!=null)
543 {
544 for (int i=_configurations.size();i-->0;)
545 {
546 try
547 {
548 _configurations.get(i).destroy(this);
549 }
550 catch(Exception e)
551 {
552 mx.add(e);
553 }
554 }
555 }
556 _configurations.clear();
557 super.destroy();
558 mx.ifExceptionThrowRuntime();
559 }
560
561
562
563
564
565
566 private void dumpUrl()
567 {
568 Connector[] connectors = getServer().getConnectors();
569 for (int i=0;i<connectors.length;i++)
570 {
571 String displayName = getDisplayName();
572 if (displayName == null)
573 displayName = "WebApp@"+connectors.hashCode();
574
575 LOG.info(displayName + " at http://" + connectors[i].toString() + getContextPath());
576 }
577 }
578
579
580
581
582
583 @ManagedAttribute(value="configuration classes used to configure webapp", readonly=true)
584 public String[] getConfigurationClasses()
585 {
586 return _configurationClasses.toArray(new String[_configurationClasses.size()]);
587 }
588
589
590
591
592
593 public Configuration[] getConfigurations()
594 {
595 return _configurations.toArray(new Configuration[_configurations.size()]);
596 }
597
598
599
600
601
602
603 @ManagedAttribute(value="default web.xml deascriptor applied before standard web.xml", readonly=true)
604 public String getDefaultsDescriptor()
605 {
606 return _defaultsDescriptor;
607 }
608
609
610
611
612
613
614 public String getOverrideDescriptor()
615 {
616 if (_overrideDescriptors.size()!=1)
617 return null;
618 return _overrideDescriptors.get(0);
619 }
620
621
622
623
624
625
626 @ManagedAttribute(value="web.xml deascriptors applied after standard web.xml", readonly=true)
627 public List<String> getOverrideDescriptors()
628 {
629 return Collections.unmodifiableList(_overrideDescriptors);
630 }
631
632
633
634
635
636 @Override
637 public PermissionCollection getPermissions()
638 {
639 return _permissions;
640 }
641
642
643
644
645
646
647 @ManagedAttribute(value="classes and packages hidden by the context classloader", readonly=true)
648 public String[] getServerClasses()
649 {
650 if (_serverClasses == null)
651 loadServerClasses();
652
653 return _serverClasses.getPatterns();
654 }
655
656
657
658
659
660
661
662
663
664
665
666 public void addServerClass(String classOrPackage)
667 {
668 if (_serverClasses == null)
669 loadServerClasses();
670
671 _serverClasses.addPattern(classOrPackage);
672 }
673
674
675
676
677
678
679
680
681
682
683
684 public void prependServerClass(String classOrPackage)
685 {
686 if (_serverClasses == null)
687 loadServerClasses();
688
689 _serverClasses.prependPattern(classOrPackage);
690 }
691
692
693
694
695
696
697 @ManagedAttribute(value="classes and packages given priority by context classloader", readonly=true)
698 public String[] getSystemClasses()
699 {
700 if (_systemClasses == null)
701 loadSystemClasses();
702
703 return _systemClasses.getPatterns();
704 }
705
706
707
708
709
710
711
712
713
714
715
716 public void addSystemClass(String classOrPackage)
717 {
718 if (_systemClasses == null)
719 loadSystemClasses();
720
721 _systemClasses.addPattern(classOrPackage);
722 }
723
724
725
726
727
728
729
730
731
732
733
734
735 public void prependSystemClass(String classOrPackage)
736 {
737 if (_systemClasses == null)
738 loadSystemClasses();
739
740 _systemClasses.prependPattern(classOrPackage);
741 }
742
743
744 @Override
745 public boolean isServerClass(String name)
746 {
747 if (_serverClasses == null)
748 loadServerClasses();
749
750 return _serverClasses.match(name);
751 }
752
753
754 @Override
755 public boolean isSystemClass(String name)
756 {
757 if (_systemClasses == null)
758 loadSystemClasses();
759
760 return _systemClasses.match(name);
761 }
762
763
764 protected void loadSystemClasses()
765 {
766 if (_systemClasses != null)
767 return;
768
769
770
771 Server server = getServer();
772 if (server != null)
773 {
774 Object systemClasses = server.getAttribute(SERVER_SYS_CLASSES);
775 if (systemClasses != null && systemClasses instanceof String[])
776 _systemClasses = new ClasspathPattern((String[])systemClasses);
777 }
778
779 if (_systemClasses == null)
780 _systemClasses = new ClasspathPattern(__dftSystemClasses);
781 }
782
783
784 private void loadServerClasses()
785 {
786 if (_serverClasses != null)
787 {
788 return;
789 }
790
791
792
793 Server server = getServer();
794 if (server != null)
795 {
796 Object serverClasses = server.getAttribute(SERVER_SRV_CLASSES);
797 if (serverClasses != null && serverClasses instanceof String[])
798 {
799 _serverClasses = new ClasspathPattern((String[])serverClasses);
800 }
801 }
802
803 if (_serverClasses == null)
804 {
805 _serverClasses = new ClasspathPattern(__dftServerClasses);
806 }
807 }
808
809
810
811
812
813 @ManagedAttribute(value="war file location", readonly=true)
814 public String getWar()
815 {
816 if (_war==null)
817 _war=getResourceBase();
818 return _war;
819 }
820
821
822 public Resource getWebInf() throws IOException
823 {
824 if (super.getBaseResource() == null)
825 return null;
826
827
828 Resource web_inf= super.getBaseResource().addPath("WEB-INF/");
829 if (!web_inf.exists() || !web_inf.isDirectory())
830 return null;
831
832 return web_inf;
833 }
834
835
836
837
838
839 @ManagedAttribute("web application distributable")
840 public boolean isDistributable()
841 {
842 return _distributable;
843 }
844
845
846
847
848
849 @ManagedAttribute(value="extract war", readonly=true)
850 public boolean isExtractWAR()
851 {
852 return _extractWAR;
853 }
854
855
856
857
858
859 @ManagedAttribute(value="webdir copied on deploy (allows hot replacement on windows)", readonly=true)
860 public boolean isCopyWebDir()
861 {
862 return _copyDir;
863 }
864
865
866
867
868
869 public boolean isCopyWebInf()
870 {
871 return _copyWebInf;
872 }
873
874
875
876
877
878
879
880
881
882 @Override
883 @ManagedAttribute(value="parent classloader given priority", readonly=true)
884 public boolean isParentLoaderPriority()
885 {
886 return _parentLoaderPriority;
887 }
888
889
890
891 public static String[] getDefaultConfigurationClasses ()
892 {
893 return DEFAULT_CONFIGURATION_CLASSES;
894 }
895
896
897 public String[] getDefaultServerClasses ()
898 {
899 return __dftServerClasses;
900 }
901
902
903 public String[] getDefaultSystemClasses ()
904 {
905 return __dftSystemClasses;
906 }
907
908
909 protected void loadConfigurations()
910 throws Exception
911 {
912
913 if (_configurations.size()>0)
914 return;
915
916 if (_configurationClasses.size()==0)
917 _configurationClasses.addAll(Configuration.ClassList.serverDefault(getServer()));
918 for (String configClass : _configurationClasses)
919 _configurations.add((Configuration)Loader.loadClass(this.getClass(), configClass).newInstance());
920 }
921
922
923 @Override
924 public String toString()
925 {
926 if (_war!=null)
927 {
928 String war=_war;
929 if (war.indexOf("/webapps/")>=0)
930 war=war.substring(war.indexOf("/webapps/")+8);
931 return super.toString()+"{"+war+"}";
932 }
933 return super.toString();
934 }
935
936
937
938
939
940
941 public void setConfigurationClasses(String[] configurations)
942 {
943 if (isRunning())
944 throw new IllegalStateException();
945 _configurationClasses.clear();
946 if (configurations!=null)
947 _configurationClasses.addAll(Arrays.asList(configurations));
948 _configurations.clear();
949 }
950
951 public void setConfigurationClasses(List<String> configurations)
952 {
953 setConfigurationClasses(configurations.toArray(new String[configurations.size()]));
954 }
955
956
957
958
959
960 public void setConfigurations(Configuration[] configurations)
961 {
962 if (isRunning())
963 throw new IllegalStateException();
964 _configurations.clear();
965 if (configurations!=null)
966 _configurations.addAll(Arrays.asList(configurations));
967 }
968
969
970
971
972
973
974 public void setDefaultsDescriptor(String defaultsDescriptor)
975 {
976 _defaultsDescriptor = defaultsDescriptor;
977 }
978
979
980
981
982
983
984 public void setOverrideDescriptor(String overrideDescriptor)
985 {
986 _overrideDescriptors.clear();
987 _overrideDescriptors.add(overrideDescriptor);
988 }
989
990
991
992
993
994
995 public void setOverrideDescriptors(List<String> overrideDescriptors)
996 {
997 _overrideDescriptors.clear();
998 _overrideDescriptors.addAll(overrideDescriptors);
999 }
1000
1001
1002
1003
1004
1005
1006 public void addOverrideDescriptor(String overrideDescriptor)
1007 {
1008 _overrideDescriptors.add(overrideDescriptor);
1009 }
1010
1011
1012
1013
1014
1015 @ManagedAttribute(value="standard web.xml descriptor", readonly=true)
1016 public String getDescriptor()
1017 {
1018 return _descriptor;
1019 }
1020
1021
1022
1023
1024
1025 public void setDescriptor(String descriptor)
1026 {
1027 _descriptor=descriptor;
1028 }
1029
1030
1031
1032
1033
1034 public void setDistributable(boolean distributable)
1035 {
1036 this._distributable = distributable;
1037 }
1038
1039
1040 @Override
1041 public void setEventListeners(EventListener[] eventListeners)
1042 {
1043 if (_sessionHandler!=null)
1044 _sessionHandler.clearEventListeners();
1045
1046 super.setEventListeners(eventListeners);
1047 }
1048
1049
1050
1051
1052
1053
1054 @Override
1055 public void addEventListener(EventListener listener)
1056 {
1057 super.addEventListener(listener);
1058 if ((listener instanceof HttpSessionActivationListener)
1059 || (listener instanceof HttpSessionAttributeListener)
1060 || (listener instanceof HttpSessionBindingListener)
1061 || (listener instanceof HttpSessionListener))
1062 {
1063 if (_sessionHandler!=null)
1064 _sessionHandler.addEventListener(listener);
1065 }
1066 }
1067
1068 @Override
1069 public void removeEventListener(EventListener listener)
1070 {
1071 super.removeEventListener(listener);
1072 if ((listener instanceof HttpSessionActivationListener)
1073 || (listener instanceof HttpSessionAttributeListener)
1074 || (listener instanceof HttpSessionBindingListener)
1075 || (listener instanceof HttpSessionListener))
1076 {
1077 if (_sessionHandler!=null)
1078 _sessionHandler.removeEventListener(listener);
1079 }
1080
1081 }
1082
1083
1084
1085
1086
1087
1088 public void setExtractWAR(boolean extractWAR)
1089 {
1090 _extractWAR = extractWAR;
1091 }
1092
1093
1094
1095
1096
1097 public void setCopyWebDir(boolean copy)
1098 {
1099 _copyDir = copy;
1100 }
1101
1102
1103
1104
1105
1106 public void setCopyWebInf(boolean copyWebInf)
1107 {
1108 _copyWebInf = copyWebInf;
1109 }
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119 public void setParentLoaderPriority(boolean java2compliant)
1120 {
1121 _parentLoaderPriority = java2compliant;
1122 }
1123
1124
1125
1126
1127
1128 public void setPermissions(PermissionCollection permissions)
1129 {
1130 _permissions = permissions;
1131 }
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142 public void setContextWhiteList(String[] contextWhiteList)
1143 {
1144 _contextWhiteList = contextWhiteList;
1145 }
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162 public void setServerClasses(String[] serverClasses)
1163 {
1164 _serverClasses = new ClasspathPattern(serverClasses);
1165 }
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182 public void setSystemClasses(String[] systemClasses)
1183 {
1184 _systemClasses = new ClasspathPattern(systemClasses);
1185 }
1186
1187
1188
1189
1190
1191
1192
1193 public void setTempDirectory(File dir)
1194 {
1195 if (isStarted())
1196 throw new IllegalStateException("Started");
1197
1198 if (dir!=null)
1199 {
1200 try{dir=new File(dir.getCanonicalPath());}
1201 catch (IOException e){LOG.warn(Log.EXCEPTION,e);}
1202 }
1203
1204 if (dir!=null && !dir.exists())
1205 {
1206 dir.mkdir();
1207 dir.deleteOnExit();
1208 }
1209
1210 if (dir!=null && ( !dir.exists() || !dir.isDirectory() || !dir.canWrite()))
1211 throw new IllegalArgumentException("Bad temp directory: "+dir);
1212
1213 try
1214 {
1215 if (dir!=null)
1216 dir=dir.getCanonicalFile();
1217 }
1218 catch(Exception e)
1219 {
1220 LOG.warn(e);
1221 }
1222 _tmpDir=dir;
1223 setAttribute(TEMPDIR,_tmpDir);
1224 }
1225
1226
1227 @ManagedAttribute(value="temporary directory location", readonly=true)
1228 public File getTempDirectory ()
1229 {
1230 return _tmpDir;
1231 }
1232
1233
1234
1235
1236
1237 public void setWar(String war)
1238 {
1239 _war = war;
1240 }
1241
1242
1243
1244
1245
1246
1247
1248 @Override
1249 @ManagedAttribute(value="extra classpath for context classloader", readonly=true)
1250 public String getExtraClasspath()
1251 {
1252 return _extraClasspath;
1253 }
1254
1255
1256
1257
1258
1259
1260
1261 public void setExtraClasspath(String extraClasspath)
1262 {
1263 _extraClasspath=extraClasspath;
1264 }
1265
1266
1267 public boolean isLogUrlOnStart()
1268 {
1269 return _logUrlOnStart;
1270 }
1271
1272
1273
1274
1275
1276
1277
1278 public void setLogUrlOnStart(boolean logOnStart)
1279 {
1280 this._logUrlOnStart = logOnStart;
1281 }
1282
1283
1284 @Override
1285 public void setServer(Server server)
1286 {
1287 super.setServer(server);
1288 }
1289
1290
1291 public boolean isAllowDuplicateFragmentNames()
1292 {
1293 return _allowDuplicateFragmentNames;
1294 }
1295
1296
1297 public void setAllowDuplicateFragmentNames(boolean allowDuplicateFragmentNames)
1298 {
1299 _allowDuplicateFragmentNames = allowDuplicateFragmentNames;
1300 }
1301
1302
1303 public void setThrowUnavailableOnStartupException (boolean throwIfStartupException) {
1304 _throwUnavailableOnStartupException = throwIfStartupException;
1305 }
1306
1307
1308 public boolean isThrowUnavailableOnStartupException () {
1309 return _throwUnavailableOnStartupException;
1310 }
1311
1312
1313 @Override
1314 protected void startContext()
1315 throws Exception
1316 {
1317 configure();
1318
1319
1320 _metadata.resolve(this);
1321
1322 super.startContext();
1323 }
1324
1325
1326 @Override
1327 public Set<String> setServletSecurity(Dynamic registration, ServletSecurityElement servletSecurityElement)
1328 {
1329
1330 Set<String> unchangedURLMappings = new HashSet<String>();
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347 Collection<String> pathMappings = registration.getMappings();
1348 if (pathMappings != null)
1349 {
1350 ConstraintSecurityHandler.createConstraint(registration.getName(), servletSecurityElement);
1351
1352 for (String pathSpec:pathMappings)
1353 {
1354 Origin origin = getMetaData().getOrigin("constraint.url."+pathSpec);
1355
1356 switch (origin)
1357 {
1358 case NotSet:
1359 {
1360
1361 List<ConstraintMapping> mappings = ConstraintSecurityHandler.createConstraintsWithMappingsForPath(registration.getName(), pathSpec, servletSecurityElement);
1362 for (ConstraintMapping m:mappings)
1363 ((ConstraintAware)getSecurityHandler()).addConstraintMapping(m);
1364 getMetaData().setOrigin("constraint.url."+pathSpec, Origin.API);
1365 break;
1366 }
1367 case WebXml:
1368 case WebDefaults:
1369 case WebOverride:
1370 case WebFragment:
1371 {
1372
1373 unchangedURLMappings.add(pathSpec);
1374 break;
1375 }
1376 case Annotation:
1377 case API:
1378 {
1379
1380
1381 List<ConstraintMapping> constraintMappings = ConstraintSecurityHandler.removeConstraintMappingsForPath(pathSpec, ((ConstraintAware)getSecurityHandler()).getConstraintMappings());
1382
1383 List<ConstraintMapping> freshMappings = ConstraintSecurityHandler.createConstraintsWithMappingsForPath(registration.getName(), pathSpec, servletSecurityElement);
1384 constraintMappings.addAll(freshMappings);
1385
1386 ((ConstraintSecurityHandler)getSecurityHandler()).setConstraintMappings(constraintMappings);
1387 break;
1388 }
1389 }
1390 }
1391 }
1392
1393 return unchangedURLMappings;
1394 }
1395
1396
1397
1398
1399 public class Context extends ServletContextHandler.Context
1400 {
1401
1402 @Override
1403 public URL getResource(String path) throws MalformedURLException
1404 {
1405 Resource resource=WebAppContext.this.getResource(path);
1406 if (resource==null || !resource.exists())
1407 return null;
1408
1409
1410 if (resource.isDirectory() && resource instanceof ResourceCollection && !WebAppContext.this.isExtractWAR())
1411 {
1412 Resource[] resources = ((ResourceCollection)resource).getResources();
1413 for (int i=resources.length;i-->0;)
1414 {
1415 if (resources[i].getName().startsWith("jar:file"))
1416 return resources[i].getURL();
1417 }
1418 }
1419
1420 return resource.getURL();
1421 }
1422
1423
1424 @Override
1425 public ServletContext getContext(String uripath)
1426 {
1427 ServletContext servletContext = super.getContext(uripath);
1428
1429 if ( servletContext != null && _contextWhiteList != null )
1430 {
1431 for ( String context : _contextWhiteList )
1432 {
1433 if ( context.equals(uripath) )
1434 {
1435 return servletContext;
1436 }
1437 }
1438
1439 return null;
1440 }
1441 else
1442 {
1443 return servletContext;
1444 }
1445 }
1446
1447
1448 }
1449
1450
1451 public MetaData getMetaData()
1452 {
1453 return _metadata;
1454 }
1455
1456 }