diff options
4 files changed, 84 insertions, 156 deletions
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java index 322aec55e7..14c796d213 100644 --- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java +++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/annotations/AnnotationConfiguration.java @@ -23,6 +23,7 @@ import java.util.Set; import org.eclipse.jetty.annotations.AnnotationParser.Handler; import org.eclipse.jetty.annotations.ClassNameResolver; +import org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration; import org.eclipse.jetty.osgi.boot.OSGiWebappConstants; import org.eclipse.jetty.osgi.boot.utils.internal.PackageAdminServiceTracker; import org.eclipse.jetty.util.log.Log; @@ -92,7 +93,7 @@ public class AnnotationConfiguration extends org.eclipse.jetty.annotations.Annot AnnotationParser oparser = (AnnotationParser)parser; Bundle webbundle = (Bundle) context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE); - Bundle[] fragAndRequiredBundles = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles(webbundle); + Set<Bundle> fragAndRequiredBundles = (Set<Bundle>)context.getAttribute(OSGiWebInfConfiguration.FRAGMENT_AND_REQUIRED_BUNDLES); if (fragAndRequiredBundles != null) { //index and scan fragments diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiMetaInfConfiguration.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiMetaInfConfiguration.java deleted file mode 100644 index 7b85f62a2d..0000000000 --- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiMetaInfConfiguration.java +++ /dev/null @@ -1,129 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== -// - -package org.eclipse.jetty.osgi.boot; - -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelperFactory; -import org.eclipse.jetty.osgi.boot.utils.internal.PackageAdminServiceTracker; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; -import org.eclipse.jetty.util.resource.Resource; -import org.eclipse.jetty.webapp.MetaInfConfiguration; -import org.eclipse.jetty.webapp.WebAppContext; -import org.osgi.framework.Bundle; - -/** - * OSGiMetaInfConfiguration - * - * Extension of standard Jetty MetaInfConfiguration class to handle OSGi bundle - * fragments that may also need to be scanned for META-INF info. - * - * @deprecated - */ -public class OSGiMetaInfConfiguration extends MetaInfConfiguration -{ - private static final Logger LOG = Log.getLogger(OSGiMetaInfConfiguration.class); - - - /** - * Inspect bundle fragments associated with the bundle of the webapp for web-fragment, resources, tlds. - * - * @see org.eclipse.jetty.webapp.MetaInfConfiguration#preConfigure(org.eclipse.jetty.webapp.WebAppContext) - */ - @Override - public void preConfigure(final WebAppContext context) throws Exception - { - Map<Resource, Resource> frags = (Map<Resource, Resource>) context.getAttribute(METAINF_FRAGMENTS); - Set<Resource> resfrags = (Set<Resource>) context.getAttribute(METAINF_RESOURCES); - List<Resource> tldfrags = (List<Resource>) context.getAttribute(METAINF_TLDS); - - Bundle[] fragments = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles((Bundle)context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE)); - //TODO not convinced we need to do this, as we added any fragment jars to the MetaData.webInfJars in OSGiWebInfConfiguration, - //so surely the web-fragments and resources tlds etc can be discovered normally? - for (Bundle frag : fragments) - { - URL webFrag = frag.getEntry("/META-INF/web-fragment.xml"); - Enumeration<URL> resEnum = frag.findEntries("/META-INF/resources", "*", true); - Enumeration<URL> tldEnum = frag.findEntries("/META-INF", "*.tld", false); - if (webFrag != null || (resEnum != null && resEnum.hasMoreElements()) || (tldEnum != null && tldEnum.hasMoreElements())) - { - try - { - if (webFrag != null) - { - if (frags == null) - { - frags = new HashMap<Resource,Resource>(); - context.setAttribute(METAINF_FRAGMENTS, frags); - } - frags.put(Resource.newResource(BundleFileLocatorHelperFactory.getFactory().getHelper().getBundleInstallLocation(frag).toURI()), - Resource.newResource(webFrag)); - } - if (resEnum != null && resEnum.hasMoreElements()) - { - URL resourcesEntry = frag.getEntry("/META-INF/resources/"); - if (resourcesEntry == null) - { - // probably we found some fragments to a - // bundle. - // those are already contributed. - // so we skip this. - } - else - { - if (resfrags == null) - { - resfrags = new HashSet<Resource>(); - context.setAttribute(METAINF_RESOURCES, resfrags); - } - resfrags.add(Resource.newResource(BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(resourcesEntry))); - } - } - if (tldEnum != null && tldEnum.hasMoreElements()) - { - if (tldfrags == null) - { - tldfrags = new ArrayList<Resource>(); - context.setAttribute(METAINF_TLDS, tldfrags); - } - while (tldEnum.hasMoreElements()) - { - URL tldUrl = tldEnum.nextElement(); - tldfrags.add(Resource.newResource(BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(tldUrl))); - } - } - } - catch (Exception e) - { - LOG.warn("Unable to locate the bundle " + frag.getBundleId(), e); - } - } - } - - super.preConfigure(context); - } -} diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java index ce3c141ae5..69a7ce8cdb 100644 --- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java +++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/OSGiWebInfConfiguration.java @@ -23,6 +23,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.StringTokenizer; import java.util.TreeMap; import java.util.regex.Pattern; @@ -51,6 +52,9 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration public static final String CONTAINER_BUNDLE_PATTERN = "org.eclipse.jetty.server.webapp.containerIncludeBundlePattern"; + public static final String FRAGMENT_AND_REQUIRED_BUNDLES = "org.eclipse.jetty.osgi.fragmentAndRequiredBundles"; + public static final String FRAGMENT_AND_REQUIRED_RESOURCES = "org.eclipse.jetty.osgi.fragmentAndRequiredResources"; + /* ------------------------------------------------------------ */ /** @@ -87,7 +91,6 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration while (tokenizer.hasMoreTokens()) names.add(tokenizer.nextToken()); } - HashSet<Resource> matchingResources = new HashSet<Resource>(); if ( !names.isEmpty() || pattern != null) { @@ -111,14 +114,20 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration matchingResources.addAll(getBundleAsResource(bundle)); } } - } - + } for (Resource r:matchingResources) { context.getMetaData().addContainerResource(r); } } + @Override + public void postConfigure(WebAppContext context) throws Exception + { + context.setAttribute(FRAGMENT_AND_REQUIRED_BUNDLES, null); + context.setAttribute(FRAGMENT_AND_REQUIRED_RESOURCES, null); + super.postConfigure(context); + } /* ------------------------------------------------------------ */ /** @@ -137,12 +146,34 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration if (webInfJars != null) mergedResources.addAll(webInfJars); - //add fragment jars as if in WEB-INF/lib of the associated webapp - Bundle[] fragments = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles((Bundle)context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE)); - for (Bundle frag : fragments) + //add fragment jars and any Required-Bundles as if in WEB-INF/lib of the associated webapp + Bundle[] bundles = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles((Bundle)context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE)); + if (bundles != null && bundles.length > 0) { - File fragFile = BundleFileLocatorHelperFactory.getFactory().getHelper().getBundleInstallLocation(frag); - mergedResources.add(Resource.newResource(fragFile.toURI())); + Set<Bundle> fragsAndReqsBundles = (Set<Bundle>)context.getAttribute(FRAGMENT_AND_REQUIRED_BUNDLES); + if (fragsAndReqsBundles == null) + { + fragsAndReqsBundles = new HashSet<Bundle>(); + context.setAttribute(FRAGMENT_AND_REQUIRED_BUNDLES, fragsAndReqsBundles); + } + + Set<Resource> fragsAndReqsResources = (Set<Resource>)context.getAttribute(FRAGMENT_AND_REQUIRED_RESOURCES); + if (fragsAndReqsResources == null) + { + fragsAndReqsResources = new HashSet<Resource>(); + context.setAttribute(FRAGMENT_AND_REQUIRED_RESOURCES, fragsAndReqsResources); + } + + for (Bundle b : bundles) + { + //add to context attribute storing associated fragments and required bundles + fragsAndReqsBundles.add(b); + File f = BundleFileLocatorHelperFactory.getFactory().getHelper().getBundleInstallLocation(b); + Resource r = Resource.newResource(f.toURI()); + //add to convenience context attribute storing fragments and required bundles as Resources + fragsAndReqsResources.add(r); + mergedResources.add(r); + } } return mergedResources; @@ -165,9 +196,8 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration Bundle bundle = (Bundle)context.getAttribute(OSGiWebappConstants.JETTY_OSGI_BUNDLE); if (bundle != null) { - //TODO anything we need to do to improve PackageAdminServiceTracker? - Bundle[] fragments = PackageAdminServiceTracker.INSTANCE.getFragmentsAndRequiredBundles(bundle); - if (fragments != null && fragments.length != 0) + Set<Bundle> fragments = (Set<Bundle>)context.getAttribute(FRAGMENT_AND_REQUIRED_BUNDLES); + if (fragments != null && !fragments.isEmpty()) { // sorted extra resource base found in the fragments. // the resources are either overriding the resourcebase found in the diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java index 8013e2cd91..75002df067 100644 --- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/MetaInfConfiguration.java @@ -131,41 +131,50 @@ public class MetaInfConfiguration extends AbstractConfiguration * Scan for META-INF/resources dir in the given jar. * * @param context - * @param jar + * @param target * @param cache * @throws Exception */ - public void scanForResources (WebAppContext context, Resource jar, ConcurrentHashMap<Resource,Resource> cache) + public void scanForResources (WebAppContext context, Resource target, ConcurrentHashMap<Resource,Resource> cache) throws Exception { Resource resourcesDir = null; - if (cache != null && cache.containsKey(jar)) + if (cache != null && cache.containsKey(target)) { - resourcesDir = cache.get(jar); + resourcesDir = cache.get(target); if (resourcesDir == EmptyResource.INSTANCE) { - if (LOG.isDebugEnabled()) LOG.debug(jar+" cached as containing no META-INF/resources"); + if (LOG.isDebugEnabled()) LOG.debug(target+" cached as containing no META-INF/resources"); return; } else - if (LOG.isDebugEnabled()) LOG.debug(jar+" META-INF/resources found in cache "); + if (LOG.isDebugEnabled()) LOG.debug(target+" META-INF/resources found in cache "); } else { //not using caches or not in the cache so check for the resources dir - if (LOG.isDebugEnabled()) LOG.debug(jar+" META-INF/resources checked"); - URI uri = jar.getURI(); - resourcesDir = Resource.newResource("jar:"+uri+"!/META-INF/resources"); + if (LOG.isDebugEnabled()) LOG.debug(target+" META-INF/resources checked"); + if (target.isDirectory()) + { + //TODO think how to handle an unpacked jar file (eg for osgi) + resourcesDir = target.addPath("/META-INF/resources"); + } + else + { + //Resource represents a packed jar + URI uri = target.getURI(); + resourcesDir = Resource.newResource("jar:"+uri+"!/META-INF/resources"); + } if (!resourcesDir.exists() || !resourcesDir.isDirectory()) resourcesDir = EmptyResource.INSTANCE; if (cache != null) { - Resource old = cache.putIfAbsent(jar, resourcesDir); + Resource old = cache.putIfAbsent(target, resourcesDir); if (old != null) resourcesDir = old; else - if (LOG.isDebugEnabled()) LOG.debug(jar+" META-INF/resources cache updated"); + if (LOG.isDebugEnabled()) LOG.debug(target+" META-INF/resources cache updated"); } if (resourcesDir == EmptyResource.INSTANCE) @@ -210,8 +219,16 @@ public class MetaInfConfiguration extends AbstractConfiguration { //not using caches or not in the cache so check for the web-fragment.xml if (LOG.isDebugEnabled()) LOG.debug(jar+" META-INF/web-fragment.xml checked"); - URI uri = jar.getURI(); - webFrag = Resource.newResource("jar:"+uri+"!/META-INF/web-fragment.xml"); + if (jar.isDirectory()) + { + //TODO ???? + webFrag = jar.addPath("/META-INF/web-fragment.xml"); + } + else + { + URI uri = jar.getURI(); + webFrag = Resource.newResource("jar:"+uri+"!/META-INF/web-fragment.xml"); + } if (!webFrag.exists() || webFrag.isDirectory()) webFrag = EmptyResource.INSTANCE; @@ -270,8 +287,17 @@ public class MetaInfConfiguration extends AbstractConfiguration else { //not using caches or not in the cache so find all tlds - URI uri = jar.getURI(); - Resource metaInfDir = Resource.newResource("jar:"+uri+"!/META-INF/"); + Resource metaInfDir = null; + if (jar.isDirectory()) + { + //TODO ?????? + metaInfDir = jar.addPath("/META-INF/"); + } + else + { + URI uri = jar.getURI(); + metaInfDir = Resource.newResource("jar:"+uri+"!/META-INF/"); + } //find any *.tld files inside META-INF or subdirs tlds = new HashSet<URL>(); |