Author: cziegeler Date: Tue Aug 24 13:52:02 2010 New Revision: 988540 URL: http://svn.apache.org/viewvc?rev=988540&view=rev Log: SLING-1691 : Improve startup behaviour
Modified: sling/trunk/contrib/scripting/jsp-taglib-atom/pom.xml sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/AbstractAbderaHandler.java sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/EntryTagHandler.java sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/internal/AbderaActivator.java Modified: sling/trunk/contrib/scripting/jsp-taglib-atom/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/jsp-taglib-atom/pom.xml?rev=988540&r1=988539&r2=988540&view=diff ============================================================================== --- sling/trunk/contrib/scripting/jsp-taglib-atom/pom.xml (original) +++ sling/trunk/contrib/scripting/jsp-taglib-atom/pom.xml Tue Aug 24 13:52:02 2010 @@ -57,15 +57,12 @@ * </Import-Package> <Export-Package> - org.apache.sling.atom.taglib.*;version=${pom.version} + org.apache.sling.atom.taglib;version=1.0.0, + org.apache.sling.atom.taglib.media;version=1.0.0 </Export-Package> <Private-Package> - org.apache.sling.atom.taglib.internal.*, - org.osgi.util.tracker + org.apache.sling.atom.taglib.internal.* </Private-Package> - <Bundle-Activator> - org.apache.sling.atom.taglib.internal.AbderaActivator - </Bundle-Activator> </instructions> </configuration> </plugin> @@ -81,6 +78,7 @@ <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> + <scope>provided</scope> </dependency> <dependency> @@ -109,8 +107,6 @@ <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.compendium</artifactId> - <scope>compile</scope> - <optional>true</optional> </dependency> </dependencies> </project> Modified: sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/AbstractAbderaHandler.java URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/AbstractAbderaHandler.java?rev=988540&r1=988539&r2=988540&view=diff ============================================================================== --- sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/AbstractAbderaHandler.java (original) +++ sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/AbstractAbderaHandler.java Tue Aug 24 13:52:02 2010 @@ -18,40 +18,21 @@ */ package org.apache.sling.atom.taglib; -import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.jsp.JspException; -import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.BodyTagSupport; import org.apache.abdera.Abdera; import org.apache.abdera.model.Entry; import org.apache.abdera.model.Feed; +import org.apache.sling.atom.taglib.internal.AbderaActivator; public class AbstractAbderaHandler extends BodyTagSupport { - public static final String ABDERA_ATTRIBUTE = "org.apache.abdera.Abdera"; - - private static final long serialVersionUID = 1L; - - public AbstractAbderaHandler() { - super(); - } + private static final long serialVersionUID = 2L; protected Abdera getAbdera() throws JspException { - return getAbdera(pageContext); - } - - protected Abdera getAbdera(PageContext pageContexxt) throws JspException { - ServletContext context = pageContext.getServletContext(); - - Object obj = context.getAttribute(ABDERA_ATTRIBUTE); - if (obj instanceof Abdera) { - return (Abdera) obj; - } - - // fallback to failure !! - throw new JspException("Abdera not available"); + return AbderaActivator.getAbdera(); } protected Feed getFeed(ServletRequest request) throws JspException { Modified: sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/EntryTagHandler.java URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/EntryTagHandler.java?rev=988540&r1=988539&r2=988540&view=diff ============================================================================== --- sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/EntryTagHandler.java (original) +++ sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/EntryTagHandler.java Tue Aug 24 13:52:02 2010 @@ -22,7 +22,6 @@ import java.util.Date; import javax.servlet.jsp.JspException; -import org.apache.abdera.i18n.text.UrlEncoding; import org.apache.abdera.model.Entry; public class EntryTagHandler extends AbstractAbderaHandler { Modified: sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/internal/AbderaActivator.java URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/internal/AbderaActivator.java?rev=988540&r1=988539&r2=988540&view=diff ============================================================================== --- sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/internal/AbderaActivator.java (original) +++ sling/trunk/contrib/scripting/jsp-taglib-atom/src/main/java/org/apache/sling/atom/taglib/internal/AbderaActivator.java Tue Aug 24 13:52:02 2010 @@ -18,104 +18,46 @@ */ package org.apache.sling.atom.taglib.internal; -import javax.servlet.ServletContext; +import javax.servlet.jsp.JspException; import org.apache.abdera.Abdera; import org.apache.abdera.ext.media.MediaExtensionFactory; import org.apache.abdera.ext.opensearch.model.OpenSearchExtensionFactory; import org.apache.abdera.factory.Factory; import org.apache.abdera.parser.stax.FOMFactory; -import org.apache.sling.atom.taglib.AbstractAbderaHandler; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.util.tracker.ServiceTracker; -public class AbderaActivator implements BundleActivator { +public abstract class AbderaActivator { - private static final String SERVLET_CONTEXT_SERVICE = "javax.servlet.ServletContext"; + private static Abdera ABDERA; - private ServiceTracker servletContext; + private static final Object LOCK = new Object(); - private Abdera abdera; - - public void start(BundleContext context) { - servletContext = new ServletContextTracker(context); - servletContext.open(); - } - - public void stop(BundleContext context) { - if (servletContext != null) { - servletContext.close(); - servletContext = null; - } - - abdera = null; - } - - private class ServletContextTracker extends ServiceTracker { - - private ServletContextTracker(BundleContext context) { - super(context, SERVLET_CONTEXT_SERVICE, null); - } - - @Override - public Object addingService(ServiceReference reference) { - Object service = super.addingService(reference); - if (service instanceof ServletContext) { - ServletContext ctx = (ServletContext) service; - Object attr = ctx.getAttribute(AbstractAbderaHandler.ABDERA_ATTRIBUTE); - if (attr instanceof Abdera) { - // nothing to do, strange that it already is here, though... - } else if (attr != null) { - // some other attribute of the same name ?? - // might log this and do nothing ! - } else { - // create Abdera - final Abdera abdera = getAbdera(); - ctx.setAttribute(AbstractAbderaHandler.ABDERA_ATTRIBUTE, - abdera); - } - } - return service; - } - - @Override - public void removedService(ServiceReference reference, Object service) { - if (service instanceof ServletContext) { - ServletContext ctx = (ServletContext) service; - Object attr = ctx.getAttribute(AbstractAbderaHandler.ABDERA_ATTRIBUTE); - if (attr == abdera) { - ctx.removeAttribute(AbstractAbderaHandler.ABDERA_ATTRIBUTE); + public static Abdera getAbdera() throws JspException { + if (ABDERA == null) { + synchronized ( LOCK ) { + if ( ABDERA == null ) { + final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + final ClassLoader osgiClassloader = AbderaActivator.class.getClassLoader(); + Thread.currentThread().setContextClassLoader(osgiClassloader); + + try { + + final Abdera a = new Abdera(); + final Factory f = a.getFactory(); + if (f instanceof FOMFactory) { + FOMFactory ff = (FOMFactory) f; + ff.registerExtension(new MediaExtensionFactory()); + ff.registerExtension(new OpenSearchExtensionFactory()); + } + ABDERA = a; + + } finally { + Thread.currentThread().setContextClassLoader(classLoader); + } } } - - super.removedService(reference, service); - } - } - - private Abdera getAbdera() { - if (abdera == null) { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - - try { - ClassLoader osgiClassloader = getClass().getClassLoader(); - Thread.currentThread().setContextClassLoader(osgiClassloader); - - abdera = new Abdera(); - Factory f = abdera.getFactory(); - if (f instanceof FOMFactory) { - FOMFactory ff = (FOMFactory) f; - ff.registerExtension(new MediaExtensionFactory()); - ff.registerExtension(new OpenSearchExtensionFactory()); - } - - } finally { - - Thread.currentThread().setContextClassLoader(classLoader); - } } - return abdera; + return ABDERA; } }