Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugues Malphettes2011-05-18 05:13:17 +0000
committerHugues Malphettes2011-05-18 05:13:17 +0000
commit59d60f33b87e397bcbe108d69945a03b48beb8b5 (patch)
tree138972cff4102bdce42013f7933ddb1c4f3d4cab
parent0967a439f3c91a9075a6fca51693d7d3999754ae (diff)
downloadorg.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
-rw-r--r--jetty-osgi/jetty-osgi-boot/META-INF/MANIFEST.MF2
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/WebBundleDeployerHelper.java2
-rw-r--r--jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/utils/internal/PackageAdminServiceTracker.java112
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)
{

Back to the top