You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2019/08/28 17:33:55 UTC

[archiva] 01/02: Finishing JCR schema changes. Using dedicated primary types.

This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch feature/storage_refactoring
in repository https://gitbox.apache.org/repos/asf/archiva.git

commit 392e444cb2e6169e31cda81e7878531d8b6bae31
Author: Martin Stockhammer <ma...@apache.org>
AuthorDate: Wed Aug 28 07:49:22 2019 +0200

    Finishing JCR schema changes. Using dedicated primary types.
---
 .../metadata/repository/jcr/JcrConstants.java      |  8 ++---
 .../repository/jcr/JcrMetadataRepository.java      | 42 +++++++++++++++-------
 .../repository/jcr/OakRepositoryFactory.java       | 12 +++----
 .../archiva/metadata/repository/jcr/jcr-schema.cnd | 13 +++++--
 4 files changed, 49 insertions(+), 26 deletions(-)

diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrConstants.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrConstants.java
index a52f9c1..12cf7b4 100644
--- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrConstants.java
+++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrConstants.java
@@ -32,8 +32,9 @@ public interface JcrConstants
 
 
     String BASE_NODE_TYPE = "archiva:base";
-    String NAMESPACE_NODE_TYPE = "archiva:namespace";
-    String PROJECT_NODE_TYPE = "archiva:project";
+    String CONTENT_NODE_TYPE = "archiva:content";
+    String NAMESPACE_MIXIN_TYPE = "archiva:namespace";
+    String PROJECT_MIXIN_TYPE = "archiva:project";
     String PROJECT_VERSION_NODE_TYPE = "archiva:projectVersion";
     String ARTIFACT_NODE_TYPE = "archiva:artifact";
     String REPOSITORY_NODE_TYPE = "archiva:repository";
@@ -42,8 +43,6 @@ public interface JcrConstants
     String MIXIN_META_CI = "archiva:meta_ci";
     String MIXIN_META_ISSUE = "archiva:meta_issue";
     String MIXIN_META_ORGANIZATION = "archiva:meta_organization";
-    String MIXIN_META_LICENSE = "archiva:meta_license";
-    String MIXIN_META_MAILINGLIST = "archiva:meta_mailinglist";
     String MAILINGLIST_NODE_TYPE = "archiva:mailinglist";
     String MAILINGLISTS_FOLDER_TYPE = "archiva:mailinglists";
     String LICENSES_FOLDER_TYPE = "archiva:licenses";
@@ -54,6 +53,7 @@ public interface JcrConstants
     String CHECKSUMS_FOLDER_TYPE = "archiva:checksums";
     String FACETS_FOLDER_TYPE = "archiva:facets";
     String FACET_ID_CONTAINER_TYPE = "archiva:facetIdContainer";
+    String FOLDER_TYPE = "archiva:folder";
 
     // Must be alphabetically ordered!
     String[] PROJECT_VERSION_VERSION_PROPERTIES = {"ci.system","ci.url", "description", "incomplete", "issue.system","issue.url", "name", "org.name", "org.url", "url", "scm.connection", "scm.developerConnection", "scm.url"};
diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
index 9260c54..d650abb 100644
--- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
@@ -378,7 +378,7 @@ public class JcrMetadataRepository
                 Iterator<Node> nodeIterator = JcrUtils.getChildNodes(root.getNode(namespacePath)).iterator();
                 while (nodeIterator.hasNext()) {
                     Node node = nodeIterator.next();
-                    if (node.isNodeType(org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_NODE_TYPE) && projectId.equals(node.getName())) {
+                    if (node.isNodeType(org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_MIXIN_TYPE) && projectId.equals(node.getName())) {
                         node.remove();
                     }
                 }
@@ -626,7 +626,7 @@ public class JcrMetadataRepository
             String path = getNamespacePath(repositoryId, projectId);
             if (root.hasNode(path)) {
                 Node node = root.getNode(path);
-                if (node.isNodeType(NAMESPACE_NODE_TYPE)) {
+                if (node.isNodeType(NAMESPACE_MIXIN_TYPE)) {
                     node.remove();
                 }
             }
@@ -1196,7 +1196,7 @@ public class JcrMetadataRepository
                 : getRepositoryContentPath(repositoryId);
 
         try {
-            return getNodeNames(getSession(session), path, NAMESPACE_NODE_TYPE);
+            return getNodeNames(getSession(session), path, NAMESPACE_MIXIN_TYPE);
         } catch (MetadataRepositoryException e) {
             throw new MetadataResolutionException(e.getMessage());
         }
@@ -1206,7 +1206,7 @@ public class JcrMetadataRepository
     public List<String> getProjects(RepositorySession session, String repositoryId, String namespace)
             throws MetadataResolutionException {
         try {
-            return getNodeNames(getSession(session), getNamespacePath(repositoryId, namespace), org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_NODE_TYPE);
+            return getNodeNames(getSession(session), getNamespacePath(repositoryId, namespace), org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_MIXIN_TYPE);
         } catch (MetadataRepositoryException e) {
             throw new MetadataResolutionException(e.getMessage());
         }
@@ -1557,6 +1557,25 @@ public class JcrMetadataRepository
         return node;
     }
 
+    private Node getOrAddNodeByPath(Node baseNode, String name, String primaryType, String... mixinTypes)
+            throws RepositoryException {
+        log.debug("getOrAddNodeByPath baseNode={}, name={}, primary={}, mixin={}", baseNode, name, primaryType, mixinTypes);
+        Node node = baseNode;
+        for (String n : name.split("/")) {
+            node = JcrUtils.getOrAddNode(node, n, primaryType);
+            for (String mixin : mixinTypes) {
+                if (mixin != null && !node.isNodeType(mixin)) {
+                    node.addMixin(mixin);
+                }
+
+            }
+            if (!node.hasProperty("id")) {
+                node.setProperty("id", n);
+            }
+        }
+        return node;
+    }
+
     private static String getFacetPath(String repositoryId, String facetId, String name) {
         return getFacetPath(repositoryId, facetId) + "/" + name;
     }
@@ -1567,10 +1586,7 @@ public class JcrMetadataRepository
         Node root = jcrSession.getRootNode();
         Node node = JcrUtils.getOrAddNode(root, "repositories");
         log.debug("Repositories " + node);
-        node = JcrUtils.getOrAddNode(node, repositoryId, JcrConstants.NT_UNSTRUCTURED);
-        if (!node.isNodeType(org.apache.archiva.metadata.repository.jcr.JcrConstants.REPOSITORY_NODE_TYPE)) {
-            node.addMixin(org.apache.archiva.metadata.repository.jcr.JcrConstants.REPOSITORY_NODE_TYPE);
-        }
+        node = JcrUtils.getOrAddNode(node, repositoryId, REPOSITORY_NODE_TYPE);
         if (!node.hasProperty("id")) {
             node.setProperty("id", repositoryId);
         }
@@ -1580,21 +1596,21 @@ public class JcrMetadataRepository
     private Node getOrAddRepositoryContentNode(Session jcrSession, String repositoryId)
             throws RepositoryException {
         Node node = getOrAddRepositoryNode(jcrSession, repositoryId);
-        return JcrUtils.getOrAddNode(node, "content");
+        return JcrUtils.getOrAddNode(node, "content", CONTENT_NODE_TYPE);
     }
 
     private Node getOrAddNamespaceNode(Session jcrSession, String repositoryId, String namespace)
             throws RepositoryException {
         Node repo = getOrAddRepositoryContentNode(jcrSession, repositoryId);
-        return getOrAddNodeByPath(repo, namespace.replace('.', '/'), NAMESPACE_NODE_TYPE);
+        return getOrAddNodeByPath(repo, namespace.replace('.', '/'), FOLDER_TYPE, NAMESPACE_MIXIN_TYPE);
     }
 
     private Node getOrAddProjectNode(Session jcrSession, String repositoryId, String namespace, String projectId)
             throws RepositoryException {
         Node namespaceNode = getOrAddNamespaceNode(jcrSession, repositoryId, namespace);
-        Node node = JcrUtils.getOrAddNode(namespaceNode, projectId);
-        if (!node.isNodeType(org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_NODE_TYPE)) {
-            node.addMixin(org.apache.archiva.metadata.repository.jcr.JcrConstants.PROJECT_NODE_TYPE);
+        Node node = JcrUtils.getOrAddNode(namespaceNode, projectId, FOLDER_TYPE);
+        if (!node.isNodeType(PROJECT_MIXIN_TYPE)) {
+            node.addMixin(PROJECT_MIXIN_TYPE);
         }
         if (!node.hasProperty("id")) {
             node.setProperty("id", projectId);
diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/OakRepositoryFactory.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/OakRepositoryFactory.java
index 28c67bf..871f19a 100644
--- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/OakRepositoryFactory.java
+++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/OakRepositoryFactory.java
@@ -458,8 +458,8 @@ public class OakRepositoryFactory
                         setProperty( JCR_PRIMARYTYPE, NT_UNSTRUCTURED, NAME );
                     rules.setProperty( ":childOrder", ImmutableSet.of(
                         REPOSITORY_NODE_TYPE,
-                        NAMESPACE_NODE_TYPE, //
-                        PROJECT_NODE_TYPE,
+                            NAMESPACE_MIXIN_TYPE, //
+                            PROJECT_MIXIN_TYPE,
                         PROJECT_VERSION_NODE_TYPE, //
                         ARTIFACT_NODE_TYPE, //
                         FACET_NODE_TYPE //
@@ -468,9 +468,9 @@ public class OakRepositoryFactory
                     idxBuilder.async( "async", "nrt", "sync" ).includedPaths( "/repositories" ).evaluatePathRestrictions();
 
                     initBaseRule(idxBuilder.indexRule( REPOSITORY_NODE_TYPE ));
-                    initBaseRule(idxBuilder.indexRule( NAMESPACE_NODE_TYPE ))
+                    initBaseRule(idxBuilder.indexRule(NAMESPACE_MIXIN_TYPE))
                         .property( "namespace" ).propertyIndex().analyzed();
-                    initBaseRule(idxBuilder.indexRule( PROJECT_NODE_TYPE ))
+                    initBaseRule(idxBuilder.indexRule(PROJECT_MIXIN_TYPE))
                         .property( "name" ).propertyIndex().analyzed().notNullCheckEnabled().nullCheckEnabled();
                     initBaseRule( idxBuilder.indexRule( PROJECT_VERSION_NODE_TYPE ) )
                         .property("name").propertyIndex().analyzed().notNullCheckEnabled().nullCheckEnabled()
@@ -506,10 +506,10 @@ public class OakRepositoryFactory
                     idxBuilder.indexRule( MIXIN_META_ORGANIZATION )
                         .property( "org.name" ).propertyIndex( ).analyzed( )
                         .property( "org.url" ).propertyIndex( ).analyzed( );
-                    idxBuilder.indexRule( MIXIN_META_LICENSE )
+                    idxBuilder.indexRule( LICENSE_NODE_TYPE )
                         .property( "license.name" ).propertyIndex( ).analyzed( )
                         .property( "license.url" ).propertyIndex( ).analyzed( );
-                    idxBuilder.indexRule( MIXIN_META_MAILINGLIST )
+                    idxBuilder.indexRule( MAILINGLIST_NODE_TYPE )
                         .property( "name" ).propertyIndex().analyzed();
                     initBaseRule(idxBuilder.indexRule( DEPENDENCY_NODE_TYPE ))
                         .property( "groupId" ).propertyIndex().analyzed().ordered()
diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/resources/org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd b/archiva-modules/plugins/metadata-store-jcr/src/main/resources/org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd
index 6c267ab..44073c2 100644
--- a/archiva-modules/plugins/metadata-store-jcr/src/main/resources/org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd
+++ b/archiva-modules/plugins/metadata-store-jcr/src/main/resources/org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd
@@ -26,12 +26,19 @@
   - id (string)
   - jcr:lastModified (date)
 
-[archiva:repository] > archiva:base mixin
+[archiva:repository] > archiva:base
  + content (archiva:content) primary
  + facets (nt:hierarchyNode)
 
-[archiva:content] > archiva:base mixin
- + * (archiva:namespace)
+[archiva:content] > archiva:base
+ + * (archiva:folder)
+
+/*
+ * Namespaces and projects can have the same path, so we add the generic folder
+ * type as primary type. Namespace and project nodes are mixin types.
+ */
+[archiva:folder] > archiva:base
+ + * (archiva:folder)
 
 [archiva:namespace] > archiva:base mixin
  - namespace (string)