Introduce abstract data model
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 15 Sep 2016 06:40:08 +0000 (06:40 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 15 Sep 2016 06:40:08 +0000 (06:40 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@9152 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.cms/bnd.bnd
org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/LocalRepository.java [new file with mode: 0644]
org.argeo.node.api/src/org/argeo/node/DataModelNamespace.java

index b0994c6a2a0f109636408b0f6ceb9248a30557a4..822bdd059cc529bb6713ece8463c4eb38d4dc901 100644 (file)
@@ -7,4 +7,4 @@ org.apache.jackrabbit.webdav.server,\
 org.apache.jackrabbit.webdav.jcr,\
 org.eclipse.equinox.http.jetty,\
 *
-Provide-Capability: cms.datamodel;name=cms;cnd=/org/argeo/cms/cms.cnd
\ No newline at end of file
+Provide-Capability: cms.datamodel;name=cms;cnd=/org/argeo/cms/cms.cnd;abstract=true
\ No newline at end of file
index 7a180cfc5287adf5612ea3deaaf9d65162d8a112..19dc8d9b8b1e7281666a01dfc47c81b7148815b6 100644 (file)
@@ -143,11 +143,8 @@ public class CmsDeployment implements NodeDeployment {
                        Set<String> processed = new HashSet<String>();
                        bundles: for (Bundle bundle : bc.getBundles()) {
                                BundleWiring wiring = bundle.adapt(BundleWiring.class);
-                               if (wiring == null) {
-                                       if (log.isTraceEnabled())
-                                               log.error("No wiring for " + bundle.getSymbolicName());
+                               if (wiring == null)
                                        continue bundles;
-                               }
                                processWiring(adminSession, wiring, processed);
                        }
                } finally {
@@ -170,13 +167,13 @@ public class CmsDeployment implements NodeDeployment {
 
        private void registerCnd(Session adminSession, BundleCapability capability, Set<String> processed) {
                Map<String, Object> attrs = capability.getAttributes();
-               String name = attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE).toString();
+               String name = (String) attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE);
                if (processed.contains(name)) {
                        if (log.isTraceEnabled())
                                log.trace("Data model " + name + " has already been processed");
                        return;
                }
-               String path = attrs.get(DataModelNamespace.CAPABILITY_CND_ATTRIBUTE).toString();
+               String path = (String) attrs.get(DataModelNamespace.CAPABILITY_CND_ATTRIBUTE);
                URL url = capability.getRevision().getBundle().getResource(path);
                try (Reader reader = new InputStreamReader(url.openStream())) {
                        CndImporter.registerNodeTypes(reader, adminSession, true);
@@ -187,14 +184,31 @@ public class CmsDeployment implements NodeDeployment {
                        throw new CmsException("Cannot import CND " + url, e);
                }
 
-               Hashtable<String, Object> properties = new Hashtable<>();
-               properties.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, name);
-               properties.put(NodeConstants.CN, name);
-               if (name.equals(ArgeoJcrConstants.ALIAS_NODE))
-                       properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
-               bc.registerService(Repository.class, adminSession.getRepository(), properties);
-               if (log.isDebugEnabled())
-                       log.debug("Published data model " + name);
+               if (!asBoolean((String) attrs.get(DataModelNamespace.CAPABILITY_ABSTRACT_ATTRIBUTE))) {
+                       Hashtable<String, Object> properties = new Hashtable<>();
+                       properties.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, name);
+                       properties.put(NodeConstants.CN, name);
+                       if (name.equals(ArgeoJcrConstants.ALIAS_NODE))
+                               properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+                       LocalRepository localRepository = new LocalRepository(adminSession.getRepository(), capability);
+                       bc.registerService(Repository.class, localRepository, properties);
+                       if (log.isDebugEnabled())
+                               log.debug("Published data model " + name);
+               }
+       }
+
+       private boolean asBoolean(String value) {
+               if (value == null)
+                       return false;
+               switch (value) {
+               case "true":
+                       return true;
+               case "false":
+                       return false;
+               default:
+                       throw new CmsException("Unsupported value for attribute " + DataModelNamespace.CAPABILITY_ABSTRACT_ATTRIBUTE
+                                       + ": " + value);
+               }
        }
 
        @Override
index 6900be3addf85f1a9015e20f00c78599ec0afb37..c6f3a600df13d67d16300065204aec741af5abaa 100644 (file)
@@ -28,8 +28,6 @@ import org.argeo.jcr.UserJcrUtils;
  * Make sure each user has a home directory available in the default workspace.
  */
 class HomeRepository extends JcrRepositoryWrapper implements KernelConstants, ArgeoJcrConstants {
-       // private final Kernel kernel;
-
        /** The home base path. */
        private String homeBasePath = "/home";
        private String peopleBasePath = ArgeoJcrConstants.PEOPLE_BASE_PATH;
@@ -37,7 +35,6 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants, Ar
        private Set<String> checkedUsers = new HashSet<String>();
 
        public HomeRepository(Repository repository) {
-               // this.kernel = kernel;
                setRepository(repository);
                LoginContext lc;
                try {
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/LocalRepository.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/LocalRepository.java
new file mode 100644 (file)
index 0000000..4a39a0f
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.cms.internal.kernel;
+
+import java.util.Map;
+
+import javax.jcr.Repository;
+
+import org.argeo.jcr.JcrRepositoryWrapper;
+import org.argeo.node.DataModelNamespace;
+import org.osgi.framework.wiring.BundleCapability;
+
+class LocalRepository extends JcrRepositoryWrapper {
+       private final String cn;
+
+       public LocalRepository(Repository repository, BundleCapability dataModelCapability) {
+               Map<String, Object> attrs = dataModelCapability.getAttributes();
+               cn = (String) attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE);
+               setRepository(repository);
+       }
+
+       String getCn() {
+               return cn;
+       }
+
+}
index 578419609a52de1e5c5553c2d8a63cce7d7905ed..6da250dbf4466153c7033bf866a34f4164ddb08e 100644 (file)
@@ -8,6 +8,13 @@ public class DataModelNamespace extends Namespace {
        public static final String CMS_DATA_MODEL_NAMESPACE = "cms.datamodel";
        public static final String CAPABILITY_NAME_ATTRIBUTE = "name";
        public static final String CAPABILITY_CND_ATTRIBUTE = "cnd";
+       /** If 'true', indicates that no repository should be published */
+       public static final String CAPABILITY_ABSTRACT_ATTRIBUTE = "abstract";
+       /**
+        * If 'true', indicates that code using this data model should be prepared
+        * to have it stored in a different JCR repository than the node
+        */
+       public static final String CAPABILITY_STANDALONE_ATTRIBUTE = "standalone";
 
        private DataModelNamespace() {
                // empty