437419 Allow scanning of META-INF for resources,fragments,tlds for unpacked jars
This commit is contained in:
parent
0751256559
commit
839485797b
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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>();
|
||||
|
|
Loading…
Reference in New Issue