From b7954524256d1ce161ffa468b9a3051db4164253 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 15 Sep 2016 06:40:08 +0000 Subject: [PATCH] Introduce abstract data model git-svn-id: https://svn.argeo.org/commons/trunk@9152 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- org.argeo.cms/bnd.bnd | 2 +- .../cms/internal/kernel/CmsDeployment.java | 42 ++++++++++++------- .../cms/internal/kernel/HomeRepository.java | 3 -- .../cms/internal/kernel/LocalRepository.java | 24 +++++++++++ .../org/argeo/node/DataModelNamespace.java | 7 ++++ 5 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 org.argeo.cms/src/org/argeo/cms/internal/kernel/LocalRepository.java diff --git a/org.argeo.cms/bnd.bnd b/org.argeo.cms/bnd.bnd index b0994c6a2..822bdd059 100644 --- a/org.argeo.cms/bnd.bnd +++ b/org.argeo.cms/bnd.bnd @@ -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 diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java index 7a180cfc5..19dc8d9b8 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java @@ -143,11 +143,8 @@ public class CmsDeployment implements NodeDeployment { Set processed = new HashSet(); 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 processed) { Map 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 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 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 diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java index 6900be3ad..c6f3a600d 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java @@ -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 checkedUsers = new HashSet(); 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 index 000000000..4a39a0fc3 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/LocalRepository.java @@ -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 attrs = dataModelCapability.getAttributes(); + cn = (String) attrs.get(DataModelNamespace.CAPABILITY_NAME_ATTRIBUTE); + setRepository(repository); + } + + String getCn() { + return cn; + } + +} diff --git a/org.argeo.node.api/src/org/argeo/node/DataModelNamespace.java b/org.argeo.node.api/src/org/argeo/node/DataModelNamespace.java index 578419609..6da250dbf 100644 --- a/org.argeo.node.api/src/org/argeo/node/DataModelNamespace.java +++ b/org.argeo.node.api/src/org/argeo/node/DataModelNamespace.java @@ -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 -- 2.30.2