Lines 127-138
public class ContextConfig
Link Here
|
127 |
protected static final LoginConfig DUMMY_LOGIN_CONFIG = |
127 |
protected static final LoginConfig DUMMY_LOGIN_CONFIG = |
128 |
new LoginConfig("NONE", null, null, null); |
128 |
new LoginConfig("NONE", null, null, null); |
129 |
|
129 |
|
130 |
/** |
|
|
131 |
* The <code>Digester</code> we will use to process web application |
132 |
* context files. |
133 |
*/ |
134 |
protected static Digester contextDigester = null; |
135 |
|
136 |
|
130 |
|
137 |
/** |
131 |
/** |
138 |
* The set of Authenticators that we know how to configure. The key is |
132 |
* The set of Authenticators that we know how to configure. The key is |
Lines 143-174
public class ContextConfig
Link Here
|
143 |
|
137 |
|
144 |
|
138 |
|
145 |
/** |
139 |
/** |
146 |
* The <code>Digester</code>s available to process web deployment descriptor |
|
|
147 |
* files. |
148 |
*/ |
149 |
protected static Digester[] webDigesters = new Digester[4]; |
150 |
|
151 |
|
152 |
/** |
153 |
* The <code>Digester</code>s available to process web fragment deployment |
154 |
* descriptor files. |
155 |
*/ |
156 |
protected static Digester[] webFragmentDigesters = new Digester[4]; |
157 |
|
158 |
|
159 |
/** |
160 |
* The <code>Rule</code>s used to parse the web.xml |
161 |
*/ |
162 |
protected static WebRuleSet webRuleSet = new WebRuleSet(false); |
163 |
|
164 |
|
165 |
/** |
166 |
* The <code>Rule</code>s used to parse the web-fragment.xml |
167 |
*/ |
168 |
protected static WebRuleSet webFragmentRuleSet = new WebRuleSet(true); |
169 |
|
170 |
|
171 |
/** |
172 |
* Deployment count. |
140 |
* Deployment count. |
173 |
*/ |
141 |
*/ |
174 |
protected static long deploymentCount = 0L; |
142 |
protected static long deploymentCount = 0L; |
Lines 236-247
public class ContextConfig
Link Here
|
236 |
* deployment descriptor files. |
204 |
* deployment descriptor files. |
237 |
*/ |
205 |
*/ |
238 |
protected Digester webDigester = null; |
206 |
protected Digester webDigester = null; |
|
|
207 |
protected WebRuleSet webRuleSet = null; |
239 |
|
208 |
|
240 |
/** |
209 |
/** |
241 |
* The <code>Digester</code> we will use to process web fragment |
210 |
* The <code>Digester</code> we will use to process web fragment |
242 |
* deployment descriptor files. |
211 |
* deployment descriptor files. |
243 |
*/ |
212 |
*/ |
244 |
protected Digester webFragmentDigester = null; |
213 |
protected Digester webFragmentDigester = null; |
|
|
214 |
protected WebRuleSet webFragmentRuleSet = null; |
245 |
|
215 |
|
246 |
|
216 |
|
247 |
// ------------------------------------------------------------- Properties |
217 |
// ------------------------------------------------------------- Properties |
Lines 486-545
public class ContextConfig
Link Here
|
486 |
|
456 |
|
487 |
|
457 |
|
488 |
/** |
458 |
/** |
489 |
* Create (if necessary) and return a Digester configured to process the |
459 |
* Create and return a Digester configured to process the |
490 |
* web application deployment descriptor (web.xml). |
460 |
* web application deployment descriptor (web.xml). |
491 |
*/ |
461 |
*/ |
492 |
public void createWebXmlDigester(boolean namespaceAware, |
462 |
public void createWebXmlDigester(boolean namespaceAware, |
493 |
boolean validation) { |
463 |
boolean validation) { |
494 |
|
464 |
|
495 |
if (!namespaceAware && !validation) { |
465 |
webRuleSet = new WebRuleSet(false); |
496 |
if (webDigesters[0] == null) { |
466 |
webDigester = DigesterFactory.newDigester(validation, |
497 |
webDigesters[0] = DigesterFactory.newDigester(validation, |
467 |
namespaceAware, webRuleSet); |
498 |
namespaceAware, webRuleSet); |
468 |
webDigester.getParser(); |
499 |
webFragmentDigesters[0] = DigesterFactory.newDigester(validation, |
|
|
500 |
namespaceAware, webFragmentRuleSet); |
501 |
webDigesters[0].getParser(); |
502 |
webFragmentDigesters[0].getParser(); |
503 |
} |
504 |
webDigester = webDigesters[0]; |
505 |
webFragmentDigester = webFragmentDigesters[0]; |
506 |
|
507 |
} else if (!namespaceAware && validation) { |
508 |
if (webDigesters[1] == null) { |
509 |
webDigesters[1] = DigesterFactory.newDigester(validation, |
510 |
namespaceAware, webRuleSet); |
511 |
webFragmentDigesters[1] = DigesterFactory.newDigester(validation, |
512 |
namespaceAware, webFragmentRuleSet); |
513 |
webDigesters[1].getParser(); |
514 |
webFragmentDigesters[1].getParser(); |
515 |
} |
516 |
webDigester = webDigesters[1]; |
517 |
webFragmentDigester = webFragmentDigesters[1]; |
518 |
|
519 |
} else if (namespaceAware && !validation) { |
520 |
if (webDigesters[2] == null) { |
521 |
webDigesters[2] = DigesterFactory.newDigester(validation, |
522 |
namespaceAware, webRuleSet); |
523 |
webFragmentDigesters[2] = DigesterFactory.newDigester(validation, |
524 |
namespaceAware, webFragmentRuleSet); |
525 |
webDigesters[2].getParser(); |
526 |
webFragmentDigesters[2].getParser(); |
527 |
} |
528 |
webDigester = webDigesters[2]; |
529 |
webFragmentDigester = webFragmentDigesters[2]; |
530 |
|
469 |
|
531 |
} else { |
470 |
webFragmentRuleSet = new WebRuleSet(true); |
532 |
if (webDigesters[3] == null) { |
471 |
webFragmentDigester = DigesterFactory.newDigester(validation, |
533 |
webDigesters[3] = DigesterFactory.newDigester(validation, |
472 |
namespaceAware, webFragmentRuleSet); |
534 |
namespaceAware, webRuleSet); |
473 |
webFragmentDigester.getParser(); |
535 |
webFragmentDigesters[3] = DigesterFactory.newDigester(validation, |
|
|
536 |
namespaceAware, webFragmentRuleSet); |
537 |
webDigesters[3].getParser(); |
538 |
webFragmentDigesters[3].getParser(); |
539 |
} |
540 |
webDigester = webDigesters[3]; |
541 |
webFragmentDigester = webFragmentDigesters[3]; |
542 |
} |
543 |
} |
474 |
} |
544 |
|
475 |
|
545 |
|
476 |
|
Lines 577-583
public class ContextConfig
Link Here
|
577 |
/** |
508 |
/** |
578 |
* Process the default configuration file, if it exists. |
509 |
* Process the default configuration file, if it exists. |
579 |
*/ |
510 |
*/ |
580 |
protected void contextConfig() { |
511 |
protected void contextConfig(Digester digester) { |
581 |
|
512 |
|
582 |
// Open the default context.xml file, if it exists |
513 |
// Open the default context.xml file, if it exists |
583 |
if( defaultContextXml==null && context instanceof StandardContext ) { |
514 |
if( defaultContextXml==null && context instanceof StandardContext ) { |
Lines 596-602
public class ContextConfig
Link Here
|
596 |
if (defaultContextFile.exists()) { |
527 |
if (defaultContextFile.exists()) { |
597 |
try { |
528 |
try { |
598 |
URL defaultContextUrl = defaultContextFile.toURI().toURL(); |
529 |
URL defaultContextUrl = defaultContextFile.toURI().toURL(); |
599 |
processContextConfig(defaultContextUrl); |
530 |
processContextConfig(digester, defaultContextUrl); |
600 |
} catch (MalformedURLException e) { |
531 |
} catch (MalformedURLException e) { |
601 |
log.error(sm.getString( |
532 |
log.error(sm.getString( |
602 |
"contextConfig.badUrl", defaultContextFile), e); |
533 |
"contextConfig.badUrl", defaultContextFile), e); |
Lines 608-614
public class ContextConfig
Link Here
|
608 |
if (hostContextFile.exists()) { |
539 |
if (hostContextFile.exists()) { |
609 |
try { |
540 |
try { |
610 |
URL hostContextUrl = hostContextFile.toURI().toURL(); |
541 |
URL hostContextUrl = hostContextFile.toURI().toURL(); |
611 |
processContextConfig(hostContextUrl); |
542 |
processContextConfig(digester, hostContextUrl); |
612 |
} catch (MalformedURLException e) { |
543 |
} catch (MalformedURLException e) { |
613 |
log.error(sm.getString( |
544 |
log.error(sm.getString( |
614 |
"contextConfig.badUrl", hostContextFile), e); |
545 |
"contextConfig.badUrl", hostContextFile), e); |
Lines 616-622
public class ContextConfig
Link Here
|
616 |
} |
547 |
} |
617 |
} |
548 |
} |
618 |
if (context.getConfigFile() != null) { |
549 |
if (context.getConfigFile() != null) { |
619 |
processContextConfig(context.getConfigFile()); |
550 |
processContextConfig(digester, context.getConfigFile()); |
620 |
} |
551 |
} |
621 |
|
552 |
|
622 |
} |
553 |
} |
Lines 625-631
public class ContextConfig
Link Here
|
625 |
/** |
556 |
/** |
626 |
* Process a context.xml. |
557 |
* Process a context.xml. |
627 |
*/ |
558 |
*/ |
628 |
protected void processContextConfig(URL contextXml) { |
559 |
protected void processContextConfig(Digester digester, URL contextXml) { |
629 |
|
560 |
|
630 |
if (log.isDebugEnabled()) { |
561 |
if (log.isDebugEnabled()) { |
631 |
log.debug("Processing context [" + context.getName() |
562 |
log.debug("Processing context [" + context.getName() |
Lines 653-697
public class ContextConfig
Link Here
|
653 |
if (source == null) { |
584 |
if (source == null) { |
654 |
return; |
585 |
return; |
655 |
} |
586 |
} |
656 |
synchronized (contextDigester) { |
587 |
|
657 |
try { |
588 |
try { |
658 |
source.setByteStream(stream); |
589 |
source.setByteStream(stream); |
659 |
contextDigester.setClassLoader(this.getClass().getClassLoader()); |
590 |
digester.setClassLoader(this.getClass().getClassLoader()); |
660 |
contextDigester.setUseContextClassLoader(false); |
591 |
digester.setUseContextClassLoader(false); |
661 |
contextDigester.push(context.getParent()); |
592 |
digester.push(context.getParent()); |
662 |
contextDigester.push(context); |
593 |
digester.push(context); |
663 |
XmlErrorHandler errorHandler = new XmlErrorHandler(); |
594 |
XmlErrorHandler errorHandler = new XmlErrorHandler(); |
664 |
contextDigester.setErrorHandler(errorHandler); |
595 |
digester.setErrorHandler(errorHandler); |
665 |
contextDigester.parse(source); |
596 |
digester.parse(source); |
666 |
if (errorHandler.getWarnings().size() > 0 || |
597 |
if (errorHandler.getWarnings().size() > 0 || |
667 |
errorHandler.getErrors().size() > 0) { |
598 |
errorHandler.getErrors().size() > 0) { |
668 |
errorHandler.logFindings(log, contextXml.toString()); |
599 |
errorHandler.logFindings(log, contextXml.toString()); |
669 |
ok = false; |
|
|
670 |
} |
671 |
if (log.isDebugEnabled()) { |
672 |
log.debug("Successfully processed context [" + context.getName() |
673 |
+ "] configuration file [" + contextXml + "]"); |
674 |
} |
675 |
} catch (SAXParseException e) { |
676 |
log.error(sm.getString("contextConfig.contextParse", |
677 |
context.getName()), e); |
678 |
log.error(sm.getString("contextConfig.defaultPosition", |
679 |
"" + e.getLineNumber(), |
680 |
"" + e.getColumnNumber())); |
681 |
ok = false; |
682 |
} catch (Exception e) { |
683 |
log.error(sm.getString("contextConfig.contextParse", |
684 |
context.getName()), e); |
685 |
ok = false; |
600 |
ok = false; |
686 |
} finally { |
601 |
} |
687 |
contextDigester.reset(); |
602 |
if (log.isDebugEnabled()) { |
688 |
try { |
603 |
log.debug("Successfully processed context [" + context.getName() |
689 |
if (stream != null) { |
604 |
+ "] configuration file [" + contextXml + "]"); |
690 |
stream.close(); |
605 |
} |
691 |
} |
606 |
} catch (SAXParseException e) { |
692 |
} catch (IOException e) { |
607 |
log.error(sm.getString("contextConfig.contextParse", |
693 |
log.error(sm.getString("contextConfig.contextClose"), e); |
608 |
context.getName()), e); |
|
|
609 |
log.error(sm.getString("contextConfig.defaultPosition", |
610 |
"" + e.getLineNumber(), |
611 |
"" + e.getColumnNumber())); |
612 |
ok = false; |
613 |
} catch (Exception e) { |
614 |
log.error(sm.getString("contextConfig.contextParse", |
615 |
context.getName()), e); |
616 |
ok = false; |
617 |
} finally { |
618 |
try { |
619 |
if (stream != null) { |
620 |
stream.close(); |
694 |
} |
621 |
} |
|
|
622 |
} catch (IOException e) { |
623 |
log.error(sm.getString("contextConfig.contextClose"), e); |
695 |
} |
624 |
} |
696 |
} |
625 |
} |
697 |
} |
626 |
} |
Lines 846-855
public class ContextConfig
Link Here
|
846 |
protected void init() { |
775 |
protected void init() { |
847 |
// Called from StandardContext.init() |
776 |
// Called from StandardContext.init() |
848 |
|
777 |
|
849 |
if (contextDigester == null){ |
778 |
Digester contextDigester = createContextDigester(); |
850 |
contextDigester = createContextDigester(); |
779 |
contextDigester.getParser(); |
851 |
contextDigester.getParser(); |
|
|
852 |
} |
853 |
|
780 |
|
854 |
if (log.isDebugEnabled()) { |
781 |
if (log.isDebugEnabled()) { |
855 |
log.debug(sm.getString("contextConfig.init")); |
782 |
log.debug(sm.getString("contextConfig.init")); |
Lines 857-863
public class ContextConfig
Link Here
|
857 |
context.setConfigured(false); |
784 |
context.setConfigured(false); |
858 |
ok = true; |
785 |
ok = true; |
859 |
|
786 |
|
860 |
contextConfig(); |
787 |
contextConfig(contextDigester); |
861 |
|
788 |
|
862 |
createWebXmlDigester(context.getXmlNamespaceAware(), |
789 |
createWebXmlDigester(context.getXmlNamespaceAware(), |
863 |
context.getXmlValidation()); |
790 |
context.getXmlValidation()); |
Lines 1416-1423
public class ContextConfig
Link Here
|
1416 |
} |
1343 |
} |
1417 |
|
1344 |
|
1418 |
// Parsing global web.xml is relatively expensive. Use a sync block to |
1345 |
// Parsing global web.xml is relatively expensive. Use a sync block to |
1419 |
// make sure it only happens once |
1346 |
// make sure it only happens once. Use the pipeline since a lock will |
1420 |
synchronized (host) { |
1347 |
// already be held on the host by another thread |
|
|
1348 |
synchronized (host.getPipeline()) { |
1421 |
entry = hostWebXmlCache.get(host); |
1349 |
entry = hostWebXmlCache.get(host); |
1422 |
if (entry != null && entry.getGlobalTimeStamp() == globalTimeStamp && |
1350 |
if (entry != null && entry.getGlobalTimeStamp() == globalTimeStamp && |
1423 |
entry.getHostTimeStamp() == hostTimeStamp) { |
1351 |
entry.getHostTimeStamp() == hostTimeStamp) { |
Lines 1679-1685
public class ContextConfig
Link Here
|
1679 |
return getWebXmlSource(defaultWebXml, getBaseDir()); |
1607 |
return getWebXmlSource(defaultWebXml, getBaseDir()); |
1680 |
} |
1608 |
} |
1681 |
|
1609 |
|
1682 |
|
|
|
1683 |
/** |
1610 |
/** |
1684 |
* Identify the host web.xml to be used and obtain an input source for |
1611 |
* Identify the host web.xml to be used and obtain an input source for |
1685 |
* it. |
1612 |
* it. |
Lines 1806-1814
public class ContextConfig
Link Here
|
1806 |
|
1733 |
|
1807 |
XmlErrorHandler handler = new XmlErrorHandler(); |
1734 |
XmlErrorHandler handler = new XmlErrorHandler(); |
1808 |
|
1735 |
|
1809 |
// Web digesters and rulesets are shared between contexts but are not |
|
|
1810 |
// thread safe. Whilst there should only be one thread at a time |
1811 |
// processing a config, play safe and sync. |
1812 |
Digester digester; |
1736 |
Digester digester; |
1813 |
WebRuleSet ruleSet; |
1737 |
WebRuleSet ruleSet; |
1814 |
if (fragment) { |
1738 |
if (fragment) { |
Lines 1819-1859
public class ContextConfig
Link Here
|
1819 |
ruleSet = webRuleSet; |
1743 |
ruleSet = webRuleSet; |
1820 |
} |
1744 |
} |
1821 |
|
1745 |
|
1822 |
// Sync on the ruleSet since the same ruleSet is shared across all four |
1746 |
digester.push(dest); |
1823 |
// digesters |
1747 |
digester.setErrorHandler(handler); |
1824 |
synchronized(ruleSet) { |
|
|
1825 |
|
1748 |
|
1826 |
digester.push(dest); |
1749 |
if(log.isDebugEnabled()) { |
1827 |
digester.setErrorHandler(handler); |
1750 |
log.debug(sm.getString("contextConfig.applicationStart", |
1828 |
|
1751 |
source.getSystemId())); |
1829 |
if(log.isDebugEnabled()) { |
1752 |
} |
1830 |
log.debug(sm.getString("contextConfig.applicationStart", |
|
|
1831 |
source.getSystemId())); |
1832 |
} |
1833 |
|
1753 |
|
1834 |
try { |
1754 |
try { |
1835 |
digester.parse(source); |
1755 |
digester.parse(source); |
1836 |
|
1756 |
|
1837 |
if (handler.getWarnings().size() > 0 || |
1757 |
if (handler.getWarnings().size() > 0 || |
1838 |
handler.getErrors().size() > 0) { |
1758 |
handler.getErrors().size() > 0) { |
1839 |
ok = false; |
|
|
1840 |
handler.logFindings(log, source.getSystemId()); |
1841 |
} |
1842 |
} catch (SAXParseException e) { |
1843 |
log.error(sm.getString("contextConfig.applicationParse", |
1844 |
source.getSystemId()), e); |
1845 |
log.error(sm.getString("contextConfig.applicationPosition", |
1846 |
"" + e.getLineNumber(), |
1847 |
"" + e.getColumnNumber())); |
1848 |
ok = false; |
1759 |
ok = false; |
1849 |
} catch (Exception e) { |
1760 |
handler.logFindings(log, source.getSystemId()); |
1850 |
log.error(sm.getString("contextConfig.applicationParse", |
1761 |
} |
1851 |
source.getSystemId()), e); |
1762 |
} catch (SAXParseException e) { |
1852 |
ok = false; |
1763 |
log.error(sm.getString("contextConfig.applicationParse", |
1853 |
} finally { |
1764 |
source.getSystemId()), e); |
1854 |
digester.reset(); |
1765 |
log.error(sm.getString("contextConfig.applicationPosition", |
1855 |
ruleSet.recycle(); |
1766 |
"" + e.getLineNumber(), |
1856 |
} |
1767 |
"" + e.getColumnNumber())); |
|
|
1768 |
ok = false; |
1769 |
} catch (Exception e) { |
1770 |
log.error(sm.getString("contextConfig.applicationParse", |
1771 |
source.getSystemId()), e); |
1772 |
ok = false; |
1773 |
} finally { |
1774 |
digester.reset(); |
1775 |
ruleSet.recycle(); |
1857 |
} |
1776 |
} |
1858 |
} |
1777 |
} |
1859 |
|
1778 |
|
Lines 2244-2250
public class ContextConfig
Link Here
|
2244 |
|
2163 |
|
2245 |
/** |
2164 |
/** |
2246 |
* process filter annotation and merge with existing one! |
2165 |
* process filter annotation and merge with existing one! |
2247 |
* FIXME: refactoring method to long and has redundant subroutines with processAnnotationWebServlet! |
2166 |
* FIXME: refactoring method too long and has redundant subroutines with |
|
|
2167 |
* processAnnotationWebServlet! |
2248 |
* @param className |
2168 |
* @param className |
2249 |
* @param ae |
2169 |
* @param ae |
2250 |
* @param fragment |
2170 |
* @param fragment |