]> source.dussan.org Git - archiva.git/commitdiff
Migrating to JCR primary types
authorMartin Stockhammer <martin_s@apache.org>
Mon, 26 Aug 2019 17:12:50 +0000 (19:12 +0200)
committerMartin Stockhammer <martin_s@apache.org>
Mon, 26 Aug 2019 17:12:50 +0000 (19:12 +0200)
archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ArtifactMetadata.java
archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrConstants.java
archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
archiva-modules/plugins/metadata-store-jcr/src/main/resources/org/apache/archiva/metadata/repository/jcr/jcr-schema.cnd

index d8e92903f0967ede35bc95945667dec2a1634785..3ee8ea8942b6a10e85eadf0e08a0803ae80e15a6 100644 (file)
@@ -21,16 +21,10 @@ package org.apache.archiva.metadata.model;
 
 import org.apache.archiva.checksum.ChecksumAlgorithm;
 import org.apache.commons.collections4.bidimap.DualHashBidiMap;
-import sun.reflect.generics.repository.MethodRepository;
 
 import javax.xml.bind.annotation.XmlRootElement;
 import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
 import java.time.ZonedDateTime;
-import java.time.temporal.TemporalAccessor;
-import java.util.Date;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
index 668f45cae12789f223422d85a069f7d4b77dfa85..494ce81662682103614ea605742df649503c1623 100644 (file)
@@ -924,7 +924,7 @@ public abstract class AbstractMetadataRepositoryTest
                 for (int i=0; i<10; i++) {
                     assertEquals(TEST_NAME + "/" + String.format("%03d",i), result.get(i).getName());
                 }
-            }, 3, 500 );
+            }, 5, 500 );
 
         }
     }
@@ -952,7 +952,7 @@ public abstract class AbstractMetadataRepositoryTest
                 for (int i=0; i<10; i++) {
                     assertEquals(TEST_NAME + "/" + String.format("%03d",i+5), result.get(i).getName());
                 }
-            }, 3, 500 );
+            }, 5, 500 );
 
         }
     }
index d0119c7ab8e830c2a36a5da6accc6ce53291bb4e..330c060288376145f7bb87e3dce657b2711eeafd 100644 (file)
@@ -46,6 +46,9 @@ public interface JcrConstants
     String MIXIN_META_MAILINGLIST = "archiva:meta_mailinglist";
     String DEPENDENCY_NODE_TYPE = "archiva:dependency";
     String CHECKSUM_NODE_TYPE = "archiva:checksum";
+    String CHECKSUMS_FOLDER_TYPE = "archiva:checksums";
+    String FACETS_FOLDER_TYPE = "archiva:facets";
+    String FACET_ID_CONTAINER_TYPE = "archiva:facetIdContainer";
 
     // 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"};
index b11d5603f5c25ecb1a7d06b7618d039d6f647804..eb06b0d8000d205436a6f0f5f7cbad701621ea0b 100644 (file)
@@ -202,7 +202,7 @@ public class JcrMetadataRepository
             node.setProperty( "size", artifactMeta.getSize() );
 
             int idx=0;
