Clarify and refactor content namespaces
authorMathieu <mbaudier@argeo.org>
Wed, 16 Nov 2022 05:00:26 +0000 (06:00 +0100)
committerMathieu <mbaudier@argeo.org>
Wed, 16 Nov 2022 05:00:26 +0000 (06:00 +0100)
org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml
org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentNamespace.java [new file with mode: 0644]
org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java

index 033ddbd2f0bab8a4934d2c0e2eca49feee1080b8..a39a4dc713d630a35e9a80399c3fe5aa239a43a1 100644 (file)
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="JCR Deployment">
    <implementation class="org.argeo.cms.jcr.internal.CmsJcrDeployment"/>
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.spi.ProvidedRepository" name="ContentRepository" policy="static"/>
 </scr:component>
diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentNamespace.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/acr/JcrContentNamespace.java
new file mode 100644 (file)
index 0000000..8b721f7
--- /dev/null
@@ -0,0 +1,75 @@
+package org.argeo.cms.jcr.acr;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Objects;
+
+import org.argeo.api.acr.spi.ContentNamespace;
+
+/** JCR-specific content namespaces. */
+public enum JcrContentNamespace implements ContentNamespace {
+       //
+       // ARGEO
+       //
+       JCRX("jcrx", "http://www.argeo.org/ns/jcrx", null, null),
+       //
+       // EXTERNAL
+       //
+       JCR("jcr", "http://www.jcp.org/jcr/1.0", null,
+                       "https://jackrabbit.apache.org/archive/wiki/JCR/NamespaceRegistry_115513459.html"),
+       //
+       JCR_MIX("mix", "http://www.jcp.org/jcr/mix/1.0", null,
+                       "https://jackrabbit.apache.org/archive/wiki/JCR/NamespaceRegistry_115513459.html"),
+       //
+       JCR_NT("nt", "http://www.jcp.org/jcr/nt/1.0", null,
+                       "https://jackrabbit.apache.org/archive/wiki/JCR/NamespaceRegistry_115513459.html"),
+       //
+       JACKRABBIT("rep", "internal", null,
+                       "https://jackrabbit.apache.org/archive/wiki/JCR/NamespaceRegistry_115513459.html"),
+       //
+       ;
+
+       private final static String RESOURCE_BASE = "/org/argeo/cms/jcr/acr/schemas/";
+
+       private String defaultPrefix;
+       private String namespace;
+       private URL resource;
+       private URL publicUrl;
+
+       JcrContentNamespace(String defaultPrefix, String namespace, String resourceFileName, String publicUrl) {
+               Objects.requireNonNull(namespace);
+               this.defaultPrefix = defaultPrefix;
+               Objects.requireNonNull(namespace);
+               this.namespace = namespace;
+               if (resourceFileName != null) {
+                       resource = getClass().getResource(RESOURCE_BASE + resourceFileName);
+                       Objects.requireNonNull(resource);
+               }
+               if (publicUrl != null)
+                       try {
+                               this.publicUrl = new URL(publicUrl);
+                       } catch (MalformedURLException e) {
+                               throw new IllegalArgumentException("Cannot interpret public URL", e);
+                       }
+       }
+
+       @Override
+       public String getDefaultPrefix() {
+               return defaultPrefix;
+       }
+
+       @Override
+       public String getNamespaceURI() {
+               return namespace;
+       }
+
+       @Override
+       public URL getSchemaResource() {
+               return resource;
+       }
+
+       public URL getPublicUrl() {
+               return publicUrl;
+       }
+
+}
index 35800f8953a50f23812771cf6b912c7441013c02..a87135511e5e5ba21caa269f9c645df81a51c273 100644 (file)
@@ -26,10 +26,12 @@ import javax.servlet.Servlet;
 import org.apache.jackrabbit.commons.cnd.CndImporter;
 import org.apache.jackrabbit.core.RepositoryContext;
 import org.apache.jackrabbit.core.RepositoryImpl;
+import org.argeo.api.acr.spi.ProvidedRepository;
 import org.argeo.api.cms.CmsConstants;
 import org.argeo.api.cms.CmsLog;
 import org.argeo.cms.ArgeoNames;
 import org.argeo.cms.jcr.CmsJcrUtils;
+import org.argeo.cms.jcr.acr.JcrContentNamespace;
 import org.argeo.cms.jcr.internal.servlet.CmsRemotingServlet;
 import org.argeo.cms.jcr.internal.servlet.CmsWebDavServlet;
 import org.argeo.cms.jcr.internal.servlet.JcrHttpUtils;
@@ -62,17 +64,21 @@ public class CmsJcrDeployment {
        // Readiness
        private boolean nodeAvailable = false;
 
+       private ProvidedRepository contentRepository;
+
 //     CmsDeployment cmsDeployment;
        public void start() {
                dataModels = new DataModels(bc);
 
+               contentRepository.registerTypes(JcrContentNamespace.values());
+
                ServiceTracker<?, ?> repoContextSt = new RepositoryContextStc();
                repoContextSt.open();
                // KernelUtils.asyncOpen(repoContextSt);
 
 //             nodeDeployment = CmsJcrActivator.getService(NodeDeployment.class);
 
-               //JcrInitUtils.addToDeployment(cmsDeployment);
+               // JcrInitUtils.addToDeployment(cmsDeployment);
 
 //             contentRepository.registerTypes(NamespaceRegistry.PREFIX_JCR, NamespaceRegistry.NAMESPACE_JCR, null);
 //             contentRepository.registerTypes(NamespaceRegistry.PREFIX_MIX, NamespaceRegistry.NAMESPACE_MIX, null);
@@ -88,7 +94,6 @@ public class CmsJcrDeployment {
 //             if (nodeHttp != null)
 //                     nodeHttp.destroy();
 
-
                try {
                        for (ServiceReference<JackrabbitLocalRepository> sr : bc
                                        .getServiceReferences(JackrabbitLocalRepository.class, null)) {
@@ -351,7 +356,8 @@ public class CmsJcrDeployment {
 
        boolean isStandalone(String dataModelName) {
                return true;
-               //return cmsDeployment.getProps(CmsConstants.NODE_REPOS_FACTORY_PID, dataModelName) != null;
+               // return cmsDeployment.getProps(CmsConstants.NODE_REPOS_FACTORY_PID,
+               // dataModelName) != null;
        }
 
        private void publishLocalRepo(String dataModelName, Repository repository) {
@@ -432,6 +438,10 @@ public class CmsJcrDeployment {
                bc.registerService(Servlet.class, remotingServlet, ip);
        }
 
+       public void setContentRepository(ProvidedRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
+
        private class RepositoryContextStc extends ServiceTracker<RepositoryContext, RepositoryContext> {
 
                public RepositoryContextStc() {