Lines 125-136
Link Here
|
125 |
protected static final LoginConfig DUMMY_LOGIN_CONFIG = |
125 |
protected static final LoginConfig DUMMY_LOGIN_CONFIG = |
126 |
new LoginConfig("NONE", null, null, null); |
126 |
new LoginConfig("NONE", null, null, null); |
127 |
|
127 |
|
128 |
/** |
|
|
129 |
* The <code>Digester</code> we will use to process web application |
130 |
* context files. |
131 |
*/ |
132 |
protected static Digester contextDigester = null; |
133 |
|
134 |
|
128 |
|
135 |
/** |
129 |
/** |
136 |
* The set of Authenticators that we know how to configure. The key is |
130 |
* The set of Authenticators that we know how to configure. The key is |
Lines 141-172
Link Here
|
141 |
|
135 |
|
142 |
|
136 |
|
143 |
/** |
137 |
/** |
144 |
* The <code>Digester</code>s available to process web deployment descriptor |
|
|
145 |
* files. |
146 |
*/ |
147 |
protected static Digester[] webDigesters = new Digester[4]; |
148 |
|
149 |
|
150 |
/** |
151 |
* The <code>Digester</code>s available to process web fragment deployment |
152 |
* descriptor files. |
153 |
*/ |
154 |
protected static Digester[] webFragmentDigesters = new Digester[4]; |
155 |
|
156 |
|
157 |
/** |
158 |
* The <code>Rule</code>s used to parse the web.xml |
159 |
*/ |
160 |
protected static WebRuleSet webRuleSet = new WebRuleSet(false); |
161 |
|
162 |
|
163 |
/** |
164 |
* The <code>Rule</code>s used to parse the web-fragment.xml |
165 |
*/ |
166 |
protected static WebRuleSet webFragmentRuleSet = new WebRuleSet(true); |
167 |
|
168 |
|
169 |
/** |
170 |
* Deployment count. |
138 |
* Deployment count. |
171 |
*/ |
139 |
*/ |
172 |
protected static long deploymentCount = 0L; |
140 |
protected static long deploymentCount = 0L; |
Lines 227-238
Link Here
|
227 |
* deployment descriptor files. |
195 |
* deployment descriptor files. |
228 |
*/ |
196 |
*/ |
229 |
protected Digester webDigester = null; |
197 |
protected Digester webDigester = null; |
|
|
198 |
protected WebRuleSet webRuleSet = null; |
230 |
|
199 |
|
231 |
/** |
200 |
/** |
232 |
* The <code>Digester</code> we will use to process web fragment |
201 |
* The <code>Digester</code> we will use to process web fragment |
233 |
* deployment descriptor files. |
202 |
* deployment descriptor files. |
234 |
*/ |
203 |
*/ |
235 |
protected Digester webFragmentDigester = null; |
204 |
protected Digester webFragmentDigester = null; |
|
|
205 |
protected WebRuleSet webFragmentRuleSet = null; |
236 |
|
206 |
|
237 |
|
207 |
|
238 |
// ------------------------------------------------------------- Properties |
208 |
// ------------------------------------------------------------- Properties |
Lines 476-535
Link Here
|
476 |
|
446 |
|
477 |
|
447 |
|
478 |
/** |
448 |
/** |
479 |
* Create (if necessary) and return a Digester configured to process the |
449 |
* Create and return a Digester configured to process the |
480 |
* web application deployment descriptor (web.xml). |
450 |
* web application deployment descriptor (web.xml). |
481 |
*/ |
451 |
*/ |
482 |
public void createWebXmlDigester(boolean namespaceAware, |
452 |
public void createWebXmlDigester(boolean namespaceAware, |
483 |
boolean validation) { |
453 |
boolean validation) { |
484 |
|
454 |
|
485 |
if (!namespaceAware && !validation) { |
455 |
webRuleSet = new WebRuleSet(false); |
486 |
if (webDigesters[0] == null) { |
456 |
webDigester = DigesterFactory.newDigester(validation, |
487 |
webDigesters[0] = DigesterFactory.newDigester(validation, |
457 |
namespaceAware, webRuleSet); |
488 |
namespaceAware, webRuleSet); |
458 |
webDigester.getParser(); |
489 |
webFragmentDigesters[0] = DigesterFactory.newDigester(validation, |
459 |
|
490 |
namespaceAware, webFragmentRuleSet); |
460 |
webFragmentRuleSet = new WebRuleSet(true); |
491 |
webDigesters[0].getParser(); |
461 |
webFragmentDigester = DigesterFactory.newDigester(validation, |
492 |
webFragmentDigesters[0].getParser(); |
462 |
namespaceAware, webFragmentRuleSet); |
493 |
} |
463 |
webFragmentDigester.getParser(); |
494 |
webDigester = webDigesters[0]; |
|
|
495 |
webFragmentDigester = webFragmentDigesters[0]; |
496 |
|
497 |
} else if (!namespaceAware && validation) { |
498 |
if (webDigesters[1] == null) { |
499 |
webDigesters[1] = DigesterFactory.newDigester(validation, |
500 |
namespaceAware, webRuleSet); |
501 |
webFragmentDigesters[1] = DigesterFactory.newDigester(validation, |
502 |
namespaceAware, webFragmentRuleSet); |
503 |
webDigesters[1].getParser(); |
504 |
webFragmentDigesters[1].getParser(); |
505 |
} |
506 |
webDigester = webDigesters[1]; |
507 |
webFragmentDigester = webFragmentDigesters[1]; |
508 |
|
509 |
} else if (namespaceAware && !validation) { |
510 |
if (webDigesters[2] == null) { |
511 |
webDigesters[2] = DigesterFactory.newDigester(validation, |
512 |
namespaceAware, webRuleSet); |
513 |
webFragmentDigesters[2] = DigesterFactory.newDigester(validation, |
514 |
namespaceAware, webFragmentRuleSet); |
515 |
webDigesters[2].getParser(); |
516 |
webFragmentDigesters[2].getParser(); |
517 |
} |
518 |
webDigester = webDigesters[2]; |
519 |
webFragmentDigester = webFragmentDigesters[2]; |
520 |
|
521 |
} else { |
522 |
if (webDigesters[3] == null) { |
523 |
webDigesters[3] = DigesterFactory.newDigester(validation, |
524 |
namespaceAware, webRuleSet); |
525 |
webFragmentDigesters[3] = DigesterFactory.newDigester(validation, |
526 |
namespaceAware, webFragmentRuleSet); |
527 |
webDigesters[3].getParser(); |
528 |
webFragmentDigesters[3].getParser(); |
529 |
} |
530 |
webDigester = webDigesters[3]; |
531 |
webFragmentDigester = webFragmentDigesters[3]; |
532 |
} |
533 |
} |
464 |
} |
534 |
|
465 |
|
535 |
|
466 |
|
Lines 567-573
Link Here
|
567 |
/** |
498 |
/** |
568 |
* Process the default configuration file, if it exists. |
499 |
* Process the default configuration file, if it exists. |
569 |
*/ |
500 |
*/ |
570 |
protected void contextConfig() { |
501 |
protected void contextConfig(Digester digester) { |
571 |
|
502 |
|
572 |
// Open the default context.xml file, if it exists |
503 |
// Open the default context.xml file, if it exists |
573 |
if( defaultContextXml==null && context instanceof StandardContext ) { |
504 |
if( defaultContextXml==null && context instanceof StandardContext ) { |
Lines 584-590
Link Here
|
584 |
if (defaultContextFile.exists()) { |
515 |
if (defaultContextFile.exists()) { |
585 |
try { |
516 |
try { |
586 |
URL defaultContextUrl = defaultContextFile.toURI().toURL(); |
517 |
URL defaultContextUrl = defaultContextFile.toURI().toURL(); |
587 |
processContextConfig(defaultContextUrl); |
518 |
processContextConfig(digester, defaultContextUrl); |
588 |
} catch (MalformedURLException e) { |
519 |
} catch (MalformedURLException e) { |
589 |
log.error(sm.getString( |
520 |
log.error(sm.getString( |
590 |
"contextConfig.badUrl", defaultContextFile), e); |
521 |
"contextConfig.badUrl", defaultContextFile), e); |
Lines 596-602
Link Here
|
596 |
if (hostContextFile.exists()) { |
527 |
if (hostContextFile.exists()) { |
597 |
try { |
528 |
try { |
598 |
URL hostContextUrl = hostContextFile.toURI().toURL(); |
529 |
URL hostContextUrl = hostContextFile.toURI().toURL(); |
599 |
processContextConfig(hostContextUrl); |
530 |
processContextConfig(digester, hostContextUrl); |
600 |
} catch (MalformedURLException e) { |
531 |
} catch (MalformedURLException e) { |
601 |
log.error(sm.getString( |
532 |
log.error(sm.getString( |
602 |
"contextConfig.badUrl", hostContextFile), e); |
533 |
"contextConfig.badUrl", hostContextFile), e); |
Lines 604-610
Link Here
|
604 |
} |
535 |
} |
605 |
} |
536 |
} |
606 |
if (context.getConfigFile() != null) |
537 |
if (context.getConfigFile() != null) |
607 |
processContextConfig(context.getConfigFile()); |
538 |
processContextConfig(digester, context.getConfigFile()); |
608 |
|
539 |
|
609 |
} |
540 |
} |
610 |
|
541 |
|
Lines 612-618
Link Here
|
612 |
/** |
543 |
/** |
613 |
* Process a context.xml. |
544 |
* Process a context.xml. |
614 |
*/ |
545 |
*/ |
615 |
protected void processContextConfig(URL contextXml) { |
546 |
protected void processContextConfig(Digester digester, URL contextXml) { |
616 |
|
547 |
|
617 |
if (log.isDebugEnabled()) |
548 |
if (log.isDebugEnabled()) |
618 |
log.debug("Processing context [" + context.getName() |
549 |
log.debug("Processing context [" + context.getName() |
Lines 638-681
Link Here
|
638 |
|
569 |
|
639 |
if (source == null) |
570 |
if (source == null) |
640 |
return; |
571 |
return; |
641 |
synchronized (contextDigester) { |
572 |
|
|
|
573 |
try { |
574 |
source.setByteStream(stream); |
575 |
digester.setClassLoader(this.getClass().getClassLoader()); |
576 |
digester.setUseContextClassLoader(false); |
577 |
digester.push(context.getParent()); |
578 |
digester.push(context); |
579 |
XmlErrorHandler errorHandler = new XmlErrorHandler(); |
580 |
digester.setErrorHandler(errorHandler); |
581 |
digester.parse(source); |
582 |
if (errorHandler.getWarnings().size() > 0 || |
583 |
errorHandler.getErrors().size() > 0) { |
584 |
errorHandler.logFindings(log, contextXml.toString()); |
585 |
ok = false; |
586 |
} |
587 |
if (log.isDebugEnabled()) |
588 |
log.debug("Successfully processed context [" + context.getName() |
589 |
+ "] configuration file [" + contextXml + "]"); |
590 |
} catch (SAXParseException e) { |
591 |
log.error(sm.getString("contextConfig.contextParse", |
592 |
context.getName()), e); |
593 |
log.error(sm.getString("contextConfig.defaultPosition", |
594 |
"" + e.getLineNumber(), |
595 |
"" + e.getColumnNumber())); |
596 |
ok = false; |
597 |
} catch (Exception e) { |
598 |
log.error(sm.getString("contextConfig.contextParse", |
599 |
context.getName()), e); |
600 |
ok = false; |
601 |
} finally { |
642 |
try { |
602 |
try { |
643 |
source.setByteStream(stream); |
603 |
if (stream != null) { |
644 |
contextDigester.setClassLoader(this.getClass().getClassLoader()); |
604 |
stream.close(); |
645 |
contextDigester.setUseContextClassLoader(false); |
|
|
646 |
contextDigester.push(context.getParent()); |
647 |
contextDigester.push(context); |
648 |
XmlErrorHandler errorHandler = new XmlErrorHandler(); |
649 |
contextDigester.setErrorHandler(errorHandler); |
650 |
contextDigester.parse(source); |
651 |
if (errorHandler.getWarnings().size() > 0 || |
652 |
errorHandler.getErrors().size() > 0) { |
653 |
errorHandler.logFindings(log, contextXml.toString()); |
654 |
ok = false; |
655 |
} |
605 |
} |
656 |
if (log.isDebugEnabled()) |
606 |
} catch (IOException e) { |
657 |
log.debug("Successfully processed context [" + context.getName() |
607 |
log.error(sm.getString("contextConfig.contextClose"), e); |
658 |
+ "] configuration file [" + contextXml + "]"); |
|
|
659 |
} catch (SAXParseException e) { |
660 |
log.error(sm.getString("contextConfig.contextParse", |
661 |
context.getName()), e); |
662 |
log.error(sm.getString("contextConfig.defaultPosition", |
663 |
"" + e.getLineNumber(), |
664 |
"" + e.getColumnNumber())); |
665 |
ok = false; |
666 |
} catch (Exception e) { |
667 |
log.error(sm.getString("contextConfig.contextParse", |
668 |
context.getName()), e); |
669 |
ok = false; |
670 |
} finally { |
671 |
contextDigester.reset(); |
672 |
try { |
673 |
if (stream != null) { |
674 |
stream.close(); |
675 |
} |
676 |
} catch (IOException e) { |
677 |
log.error(sm.getString("contextConfig.contextClose"), e); |
678 |
} |
679 |
} |
608 |
} |
680 |
} |
609 |
} |
681 |
} |
610 |
} |
Lines 828-844
Link Here
|
828 |
protected void init() { |
757 |
protected void init() { |
829 |
// Called from StandardContext.init() |
758 |
// Called from StandardContext.init() |
830 |
|
759 |
|
831 |
if (contextDigester == null){ |
760 |
Digester contextDigester = createContextDigester(); |
832 |
contextDigester = createContextDigester(); |
761 |
contextDigester.getParser(); |
833 |
contextDigester.getParser(); |
|
|
834 |
} |
835 |
|
762 |
|
836 |
if (log.isDebugEnabled()) |
763 |
if (log.isDebugEnabled()) |
837 |
log.debug(sm.getString("contextConfig.init")); |
764 |
log.debug(sm.getString("contextConfig.init")); |
838 |
context.setConfigured(false); |
765 |
context.setConfigured(false); |
839 |
ok = true; |
766 |
ok = true; |
840 |
|
767 |
|
841 |
contextConfig(); |
768 |
contextConfig(contextDigester); |
842 |
|
769 |
|
843 |
createWebXmlDigester(context.getXmlNamespaceAware(), |
770 |
createWebXmlDigester(context.getXmlNamespaceAware(), |
844 |
context.getXmlValidation()); |
771 |
context.getXmlValidation()); |
Lines 1715-1723
Link Here
|
1715 |
|
1642 |
|
1716 |
XmlErrorHandler handler = new XmlErrorHandler(); |
1643 |
XmlErrorHandler handler = new XmlErrorHandler(); |
1717 |
|
1644 |
|
1718 |
// Web digesters and rulesets are shared between contexts but are not |
|
|
1719 |
// thread safe. Whilst there should only be one thread at a time |
1720 |
// processing a config, play safe and sync. |
1721 |
Digester digester; |
1645 |
Digester digester; |
1722 |
WebRuleSet ruleSet; |
1646 |
WebRuleSet ruleSet; |
1723 |
if (fragment) { |
1647 |
if (fragment) { |
Lines 1728-1768
Link Here
|
1728 |
ruleSet = webRuleSet; |
1652 |
ruleSet = webRuleSet; |
1729 |
} |
1653 |
} |
1730 |
|
1654 |
|
1731 |
// Sync on the ruleSet since the same ruleSet is shared across all four |
1655 |
digester.push(dest); |
1732 |
// digesters |
1656 |
digester.setErrorHandler(handler); |
1733 |
synchronized(ruleSet) { |
1657 |
|
1734 |
|
1658 |
if(log.isDebugEnabled()) { |
1735 |
digester.push(dest); |
1659 |
log.debug(sm.getString("contextConfig.applicationStart", |
1736 |
digester.setErrorHandler(handler); |
1660 |
source.getSystemId())); |
1737 |
|
1661 |
} |
1738 |
if(log.isDebugEnabled()) { |
|
|
1739 |
log.debug(sm.getString("contextConfig.applicationStart", |
1740 |
source.getSystemId())); |
1741 |
} |
1742 |
|
1662 |
|
1743 |
try { |
1663 |
try { |
1744 |
digester.parse(source); |
1664 |
digester.parse(source); |
1745 |
|
1665 |
|
1746 |
if (handler.getWarnings().size() > 0 || |
1666 |
if (handler.getWarnings().size() > 0 || |
1747 |
handler.getErrors().size() > 0) { |
1667 |
handler.getErrors().size() > 0) { |
1748 |
ok = false; |
|
|
1749 |
handler.logFindings(log, source.getSystemId()); |
1750 |
} |
1751 |
} catch (SAXParseException e) { |
1752 |
log.error(sm.getString("contextConfig.applicationParse", |
1753 |
source.getSystemId()), e); |
1754 |
log.error(sm.getString("contextConfig.applicationPosition", |
1755 |
"" + e.getLineNumber(), |
1756 |
"" + e.getColumnNumber())); |
1757 |
ok = false; |
1668 |
ok = false; |
1758 |
} catch (Exception e) { |
1669 |
handler.logFindings(log, source.getSystemId()); |
1759 |
log.error(sm.getString("contextConfig.applicationParse", |
|
|
1760 |
source.getSystemId()), e); |
1761 |
ok = false; |
1762 |
} finally { |
1763 |
digester.reset(); |
1764 |
ruleSet.recycle(); |
1765 |
} |
1670 |
} |
|
|
1671 |
} catch (SAXParseException e) { |
1672 |
log.error(sm.getString("contextConfig.applicationParse", |
1673 |
source.getSystemId()), e); |
1674 |
log.error(sm.getString("contextConfig.applicationPosition", |
1675 |
"" + e.getLineNumber(), |
1676 |
"" + e.getColumnNumber())); |
1677 |
ok = false; |
1678 |
} catch (Exception e) { |
1679 |
log.error(sm.getString("contextConfig.applicationParse", |
1680 |
source.getSystemId()), e); |
1681 |
ok = false; |
1682 |
} finally { |
1683 |
digester.reset(); |
1684 |
ruleSet.recycle(); |
1766 |
} |
1685 |
} |
1767 |
} |
1686 |
} |
1768 |
|
1687 |
|
Lines 2152-2158
Link Here
|
2152 |
|
2071 |
|
2153 |
/** |
2072 |
/** |
2154 |
* process filter annotation and merge with existing one! |
2073 |
* process filter annotation and merge with existing one! |
2155 |
* FIXME: refactoring method to long and has redundant subroutines with processAnnotationWebServlet! |
2074 |
* FIXME: refactoring method too long and has redundant subroutines with |
|
|
2075 |
* processAnnotationWebServlet! |
2156 |
* @param className |
2076 |
* @param className |
2157 |
* @param ae |
2077 |
* @param ae |
2158 |
* @param fragment |
2078 |
* @param fragment |