Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse McConnell2012-02-21 22:03:32 +0000
committerJesse McConnell2012-02-21 22:03:32 +0000
commit7fe545488832a7e823014f8e86a80935cc1b3ecd (patch)
tree3828495f70f8c5d7be94ac6923ebe583bfbef2b6
parenta90c3201e8632b65f2bff626f3c838071211feb2 (diff)
downloadorg.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.java53
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 '\'';
+ }
+
+ }
+
}

Back to the top