From 070a35d657ea75fa168759b739d8671386048da6 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 23 Feb 2011 21:06:55 +0000 Subject: [PATCH] Remote JCR client working First (failed) try of Modeshape git-svn-id: https://svn.argeo.org/commons/trunk@4176 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org.argeo.server.jackrabbit.repo/.project | 22 +++++ .../.settings/org.eclipse.pde.core.prefs | 4 + .../META-INF/MANIFEST.MF | 4 + .../META-INF/spring/jackrabbit-osgi.xml | 8 +- .../META-INF/spring/jackrabbit.xml | 27 +++--- .../build.properties | 1 + .../META-INF/MANIFEST.MF | 2 +- .../WEB-INF/web.xml | 18 ++-- .../jackrabbit/JackrabbitContainer.java | 95 ++++++++++++------- .../webdav/CachingSessionProvider.java | 19 +++- .../jackrabbit/webdav/JcrRemotingServlet.java | 9 +- .../MultipleRepositoryHandlerMapping.java | 62 ++++++++---- .../argeo/jcr/DefaultRepositoryRegister.java | 21 ++-- .../org/argeo/jcr/RepositoryRegister.java | 9 +- .../argeo/modeshape/FileSystemRepository.java | 45 +++++++++ server/runtime/pom.xml | 3 +- 16 files changed, 255 insertions(+), 94 deletions(-) create mode 100644 server/modules/org.argeo.server.jackrabbit.repo/.project create mode 100644 server/modules/org.argeo.server.jackrabbit.repo/.settings/org.eclipse.pde.core.prefs create mode 100644 server/modules/org.argeo.server.jackrabbit.repo/build.properties create mode 100644 server/runtime/org.argeo.server.modeshape/src/main/java/org/argeo/modeshape/FileSystemRepository.java diff --git a/server/modules/org.argeo.server.jackrabbit.repo/.project b/server/modules/org.argeo.server.jackrabbit.repo/.project new file mode 100644 index 000000000..695beebdd --- /dev/null +++ b/server/modules/org.argeo.server.jackrabbit.repo/.project @@ -0,0 +1,22 @@ + + + org.argeo.server.jackrabbit.repo + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + 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 index 000000000..aae24717e --- /dev/null +++ b/server/modules/org.argeo.server.jackrabbit.repo/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +#Wed Feb 23 10:53:42 CET 2011 +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/server/modules/org.argeo.server.jackrabbit.repo/META-INF/MANIFEST.MF b/server/modules/org.argeo.server.jackrabbit.repo/META-INF/MANIFEST.MF index 7f8f85f7b..9a48e044c 100644 --- a/server/modules/org.argeo.server.jackrabbit.repo/META-INF/MANIFEST.MF +++ b/server/modules/org.argeo.server.jackrabbit.repo/META-INF/MANIFEST.MF @@ -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 diff --git a/server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit-osgi.xml b/server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit-osgi.xml index 796c32dc5..8ad34c315 100644 --- a/server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit-osgi.xml +++ b/server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit-osgi.xml @@ -6,7 +6,11 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> - + + + + + + \ No newline at end of file diff --git a/server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit.xml b/server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit.xml index c56a03f59..d6ef7ec88 100644 --- a/server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit.xml +++ b/server/modules/org.argeo.server.jackrabbit.repo/META-INF/spring/jackrabbit.xml @@ -12,19 +12,18 @@ - - - + + + + + + + + + + + + - \ 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 index 000000000..5f22cdd44 --- /dev/null +++ b/server/modules/org.argeo.server.jackrabbit.repo/build.properties @@ -0,0 +1 @@ +bin.includes = META-INF/ diff --git a/server/modules/org.argeo.server.jackrabbit.webapp.war/META-INF/MANIFEST.MF b/server/modules/org.argeo.server.jackrabbit.webapp.war/META-INF/MANIFEST.MF index eadb4dc4b..828e95a14 100644 --- a/server/modules/org.argeo.server.jackrabbit.webapp.war/META-INF/MANIFEST.MF +++ b/server/modules/org.argeo.server.jackrabbit.webapp.war/META-INF/MANIFEST.MF @@ -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, diff --git a/server/modules/org.argeo.server.jackrabbit.webapp.war/WEB-INF/web.xml b/server/modules/org.argeo.server.jackrabbit.webapp.war/WEB-INF/web.xml index b5a150944..a2822ad47 100644 --- a/server/modules/org.argeo.server.jackrabbit.webapp.war/WEB-INF/web.xml +++ b/server/modules/org.argeo.server.jackrabbit.webapp.war/WEB-INF/web.xml @@ -41,13 +41,13 @@ - - springSecurityFilterChain - org.springframework.web.filter.DelegatingFilterProxy - - - - springSecurityFilterChain - /* - + + + + + + + + + diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java index 6ec6065a5..c828d703a 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java @@ -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 params = new HashMap(); + 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; + } + } diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/CachingSessionProvider.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/CachingSessionProvider.java index ad301871d..a8771ae68 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/CachingSessionProvider.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/CachingSessionProvider.java @@ -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 sessions = (Map) 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 } } diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/JcrRemotingServlet.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/JcrRemotingServlet.java index 8fb580179..add064b3f 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/JcrRemotingServlet.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/JcrRemotingServlet.java @@ -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())); } } diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/MultipleRepositoryHandlerMapping.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/MultipleRepositoryHandlerMapping.java index 077aa4fe6..a8591dc5f 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/MultipleRepositoryHandlerMapping.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/webdav/MultipleRepositoryHandlerMapping.java @@ -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; diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/DefaultRepositoryRegister.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/DefaultRepositoryRegister.java index e2d985424..fc2fb529d 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/DefaultRepositoryRegister.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/DefaultRepositoryRegister.java @@ -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 repositories = Collections - .synchronizedSortedMap(new TreeMap()); + /** Read only map which will be directly exposed. */ + private Map repositories = Collections + .unmodifiableMap(new TreeMap()); @SuppressWarnings("rawtypes") public synchronized Repository getRepository(Map parameters) @@ -34,8 +36,9 @@ public class DefaultRepositoryRegister extends Observable implements return repositories.get(name); } - public Map getRepositories() { - return new TreeMap(repositories); + /** Access to the read-only map */ + public synchronized Map 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 map = new TreeMap( + 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 map = new TreeMap( + repositories); + map.put(name, repository); + repositories = Collections.unmodifiableMap(map); setChanged(); notifyObservers(repository); } diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/RepositoryRegister.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/RepositoryRegister.java index 8d317db25..8f6e17ba6 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/RepositoryRegister.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/RepositoryRegister.java @@ -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 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 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 index 000000000..7516b6a91 --- /dev/null +++ b/server/runtime/org.argeo.server.modeshape/src/main/java/org/argeo/modeshape/FileSystemRepository.java @@ -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(); + } + } +} diff --git a/server/runtime/pom.xml b/server/runtime/pom.xml index 7b078be6a..35466145f 100644 --- a/server/runtime/pom.xml +++ b/server/runtime/pom.xml @@ -18,8 +18,9 @@ org.argeo.server.jxl org.argeo.server.hibernate org.argeo.server.ads - org.argeo.server.jackrabbit org.argeo.server.jcr + org.argeo.server.jackrabbit + org.argeo.server.modeshape -- 2.39.2