You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2015/08/07 13:01:10 UTC

svn commit: r1694657 - in /jackrabbit/oak/trunk/oak-examples/webapp: ./ src/main/java/org/apache/jackrabbit/j2ee/ src/main/webapp/WEB-INF/ src/main/webapp/WEB-INF/templates/

Author: chetanm
Date: Fri Aug  7 11:01:10 2015
New Revision: 1694657

URL: http://svn.apache.org/r1694657
Log:
OAK-3193 - Integrate with Felix WebConsole

-- Add bundles related to Felix WebConsole
-- Make use of Felix ProxyServlet to route calls for /osgi/* to WebConsole servlet at /osgi/system/console
-- RepositoryStartupServlet would now register the BundleContext with ServletContext upon startup. This would allow the ProxyServlet to work
-- Add bundle filter to ensure only required bundles get started (OAK-3194)

Modified:
    jackrabbit/oak/trunk/oak-examples/webapp/pom.xml
    jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java
    jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java
    jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties
    jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/web.xml

Modified: jackrabbit/oak/trunk/oak-examples/webapp/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/pom.xml?rev=1694657&r1=1694656&r2=1694657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/pom.xml Fri Aug  7 11:01:10 2015
@@ -113,6 +113,24 @@
       <version>1.1</version>
     </dependency>
 
+    <!-- Required for Felix WebConsole -->
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.http.proxy</artifactId>
+      <version>2.3.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.http.bridge</artifactId>
+      <version>2.3.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.webconsole</artifactId>
+      <version>4.2.10</version>
+      <classifier>all</classifier>
+    </dependency>
+
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
@@ -163,7 +181,7 @@
          <artifactId>jetty-maven-plugin</artifactId>
          <version>9.2.8.v20150217</version>
          <configuration>
-           <scanIntervalSeconds>10</scanIntervalSeconds>
+           <scanIntervalSeconds>0</scanIntervalSeconds>
            <connectors>
              <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                <port>8080</port>

Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java?rev=1694657&r1=1694656&r2=1694657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java Fri Aug  7 11:01:10 2015
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.j2ee;
 
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 import javax.servlet.ServletException;
 import javax.servlet.ServletConfig;
@@ -44,6 +45,13 @@ public class BootstrapConfig extends Abs
 
     private String repositoryName;
 
+    private String bundleFilter;
+
+    //By default shutdown framework if there is a timeout
+    private boolean shutdownOnTimeout = true;
+
+    private int startupTimeout = (int) TimeUnit.MINUTES.toSeconds(5); //Default 5 minute timeout
+
     private JNDIConfig jndiConfig = new JNDIConfig(this);
 
     private RMIConfig rmiConfig = new RMIConfig(this);
@@ -84,6 +92,14 @@ public class BootstrapConfig extends Abs
         this.repositoryName = repositoryName;
     }
 
+    public String getBundleFilter() {
+        return bundleFilter;
+    }
+
+    public void setBundleFilter(String bundleFilter) {
+        this.bundleFilter = bundleFilter;
+    }
+
     public JNDIConfig getJndiConfig() {
         return jndiConfig;
     }
@@ -92,6 +108,22 @@ public class BootstrapConfig extends Abs
         return rmiConfig;
     }
 
+    public boolean isShutdownOnTimeout() {
+        return shutdownOnTimeout;
+    }
+
+    public void setShutdownOnTimeout(boolean shutdownOnTimeout) {
+        this.shutdownOnTimeout = shutdownOnTimeout;
+    }
+
+    public int getStartupTimeout() {
+        return startupTimeout;
+    }
+
+    public void setStartupTimeout(int startupTimeout) {
+        this.startupTimeout = startupTimeout;
+    }
+
     public void validate() {
         valid = repositoryName != null;
         jndiConfig.validate();

Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java?rev=1694657&r1=1694656&r2=1694657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java Fri Aug  7 11:01:10 2015
@@ -19,12 +19,13 @@ package org.apache.jackrabbit.j2ee;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.api.JackrabbitRepository;
-import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.jackrabbit.commons.repository.RepositoryFactory;
 import org.apache.jackrabbit.oak.run.osgi.OakOSGiRepositoryFactory;
 import org.apache.jackrabbit.rmi.server.RemoteAdapterFactory;
 import org.apache.jackrabbit.rmi.server.ServerAdapterFactory;
 import org.apache.jackrabbit.servlet.AbstractRepositoryServlet;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -269,6 +270,7 @@ public class RepositoryStartupServlet ex
             log.info("Shutdown: Repository already stopped.");
         } else {
             log.info("RepositoryStartupServlet shutting down...");
+            unregisterOSGi();
             shutdownRepository();
             unregisterRMI();
             unregisterJNDI();
@@ -458,15 +460,37 @@ public class RepositoryStartupServlet ex
      */
     protected Repository createRepository(File configJson, File homedir)
             throws RepositoryException {
-        Map<String,String> config = new HashMap<String, String>();
-        config.put("org.apache.jackrabbit.repository.home", homedir.getAbsolutePath());
-        config.put("org.apache.jackrabbit.oak.repository.configFile", configJson.getAbsolutePath());
+        Map<String,Object> config = new HashMap<String, Object>();
+        config.put(OakOSGiRepositoryFactory.REPOSITORY_HOME, homedir.getAbsolutePath());
+        config.put(OakOSGiRepositoryFactory.REPOSITORY_CONFIG_FILE, configJson.getAbsolutePath());
+        config.put(OakOSGiRepositoryFactory.REPOSITORY_BUNDLE_FILTER, getBootstrapConfig().getBundleFilter());
+        config.put(OakOSGiRepositoryFactory.REPOSITORY_SHUTDOWN_ON_TIMEOUT, getBootstrapConfig().isShutdownOnTimeout());
+        config.put(OakOSGiRepositoryFactory.REPOSITORY_STARTUP_TIMEOUT, getBootstrapConfig().getStartupTimeout());
+        configureActivator(config);
         //TODO oak-jcr also provides a dummy RepositoryFactory. Hence this
         //cannot be used
         //return JcrUtils.getRepository(config);
         return new OakOSGiRepositoryFactory().getRepository(config);
     }
 
