From 7199c6ceca5420d2792c4751622374271c084f2c Mon Sep 17 00:00:00 2001 From: Jan Bartel Date: Thu, 4 Sep 2014 08:16:35 +1000 Subject: [PATCH] Switch to apache-jsp for jetty-osgi --- apache-jsp/pom.xml | 24 +++ jetty-osgi/jetty-osgi-boot-jsp/pom.xml | 54 ++++-- .../jasper/ContainerTldBundleDiscoverer.java | 162 +++++++++++++--- .../boot/jasper/JSTLBundleDiscoverer.java | 59 ++++-- .../osgi/boot/jsp/FragmentActivator.java | 6 +- .../annotations/AnnotationConfiguration.java | 4 + .../osgi/boot/AbstractWebAppProvider.java | 1 + .../osgi/boot/OSGiWebInfConfiguration.java | 11 +- .../webapp/OSGiWebappClassLoader.java | 7 + jetty-osgi/test-jetty-osgi/pom.xml | 29 ++- .../osgi/test/TestJettyOSGiBootCore.java | 31 ++- .../TestJettyOSGiBootWebAppAsService.java | 11 +- .../TestJettyOSGiBootWithAnnotations.java | 179 ++++++++++++++++++ .../osgi/test/TestJettyOSGiBootWithJsp.java | 28 +-- pom.xml | 2 +- .../test-spec-webapp/pom.xml | 67 ++++++- .../src/main/assembly/web-bundle.xml | 18 ++ 17 files changed, 585 insertions(+), 108 deletions(-) create mode 100644 jetty-osgi/test-jetty-osgi/src/test/java/org/eclipse/jetty/osgi/test/TestJettyOSGiBootWithAnnotations.java create mode 100644 tests/test-webapps/test-servlet-spec/test-spec-webapp/src/main/assembly/web-bundle.xml diff --git a/apache-jsp/pom.xml b/apache-jsp/pom.xml index 7153ed93196..34d3b950173 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 + + + org.apache.maven.plugins maven-assembly-plugin diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml index 2a36eb34723..54374e665b5 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-SNAPSHOT + + @@ -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/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/AbstractWebAppProvider.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/AbstractWebAppProvider.java index 6d31ebd03cf..97f9296114f 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 @@ -268,6 +268,7 @@ public abstract class AbstractWebAppProvider extends AbstractLifeCycle implement //Sets the location of the war file // converts bundleentry: protocol if necessary + System.err.println("WAR : "+BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(url).toString()); _webApp.setWar(BundleFileLocatorHelperFactory.getFactory().getHelper().getLocalURL(url).toString()); // Set up what has been configured on the provider 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..bdd52ac537c 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,13 @@ public class OSGiWebappClassLoader extends WebAppClassLoader implements BundleRe + @Override + public Class loadClass(String name) throws ClassNotFoundException + { + System.err.println("LOADING CLASS: "+name); + 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 6b545473d50..2a734b968bd 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-SNAPSHOT + org.apache.geronimo.specs geronimo-jta_1.1_spec @@ -168,6 +164,12 @@ test + + org.mortbay.jasper + apache-el + 8.0.9-SNAPSHOT + test + @@ -341,6 +343,15 @@ webbundle test + + + org.eclipse.jetty.tests + test-spec-webapp + ${project.version} + war + test + + 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 2565c5be952..b5035fadff5 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 @@ -88,13 +88,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()); @@ -122,6 +119,32 @@ public class TestJettyOSGiBootCore res.add(mavenBundle().groupId( "org.eclipse.jetty.osgi" ).artifactId( "jetty-osgi-boot" ).versionAsInProject().start()); return res; } + + public static List