diff --git a/VERSION.txt b/VERSION.txt
index d330e267ae2..5787c9b4b0e 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1,8 +1,39 @@
jetty-9.3.0-SNAPSHOT
-jetty-9.2.3-SNAPSHOT
-jetty-9.2.2-v20140723 - 23 July 2014
+jetty-9.2.3.v20140905 - 05 September 2014
+ + 347110 renamed class transformer methods
+ + 411163 Add embedded jetty code example with JSP enabled
+ + 435322 Added a idleTimeout to the SharedBlockerCallback
+ + 435533 Handle 0 sized async gzip
+ + 435988 ContainerLifeCycle: beans never stopped on remove
+ + 436862 Update jetty-osgi to asm-5 and spifly-1.0.1
+ + 438500 Odd NoClassDef errors when shutting down the jetty-maven-plugin via
+ the stop goal
+ + 440255 ensure 500 is logged on thrown Errors
+ + 441073 isEarlyEOF on HttpInput
+ + 441475 org.eclipse.jetty.server.ResourceCache exceptions under high load
+ + 441479 Jetty hangs due to deadlocks in session manager
+ + 441649 Update to jsp and el Apache Jasper 8.0.9
+ + 441756 Ssl Stackoverflow on renegotiate
+ + 441897 Fixed etag handling in gzipfilter
+ + 442048 fixed sendRedirect %2F encoding
+ + 442383 Improved insufficient threads message
+ + 442628 Update example xml file for second server instance to extract wars
+ + 442642 Quickstart generates valid XML
+ + 442759 Allow specific ServletContainerInitializers to be excluded
+ + 442950 Embedded Jetty client requests to localhost hangs with high cpu usage
+ (NIO OP_CONNECT Solaris/Sparc).
+ + 443049 Improved HttpParser illegal character messages
+ + 443158 Fixed HttpOutput spin
+ + 443172 web-fragment.xml wrongly parsed for applications running in serlvet
+ 2.4 mode
+ + 443231 java.lang.NullPointerException on scavenge scheduling when session id
+ manager declared before shared scheduler
+ + 443262 Distinguish situation where jetty looks for tlds in META-INF but
+ finds none vs does not look
+
+jetty-9.2.2.v20140723 - 23 July 2014
+ 411323 DosFilter/QoSFilter should use AsyncContext rather than
Continuations.
+ 432815 Fixed selector stop race
diff --git a/apache-jsp/pom.xml b/apache-jsp/pom.xml
index bfd0b92f4c8..7cd20a7fb05 100644
--- a/apache-jsp/pom.xml
+++ b/apache-jsp/pom.xml
@@ -26,6 +26,7 @@
+ Jetty-specific ServletContainerInitializer for Jasperorg.eclipse.jetty.apache.jsp.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"osgi.serviceloader; osgi.serviceloader=javax.servlet.ServletContainerInitializer
@@ -35,6 +36,29 @@
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ artifact-jar
+
+ jar
+
+
+
+ test-jar
+
+ test-jar
+
+
+
+
+
+ ${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+
+
diff --git a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn.mod b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn.mod
index 4e6440fd17f..2260ad3d4bc 100644
--- a/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn.mod
+++ b/jetty-alpn/jetty-alpn-server/src/main/config/modules/protonego-impl/alpn.mod
@@ -37,7 +37,7 @@ lib/alpn/
[license]
ALPN is a hosted at github under the GPL v2 with ClassPath Exception.
-ALPM replaces/modified OpenJDK classes in the java.sun.security.ssl package.
+ALPM replaces/modifies OpenJDK classes in the java.sun.security.ssl package.
http://github.com/jetty-project/jetty-alpn
http://openjdk.java.net/legal/gplv2+ce.html
diff --git a/jetty-npn/jetty-npn-server/src/main/config/modules/protonego-impl/npn.mod b/jetty-npn/jetty-npn-server/src/main/config/modules/protonego-impl/npn.mod
index a512d7a7bd8..8a5787be893 100644
--- a/jetty-npn/jetty-npn-server/src/main/config/modules/protonego-impl/npn.mod
+++ b/jetty-npn/jetty-npn-server/src/main/config/modules/protonego-impl/npn.mod
@@ -37,6 +37,6 @@ lib/npn/
[license]
NPN is a hosted at github under the GPL v2 with ClassPath Exception.
-NPN replaces/modified OpenJDK classes in the java.sun.security.ssl package.
+NPN replaces/modifies OpenJDK classes in the java.sun.security.ssl package.
http://github.com/jetty-project/jetty-npn
http://openjdk.java.net/legal/gplv2+ce.html
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
index a61cdeecab8..f6ef0649061 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
@@ -39,10 +39,31 @@
org.eclipse.jetty
- jetty-jsp
+ apache-jsp${project.version}
+
+ org.eclipse.jetty.orbit
+ javax.servlet.jsp.jstl
+
+
+ org.glassfish.web
+ javax.servlet.jsp.jstl
+
+
+ org.mortbay.jasper
+ apache-el
+ 8.0.9.M3
+
+
@@ -96,7 +117,7 @@
javax.el;version="[3.0,3.1)",
javax.servlet;version="[3.1,3.2)",
javax.servlet.resources;version="[3.1,3.2)",
- javax.servlet.jsp.resources;version="[3.1,3.2)",
+ javax.servlet.jsp.resources;version="[2.3,4)",
javax.servlet.jsp;version="[2.3,2.4)",
javax.servlet.jsp.el;version="[2.3,2.4)",
javax.servlet.jsp.tagext;version="[2.3,2.4)",
@@ -104,16 +125,20 @@
javax.servlet.jsp.jstl.fmt;version="1.2";resolution:=optional,
javax.servlet.jsp.jstl.sql;version="1.2";resolution:=optional,
javax.servlet.jsp.jstl.tlv;version="1.2";resolution:=optional,
- org.apache.jasper;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.compiler;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.compiler.tagplugin;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.runtime;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.security;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.servlet;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.tagplugins.jstl;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.util;version="[2.3.2,2.4)";resolution:=optional,
- org.apache.jasper.xmlparser;version="[2.3.2,2.4)";resolution:=optional,
- org.glassfish.jsp.api;version="[2.3.2,2.4)";resolution:=optional,
+ org.apache.el;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el.lang;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el.stream;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el.util;version="[8.0.9,9)";resolution:=optional,
+ org.apache.el.parser;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.compiler;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.compiler.tagplugin;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.runtime;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.security;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.servlet;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.tagplugins.jstl;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.util;version="[8.0.9,9)";resolution:=optional,
+ org.apache.jasper.xmlparser;version="[8.0.9,9)";resolution:=optional,
org.apache.taglibs.standard;version="1.2";resolution:=optional,
org.apache.taglibs.standard.extra.spath;version="1.2";resolution:=optional,
org.apache.taglibs.standard.functions;version="1.2";resolution:=optional,
@@ -137,6 +162,7 @@
org.apache.taglibs.standard.tag.rt.xml;version="1.2";resolution:=optional,
org.apache.taglibs.standard.tei;version="1.2";resolution:=optional,
org.apache.taglibs.standard.tlv;version="1.2";resolution:=optional,
+ org.apache.tomcat;version="[8.0.9,9)";resolution:=optional,
org.osgi.*,
org.xml.*;resolution:=optional,
org.xml.sax.*;resolution:=optional,
@@ -145,8 +171,8 @@
org.w3c.dom.ls;resolution:=optional,
javax.xml.parser;resolution:=optional
- <_nouses>true
- org.apache.jasper.*;version="2.3"
+ <_nouses>true
+ org.apache.jasper.*;version="8.0.9",org.apache.el.*;version="8.0.9"
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/ContainerTldBundleDiscoverer.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/ContainerTldBundleDiscoverer.java
index b88fda629d6..7979d7bd47e 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/ContainerTldBundleDiscoverer.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/ContainerTldBundleDiscoverer.java
@@ -27,10 +27,15 @@ import java.util.Set;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
+import javax.servlet.jsp.JspFactory;
+
import org.eclipse.jetty.deploy.DeploymentManager;
+import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
import org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration;
import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
import org.eclipse.jetty.osgi.boot.utils.TldBundleDiscoverer;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
@@ -39,15 +44,24 @@ import org.osgi.framework.FrameworkUtil;
/**
* ContainerTldBundleDiscoverer
*
+ * Finds bundles that are considered as on the container classpath that
+ * contain tlds.
*
- * Use a System property to define bundles that contain tlds that need to
- * be treated by jasper as if they were on the jetty container's classpath.
+ * The System property org.eclipse.jetty.osgi.tldbundles is a comma
+ * separated list of exact symbolic names of bundles that have container classpath
+ * tlds.
*
- * The value of the property is evaluated against the DeploymentManager
- * context attribute "org.eclipse.jetty.server.webapp.containerIncludeBundlePattern",
- * which defines a pattern of matching bundle names.
+ * The DeploymentManager context attribute "org.eclipse.jetty.server.webapp.containerIncludeBundlePattern"
+ * can be used to define a pattern of symbolic names of bundles that contain container
+ * classpath tlds.
*
- * The bundle locations are converted to URLs for jasper's use.
+ * The matching bundles are converted to URLs that are put onto a special classloader that acts as the
+ * parent classloader for contexts deployed by the jetty Server instance (see ServerInstanceWrapper).
+ *
+ * It also discovers the bundle that contains the jstl taglib and adds it into the
+ * "org.eclipse.jetty.server.webapp.containerIncludeBundlePattern" (if it is not already there) so
+ * that the WebInfOSGiConfiguration class will add the jstl taglib bundle into the list of container
+ * resources.
*
* Eg:
* -Dorg.eclipse.jetty.osgi.tldbundles=org.springframework.web.servlet,com.opensymphony.module.sitemesh
@@ -55,16 +69,20 @@ import org.osgi.framework.FrameworkUtil;
*/
public class ContainerTldBundleDiscoverer implements TldBundleDiscoverer
{
+
+ private static final Logger LOG = Log.getLogger(ContainerTldBundleDiscoverer.class);
+
+
+ private static String DEFAULT_JSP_FACTORY_IMPL_CLASS = "org.apache.jasper.runtime.JspFactoryImpl";
/**
- * Comma separated list of names of bundles that contain tld files that should be
- * discoved by jasper as if they were on the container's classpath.
- * Eg:
- * -Djetty.osgi.tldbundles=org.springframework.web.servlet,com.opensymphony.module.sitemesh
+ * Default name of a class that belongs to the jstl bundle. From that class
+ * we locate the corresponding bundle and register it as a bundle that
+ * contains tld files.
*/
- public static final String SYS_PROP_TLD_BUNDLES = "org.eclipse.jetty.osgi.tldbundles";
-
-
+ private static String DEFAULT_JSTL_BUNDLE_CLASS = "org.apache.taglibs.standard.tag.el.core.WhenTag";
+ private Bundle jstlBundle = null;
+
/**
* Check the System property "org.eclipse.jetty.osgi.tldbundles" for names of
* bundles that contain tlds and convert to URLs.
@@ -72,19 +90,18 @@ public class ContainerTldBundleDiscoverer implements TldBundleDiscoverer
* @return The location of the jars that contain tld files as URLs.
*/
public URL[] getUrlsForBundlesWithTlds(DeploymentManager deploymentManager, BundleFileLocatorHelper locatorHelper) throws Exception
- {
- // naive way of finding those bundles.
- // lots of assumptions: for example we assume a single version of each
- // bundle that would contain tld files.
- // this is probably good enough as those tlds are loaded system-wide on
- // jetty.
- // to do better than this we need to do it on a per webapp basis.
- // probably using custom properties in the ContextHandler service
- // and mirroring those in the MANIFEST.MF
+ {
+ if (!isJspAvailable())
+ {
+ return new URL[0];
+ }
+
+ if (jstlBundle == null)
+ jstlBundle = findJstlBundle();
Bundle[] bundles = FrameworkUtil.getBundle(ContainerTldBundleDiscoverer.class).getBundleContext().getBundles();
HashSet urls = new HashSet();
- String tmp = System.getProperty(SYS_PROP_TLD_BUNDLES); //comma separated exact names
+ String tmp = System.getProperty(OSGiWebInfConfiguration.SYS_PROP_TLD_BUNDLES); //comma separated exact names
List sysNames = new ArrayList();
if (tmp != null)
{
@@ -93,13 +110,33 @@ public class ContainerTldBundleDiscoverer implements TldBundleDiscoverer
sysNames.add(tokenizer.nextToken());
}
tmp = (String) deploymentManager.getContextAttribute(OSGiWebInfConfiguration.CONTAINER_BUNDLE_PATTERN); //bundle name patterns
+
Pattern pattern = (tmp==null? null : Pattern.compile(tmp));
+
+ //check that the jstl bundle is not already included in the pattern, and include it if it is not because
+ //subsequent classes such as OSGiWebInfConfiguration use this pattern to determine which jars are
+ //considered to be on the container classpath
+ if (jstlBundle != null)
+ {
+ if (pattern == null)
+ {
+ pattern = Pattern.compile(jstlBundle.getSymbolicName());
+ deploymentManager.setContextAttribute(OSGiWebInfConfiguration.CONTAINER_BUNDLE_PATTERN, jstlBundle.getSymbolicName());
+ }
+ else if (!(pattern.matcher(jstlBundle.getSymbolicName()).matches()))
+ {
+ String s = tmp+"|"+jstlBundle.getSymbolicName();
+ pattern = Pattern.compile(s);
+ deploymentManager.setContextAttribute(OSGiWebInfConfiguration.CONTAINER_BUNDLE_PATTERN, s);
+ }
+ }
+
+
for (Bundle bundle : bundles)
{
if (sysNames.contains(bundle.getSymbolicName()))
- convertBundleLocationToURL(locatorHelper, bundle, urls);
-
- if (pattern != null && pattern.matcher(bundle.getSymbolicName()).matches())
+ convertBundleLocationToURL(locatorHelper, bundle, urls);
+ else if (pattern != null && pattern.matcher(bundle.getSymbolicName()).matches())
convertBundleLocationToURL(locatorHelper, bundle, urls);
}
@@ -107,6 +144,79 @@ public class ContainerTldBundleDiscoverer implements TldBundleDiscoverer
}
+ /**
+ * Check that jsp is on the classpath
+ * @return
+ */
+ public boolean isJspAvailable()
+ {
+ try
+ {
+ getClass().getClassLoader().loadClass("org.apache.jasper.servlet.JspServlet");
+ }
+ catch (Exception e)
+ {
+ LOG.warn("Unable to locate the JspServlet: jsp support unavailable.", e);
+ return false;
+ }
+ return true;
+ }
+
+
+ /**
+ *
+ * Some versions of JspFactory do Class.forName, which probably won't work in an
+ * OSGi environment.
+ */
+ public void fixJspFactory ()
+ {
+ try
+ {
+ Class servletContextClass = javax.servlet.ServletContext.class;
+ // bug #299733
+ JspFactory fact = JspFactory.getDefaultFactory();
+ if (fact == null)
+ { // bug #299733
+ // JspFactory does a simple
+ // Class.getForName("org.apache.jasper.runtime.JspFactoryImpl")
+ // however its bundles does not import the jasper package
+ // so it fails. let's help things out:
+ fact = (JspFactory) JettyBootstrapActivator.class.getClassLoader().loadClass(DEFAULT_JSP_FACTORY_IMPL_CLASS).newInstance();
+ JspFactory.setDefaultFactory(fact);
+ }
+ }
+ catch (Exception e)
+ {
+ LOG.warn("Unable to set the JspFactory: jsp support incomplete.", e);
+ }
+ }
+
+
+ /**
+ * Find the bundle that contains a jstl implementation class, which assumes that
+ * the jstl taglibs will be inside the same bundle.
+ * @return
+ */
+ public Bundle findJstlBundle ()
+ {
+ Class> jstlClass = null;
+
+ try
+ {
+ jstlClass = JSTLBundleDiscoverer.class.getClassLoader().loadClass(DEFAULT_JSTL_BUNDLE_CLASS);
+ }
+ catch (ClassNotFoundException e)
+ {
+ LOG.info("jstl not on classpath", e);
+ }
+
+ if (jstlClass != null)
+ //get the bundle containing jstl
+ return FrameworkUtil.getBundle(jstlClass);
+
+ return null;
+ }
+
/**
* Resolves a bundle that contains tld files as a URL. The URLs are
* used by jasper to discover the tld files.
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
index 04cdc724202..3857664942d 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jasper/JSTLBundleDiscoverer.java
@@ -20,9 +20,11 @@ package org.eclipse.jetty.osgi.boot.jasper;
import java.io.File;
import java.io.InputStream;
+import java.lang.reflect.Field;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
+import java.util.Set;
import javax.servlet.Servlet;
import javax.servlet.jsp.JspContext;
@@ -30,7 +32,6 @@ import javax.servlet.jsp.JspFactory;
import org.apache.jasper.Constants;
import org.apache.jasper.compiler.Localizer;
-import org.apache.jasper.xmlparser.ParserUtils;
import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.osgi.boot.JettyBootstrapActivator;
import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelper;
@@ -85,10 +86,12 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
* implementation. bug #299733
*/
private static String DEFAULT_JSP_FACTORY_IMPL_CLASS = "org.apache.jasper.runtime.JspFactoryImpl";
+
+ private static final Set __tldBundleCache = new HashSet();
public JSTLBundleDiscoverer()
{
- fixupDtdResolution();
+ //fixupDtdResolution();
try
{
@@ -102,6 +105,7 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
}
try
{
+ Class servletContextClass = javax.servlet.ServletContext.class;
// bug #299733
JspFactory fact = JspFactory.getDefaultFactory();
if (fact == null)
@@ -143,7 +147,7 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
{
ArrayList urls = new ArrayList();
- HashSet> classesToAddToTheTldBundles = new HashSet>();
+ Class> jstlClass = null;
// Look for the jstl bundle
// We assume the jstl's tlds are defined there.
@@ -151,18 +155,21 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
// So we can look for this class using this bundle's classloader:
try
{
- Class> jstlClass = JSTLBundleDiscoverer.class.getClassLoader().loadClass(DEFAULT_JSTL_BUNDLE_CLASS);
-
- classesToAddToTheTldBundles.add(jstlClass);
+ jstlClass = JSTLBundleDiscoverer.class.getClassLoader().loadClass(DEFAULT_JSTL_BUNDLE_CLASS);
}
catch (ClassNotFoundException e)
{
LOG.info("jstl not on classpath", e);
}
- for (Class> cl : classesToAddToTheTldBundles)
+
+ if (jstlClass != null)
{
- Bundle tldBundle = FrameworkUtil.getBundle(cl);
+ //get the bundle containing jstl
+ Bundle tldBundle = FrameworkUtil.getBundle(jstlClass);
File tldBundleLocation = locatorHelper.getBundleInstallLocation(tldBundle);
+
+ System.err.println("jstl bundle: "+tldBundle);
+ System.err.println("jstl bundle location: "+tldBundleLocation);
if (tldBundleLocation != null && tldBundleLocation.isDirectory())
{
// try to find the jar files inside this folder
@@ -170,6 +177,7 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
{
if (f.getName().endsWith(".jar") && f.isFile())
{
+ System.err.println("Tld jar in dir: "+f.toURI());
urls.add(f.toURI().toURL());
}
else if (f.isDirectory() && f.getName().equals("lib"))
@@ -178,6 +186,7 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
{
if (f2.getName().endsWith(".jar") && f2.isFile())
{
+ System.err.println("Tld jar in lib dir: "+f2.toURI());
urls.add(f2.toURI().toURL());
}
}
@@ -187,9 +196,20 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
}
else if (tldBundleLocation != null)
{
+ System.err.println("Tld bundle uri: "+tldBundleLocation.toURI());
urls.add(tldBundleLocation.toURI().toURL());
+
+ String pattern = (String)deployer.getContextAttribute("org.eclipse.jetty.server.webapp.containerIncludeBundlePattern");
+ pattern = (pattern==null?"":pattern);
+ if (!pattern.contains(tldBundle.getSymbolicName()))
+ {
+ pattern += "|"+tldBundle.getSymbolicName();
+ deployer.setContextAttribute("org.eclipse.jetty.server.webapp.containerIncludeBundlePattern", pattern);
+ }
+ System.err.println("PATTERN: "+pattern);
}
}
+
return urls.toArray(new URL[urls.size()]);
}
@@ -209,11 +229,12 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
* new value on a static friendly field :(
*
*/
- void fixupDtdResolution()
+ void fixupDtdResolution()
{
try
{
- ParserUtils.setEntityResolver(new MyFixedupEntityResolver());
+ // ParserUtils.setEntityResolver(new MyFixedupEntityResolver());
+
}
catch (Exception e)
@@ -227,21 +248,21 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
* Instead of using the ParserUtil's classloader, we use a class that is
* indeed next to the resource for sure.
*/
- static class MyFixedupEntityResolver implements EntityResolver
- {
+ //static class MyFixedupEntityResolver implements EntityResolver
+ //{
/**
* Same values than in ParserUtils...
*/
- static final String[] CACHED_DTD_PUBLIC_IDS = { Constants.TAGLIB_DTD_PUBLIC_ID_11, Constants.TAGLIB_DTD_PUBLIC_ID_12,
+ /* static final String[] CACHED_DTD_PUBLIC_IDS = { Constants.TAGLIB_DTD_PUBLIC_ID_11, Constants.TAGLIB_DTD_PUBLIC_ID_12,
Constants.WEBAPP_DTD_PUBLIC_ID_22, Constants.WEBAPP_DTD_PUBLIC_ID_23, };
static final String[] CACHED_DTD_RESOURCE_PATHS = { Constants.TAGLIB_DTD_RESOURCE_PATH_11, Constants.TAGLIB_DTD_RESOURCE_PATH_12,
Constants.WEBAPP_DTD_RESOURCE_PATH_22, Constants.WEBAPP_DTD_RESOURCE_PATH_23, };
static final String[] CACHED_SCHEMA_RESOURCE_PATHS = { Constants.TAGLIB_SCHEMA_RESOURCE_PATH_20, Constants.TAGLIB_SCHEMA_RESOURCE_PATH_21,
- Constants.WEBAPP_SCHEMA_RESOURCE_PATH_24, Constants.WEBAPP_SCHEMA_RESOURCE_PATH_25, };
+ Constants.WEBAPP_SCHEMA_RESOURCE_PATH_24, Constants.WEBAPP_SCHEMA_RESOURCE_PATH_25, };*/
- public InputSource resolveEntity(String publicId, String systemId) throws SAXException
+ /* public InputSource resolveEntity(String publicId, String systemId) throws SAXException
{
for (int i = 0; i < CACHED_DTD_PUBLIC_IDS.length; i++)
{
@@ -255,11 +276,11 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
{
input = JspContext.class.getResourceAsStream(resourcePath);
if (input == null)
- {
+ {*/
// if that failed try again with the original code:
// although it is likely not changed.
- input = this.getClass().getResourceAsStream(resourcePath);
- }
+ /* input = this.getClass().getResourceAsStream(resourcePath);
+ }
}
if (input == null) { throw new SAXException(Localizer.getMessage("jsp.error.internal.filenotfound", resourcePath)); }
InputSource isrc = new InputSource(input);
@@ -269,6 +290,6 @@ public class JSTLBundleDiscoverer implements TldBundleDiscoverer
return null;
}
- }
+ }*/
}
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
index d9bd9b69e84..74175801022 100644
--- a/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
+++ b/jetty-osgi/jetty-osgi-boot-jsp/src/main/java/org/eclipse/jetty/osgi/boot/jsp/FragmentActivator.java
@@ -18,17 +18,16 @@
package org.eclipse.jetty.osgi.boot.jsp;
-import org.eclipse.jetty.osgi.boot.BundleWebAppProvider;
+
import org.eclipse.jetty.osgi.boot.internal.serverfactory.ServerInstanceWrapper;
import org.eclipse.jetty.osgi.boot.jasper.ContainerTldBundleDiscoverer;
-import org.eclipse.jetty.osgi.boot.jasper.JSTLBundleDiscoverer;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
/**
* FragmentActivator
*
- * Sets up support for jsp. All relevant jsp jars must also be installed
+ * Sets up support for jsp and jstl. All relevant jsp jars must also be installed
* into the osgi environment.
*
* Note that as this is part of a bundle fragment, this activator is NOT
@@ -54,7 +53,6 @@ public class FragmentActivator implements BundleActivator
//set up some classes that will look for bundles with tlds that must be converted
//to urls and treated as if they are on the Jetty container's classpath so that
//jasper can deal with them
- ServerInstanceWrapper.addContainerTldBundleDiscoverer(new JSTLBundleDiscoverer());
ServerInstanceWrapper.addContainerTldBundleDiscoverer(new ContainerTldBundleDiscoverer());
}
diff --git a/jetty-osgi/jetty-osgi-boot/pom.xml b/jetty-osgi/jetty-osgi-boot/pom.xml
index a5b8453e7c4..bdbdb65915f 100644
--- a/jetty-osgi/jetty-osgi-boot/pom.xml
+++ b/jetty-osgi/jetty-osgi-boot/pom.xml
@@ -112,8 +112,9 @@
javax.servlet.http;version="[3.1,3.2)",
javax.transaction;version="1.1.0";resolution:=optional,
javax.transaction.xa;version="1.1.0";resolution:=optional,
+ org.eclipse.jetty.annotations;version="9.1";resolution:=optional,
+ org.eclipse.jetty.plus.webapp;version="9.1";resolution:=optional,
org.objectweb.asm;version=4;resolution:=optional,
- org.eclipse.jetty.annotations;version="9.0.0";resolution:=optional,
org.osgi.framework,
org.osgi.service.cm;version="1.2.0",
org.osgi.service.packageadmin,
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 14c796d2139..7ceca896c17 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
@@ -67,6 +67,10 @@ public class AnnotationConfiguration extends org.eclipse.jetty.annotations.Annot
}
+ public AnnotationConfiguration()
+ {
+ System.err.println("Constructed osgi.AnnotationConfiguration");
+ }
/**
* This parser scans the bundles using the OSGi APIs instead of assuming a jar.
*/
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractContextProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractContextProvider.java
index 89621a2284b..726aa694d9b 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractContextProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractContextProvider.java
@@ -143,63 +143,12 @@ public abstract class AbstractContextProvider extends AbstractLifeCycle implemen
{
//apply the contextFile, creating the ContextHandler, the DeploymentManager will register it in the ContextHandlerCollection
Resource res = null;
-
- //try to find the context file in the filesystem
- if (_contextFile.startsWith("/"))
- res = getFileAsResource(_contextFile);
-
- //try to find it relative to jetty home
- if (res == null)
- {
- //See if the specific server we are related to has jetty.home set
- String jettyHome = (String)getServerInstanceWrapper().getServer().getAttribute(OSGiServerConstants.JETTY_HOME);
- if (jettyHome != null)
- res = getFileAsResource(jettyHome, _contextFile);
-
- //try to see if a SystemProperty for jetty.home is set
- if (res == null)
- {
- jettyHome = System.getProperty(OSGiServerConstants.JETTY_HOME);
-
- if (jettyHome != null)
- {
- if (jettyHome.startsWith("\"") || jettyHome.startsWith("'"))
- jettyHome = jettyHome.substring(1);
- if (jettyHome.endsWith("\"") || (jettyHome.endsWith("'")))
- jettyHome = jettyHome.substring(0,jettyHome.length()-1);
-
- res = getFileAsResource(jettyHome, _contextFile);
- LOG.debug("jetty home context file: {}",res);
- }
- }
- }
-
- //try to find it relative to an override location that has been specified
- if (res == null)
- {
- if (bundleOverrideLocation != null)
- {
- try(Resource location=Resource.newResource(bundleOverrideLocation))
- {
- res=location.addPath(_contextFile);
- }
- LOG.debug("Bundle override location context file: {}",res);
- }
- }
-
- //try to find it relative to the bundle in which it is being deployed
- if (res == null)
- {
- if (_contextFile.startsWith("./"))
- _contextFile = _contextFile.substring(1);
-
- if (!_contextFile.startsWith("/"))
- _contextFile = "/" + _contextFile;
-
- URL contextURL = _bundle.getEntry(_contextFile);
- if (contextURL != null)
- res = Resource.newResource(contextURL);
- }
+
+ String jettyHome = (String)getServerInstanceWrapper().getServer().getAttribute(OSGiServerConstants.JETTY_HOME);
+ if (jettyHome == null)
+ jettyHome = System.getProperty(OSGiServerConstants.JETTY_HOME);
+
+ res = findFile(_contextFile, jettyHome, bundleOverrideLocation, _bundle);
//apply the context xml file, either to an existing ContextHandler, or letting the
//it create the ContextHandler as necessary
@@ -266,38 +215,6 @@ public abstract class AbstractContextProvider extends AbstractLifeCycle implemen
}
-
- private Resource getFileAsResource (String dir, String file)
- {
- Resource r = null;
- try
- {
- File asFile = new File (dir, file);
- if (asFile.exists())
- r = Resource.newResource(asFile);
- }
- catch (Exception e)
- {
- r = null;
- }
- return r;
- }
-
- private Resource getFileAsResource (String file)
- {
- Resource r = null;
- try
- {
- File asFile = new File (file);
- if (asFile.exists())
- r = Resource.newResource(asFile);
- }
- catch (Exception e)
- {
- r = null;
- }
- return r;
- }
}
/* ------------------------------------------------------------ */
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractOSGiApp.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractOSGiApp.java
index 185d0f1ae6e..7ffc9b4c66d 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractOSGiApp.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractOSGiApp.java
@@ -18,6 +18,8 @@
package org.eclipse.jetty.osgi.boot;
+import java.io.File;
+import java.net.URL;
import java.util.Dictionary;
import java.util.Hashtable;
@@ -25,6 +27,9 @@ import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppProvider;
import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.util.log.Logger;
+import org.eclipse.jetty.util.resource.Resource;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceRegistration;
@@ -39,6 +44,8 @@ import org.osgi.framework.ServiceRegistration;
*/
public abstract class AbstractOSGiApp extends App
{
+ private static final Logger LOG = Log.getLogger(AbstractOSGiApp.class);
+
protected Bundle _bundle;
protected Dictionary _properties;
protected ServiceRegistration _registration;
@@ -118,4 +125,91 @@ public abstract class AbstractOSGiApp extends App
_registration = null;
}
+ protected Resource getFileAsResource (String dir, String file)
+ {
+ Resource r = null;
+ try
+ {
+ File asFile = new File (dir, file);
+ if (asFile.exists())
+ r = Resource.newResource(asFile);
+ }
+ catch (Exception e)
+ {
+ r = null;
+ }
+ return r;
+ }
+
+ protected Resource getFileAsResource (String file)
+ {
+ Resource r = null;
+ try
+ {
+ File asFile = new File (file);
+ if (asFile.exists())
+ r = Resource.newResource(asFile);
+ }
+ catch (Exception e)
+ {
+ r = null;
+ }
+ return r;
+ }
+
+ protected Resource findFile (String fileName, String jettyHome, String bundleOverrideLocation, Bundle containingBundle)
+ {
+ Resource res = null;
+
+ //try to find the context file in the filesystem
+ if (fileName.startsWith("/"))
+ res = getFileAsResource(fileName);
+ if (res != null)
+ return res;
+
+ //try to find it relative to jetty home
+ if (jettyHome != null)
+ {
+ if (jettyHome.startsWith("\"") || jettyHome.startsWith("'"))
+ jettyHome = jettyHome.substring(1);
+ if (jettyHome.endsWith("\"") || (jettyHome.endsWith("'")))
+ jettyHome = jettyHome.substring(0,jettyHome.length()-1);
+
+ res = getFileAsResource(jettyHome, fileName);
+ }
+ if (res != null)
+ return res;
+
+
+ //try to find it relative to an override location that has been specified
+ if (bundleOverrideLocation != null)
+ {
+ try(Resource location=Resource.newResource(bundleOverrideLocation))
+ {
+ res=location.addPath(fileName);
+ }
+ catch (Exception e)
+ {
+ LOG.warn(e);
+ }
+ }
+ if (res != null)
+ return res;
+
+ //try to find it relative to the bundle in which it is being deployed
+ if (containingBundle != null)
+ {
+ if (fileName.startsWith("./"))
+ fileName = fileName.substring(1);
+
+ if (!fileName.startsWith("/"))
+ fileName = "/" + fileName;
+
+ URL entry = _bundle.getEntry(fileName);
+ if (entry != null)
+ res = Resource.newResource(entry);
+ }
+
+ return res;
+ }
}
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
index 6d31ebd03cf..849a00c55c3 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java
@@ -20,10 +20,12 @@ package org.eclipse.jetty.osgi.boot;
import java.io.File;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.List;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppProvider;
@@ -32,7 +34,9 @@ import org.eclipse.jetty.osgi.boot.internal.serverfactory.ServerInstanceWrapper;
import org.eclipse.jetty.osgi.boot.internal.webapp.OSGiWebappClassLoader;
import org.eclipse.jetty.osgi.boot.utils.BundleFileLocatorHelperFactory;
import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.util.ArrayUtil;
import org.eclipse.jetty.util.component.AbstractLifeCycle;
+import org.eclipse.jetty.util.Loader;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.resource.JarResource;
@@ -73,17 +77,23 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
public static String[] getDefaultConfigurations ()
{
+ List configs = ArrayUtil.asMutableList(__defaultConfigurations);
if (annotationsAvailable())
{
- String[] configs = new String[__defaultConfigurations.length+1];
- System.arraycopy(__defaultConfigurations, 0, configs, 0, 4);
- configs[4] = "org.eclipse.jetty.osgi.annotations.AnnotationConfiguration";
- configs[5] = __defaultConfigurations[__defaultConfigurations.length-1];
- return configs;
+ //add before JettyWebXmlConfiguration
+ int i = configs.indexOf("org.eclipse.jetty.webapp.JettyWebXmlConfiguration");
+ configs.add(i, "org.eclipse.jetty.osgi.annotations.AnnotationConfiguration");
+ }
+
+ if (jndiAvailable())
+ {
+ //add in EnvConfiguration and PlusConfiguration just after FragmentConfiguration
+ int i = configs.indexOf("org.eclipse.jetty.webapp.FragmentConfiguration");
+ configs.add(++i, "org.eclipse.jetty.plus.webapp.EnvConfiguration");
+ configs.add(++i, "org.eclipse.jetty.plus.webapp.PlusConfiguration");
}
-
- return Arrays.copyOf(__defaultConfigurations, __defaultConfigurations.length);
+ return configs.toArray(new String[configs.size()]);
}
private static boolean annotationsAvailable()
@@ -91,7 +101,7 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
boolean result = false;
try
{
- Thread.currentThread().getContextClassLoader().loadClass("org.eclipse.jetty.annotations.AnnotationConfiguration");
+ Loader.loadClass(AbstractWebAppProvider.class,"org.eclipse.jetty.annotations.AnnotationConfiguration");
result = true;
LOG.debug("Annotation support detected");
}
@@ -104,6 +114,23 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
return result;
}
+
+ private static boolean jndiAvailable()
+ {
+ try
+ {
+ Loader.loadClass(AbstractWebAppProvider.class, "org.eclipse.jetty.plus.jndi.Resource");
+ Loader.loadClass(AbstractWebAppProvider.class, "org.eclipse.jetty.plus.webapp.EnvConfiguration");
+ LOG.debug("JNDI support detected");
+ return true;
+ }
+ catch (ClassNotFoundException e)
+ {
+ LOG.debug("No JNDI support detected");
+ return false;
+ }
+ }
+
private boolean _parentLoaderPriority;
@@ -328,7 +355,7 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
// apply any META-INF/context.xml file that is found to configure
// the webapp first
- applyMetaInfContextXml(rootResource);
+ applyMetaInfContextXml(rootResource, overrideBundleInstallLocation);
_webApp.setAttribute(OSGiWebappConstants.REQUIRE_TLD_BUNDLE, requireTldBundles);
@@ -384,7 +411,7 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
}
- protected void applyMetaInfContextXml(Resource rootResource)
+ protected void applyMetaInfContextXml(Resource rootResource, String overrideBundleInstallLocation)
throws Exception
{
if (_bundle == null) return;
@@ -398,8 +425,31 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement
Thread.currentThread().setContextClassLoader(_webApp.getClassLoader());
//TODO replace this with getting the InputStream so we don't cache in URL
- // find if there is a META-INF/context.xml file
+ //Try looking for a context xml file in META-INF with a specific name
URL contextXmlUrl = _bundle.getEntry("/META-INF/jetty-webapp-context.xml");
+
+ if (contextXmlUrl == null)
+ {
+ //Didn't find specially named file, try looking for a property that names a context xml file to use
+ if (_properties != null)
+ {
+ String tmp = (String)_properties.get(OSGiWebappConstants.JETTY_CONTEXT_FILE_PATH);
+ if (tmp != null)
+ {
+ String[] filenames = tmp.split(",;");
+ if (filenames != null && filenames.length > 0)
+ {
+ String filename = filenames[0]; //should only be 1 filename in this usage
+ String jettyHome = (String)getServerInstanceWrapper().getServer().getAttribute(OSGiServerConstants.JETTY_HOME);
+ if (jettyHome == null)
+ jettyHome = System.getProperty(OSGiServerConstants.JETTY_HOME);
+ Resource res = findFile(filename, jettyHome, overrideBundleInstallLocation, _bundle);
+ if (res != null)
+ contextXmlUrl = res.getURL();
+ }
+ }
+ }
+ }
if (contextXmlUrl == null) return;
// Apply it just as the standard jetty ContextProvider would do
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleContextProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleContextProvider.java
index 1cd720b601f..65466f506a5 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleContextProvider.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/BundleContextProvider.java
@@ -106,6 +106,13 @@ public class BundleContextProvider extends AbstractContextProvider implements Bu
if (bundle == null)
return false;
+ //If the bundle defines a Web-ContextPath then its probably a webapp and the BundleWebAppProvider should deploy it
+ if ((String)bundle.getHeaders().get(OSGiWebappConstants.RFC66_WEB_CONTEXTPATH) != null)
+ {
+ if (LOG.isDebugEnabled()) LOG.debug("BundleContextProvider ignoring bundle {} with {} set", bundle.getSymbolicName(), OSGiWebappConstants.RFC66_WEB_CONTEXTPATH);
+ return false;
+ }
+
String contextFiles = (String)bundle.getHeaders().get(OSGiWebappConstants.JETTY_CONTEXT_FILE_PATH);
if (contextFiles == null)
contextFiles = (String)bundle.getHeaders().get(OSGiWebappConstants.SERVICE_PROP_CONTEXT_FILE_PATH);
@@ -113,6 +120,7 @@ public class BundleContextProvider extends AbstractContextProvider implements Bu
if (contextFiles == null)
return false;
+
boolean added = false;
//bundle defines JETTY_CONTEXT_FILE_PATH header,
//a comma separated list of context xml files that each define a ContextHandler
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 69a7ce8cdb9..4482640bcfd 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
@@ -50,7 +50,14 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
{
private static final Logger LOG = Log.getLogger(WebInfConfiguration.class);
-
+ /**
+ * Comma separated list of symbolic names of bundles that contain tlds that should be considered
+ * as on the container classpath
+ */
+ public static final String SYS_PROP_TLD_BUNDLES = "org.eclipse.jetty.osgi.tldbundles";
+ /**
+ * Regex of symbolic names of bundles that should be considered to be on the container classpath
+ */
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";
@@ -84,7 +91,7 @@ public class OSGiWebInfConfiguration extends WebInfConfiguration
String tmp = (String)context.getAttribute(CONTAINER_BUNDLE_PATTERN);
Pattern pattern = (tmp==null?null:Pattern.compile(tmp));
List names = new ArrayList();
- tmp = System.getProperty("org.eclipse.jetty.osgi.tldbundles");
+ tmp = System.getProperty(SYS_PROP_TLD_BUNDLES);
if (tmp != null)
{
StringTokenizer tokenizer = new StringTokenizer(tmp, ", \n\r\t", false);
diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
index 94a06f62f44..62d9f0b341a 100644
--- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
+++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/webapp/OSGiWebappClassLoader.java
@@ -97,6 +97,12 @@ public class OSGiWebappClassLoader extends WebAppClassLoader implements BundleRe
+ @Override
+ public Class> loadClass(String name) throws ClassNotFoundException
+ {
+ return super.loadClass(name);
+ }
+
/* ------------------------------------------------------------ */
/**
* Returns the Bundle that defined this web-application.
diff --git a/jetty-osgi/test-jetty-osgi/pom.xml b/jetty-osgi/test-jetty-osgi/pom.xml
index 90b8cb0b73b..c5ad5c212a9 100644
--- a/jetty-osgi/test-jetty-osgi/pom.xml
+++ b/jetty-osgi/test-jetty-osgi/pom.xml
@@ -130,12 +130,7 @@
-
- org.eclipse.jetty.toolchain
- jetty-jsp-fragment
- 2.3.3
- test
-
+
org.eclipse.jetty.osgijetty-httpservice
@@ -144,10 +139,11 @@
- javax.servlet
- javax.servlet-api
- test
+ org.eclipse.jetty.toolchain
+ jetty-osgi-servlet-api
+ 3.1.0.M0
+
org.apache.geronimo.specsgeronimo-jta_1.1_spec
@@ -168,6 +164,12 @@
test
+
+ org.mortbay.jasper
+ apache-el
+ 8.0.9.M3
+ test
+
@@ -341,6 +343,29 @@
webbundletest
+
+
+ org.eclipse.jetty.tests
+ test-spec-webapp
+ ${project.version}
+ war
+ test
+
+
+
+ org.eclipse.jetty.tests
+ test-container-initializer
+ ${project.version}
+ test
+
+
+
+
+ org.eclipse.jetty.tests
+ test-mock-resources
+ ${project.version}
+
+
org.eclipse.jetty.osgitest-jetty-osgi-context
diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
index c927fb3aec9..30cd5e26cfb 100644
--- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
+++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootCore.java
@@ -48,6 +48,7 @@ public class TestJettyOSGiBootCore
{
private static final String LOG_LEVEL = "WARN";
+ // TODO these should be dynamic
public static final int DEFAULT_HTTP_PORT = 9876;
public static final int DEFAULT_SSL_PORT = 9877;
@@ -91,13 +92,10 @@ public class TestJettyOSGiBootCore
res.add(mavenBundle().groupId( "org.apache.aries" ).artifactId( "org.apache.aries.util" ).versionAsInProject().start());
res.add(mavenBundle().groupId( "org.apache.aries.spifly" ).artifactId( "org.apache.aries.spifly.dynamic.bundle" ).versionAsInProject().start());
- res.add(mavenBundle().groupId( "javax.servlet" ).artifactId( "javax.servlet-api" ).versionAsInProject().noStart());
+ res.add(mavenBundle().groupId( "org.eclipse.jetty.toolchain" ).artifactId( "jetty-osgi-servlet-api" ).versionAsInProject().noStart());
res.add(mavenBundle().groupId( "javax.annotation" ).artifactId( "javax.annotation-api" ).versionAsInProject().noStart());
res.add(mavenBundle().groupId( "org.apache.geronimo.specs" ).artifactId( "geronimo-jta_1.1_spec" ).version("1.1.1").noStart());
res.add(mavenBundle().groupId( "org.eclipse.jetty.orbit" ).artifactId( "javax.mail.glassfish" ).version( "1.4.1.v201005082020" ).noStart());
-
-
- res.add(mavenBundle().groupId( "org.eclipse.jetty.toolchain" ).artifactId( "jetty-schemas" ).versionAsInProject().noStart());
res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-deploy" ).versionAsInProject().noStart());
res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-server" ).versionAsInProject().noStart());
@@ -112,7 +110,7 @@ public class TestJettyOSGiBootCore
res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-servlets" ).versionAsInProject().noStart());
res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-client" ).versionAsInProject().noStart());
res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-jndi" ).versionAsInProject().noStart());
- res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-plus" ).versionAsInProject().noStart());
+ res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-plus" ).versionAsInProject());
res.add(mavenBundle().groupId( "org.eclipse.jetty" ).artifactId( "jetty-annotations" ).versionAsInProject().start());
res.add(mavenBundle().groupId( "org.eclipse.jetty.websocket" ).artifactId( "websocket-api" ).versionAsInProject().noStart());
res.add(mavenBundle().groupId( "org.eclipse.jetty.websocket" ).artifactId( "websocket-common" ).versionAsInProject().noStart());
@@ -125,6 +123,32 @@ public class TestJettyOSGiBootCore
res.add(mavenBundle().groupId( "org.eclipse.jetty.osgi" ).artifactId( "jetty-osgi-boot" ).versionAsInProject().start());
return res;
}
+
+ public static List