diff options
author | Jesse McConnell | 2012-02-21 22:03:32 +0000 |
---|---|---|
committer | Jesse McConnell | 2012-02-21 22:03:32 +0000 |
commit | 7fe545488832a7e823014f8e86a80935cc1b3ecd (patch) | |
tree | 3828495f70f8c5d7be94ac6923ebe583bfbef2b6 | |
parent | a90c3201e8632b65f2bff626f3c838071211feb2 (diff) | |
download | org.eclipse.jetty.project-7fe545488832a7e823014f8e86a80935cc1b3ecd.tar.gz org.eclipse.jetty.project-7fe545488832a7e823014f8e86a80935cc1b3ecd.tar.xz org.eclipse.jetty.project-7fe545488832a7e823014f8e86a80935cc1b3ecd.zip |
[Bug 372093] handle quotes in Require-Bundle manifest string
-rw-r--r-- | jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java index b7c17bbf55..455d4c1e5d 100644 --- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java +++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java @@ -183,7 +183,7 @@ public class PackageAdminServiceTracker implements ServiceListener { return; } - StringTokenizer tokenizer = new StringTokenizer(requiredBundleHeader, ","); + StringTokenizer tokenizer = new ManifestTokenizer(requiredBundleHeader); while (tokenizer.hasMoreTokens()) { String tok = tokenizer.nextToken().trim(); @@ -313,4 +313,55 @@ public class PackageAdminServiceTracker implements ServiceListener return _startLevel == null ? true : _startLevel.getStartLevel() >= _maxStartLevel; } + private static class ManifestTokenizer extends StringTokenizer { + + public ManifestTokenizer(String header) { + super(header, ","); + } + + @Override + public String nextToken() { + String token = super.nextToken(); + + while (hasOpenQuote(token) && hasMoreTokens()) { + token += "," + super.nextToken(); + } + return token; + } + + private boolean hasOpenQuote(String token) { + int i = -1; + do { + int quote = getQuote(token, i+1); + if (quote < 0) { + return false; + } + + i = token.indexOf(quote, i+1); + i = token.indexOf(quote, i+1); + } while (i >= 0); + return true; + } + + private int getQuote(String token, int offset) { + int i = token.indexOf('"', offset); + int j = token.indexOf('\'', offset); + if (i < 0) { + if (j < 0) { + return -1; + } else { + return '\''; + } + } + if (j < 0) { + return '"'; + } + if (i < j) { + return '"'; + } + return '\''; + } + + } + } |