diff options
author | Hugues Malphettes | 2011-05-18 05:13:17 +0000 |
---|---|---|
committer | Hugues Malphettes | 2011-05-18 05:13:17 +0000 |
commit | 59d60f33b87e397bcbe108d69945a03b48beb8b5 (patch) | |
tree | 138972cff4102bdce42013f7933ddb1c4f3d4cab | |
parent | 0967a439f3c91a9075a6fca51693d7d3999754ae (diff) | |
download | org.eclipse.jetty.project-59d60f33b87e397bcbe108d69945a03b48beb8b5.tar.gz org.eclipse.jetty.project-59d60f33b87e397bcbe108d69945a03b48beb8b5.tar.xz org.eclipse.jetty.project-59d60f33b87e397bcbe108d69945a03b48beb8b5.zip |
bug 346027 Add required-bundles and fragment's required bundles to the pacckages where META-INF/web-fragments.xml and META-INF/resources are discovered.
git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@3202 7e9141cc-0065-0410-87d8-b60c137991c4
3 files changed, 114 insertions, 2 deletions
diff --git a/jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF b/jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF index 54da97ddcb..2b735d0af2 100644 --- a/jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF +++ b/jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF @@ -21,8 +21,8 @@ Import-Package: javax.mail;version="1.4.0";resolution:=optional, org.osgi.service.url;version="1.0.0", org.osgi.util.tracker;version="1.3.0", org.slf4j;resolution:=optional, - org.slf4j.spi;resolution:=optional, org.slf4j.helpers;resolution:=optional, + org.slf4j.spi;resolution:=optional, org.xml.sax, org.xml.sax.helpers Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java index 7ae65b966d..87e6ef4f79 100644 --- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java +++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java @@ -501,7 +501,7 @@ public class WebBundleDeployerHelper implements IWebBundleDeployerHelper wah.setAttribute(OSGiWebappConstants.REQUIRE_TLD_BUNDLE, requireTldBundle); - Bundle[] fragments = PackageAdminServiceTracker.INSTANCE.getFragments(contributor); + Bundle[] fragments = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles(contributor); if (fragments != null && fragments.length != 0) { //sorted extra resource base found in the fragments. 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 c9cdacaae5..66796621d5 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 @@ -13,7 +13,10 @@ package org.eclipse.jetty.osgi.boot.utils.internal; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.StringTokenizer; import org.osgi.framework.Bundle; import org.osgi.framework.BundleActivator; @@ -100,6 +103,115 @@ public class PackageAdminServiceTracker implements ServiceListener PackageAdmin admin = (PackageAdmin)_context.getService(sr); return admin.getFragments(bundle); } + + /** + * Returns the fragments and the required-bundles that have a jetty-web annotation attribute + * compatible with the webFragOrAnnotationOrResources. + * @param bundle + * @param webFragOrAnnotationOrResources + * @return + */ + public Bundle[] getFragmentsAndRequiredBundles(Bundle bundle) + { + ServiceReference sr = _context.getServiceReference(PackageAdmin.class.getName()); + if (sr == null) + {//we should never be here really. + return null; + } + PackageAdmin admin = (PackageAdmin)_context.getService(sr); + Bundle[] fragments = admin.getFragments(bundle); + //get the required bundles. we can't use the org.osgi.framework.wiring package + //just yet: it is not supported by enough osgi implementations. + List<Bundle> requiredBundles = getRequiredBundles(bundle, admin); + if (fragments != null) + { + Set<String> already = new HashSet<String>(); + for (Bundle b : requiredBundles) + { + already.add(b.getSymbolicName()); + } + //Also add the bundles required by the fragments. + //this way we can inject onto an existing web-bundle a set of bundles that extend it + for (Bundle f : fragments) + { + List<Bundle> requiredBundlesByFragment = getRequiredBundles(f, admin); + for (Bundle b : requiredBundlesByFragment) + { + if (already.add(b.getSymbolicName())) + { + requiredBundles.add(b); + } + } + } + } + ArrayList<Bundle> bundles = new ArrayList<Bundle>( + (fragments != null ? fragments.length : 0) + + (requiredBundles != null ? requiredBundles.size() : 0)); + if (fragments != null) + { + for (Bundle f : fragments) + { + bundles.add(f); + } + } + if (requiredBundles != null) + { + bundles.addAll(requiredBundles); + } + return bundles.toArray(new Bundle[bundles.size()]); + } + + /** + * A simplistic but good enough parser for the Require-Bundle header. + * @param bundle + * @return The map of required bundles associated to the value of the jetty-web attribute. + */ + protected List<Bundle> getRequiredBundles(Bundle bundle, PackageAdmin admin) + { + List<Bundle> res = new ArrayList<Bundle>(); + String requiredBundleHeader = bundle.getHeaders().get("Require-Bundle"); + if (requiredBundleHeader == null) + { + return res; + } + StringTokenizer tokenizer = new StringTokenizer(requiredBundleHeader, ","); + while (tokenizer.hasMoreTokens()) + { + String tok = tokenizer.nextToken().trim(); + StringTokenizer tokenizer2 = new StringTokenizer(tok, ";"); + String symbolicName = tokenizer2.nextToken().trim(); + String versionRange = null; + while (tokenizer2.hasMoreTokens()) + { + String next = tokenizer2.nextToken().trim(); + if (next.startsWith("bundle-version=")) + { + if (next.startsWith("bundle-version=\"") || next.startsWith("bundle-version='")) + { + versionRange = next.substring("bundle-version=\"".length(), next.length()-1); + } + else + { + versionRange = next.substring("bundle-version=".length()); + } + } + } + Bundle[] reqBundles = admin.getBundles(symbolicName, versionRange); + if (reqBundles != null) + { + for (Bundle b : reqBundles) + { + if (b.getState() == Bundle.ACTIVE || b.getState() == Bundle.STARTING) + { + res.add(b); + break; + } + } + } + } + return res; + } + private void invokeFragmentActivators(ServiceReference sr) { |