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)