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 <[email protected]> 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)
