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/06 14:42:21 UTC

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

Author: chetanm
Date: Thu Aug  6 12:42:20 2015
New Revision: 1694486

URL: http://svn.apache.org/r1694486
Log:
OAK-3185 - Port and refactor jackrabbit-webapp module to Oak (WIP)

Introducing repository-config.json which acts as a substitute for repository.xml to configure the whole repository
-- Changed the default folder to 'oak' under which repository would be created
-- Repository initialization logic would use OSGiRepositoryFactory to initialize repository. Still cannot use ServiceLoader approach as oak-jcr has a dummy factory
-- Disabled auto JNDI registration for now as we do not have MemoryInitialContextFactory. User can configure it as per requirement of respective app server

Added:
    jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/repository-config.json
Modified:
    jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/Installer.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
    jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/bootstrap/missing.jsp

Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/Installer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/Installer.java?rev=1694486&r1=1694485&r2=1694486&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/Installer.java (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/Installer.java Thu Aug  6 12:42:20 2015
@@ -95,7 +95,7 @@ public class Installer {
      * todo: to be configured
      */
     private final String configTemplate =
-        "/org/apache/jackrabbit/core/repository.xml";
+            "/WEB-INF/templates/repository-config.json";
 
     /**
      * the place for the bootstrap properties template
@@ -125,62 +125,43 @@ public class Installer {
     public int installRepository(HttpServletRequest req)
             throws ServletException, IOException {
         String repHome = req.getParameter("repository_home");
-        String repType = req.getParameter("repository_type");
-        String repXml = req.getParameter("repository_xml");
         String mode = req.getParameter("mode");
 
         if (repHome == null || mode == null) {
             return C_INVALID_INPUT;
         }
         File home = new File(repHome);
-
-        File config;
-        if ("oak".equals(repType)) {
-            config = null;
-            repXml = null;
-        } else if (repXml == null || repXml.length() == 0) {
-            config = new File(home, "repository.xml");
-            repXml = config.getPath();
-        } else {
-            config = new File(repXml);
-        }
+        File config = new File(home, "repository-config.json");
 
         if ("new".equals(mode)) {
             // Test internal folder repository existence and not home because home is already created
             // by org.apache.jackrabbit.server.remoting.davex.JcrRemotingServlet
-            if (new File(home, "repository").exists()) {
-                log.error("Trying to install new repository home '{}' but it already contain a repository", repHome);
-                return C_HOME_EXISTS;
-            }
-            if (config != null && config.exists()) {
-                log.error("Trying to install new repository config '{}' but already exists", repXml);
+            if (config.exists()) {
+                log.error("Trying to install new repository config '{}' but already exists", config);
                 return C_CONFIG_EXISTS;
             }
             log.info("Creating new repository home '{}'", repHome);
             home.mkdirs();
 
-            if (config != null) {
-                // install repository xml for Jackrabbit Classic
-                try {
-                    installRepositoryConfig(config);
-                } catch (IOException e) {
-                    log.error("Error while installing new repository config '{}': {}", repXml, e.toString());
-                    return C_BOOTSTRAP_EXISTS;
-                }
+            try {
+                installRepositoryConfig(config);
+            } catch (IOException e) {
+                log.error("Error while installing new repository config '{}': {}", config, e.toString());
+                return C_BOOTSTRAP_EXISTS;
             }
         } else {
             if (!home.exists()) {
                 log.error("Trying to use existing repository home '{}' but does not exists", repHome);
                 return C_HOME_MISSING;
             }
-            if (config != null && !config.exists()) {
-                log.error("Trying to use existing repository config '{}' but does not exists", repXml);
+            if (!config.exists()) {
+                log.error("Trying to use existing repository config '{}' but does not exists", config);
                 return C_CONFIG_MISSING;
             }
         }
         // install bootstrap.properties
         try {
-            installBootstrap(bootstrapConfigFile, repHome, repXml);
+            installBootstrap(bootstrapConfigFile, repHome);
         } catch (IOException e) {
             log.error("Error while installing '{}': {}", bootstrapConfigFile.getPath(), e.toString());
             return C_INSTALL_ERROR;
@@ -213,19 +194,15 @@ public class Installer {
      * Installs the bootstrap config file from the template
      * @param dest the destination location
      * @param repHome the repository home location
-     * @param repXml the repository xml location
      * @throws IOException if an I/O error occurs
      */
-    private void installBootstrap(File dest, String repHome, String repXml)
+    private void installBootstrap(File dest, String repHome)
             throws IOException {
         log.info("Creating new bootstrap properties: {}", dest.getPath());
         InputStream in = context.getResourceAsStream(bootstrapTemplate);
         Properties props = new Properties();
         props.load(in);
         props.setProperty("repository.home", repHome);
-        if (repXml != null) {
-            props.setProperty("repository.config", repXml);
-        }
         in.close();
         if (!dest.getParentFile().exists()) {
             dest.getParentFile().mkdirs();

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=1694486&r1=1694485&r2=1694486&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 Thu Aug  6 12:42:20 2015
@@ -16,26 +16,24 @@
  */
 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.core.RepositoryImpl;
-import org.apache.jackrabbit.core.config.RepositoryConfig;
-import org.apache.jackrabbit.oak.jcr.Jcr;
-import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
-import org.apache.jackrabbit.oak.plugins.segment.SegmentStore;
-import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.xml.sax.InputSource;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.net.UnknownHostException;
@@ -48,6 +46,8 @@ import java.rmi.registry.LocateRegistry;
 import java.rmi.registry.Registry;
 import java.rmi.server.RMIServerSocketFactory;
 import java.rmi.server.UnicastRemoteObject;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
 
 import javax.jcr.Repository;
@@ -172,11 +172,6 @@ public class RepositoryStartupServlet ex
     static String bootstrapOverride = null;
 
     /**
-     * the TarMK segment store
-     */
-    private SegmentStore store;
-
-    /**
      * the registered repository
      */
     private Repository repository;
@@ -410,35 +405,31 @@ public class RepositoryStartupServlet ex
                     "Repository configuration failure: " + config.getRepositoryHome(), e);
         }
         String repConfig = config.getRepositoryConfig();
-        if (repConfig != null) { // Jackrabbit Classic
-            InputStream in = getServletContext().getResourceAsStream(repConfig);
-            if (in == null) {
+        if (repConfig != null) {
+            File configJson = new File(repHome, repConfig);
+            if (!configJson.exists()){
+                InputStream in = getServletContext().getResourceAsStream(repConfig);
+                if (in == null){
+                    throw new ServletException("No config file found in classpath " + repConfig);
+                }
+                OutputStream os = null;
                 try {
-                    in = new FileInputStream(new File(repConfig));
-                } catch (FileNotFoundException e) {
-                    // fallback to old config
-                    try {
-                        in = new FileInputStream(new File(repHome, repConfig));
-                    } catch (FileNotFoundException e1) {
-                        throw new ServletExceptionWithCause(
-                                "Repository configuration not found: " + repConfig, e);
-                    }
+                    os = FileUtils.openOutputStream(configJson);
+                    IOUtils.copy(in, os);
+                } catch (IOException e1) {
+                    throw new ServletExceptionWithCause(
+                            "Error copying the repository config json", e1);
+                } finally {
+                    IOUtils.closeQuietly(os);
+                    IOUtils.closeQuietly(in);
                 }
             }
 
             try {
-                repository = createRepository(new InputSource(in), repHome);
+                repository = createRepository(configJson, repHome);
             } catch (RepositoryException e) {
                 throw new ServletExceptionWithCause("Error while creating repository", e);
             }
-        } else { // Jackrabbit Oak
-            try {
-                String model = System.getProperty("sun.arch.data.model", "32");
-                store = new FileStore(repHome, 256, "64".equals(model));
-                repository = new Jcr(new SegmentNodeStore(store)).createRepository();
-            } catch (IOException e) {
-                throw new ServletExceptionWithCause("Error while creating repository", e);
-            }
         }
     }
 
@@ -449,10 +440,7 @@ public class RepositoryStartupServlet ex
      * <code>nulled</code>.
      */
     private void shutdownRepository() {
-        if (store != null) {
-            store.close();
-            store = null;
-        } else if (repository instanceof JackrabbitRepository) {
+        if (repository instanceof JackrabbitRepository) {
             ((JackrabbitRepository) repository).shutdown();
         }
         repository = null;
@@ -468,10 +456,15 @@ public class RepositoryStartupServlet ex
      * @return a new jcr repository.
      * @throws RepositoryException if an error during creation occurs.
      */
-    protected Repository createRepository(InputSource is, File homedir)
+    protected Repository createRepository(File configJson, File homedir)
             throws RepositoryException {
-        RepositoryConfig config = RepositoryConfig.create(is, homedir.getAbsolutePath());
-        return RepositoryImpl.create(config);
+        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());
+        //TODO oak-jcr also provides a dummy RepositoryFactory. Hence this
+        //cannot be used
+        //return JcrUtils.getRepository(config);
+        return new OakOSGiRepositoryFactory().getRepository(config);
     }
 
     /**

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=1694486&r1=1694485&r2=1694486&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 Thu Aug  6 12:42:20 2015
@@ -18,8 +18,8 @@
 # in the "bootstrap-config" init parameter.
 
 # Repository configuration settings (will be adjusted by installer)
-repository.config=jackrabbit/repository/repository.xml
-repository.home=jackrabbit/repository
+repository.config=repository-config.json
+repository.home=oak
 repository.name=jackrabbit.repository
 
 # RMI Settings
@@ -32,7 +32,9 @@ rmi.host=localhost
 # JNDI Settings
 # all properties starting with 'java.naming.' will go into the
 # environment of the initial context
-jndi.enabled=true
+# TODO Disabling JMDI support by default as DummyInitialContextFactory does
+# not exist by default
+jndi.enabled=false
 # if the name is not specified, it's initialized with the repository.name
 #jndi.name=${repository.name}
 java.naming.provider.url=http://www.apache.org/jackrabbit

Added: jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/repository-config.json
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/repository-config.json?rev=1694486&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/repository-config.json (added)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/repository-config.json Thu Aug  6 12:42:20 2015
@@ -0,0 +1,24 @@
+{
+  "org.apache.felix.jaas.Configuration.factory-GuestLoginModule": {
+    "jaas.controlFlag": "optional",
+    "jaas.classname": "org.apache.jackrabbit.oak.spi.security.authentication.GuestLoginModule",
+    "jaas.ranking": 300
+  },
+  "org.apache.felix.jaas.Configuration.factory-LoginModuleImpl": {
+    "jaas.controlFlag": "required",
+    "jaas.classname": "org.apache.jackrabbit.oak.security.authentication.user.LoginModuleImpl",
+    "jaas.ranking": 100
+  },
+  "org.apache.felix.jaas.Configuration.factory-TokenLoginModule": {
+    "jaas.controlFlag": "sufficient",
+    "jaas.classname": "org.apache.jackrabbit.oak.security.authentication.token.TokenLoginModule",
+    "jaas.ranking": 200
+  },
+  "org.apache.felix.jaas.ConfigurationSpi": {
+    "jaas.defaultRealmName": "jackrabbit.oak",
+    "jaas.globalConfigPolicy": "proxy",
+    "jaas.configProviderName": "FelixJaasProvider"
+  },
+  "org.apache.jackrabbit.oak.jcr.osgi.RepositoryManager": {},
+  "org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStoreService" : {}
+}
\ No newline at end of file

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=1694486&r1=1694485&r2=1694486&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 Thu Aug  6 12:42:20 2015
@@ -34,7 +34,7 @@
 
         <init-param>
             <param-name>bootstrap-config</param-name>
-            <param-value>jackrabbit/bootstrap.properties</param-value>
+            <param-value>oak/bootstrap.properties</param-value>
             <description>
                 Property file that hold the same initialization properties than
                 the init-params below. If a parameter is specified in both
@@ -125,7 +125,7 @@
 
         <init-param>
             <param-name>bootstrap-config</param-name>
-            <param-value>jackrabbit/bootstrap.properties</param-value>
+            <param-value>oak/bootstrap.properties</param-value>
             <description>
                 Property file that hold the same initialization properties than
                 the init-params below. If a parameter is specified in both

Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/bootstrap/missing.jsp
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/bootstrap/missing.jsp?rev=1694486&r1=1694485&r2=1694486&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/bootstrap/missing.jsp (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/bootstrap/missing.jsp Thu Aug  6 12:42:20 2015
@@ -37,16 +37,7 @@ request.setAttribute("title", "Content R
   <p>
     <label>
       Repository home directory:
-      <input size="40" type="text" name="repository_home" value="jackrabbit">
-    </label>
-  </p>
-  <p>
-    Repository type:
-    <label>
-      <input type="radio" name="repository_type" value="classic" checked> Classic
-    </label>
-    <label>
-      <input type="radio" name="repository_type" value="oak"> Oak
+      <input size="40" type="text" name="repository_home" value="oak">
     </label>
   </p>
   <p><input type="submit" value="Create Content Repository"></p>
@@ -58,7 +49,7 @@ request.setAttribute("title", "Content R
   <p>
     Use this form to access an existing content repository in the given
     directory. The repository configuration file should be available as
-    <code>repository.xml</code> within the given directory.
+    <code>repository-config.json</code> within the given directory.
   </p>
   <p>
     Note that the repository can not be concurrently accessed by multiple
@@ -70,7 +61,7 @@ request.setAttribute("title", "Content R
   <p>
     <label>
       Repository home directory:
-      <input size="40" type="text" name="repository_home" value="jackrabbit">
+      <input size="40" type="text" name="repository_home" value="oak">
     </label>
   </p>
   <p><input type="submit" value="Access Content Repository"></p>