X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.server.jcr%2Fsrc%2Forg%2Fargeo%2Fjackrabbit%2FJackrabbitRepositoryFactory.java;h=e5bb3bce0e3d00d2901febc697e4bd127989497e;hb=4f3195c9dc273e6e396920c8fa19e9605b9831e2;hp=d64bb5e688d137d66edef8ef509bf3641c4cf037;hpb=05e5c99eb2057d995365362216d775dc121f6113;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.server.jcr/src/org/argeo/jackrabbit/JackrabbitRepositoryFactory.java b/org.argeo.server.jcr/src/org/argeo/jackrabbit/JackrabbitRepositoryFactory.java index d64bb5e68..e5bb3bce0 100644 --- a/org.argeo.server.jcr/src/org/argeo/jackrabbit/JackrabbitRepositoryFactory.java +++ b/org.argeo.server.jcr/src/org/argeo/jackrabbit/JackrabbitRepositoryFactory.java @@ -17,6 +17,8 @@ package org.argeo.jackrabbit; import java.io.File; import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -36,7 +38,7 @@ import org.apache.jackrabbit.core.config.RepositoryConfigurationParser; import org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory; import org.argeo.ArgeoException; import org.argeo.jcr.ArgeoJcrConstants; -import org.argeo.jcr.DefaultRepositoryFactory; +import org.argeo.jcr.ArgeoJcrException; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.xml.sax.InputSource; @@ -45,23 +47,21 @@ import org.xml.sax.InputSource; * Repository factory which can create new repositories and access remote * Jackrabbit repositories */ -public class JackrabbitRepositoryFactory extends DefaultRepositoryFactory - implements RepositoryFactory, ArgeoJcrConstants { +public class JackrabbitRepositoryFactory implements RepositoryFactory, ArgeoJcrConstants { - private final static Log log = LogFactory - .getLog(JackrabbitRepositoryFactory.class); + private final static Log log = LogFactory.getLog(JackrabbitRepositoryFactory.class); - private Resource fileRepositoryConfiguration = new ClassPathResource( - "/org/argeo/jackrabbit/repository-h2.xml"); + private Resource fileRepositoryConfiguration = new ClassPathResource("/org/argeo/jackrabbit/repository-h2.xml"); @SuppressWarnings({ "rawtypes", "unchecked" }) public Repository getRepository(Map parameters) throws RepositoryException { - // check if can be found by alias - Repository repository = super.getRepository(parameters); - if (repository != null) - return repository; + // // check if can be found by alias + // Repository repository = super.getRepository(parameters); + // if (repository != null) + // return repository; // check if remote + Repository repository; String uri = null; if (parameters.containsKey(JCR_REPOSITORY_URI)) uri = parameters.get(JCR_REPOSITORY_URI).toString(); @@ -73,43 +73,50 @@ public class JackrabbitRepositoryFactory extends DefaultRepositoryFactory repository = createRemoteRepository(uri); else if (uri.startsWith("file"))// http, https repository = createFileRepository(uri, parameters); - else if (uri.startsWith("vm")) { - log.warn("URI " - + uri - + " should have been managed by generic JCR repository factory"); - repository = getRepositoryByAlias(getAliasFromURI(uri)); - } + else if (uri.startsWith("vm")) { + log.warn("URI " + + uri + + " should have been managed by generic JCR repository factory"); + repository = getRepositoryByAlias(getAliasFromURI(uri)); + } + else + throw new ArgeoJcrException("Unrecognized URI format " + uri); + } - // publish under alias - if (parameters.containsKey(JCR_REPOSITORY_ALIAS)) { - Properties properties = new Properties(); - properties.putAll(parameters); + else if (parameters.containsKey(JCR_REPOSITORY_ALIAS)) { + // Properties properties = new Properties(); + // properties.putAll(parameters); String alias = parameters.get(JCR_REPOSITORY_ALIAS).toString(); - publish(alias, repository, properties); - log.info("Registered JCR repository under alias '" + alias - + "' with properties " + properties); - } + // publish(alias, repository, properties); + // log.info("Registered JCR repository under alias '" + alias + "' + // with properties " + properties); + repository = getRepositoryByAlias(alias); + } else + throw new ArgeoJcrException("Not enough information in " + parameters); + + if (repository == null) + throw new ArgeoJcrException("Repository not found " + parameters); return repository; } - protected Repository createRemoteRepository(String uri) - throws RepositoryException { + protected Repository getRepositoryByAlias(String alias) { + return null; + } + + protected Repository createRemoteRepository(String uri) throws RepositoryException { Map params = new HashMap(); params.put(JcrUtils.REPOSITORY_URI, uri); - Repository repository = new Jcr2davRepositoryFactory() - .getRepository(params); + Repository repository = new Jcr2davRepositoryFactory().getRepository(params); if (repository == null) - throw new ArgeoException("Remote Davex repository " + uri - + " not found"); + throw new ArgeoException("Remote Davex repository " + uri + " not found"); log.info("Initialized remote Jackrabbit repository from uri " + uri); return repository; } @SuppressWarnings({ "rawtypes", "unchecked" }) - protected Repository createFileRepository(final String uri, Map parameters) - throws RepositoryException { + protected Repository createFileRepository(final String uri, Map parameters) throws RepositoryException { InputStream configurationIn = null; try { Properties vars = new Properties(); @@ -117,32 +124,26 @@ public class JackrabbitRepositoryFactory extends DefaultRepositoryFactory String dirPath = uri.substring("file:".length()); File homeDir = new File(dirPath); if (homeDir.exists() && !homeDir.isDirectory()) - throw new ArgeoException("Repository home " + dirPath - + " is not a directory"); + throw new ArgeoException("Repository home " + dirPath + " is not a directory"); if (!homeDir.exists()) homeDir.mkdirs(); configurationIn = fileRepositoryConfiguration.getInputStream(); - vars.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE, - homeDir.getCanonicalPath()); - RepositoryConfig repositoryConfig = RepositoryConfig.create( - new InputSource(configurationIn), vars); + vars.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE, homeDir.getCanonicalPath()); + RepositoryConfig repositoryConfig = RepositoryConfig.create(new InputSource(configurationIn), vars); // TransientRepository repository = new // TransientRepository(repositoryConfig); - final RepositoryImpl repository = RepositoryImpl - .create(repositoryConfig); + final RepositoryImpl repository = RepositoryImpl.create(repositoryConfig); Session session = repository.login(); // FIXME make it generic - org.argeo.jcr.JcrUtils.addPrivilege(session, "/", "ROLE_ADMIN", - "jcr:all"); + org.argeo.jcr.JcrUtils.addPrivilege(session, "/", "ROLE_ADMIN", "jcr:all"); org.argeo.jcr.JcrUtils.logoutQuietly(session); - Runtime.getRuntime().addShutdownHook( - new Thread("Clean JCR repository " + uri) { - public void run() { - repository.shutdown(); - log.info("Destroyed repository " + uri); - } - }); + Runtime.getRuntime().addShutdownHook(new Thread("Clean JCR repository " + uri) { + public void run() { + repository.shutdown(); + log.info("Destroyed repository " + uri); + } + }); log.info("Initialized file Jackrabbit repository from uri " + uri); return repository; } catch (Exception e) { @@ -152,6 +153,20 @@ public class JackrabbitRepositoryFactory extends DefaultRepositoryFactory } } + protected String getAliasFromURI(String uri) { + try { + URI uriObj = new URI(uri); + String alias = uriObj.getPath(); + if (alias.charAt(0) == '/') + alias = alias.substring(1); + if (alias.charAt(alias.length() - 1) == '/') + alias = alias.substring(0, alias.length() - 1); + return alias; + } catch (URISyntaxException e) { + throw new ArgeoException("Cannot interpret URI " + uri, e); + } + } + /** * Called after the repository has been initialised. Does nothing by * default. @@ -161,8 +176,7 @@ public class JackrabbitRepositoryFactory extends DefaultRepositoryFactory } - public void setFileRepositoryConfiguration( - Resource fileRepositoryConfiguration) { + public void setFileRepositoryConfiguration(Resource fileRepositoryConfiguration) { this.fileRepositoryConfiguration = fileRepositoryConfiguration; }