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 Jasper org.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.osgi jetty-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.specs geronimo-jta_1.1_spec @@ -168,6 +164,12 @@ test + + org.mortbay.jasper + apache-el + 8.0.9.M3 + test + @@ -341,6 +343,29 @@ webbundle test + + + 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.osgi test-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

Servlet 3.1 Test WebApp

")); + + Request req = client.POST("http://127.0.0.1:" + TestJettyOSGiBootCore.DEFAULT_HTTP_PORT + "/test"); + response = req.send(); + content = new String(response.getContent()); + assertTrue(content.contains("

Result: PASS

")); + } + finally + { + client.stop(); + } + } + +} diff --git a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java index 6b703cee13d..30aef58650a 100644 --- a/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java +++ b/jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithJsp.java @@ -52,7 +52,7 @@ import org.osgi.framework.BundleContext; @RunWith(PaxExam.class) public class TestJettyOSGiBootWithJsp { - private static final String LOG_LEVEL = "WARN"; + private static final String LOG_LEVEL = "INFO"; @Inject BundleContext bundleContext = null; @@ -72,7 +72,7 @@ public class TestJettyOSGiBootWithJsp options.addAll(Arrays.asList(options(systemProperty("pax.exam.logging").value("none")))); options.addAll(Arrays.asList(options(systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(LOG_LEVEL)))); options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.LEVEL").value(LOG_LEVEL)))); - + options.addAll(Arrays.asList(options(systemProperty("org.eclipse.jetty.annotations.LEVEL").value("DEBUG")))); options.addAll(jspDependencies()); return options.toArray(new Option[options.size()]); } @@ -110,26 +110,19 @@ public class TestJettyOSGiBootWithJsp public static List