Finishing JCR schema changes. Using dedicated primary types.

This commit is contained in:
Martin Stockhammer 2019-08-28 07:49:22 +02:00
parent 31fd0d917e
commit 392e444cb2
4 changed files with 49 additions and 26 deletions

View File

@ -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"};

View File

@ -378,7 +378,7 @@ public void removeProject(RepositorySession session, String repositoryId, String
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 void removeNamespace(RepositorySession session, String repositoryId, Stri
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 List<String> getChildNamespaces(RepositorySession session, String reposit
: 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 List<String> getChildNamespaces(RepositorySession session, String reposit
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 @@ private Node getOrAddNodeByPath(Node baseNode, String name, String nodeType, boo
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 @@ private Node getOrAddRepositoryNode(Session jcrSession, String repositoryId)
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 @@ private Node getOrAddRepositoryNode(Session jcrSession, String repositoryId)
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);

View File

@ -458,8 +458,8 @@ public void initialize( NodeBuilder root )
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 void initialize( NodeBuilder root )
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 void initialize( NodeBuilder root )
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()

View File

@ -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)