]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryBuilder.java
Introduce Jackrabbit clustering
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / RepositoryBuilder.java
index 94b8c051e726291e540adde5eca4cba6e477c119..f866c2b99a346c7884a72193d2eeaa5dd17db349 100644 (file)
@@ -24,11 +24,8 @@ import org.apache.jackrabbit.core.cache.CacheManager;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
 import org.apache.jackrabbit.core.config.RepositoryConfigurationParser;
 import org.argeo.cms.CmsException;
-import org.argeo.jcr.ArgeoJcrConstants;
 import org.argeo.jcr.ArgeoJcrException;
-import org.argeo.node.RepoConf;
-import org.osgi.framework.Constants;
-import org.osgi.service.cm.ConfigurationAdmin;
+import org.argeo.node.NodeConstants;
 import org.xml.sax.InputSource;
 
 /** Can interpret properties in order to create an actual JCR repository. */
@@ -57,23 +54,27 @@ class RepositoryBuilder {
                ClassLoader cl = getClass().getClassLoader();
                InputStream in = null;
                try {
-                       final String base = "/org/argeo/jackrabbit";
-                       switch (type) {
-                       case h2:
-                               in = cl.getResourceAsStream(base + "/repository-h2.xml");
-                               break;
-                       case postgresql:
-                               in = cl.getResourceAsStream(base + "/repository-postgresql.xml");
-                               break;
-                       case memory:
-                               in = cl.getResourceAsStream(base + "/repository-memory.xml");
-                               break;
-                       case localfs:
-                               in = cl.getResourceAsStream(base + "/repository-localfs.xml");
-                               break;
-                       default:
-                               throw new ArgeoJcrException("Unsupported node type " + type);
-                       }
+                       final String base = "/org/argeo/cms/internal/kernel";
+//                     switch (type) {
+//                     case h2:
+//                             in = cl.getResourceAsStream(base + "/repository-h2.xml");
+//                             break;
+//                     case postgresql:
+//                             in = cl.getResourceAsStream(base + "/repository-postgresql.xml");
+//                             break;
+//                     case postgresql_ds:
+//                             in = cl.getResourceAsStream(base + "/repository-postgresql-ds.xml");
+//                             break;
+//                     case memory:
+//                             in = cl.getResourceAsStream(base + "/repository-memory.xml");
+//                             break;
+//                     case localfs:
+//                             in = cl.getResourceAsStream(base + "/repository-localfs.xml");
+//                             break;
+//                     default:
+//                             throw new ArgeoJcrException("Unsupported node type " + type);
+//                     }
+                       in = cl.getResourceAsStream(base + "/repository-"+type.name()+".xml");
 
                        if (in == null)
                                throw new ArgeoJcrException("Repository configuration not found");
@@ -88,23 +89,35 @@ class RepositoryBuilder {
 
        private Properties getConfigurationProperties(JackrabbitType type, Dictionary<String, ?> properties) {
                Properties props = new Properties();
-               keys: for (Enumeration<String> keys = properties.keys(); keys.hasMoreElements();) {
+               for (Enumeration<String> keys = properties.keys(); keys.hasMoreElements();) {
                        String key = keys.nextElement();
-                       if (key.equals(ConfigurationAdmin.SERVICE_FACTORYPID) || key.equals(Constants.SERVICE_PID)
-                                       || key.equals(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS))
-                               continue keys;
-                       String value = prop(properties, RepoConf.valueOf(key));
-                       if (value != null)
-                               props.put(key, value);
+                       // if (key.equals(ConfigurationAdmin.SERVICE_FACTORYPID) ||
+                       // key.equals(Constants.SERVICE_PID)
+                       // || key.equals(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS))
+                       // continue keys;
+                       // try {
+                       // String value = prop(properties, RepoConf.valueOf(key));
+                       // if (value != null)
+                       props.put(key, properties.get(key));
+                       // } catch (IllegalArgumentException e) {
+                       // // ignore non RepoConf
+                       // // FIXME make it more flexible/extensible
+                       // }
                }
 
                // home
                String homeUri = props.getProperty(RepoConf.labeledUri.name());
                Path homePath;
-               try {
-                       homePath = Paths.get(new URI(homeUri)).toAbsolutePath();
-               } catch (URISyntaxException e) {
-                       throw new CmsException("Invalid repository home URI", e);
+               if (homeUri == null) {
+                       String cn = props.getProperty(NodeConstants.CN);
+                       assert cn != null;
+                       homePath = KernelUtils.getOsgiInstancePath(KernelConstants.DIR_REPOS + '/' + cn);
+               } else {
+                       try {
+                               homePath = Paths.get(new URI(homeUri)).toAbsolutePath();
+                       } catch (URISyntaxException e) {
+                               throw new CmsException("Invalid repository home URI", e);
+                       }
                }
                Path rootUuidPath = homePath.resolve("repository/meta/rootUUID");
                if (!Files.exists(rootUuidPath)) {
@@ -140,6 +153,8 @@ class RepositoryBuilder {
                        setProp(props, RepoConf.dbpassword, "");
                        break;
                case postgresql:
+               case postgresql_ds:
+               case postgresql_cluster:
                        dburl = "jdbc:postgresql://localhost/demo";
                        setProp(props, RepoConf.dburl, dburl);
                        setProp(props, RepoConf.dbuser, "argeo");