+    private void configureActivator(Map<String, Object> config) {
+        try{
+            config.put(BundleActivator.class.getName(), new BundleActivator() {
+                @Override
+                public void start(BundleContext bundleContext) throws Exception {
+                    registerOSGi(bundleContext);
+                }
+
+                @Override
+                public void stop(BundleContext bundleContext) throws Exception {
+                    unregisterOSGi();
+                }
+            });
+        } catch (Throwable t){
+            log.warn("OSGi support not present", t);
+        }
+    }
+
     /**
      * Binds the repository to the JNDI context
      * @throws ServletException if an error occurs.
@@ -632,6 +656,20 @@ public class RepositoryStartupServlet ex
     }
 
     /**
+     * Set the BundleContext reference with ServletContext. This is then used by
+     * Felix Proxy Servlet. Kept the type as object to allow logic to work in
+     * absence of OSGi classes also.
+     * @param bundleContext
+     */
+    private void registerOSGi(Object bundleContext) {
+        getServletContext().setAttribute("org.osgi.framework.BundleContext", bundleContext);
+    }
+
+    private void unregisterOSGi() {
+        getServletContext().removeAttribute("org.osgi.framework.BundleContext");
+    }
+
+    /**
      * Returns the config that was used to bootstrap this servlet.
      * @return the bootstrap config or <code>null</code>.
      */

Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties?rev=1694657&r1=1694656&r2=1694657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties Fri Aug  7 11:01:10 2015
@@ -21,6 +21,13 @@
 repository.config=repository-config.json
 repository.home=oak
 repository.name=jackrabbit.repository
+bundle.filter=(|(Bundle-SymbolicName=org.apache.jackrabbit*)(Bundle-SymbolicName=org.apache.sling*)(Bundle-SymbolicName=org.apache.felix*)(Bundle-SymbolicName=org.apache.aries*))
+
+#By default do not shutdown OSGi framework upon timeout
+shutdown.on.timeout=false
+
+#Default timeout for waiting for repository service is 300 sec i.e. 5 min
+startup.timeout=300
 
 # RMI Settings
 rmi.enabled=true

Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/web.xml?rev=1694657&r1=1694656&r2=1694657&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/web.xml (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/web.xml Fri Aug  7 11:01:10 2015
@@ -20,6 +20,10 @@
 <web-app>
     <display-name>Jackrabbit JCR Server</display-name>
 
+    <listener>
+        <listener-class>org.apache.felix.http.proxy.ProxyListener</listener-class>
+    </listener>
+
     <!-- ====================================================================== -->
     <!-- R E P O S I T O R Y   S T A R T U P  S E R V L E T                     -->
     <!-- ====================================================================== -->
@@ -361,6 +365,18 @@
     </servlet>
 
     <!-- ====================================================================== -->
+    <!-- F E L I X   W E B C O N S O L E P R O X Y   S E R V L E T              -->
+    <!-- ====================================================================== -->
+
+    <servlet>
+        <servlet-name>proxy</servlet-name>
+        <description>
+            This servlet is used to enable integration with Felix WebConsole. It
+            routes the call to /osgi/* to servlets running withing OSGi
+        </description>
+        <servlet-class>org.apache.felix.http.proxy.ProxyServlet</servlet-class>
+    </servlet>
+    <!-- ====================================================================== -->
     <!-- S E R V L E T   M A P P I N G                                          -->
     <!-- ====================================================================== -->
     <servlet-mapping>
@@ -379,6 +395,10 @@
         <servlet-name>RMI</servlet-name>
         <url-pattern>/rmi</url-pattern>
     </servlet-mapping>
+    <servlet-mapping>
+        <servlet-name>proxy</servlet-name>
+        <url-pattern>/osgi/*</url-pattern>
+    </servlet-mapping>
 
     <!-- ====================================================================== -->
     <!-- W E L C O M E   F I L E S                                              -->