Remote JCR client working
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 23 Feb 2011 21:06:55 +0000 (21:06 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 23 Feb 2011 21:06:55 +0000 (21:06 +0000)
First (failed) try of Modeshape

git-svn-id: https://svn.argeo.org/commons/trunk@4176 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

16 files changed:
server/modules/org.argeo.server.jackrabbit.repo/.project [new file with mode: 0644]
server/modules/org.argeo.server.jackrabbit.repo/.settings/org.eclipse.pde.core.prefs [new file with mode: 0644]
server/modules/org.argeo.server.jackrabbit.repo/META-INF/MANIFEST.MF
server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit-osgi.xml
server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit.xml
server/modules/org.argeo.server.jackrabbit.repo/build.properties [new file with mode: 0644]
server/modules/org.argeo.server.jackrabbit.webapp.war/META-INF/MANIFEST.MF
server/modules/org.argeo.server.jackrabbit.webapp.war/WEB-INF/web.xml
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/CachingSessionProvider.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/JcrRemotingServlet.java
server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/MultipleRepositoryHandlerMapping.java
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/DefaultRepositoryRegister.java
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/RepositoryRegister.java
server/runtime/org.argeo.server.modeshape/src/main/java/org/argeo/modeshape/FileSystemRepository.java [new file with mode: 0644]
server/runtime/pom.xml

diff --git a/server/modules/org.argeo.server.jackrabbit.repo/.project b/server/modules/org.argeo.server.jackrabbit.repo/.project
new file mode 100644 (file)
index 0000000..695beeb
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.server.jackrabbit.repo</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+       </natures>
+</projectDescription>
diff --git a/server/modules/org.argeo.server.jackrabbit.repo/.settings/org.eclipse.pde.core.prefs b/server/modules/org.argeo.server.jackrabbit.repo/.settings/org.eclipse.pde.core.prefs
new file mode 100644 (file)
index 0000000..aae2471
--- /dev/null
@@ -0,0 +1,4 @@
+#Wed Feb 23 10:53:42 CET 2011
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
index 7f8f85f7bebcd7319b307793b74a057f5ce9f1de..9a48e044c5c4a1b9b38cf39ad3ccd1034dc14346 100644 (file)
@@ -1,8 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Repo
 Bundle-SymbolicName: org.argeo.server.jackrabbit.repo
 Bundle-Version: 0.2.3.SNAPSHOT
 Import-Package: javax.jcr,
  org.apache.jackrabbit.core,
  org.apache.jackrabbit.core.config,
+ org.apache.lucene.util;version="2.4.1",
  org.apache.xalan.processor,
  org.argeo.server.jackrabbit,
  org.springframework.beans.factory.config
index 796c32dc54e53374f1b2277e8ebb4fb2a917f18d..8ad34c315931e7ca20c498e31ba09c4c1a24bcf1 100644 (file)
@@ -6,7 +6,11 @@
        http://www.springframework.org/schema/beans   \r
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
-       <service ref="repository" interface="javax.jcr.Repository"\r
-               context-class-loader="service-provider" />\r
+       <service ref="remoteJcrRepository" interface="javax.jcr.Repository">\r
+               <service-properties>\r
+                       <beans:entry key="argeo.jcr.repository.name" value="remote_repo" />\r
+               </service-properties>\r
+       </service>\r
+\r
 \r
 </beans:beans>
\ No newline at end of file
index c56a03f59d53c59107de9db254a79bf32c093bb4..d6ef7ec88ce037a8110458ecb126f78f871770f4 100644 (file)
                </property>
        </bean>
 
-       <bean id="repository" class="org.argeo.server.jackrabbit.JackrabbitContainer">
-               <property name="homeDirectory" value="${argeo.osgi.data.dir}/jackrabbit" />
-               <property name="configuration" value="${argeo.jackrabbit.repo.configuration}" />
+       <bean id="remoteJcrRepository" class="org.argeo.server.jackrabbit.JackrabbitContainer">
+               <property name="uri"
+                       value="http://localhost:7070/org.argeo.server.jcr.webapp/remoting/repo" />
+<!--           <property name="namespaces">-->
+<!--                   <map>-->
+<!--                           <entry key="slc" value="http://www.argeo.org/slc" />-->
+<!--                   </map>-->
+<!--           </property>-->
+<!--           <property name="cndFiles">-->
+<!--                   <list>-->
+<!--                           <value>classpath:/org/argeo/slc/repo/repo.cnd</value>-->
+<!--                   </list>-->
+<!--           </property>-->
        </bean>
-       <!--
-               <bean id="repository"
-               class="org.apache.jackrabbit.core.RepositoryImpl"
-               factory-method="create"> <constructor-arg ref="repositoryConfig" />
-               </bean> <bean id="repositoryConfig"
-               class="org.apache.jackrabbit.core.config.RepositoryConfig"
-               factory-method="create"> <constructor-arg
-               value="osgibundle:repository.xml" type="java.io.InputStream" />
-               <constructor-arg value="${argeo.osgi.data.dir}/jackrabbit"
-               type="java.lang.String" /> </bean>
-       -->
 </beans>
\ No newline at end of file
diff --git a/server/modules/org.argeo.server.jackrabbit.repo/build.properties b/server/modules/org.argeo.server.jackrabbit.repo/build.properties
new file mode 100644 (file)
index 0000000..5f22cdd
--- /dev/null
@@ -0,0 +1 @@
+bin.includes = META-INF/
index eadb4dc4b4b7fb08425765b5f5ac466c75ab1e28..828e95a14c570f331775b80b0b43d8c6ccc8b786 100644 (file)
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
 Bundle-Name: Webapp
 Bundle-SymbolicName: org.argeo.server.jackrabbit.webapp
 Bundle-Version: 1.0.0.qualifier
-Web-ContextPath: jcr
+Web-ContextPath: org.argeo.server.jcr.webapp
 Bundle-Vendor: Argeo
 Import-Package: javax.jcr,
  javax.servlet,
index b5a1509447f3346f5fe631e3753d0b0798f60d44..a2822ad477264aac5036398640a540deda4c4337 100644 (file)
        </servlet-mapping>
 
        <!--  Security -->
-       <filter>
-               <filter-name>springSecurityFilterChain</filter-name>
-               <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
-       </filter>
-
-       <filter-mapping>
-               <filter-name>springSecurityFilterChain</filter-name>
-               <url-pattern>/*</url-pattern>
-       </filter-mapping>
+<!--   <filter>-->
+<!--           <filter-name>springSecurityFilterChain</filter-name>-->
+<!--           <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>-->
+<!--   </filter>-->
+<!---->
+<!--   <filter-mapping>-->
+<!--           <filter-name>springSecurityFilterChain</filter-name>-->
+<!--           <url-pattern>/*</url-pattern>-->
+<!--   </filter-mapping>-->
 </web-app>
index 6ec6065a542b7f2f3d8f422b9c6bfb9c7bef3609..c828d703a7daa6bd2a9ae320cf474e4f07dd1187 100644 (file)
@@ -38,12 +38,16 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.api.JackrabbitRepository;
+import org.apache.jackrabbit.commons.JcrUtils;
 import org.apache.jackrabbit.commons.NamespaceHelper;
 import org.apache.jackrabbit.commons.cnd.CndImporter;
+import org.apache.jackrabbit.core.RepositoryFactoryImpl;
 import org.apache.jackrabbit.core.RepositoryImpl;
 import org.apache.jackrabbit.core.TransientRepository;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.jackrabbit.core.config.RepositoryConfigurationParser;
+import org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory;
 import org.argeo.ArgeoException;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -65,6 +69,7 @@ public class JackrabbitContainer implements InitializingBean, DisposableBean,
        private Resource variables;
 
        private Boolean inMemory = false;
+       private String uri = null;
 
        private Repository repository;
 
@@ -82,50 +87,66 @@ public class JackrabbitContainer implements InitializingBean, DisposableBean,
        public void afterPropertiesSet() throws Exception {
                // Load cnds as resources
                for (String resUrl : cndFiles) {
-
                        Resource res = resourceLoader.getResource(resUrl);
                        byte[] arr = IOUtils.toByteArray(res.getInputStream());
                        cnds.add(arr);
                }
 
-               if (inMemory && homeDirectory.exists()) {
-                       FileUtils.deleteDirectory(homeDirectory);
-                       log.warn("Deleted Jackrabbit home directory " + homeDirectory);
-               }
+               if (uri != null) {
+                       // Thread.currentThread().setContextClassLoader(
+                       // getClass().getClassLoader());
+                       // repository = JcrUtils.getRepository(uri);
+                       Map<String, String> params = new HashMap<String, String>();
+                       params.put(JcrUtils.REPOSITORY_URI, uri);
+                       repository = new Jcr2davRepositoryFactory().getRepository(params);
+                       if (repository == null)
+                               throw new ArgeoException("Remote Davex repository " + uri
+                                               + " not found");
+                       log.info("Initialized Jackrabbit repository " + repository
+                                       + " from uri " + uri);
+               } else {
+                       if (inMemory && homeDirectory.exists()) {
+                               FileUtils.deleteDirectory(homeDirectory);
+                               log.warn("Deleted Jackrabbit home directory " + homeDirectory);
+                       }
 
-               RepositoryConfig config;
-               InputStream in = configuration.getInputStream();
-               InputStream propsIn = null;
-               try {
-                       Properties vars = new Properties();
-                       if (variables != null) {
-                               propsIn = variables.getInputStream();
-                               vars.load(propsIn);
+                       RepositoryConfig config;
+                       InputStream in = configuration.getInputStream();
+                       InputStream propsIn = null;
+                       try {
+                               Properties vars = new Properties();
+                               if (variables != null) {
+                                       propsIn = variables.getInputStream();
+                                       vars.load(propsIn);
+                               }
+                               // override with system properties
+                               vars.putAll(System.getProperties());
+                               vars.put(
+                                               RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE,
+                                               homeDirectory.getCanonicalPath());
+                               config = RepositoryConfig.create(new InputSource(in), vars);
+                       } catch (Exception e) {
+                               throw new RuntimeException("Cannot read configuration", e);
+                       } finally {
+                               IOUtils.closeQuietly(in);
+                               IOUtils.closeQuietly(propsIn);
                        }
-                       // override with system properties
-                       vars.putAll(System.getProperties());
-                       vars.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE,
-                                       homeDirectory.getCanonicalPath());
-                       config = RepositoryConfig.create(new InputSource(in), vars);
-               } catch (Exception e) {
-                       throw new RuntimeException("Cannot read configuration", e);
-               } finally {
-                       IOUtils.closeQuietly(in);
-                       IOUtils.closeQuietly(propsIn);
-               }
 
-               if (inMemory)
-                       repository = new TransientRepository(config);
-               else
-                       repository = RepositoryImpl.create(config);
+                       if (inMemory)
+                               repository = new TransientRepository(config);
+                       else
+                               repository = RepositoryImpl.create(config);
 
-               log.info("Initialized Jackrabbit repository " + repository + " in "
-                               + homeDirectory + " with config " + configuration);
+                       log.info("Initialized Jackrabbit repository " + repository + " in "
+                                       + homeDirectory + " with config " + configuration);
+               }
        }
 
        public void destroy() throws Exception {
                if (repository != null) {
-                       if (repository instanceof RepositoryImpl)
+                       if (repository instanceof JackrabbitRepository)
+                               ((JackrabbitRepository) repository).shutdown();
+                       else if (repository instanceof RepositoryImpl)
                                ((RepositoryImpl) repository).shutdown();
                        else if (repository instanceof TransientRepository)
                                ((TransientRepository) repository).shutdown();
@@ -138,8 +159,12 @@ public class JackrabbitContainer implements InitializingBean, DisposableBean,
                                        log.debug("Deleted Jackrabbit home directory "
                                                        + homeDirectory);
                        }
-               log.info("Destroyed Jackrabbit repository " + repository + " in "
-                               + homeDirectory + " with config " + configuration);
+
+               if (uri != null)
+                       log.info("Destroyed Jackrabbit repository with uri " + uri);
+               else
+                       log.info("Destroyed Jackrabbit repository " + repository + " in "
+                                       + homeDirectory + " with config " + configuration);
        }
 
        // JCR REPOSITORY (delegated)
@@ -267,4 +292,8 @@ public class JackrabbitContainer implements InitializingBean, DisposableBean,
                this.variables = variables;
        }
 
+       public void setUri(String uri) {
+               this.uri = uri;
+       }
+
 }
index ad301871d9070e5e791a7ad2d74b9910552f52b7..a8771ae68634918ffe24aeb6888811270e8c480a 100644 (file)
@@ -4,6 +4,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.jcr.Credentials;
 import javax.jcr.LoginException;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
@@ -22,6 +23,15 @@ public class CachingSessionProvider implements SessionProvider {
        private final static Log log = LogFactory
                        .getLog(CachingSessionProvider.class);
 
+       private Credentials credentials = null;
+
+       public CachingSessionProvider() {
+       }
+
+       public CachingSessionProvider(Credentials credentials) {
+               this.credentials = credentials;
+       }
+
        @SuppressWarnings("unchecked")
        public Session getSession(HttpServletRequest request, Repository rep,
                        String workspace) throws LoginException, ServletException,
@@ -36,13 +46,15 @@ public class CachingSessionProvider implements SessionProvider {
                Map<String, Session> sessions = (Map<String, Session>) httpSession
                                .getAttribute(JCR_SESSIONS_ATTRIBUTE);
                if (!sessions.containsKey(workspace)) {
-                       Session session = rep.login(workspace);
+                       Session session = rep.login(credentials, workspace);
                        sessions.put(workspace, session);
                        return session;
                } else {
                        Session session = sessions.get(workspace);
                        if (!session.isLive()) {
-                               session = rep.login(workspace);
+                               sessions.remove(workspace);
+                               session = rep.login(credentials, workspace);
+                               sessions.put(workspace, session);
                        }
                        return session;
                }
@@ -51,7 +63,8 @@ public class CachingSessionProvider implements SessionProvider {
        public void releaseSession(Session session) {
                if (log.isDebugEnabled())
                        log.debug("Releasing JCR session " + session);
-               session.logout();
+               // session.logout();
+               // FIXME: find a way to log out when the HTTP session is expired
        }
 
 }
index 8fb58017984c20518d45bf24cf0725e1a9a541c3..add064b3f7d5ba6b08139c70f4fb45f0f81854f2 100644 (file)
@@ -1,13 +1,9 @@
 package org.argeo.server.jackrabbit.webdav;
 
-import java.util.Enumeration;
-
 import javax.jcr.Repository;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
+import javax.jcr.SimpleCredentials;
 
 import org.apache.jackrabbit.server.SessionProvider;
-import org.springframework.web.servlet.mvc.ServletWrappingController;
 
 public class JcrRemotingServlet extends
                org.apache.jackrabbit.server.remoting.davex.JcrRemotingServlet {
@@ -27,7 +23,8 @@ public class JcrRemotingServlet extends
 
        @Override
        protected SessionProvider getSessionProvider() {
-               return new CachingSessionProvider();
+               return new CachingSessionProvider(new SimpleCredentials("demo",
+                               "demo".toCharArray()));
        }
 
 }
index 077aa4fe63fee37860ecac424a872746e967848d..a8591dc5f0ad889641c0649faeb7127e6956dea7 100644 (file)
@@ -6,12 +6,14 @@ import java.util.Properties;
 import javax.jcr.Repository;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet;
+import org.argeo.ArgeoException;
 import org.argeo.jcr.RepositoryRegister;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
@@ -20,7 +22,6 @@ import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.web.context.ServletContextAware;
 import org.springframework.web.servlet.HandlerExecutionChain;
 import org.springframework.web.servlet.HandlerMapping;
-import org.springframework.web.servlet.mvc.ServletWrappingController;
 
 public class MultipleRepositoryHandlerMapping implements HandlerMapping,
                ApplicationContextAware, ServletContextAware {
@@ -34,34 +35,61 @@ public class MultipleRepositoryHandlerMapping implements HandlerMapping,
 
        public HandlerExecutionChain getHandler(HttpServletRequest request)
                        throws Exception {
-               log.debug(request);
-               log.debug("getContextPath=" + request.getContextPath());
-               log.debug("getServletPath=" + request.getServletPath());
-               log.debug("getPathInfo=" + request.getPathInfo());
+               if (log.isTraceEnabled()) {
+                       log.trace("getContextPath=" + request.getContextPath());
+                       log.trace("getServletPath=" + request.getServletPath());
+                       log.trace("getPathInfo=" + request.getPathInfo());
+               }
 
-               String repositoryName = "repo";
-               String pathPrefix = "/remoting/repo";
-               String beanName = "remoting_" + repositoryName;
+               String repositoryName = extractRepositoryName(request);
+               String pathPrefix = request.getServletPath() + '/' + repositoryName;
+               String beanName = pathPrefix;
 
                if (!applicationContext.containsBean(beanName)) {
                        Repository repository = repositoryRegister.getRepositories().get(
                                        repositoryName);
-                       JcrRemotingServlet jcrRemotingServlet = new JcrRemotingServlet(
-                                       repository);
-                       Properties initParameters = new Properties();
-                       initParameters.setProperty(
-                                       JCRWebdavServerServlet.INIT_PARAM_RESOURCE_PATH_PREFIX,
-                                       pathPrefix);
-                       jcrRemotingServlet.init(new DelegatingServletConfig(beanName,
-                                       initParameters));
+                       HttpServlet servlet = createServlet(repository, pathPrefix);
                        applicationContext.getBeanFactory().registerSingleton(beanName,
-                                       jcrRemotingServlet);
+                                       servlet);
+                       // TODO: unregister it as well
                }
                HttpServlet remotingServlet = (HttpServlet) applicationContext
                                .getBean(beanName);
                return new HandlerExecutionChain(remotingServlet);
        }
 
+       protected HttpServlet createServlet(Repository repository, String pathPrefix)
+                       throws ServletException {
+               JcrRemotingServlet jcrRemotingServlet = new JcrRemotingServlet(
+                               repository);
+               Properties initParameters = new Properties();
+               initParameters.setProperty(
+                               JCRWebdavServerServlet.INIT_PARAM_RESOURCE_PATH_PREFIX,
+                               pathPrefix);
+               jcrRemotingServlet.init(new DelegatingServletConfig(pathPrefix.replace(
+                               '/', '_'), initParameters));
+               return jcrRemotingServlet;
+       }
+
+       /** The repository name is the first part of the path info */
+       protected String extractRepositoryName(HttpServletRequest request) {
+               String pathInfo = request.getPathInfo();
+               // TODO: optimize by checking character by character
+               String[] tokens = pathInfo.split("/");
+               StringBuffer currName = new StringBuffer("");
+               tokens: for (String token : tokens) {
+                       if (token.equals(""))
+                               continue tokens;
+                       currName.append(token);
+                       if (repositoryRegister.getRepositories().containsKey(
+                                       currName.toString()))
+                               return currName.toString();
+                       currName.append('/');
+               }
+               throw new ArgeoException("No repository can be found for request "
+                               + pathInfo);
+       }
+
        public void setApplicationContext(ApplicationContext applicationContext)
                        throws BeansException {
                this.applicationContext = (ConfigurableApplicationContext) applicationContext;
index e2d9854246364feea7cfb0f7255ebf531551e1a2..fc2fb529dc1fd854c1ba282af5d4a065421fcedb 100644 (file)
@@ -1,6 +1,7 @@
 package org.argeo.jcr;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Observable;
 import java.util.SortedMap;
@@ -17,8 +18,9 @@ public class DefaultRepositoryRegister extends Observable implements
        private final static Log log = LogFactory
                        .getLog(DefaultRepositoryRegister.class);
 
-       private SortedMap<String, Repository> repositories = Collections
-                       .synchronizedSortedMap(new TreeMap<String, Repository>());
+       /** Read only map which will be directly exposed. */
+       private Map<String, Repository> repositories = Collections
+                       .unmodifiableMap(new TreeMap<String, Repository>());
 
        @SuppressWarnings("rawtypes")
        public synchronized Repository getRepository(Map parameters)
@@ -34,8 +36,9 @@ public class DefaultRepositoryRegister extends Observable implements
                return repositories.get(name);
        }
 
-       public Map<String, Repository> getRepositories() {
-               return new TreeMap<String, Repository>(repositories);
+       /** Access to the read-only map */
+       public synchronized Map<String, Repository> getRepositories() {
+               return repositories;
        }
 
        /** Registers a service, typically called when OSGi services are bound. */
@@ -49,7 +52,10 @@ public class DefaultRepositoryRegister extends Observable implements
                }
 
                String name = properties.get(JCR_REPOSITORY_NAME).toString();
-               repositories.put(name, repository);
+               Map<String, Repository> map = new TreeMap<String, Repository>(
+                               repositories);
+               map.put(name, repository);
+               repositories = Collections.unmodifiableMap(map);
                setChanged();
                notifyObservers(repository);
        }
