You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sk...@apache.org on 2004/05/07 03:21:14 UTC
cvs commit: jakarta-commons/digester/src/java/org/apache/commons/digester ExtendedBaseRules.java
skitching 2004/05/06 18:21:14
Modified: digester/src/java/org/apache/commons/digester
ExtendedBaseRules.java
Log:
Patch for bug #28486. Also avoid multiple calls to startsWith and endsWith
as requested by Robert Donkin.
Revision Changes Path
1.14 +24 -9 jakarta-commons/digester/src/java/org/apache/commons/digester/ExtendedBaseRules.java
Index: ExtendedBaseRules.java
===================================================================
RCS file: /home/cvs/jakarta-commons/digester/src/java/org/apache/commons/digester/ExtendedBaseRules.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- ExtendedBaseRules.java 8 Apr 2004 06:11:36 -0000 1.13
+++ ExtendedBaseRules.java 7 May 2004 01:21:14 -0000 1.14
@@ -254,6 +254,8 @@
// Find the longest key, ie more discriminant
String longKey = "";
+ int longKeyLength = 0;
+
Iterator keys = this.cache.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
@@ -268,18 +270,22 @@
// don't need to check exact matches
- if (key.startsWith("*/") || (isUniversal && key.endsWith("/*"))) {
+ boolean wildcardMatchStart = key.startsWith("*/");
+ boolean wildcardMatchEnd = key.endsWith("/*");
+ if (wildcardMatchStart || (isUniversal && wildcardMatchEnd)) {
boolean parentMatched = false;
boolean basicMatched = false;
boolean ancesterMatched = false;
- if (key.endsWith("/?")) {
+
+ boolean parentMatchEnd = key.endsWith("/?");
+ if (parentMatchEnd) {
// try for a parent match
parentMatched = parentMatch(key, pattern, parentPattern);
- } else if (key.endsWith("/*")) {
+ } else if (wildcardMatchEnd) {
// check for ancester match
- if (key.startsWith("*/")) {
+ if (wildcardMatchStart) {
String patternBody = key.substring(2, key.length() - 2);
if (pattern.endsWith(patternBody)) {
ancesterMatched = true;
@@ -317,16 +323,25 @@
} else {
if (!ignoreBasicMatches) {
// ensure that all parent matches are SHORTER
- // than rules with same level of matching
+ // than rules with same level of matching.
+ //
+ // the calculations below don't work for universal
+ // matching, but we don't care because in that case
+ // this if-stmt is not entered.
int keyLength = key.length();
- if (parentMatched || ancesterMatched) {
- keyLength--;
+ if (wildcardMatchStart) {
+ --keyLength;
+ }
+ if (wildcardMatchEnd) {
+ --keyLength;
+ } else if (parentMatchEnd) {
+ --keyLength;
}
-
- if (keyLength > longKey.length()) {
+ if (keyLength > longKeyLength) {
rulesList = (List) this.cache.get(key);
longKey = key;
+ longKeyLength = keyLength;
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org