-            Node cslistNode = getOrAddNodeByPath( node, "checksums" );
+            Node cslistNode = getOrAddNodeByPath( node, "checksums", CHECKSUMS_FOLDER_TYPE, true );
             NodeIterator nit = cslistNode.getNodes("*");
             while (nit.hasNext()) {
                 Node csNode = nit.nextNode();
@@ -234,8 +234,7 @@ public class JcrMetadataRepository
                 if ( metadataFacet != null )
                 {
                     // recreate, to ensure properties are removed
-                    Node n = node.addNode( facetId);
-                    n.addMixin( FACET_NODE_TYPE );
+                    Node n = node.addNode( facetId, FACET_NODE_TYPE);
                     n.setProperty( "facetId", facetId );
 
                     for ( Map.Entry<String, String> entry : metadataFacet.toProperties().entrySet() )
@@ -368,8 +367,7 @@ public class JcrMetadataRepository
                 {
                     versionNode.getNode( facet.getFacetId() ).remove();
                 }
-                Node n = versionNode.addNode( facet.getFacetId() );
-                n.addMixin( FACET_NODE_TYPE );
+                Node n = versionNode.addNode( facet.getFacetId(), FACET_NODE_TYPE );
 
                 for ( Map.Entry<String, String> entry : facet.toProperties().entrySet() )
                 {
@@ -673,15 +671,17 @@ public class JcrMetadataRepository
         try
         {
             Node repo = getOrAddRepositoryNode( jcrSession, repositoryId );
-            Node facets = JcrUtils.getOrAddNode( repo, "facets" );
+            Node facets = JcrUtils.getOrAddNode( repo, "facets", FACETS_FOLDER_TYPE);
 
             String id = metadataFacet.getFacetId();
-            Node facetNode = JcrUtils.getOrAddNode( facets, id );
+            Node facetNode = JcrUtils.getOrAddNode( facets, id, FACET_ID_CONTAINER_TYPE );
+            if (!facetNode.hasProperty("id")) {
+                facetNode.setProperty("id", id);
+            }
 
-            Node facetInstance = getOrAddNodeByPath( facetNode, metadataFacet.getName() );
-            if (!facetInstance.isNodeType( FACET_NODE_TYPE ))
+            Node facetInstance = getOrAddNodeByPath( facetNode, metadataFacet.getName(), FACET_NODE_TYPE, true );
+            if (!facetInstance.hasProperty( "archiva:facetId"))
             {
-                facetInstance.addMixin( FACET_NODE_TYPE );
                 facetInstance.setProperty( "archiva:facetId", id );
                 facetInstance.setProperty( "archiva:name", metadataFacet.getName( ) );
             }
@@ -1796,17 +1796,25 @@ public class JcrMetadataRepository
         return getOrAddNodeByPath( baseNode, name, null );
     }
 
-    private Node getOrAddNodeByPath( Node baseNode, String name, String nodeType )
+    private Node getOrAddNodeByPath( Node baseNode, String name, String nodeType ) throws RepositoryException {
+        return getOrAddNodeByPath(baseNode, name, nodeType, false);
+    }
+
+    private Node getOrAddNodeByPath( Node baseNode, String name, String nodeType, boolean primaryType )
         throws RepositoryException
     {
         log.debug( "getOrAddNodeByPath " + baseNode + " " + name + " " + nodeType );
         Node node = baseNode;
         for ( String n : name.split( "/" ) )
         {
-            node = JcrUtils.getOrAddNode( node, n );
-            if ( nodeType != null && !node.isNodeType( nodeType ))
-            {
-                node.addMixin( nodeType );
+            if (nodeType!=null && primaryType) {
+                node = JcrUtils.getOrAddNode( node, n, nodeType );
+            } else {
+                node = JcrUtils.getOrAddNode( node, n);
+                if ( nodeType != null && !node.isNodeType( nodeType ))
+                {
+                    node.addMixin( nodeType );
+                }
             }
             if (!node.hasProperty( "id" )) {
                 node.setProperty( "id", n );
@@ -1892,11 +1900,7 @@ public class JcrMetadataRepository
         throws RepositoryException
     {
         Node versionNode = getOrAddProjectVersionNode( jcrSession, repositoryId, namespace, projectId, projectVersion );
-        Node node = JcrUtils.getOrAddNode( versionNode, id);
-        if (!node.isNodeType( ARTIFACT_NODE_TYPE ))
-        {
-            node.addMixin( ARTIFACT_NODE_TYPE );
-        }
+        Node node = JcrUtils.getOrAddNode( versionNode, id, ARTIFACT_NODE_TYPE);
         if (!node.hasProperty( "id" )) {
             node.setProperty( "id", id );
         }
index 7fdb67869cb1720b31dddbf6937b9f7eeccea5cb..1e7f3e7f6d352aa6e37422fc33e6d9a8423a6535 100644 (file)
  * under the License.
  */
 
+/*
+ * JCR OAK does not support same name siblings. Which means we have to
+ * setup unique keys for list entries.
+ */
 <archiva = 'http://archiva.apache.org/jcr'>
 [archiva:base] abstract mixin
   - id (string)
@@ -24,6 +28,7 @@
 
 [archiva:repository] > archiva:base mixin
  + content (archiva:content) primary
+ + facets (nt:hierarchyNode)
 
 [archiva:content] > archiva:base mixin
  + * (archiva:namespace)
@@ -81,7 +86,8 @@
 [archiva:dependencies] mixin
  + * (archiva:dependency)
 
-[archiva:checksums]
+[archiva:checksums] > nt:hierarchyNode
+ - id (string)
  + * (archiva:checksum)
 
 [archiva:checksum]
  + * (archiva:dependencies)
  + * (archiva:facet)
 
-[archiva:artifact] > archiva:base mixin
+
+
+[archiva:artifact] > archiva:base
  - whenGathered (date)
  - size (long)
  - version (string)
- + * (archiva:checksum)
+ + checksums (archiva:checksums)
  + * (archiva:facet)
 
-[archiva:facet] > archiva:base mixin
+[archiva:facets] > nt:hierarchyNode
+ + * (archiva:facetIdContainer)
+
+[archiva:facetIdContainer] > archiva:base
+ + * (archiva:facet)
+
+[archiva:facet] > archiva:base
  - archiva:facetId
- - archiva:name
\ No newline at end of file
+ - archiva:name
+ - * (string)
+ + * (archiva:facet)