@@ -65,7 +71,10 @@ public class DefaultRepositoryRegister extends Observable implements
                }
 
                String name = properties.get(JCR_REPOSITORY_NAME).toString();
-               repositories.remove(name);
+               Map<String, Repository> map = new TreeMap<String, Repository>(
+                               repositories);
+               map.put(name, repository);
+               repositories = Collections.unmodifiableMap(map);
                setChanged();
                notifyObservers(repository);
        }
index 8d317db25ebaea70decc38bc83fd14cbe56f5275..8f6e17ba60b9defb3263777a3e5de661b90194f3 100644 (file)
@@ -6,8 +6,13 @@ import javax.jcr.Repository;
 import javax.jcr.RepositoryFactory;
 
 /** Allows to register repositories by name. */
-public interface RepositoryRegister extends RepositoryFactory{
+public interface RepositoryRegister extends RepositoryFactory {
        public final static String JCR_REPOSITORY_NAME = "argeo.jcr.repository.name";
 
-       public Map<String,Repository> getRepositories();
+       /**
+        * The registered {@link Repository} as a read-only map. Note that this
+        * method should be called for each access in order to be sure to be up to
+        * date in case repositories have registered/unregistered
+        */
+       public Map<String, Repository> getRepositories();
 }
diff --git a/server/runtime/org.argeo.server.modeshape/src/main/java/org/argeo/modeshape/FileSystemRepository.java b/server/runtime/org.argeo.server.modeshape/src/main/java/org/argeo/modeshape/FileSystemRepository.java
new file mode 100644 (file)
index 0000000..7516b6a
--- /dev/null
@@ -0,0 +1,45 @@
+package org.argeo.modeshape;
+
+import java.util.UUID;
+
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.argeo.jcr.JcrUtils;
+import org.modeshape.connector.filesystem.FileSystemSource;
+import org.modeshape.jcr.JcrConfiguration;
+import org.modeshape.jcr.JcrEngine;
+
+public class FileSystemRepository {
+       public void init() {
+               try {
+                       // Required in order to load mime type definitions
+                       Thread.currentThread().setContextClassLoader(JcrConfiguration.class.getClassLoader());
+                       JcrConfiguration config = new JcrConfiguration();
+                       config.repositorySource("fsSource")
+                                       .usingClass(FileSystemSource.class)
+                                       .setDescription("The repository for our content")
+                                       .setProperty("workspaceRootPath", "/home/mbaudier/tmp")
+                                       .setProperty("defaultWorkspaceName", "prod")
+                                       .setProperty("predefinedWorkspaceNames",
+                                                       new String[] { "staging", "dev" })
+                                       .setProperty(
+                                                       "rootNodeUuid",
+                                                       UUID.fromString("fd129c12-81a8-42ed-aa4b-820dba49e6f0"))
+                                       .setProperty("updatesAllowed", "true")
+                                       .setProperty("creatingWorkspaceAllowed", "false");
+                       config.repository("fsRepo").setSource("fsSource");
+
+                       JcrEngine jcrEngine = config.build();
+                       jcrEngine.start();
+                       Repository repository = jcrEngine.getRepository("fsRepo");
+                       Session session = repository.login(new SimpleCredentials("demo",
+                                       "demo".toCharArray()));
+                       JcrUtils.debug(session.getRootNode());
+               } catch (RepositoryException e) {
+                       e.printStackTrace();
+               }
+       }
+}
index 7b078be6a4ed341ab78ca1e2c622ef340e8788cd..35466145f4d42327eee3695b5ee6814aa6dfce65 100644 (file)
@@ -18,8 +18,9 @@
                <module>org.argeo.server.jxl</module>
                <module>org.argeo.server.hibernate</module>
                <module>org.argeo.server.ads</module>
-               <module>org.argeo.server.jackrabbit</module>
                <module>org.argeo.server.jcr</module>
+               <module>org.argeo.server.jackrabbit</module>
+               <module>org.argeo.server.modeshape</module>
        </modules>
        <build>
                <resources>