[MRM-1327] re-arrange utility methods, and use search for retrieving artifacts by date

git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1051396 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Brett Porter 2010-12-21 07:21:44 +00:00
parent 8ab39caf50
commit 5622b1c569
4 changed files with 293 additions and 242 deletions

View File

@ -47,6 +47,8 @@
public abstract class AbstractMetadataRepositoryTest public abstract class AbstractMetadataRepositoryTest
extends PlexusInSpringTestCase extends PlexusInSpringTestCase
{ {
protected static final String OTHER_REPO_ID = "other-repo";
protected MetadataRepository repository; protected MetadataRepository repository;
protected static final String TEST_REPO_ID = "test"; protected static final String TEST_REPO_ID = "test";
@ -162,8 +164,7 @@ public void testGetProjectVersionOnly()
public void testGetArtifactOnly() public void testGetArtifactOnly()
throws MetadataResolutionException throws MetadataResolutionException
{ {
assertEquals( Collections.<ArtifactMetadata>emptyList(), assertEquals( Collections.<ArtifactMetadata>emptyList(), new ArrayList<ArtifactMetadata>(
new ArrayList<ArtifactMetadata>(
repository.getArtifacts( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ) ); repository.getArtifacts( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ) );
assertNull( repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) ); assertNull( repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ) );
assertNull( repository.getProject( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ) ); assertNull( repository.getProject( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT ) );
@ -184,7 +185,9 @@ public void testGetArtifactOnly()
assertEquals( TEST_PROJECT, projectMetadata.getId() ); assertEquals( TEST_PROJECT, projectMetadata.getId() );
assertEquals( TEST_NAMESPACE, projectMetadata.getNamespace() ); assertEquals( TEST_NAMESPACE, projectMetadata.getNamespace() );
ProjectVersionMetadata projectVersionMetadata = repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); ProjectVersionMetadata projectVersionMetadata = repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE,
TEST_PROJECT,
TEST_PROJECT_VERSION );
assertEquals( TEST_PROJECT_VERSION, projectVersionMetadata.getId() ); assertEquals( TEST_PROJECT_VERSION, projectVersionMetadata.getId() );
} }
@ -307,9 +310,12 @@ public void testUpdateProjectReference()
reference.setProjectVersion( "1.1" ); reference.setProjectVersion( "1.1" );
reference.setReferenceType( ProjectVersionReference.ReferenceType.DEPENDENCY ); reference.setReferenceType( ProjectVersionReference.ReferenceType.DEPENDENCY );
repository.updateProjectReference( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, reference ); repository.updateProjectReference( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION,
reference );
Collection<ProjectVersionReference> references = repository.getProjectReferences( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION ); Collection<ProjectVersionReference> references = repository.getProjectReferences( TEST_REPO_ID, TEST_NAMESPACE,
TEST_PROJECT,
TEST_PROJECT_VERSION );
assertEquals( 1, references.size() ); assertEquals( 1, references.size() );
reference = references.iterator().next(); reference = references.iterator().next();
assertEquals( "another.namespace", reference.getNamespace() ); assertEquals( "another.namespace", reference.getNamespace() );
@ -323,9 +329,10 @@ public void testGetRepositories()
// currently set up this way so the behaviour of both the test and the mock config return the same repository // currently set up this way so the behaviour of both the test and the mock config return the same repository
// set as the File implementation just uses the config rather than the content // set as the File implementation just uses the config rather than the content
repository.updateNamespace( TEST_REPO_ID, "namespace" ); repository.updateNamespace( TEST_REPO_ID, "namespace" );
repository.updateNamespace( "other-repo", "namespace" ); repository.updateNamespace( OTHER_REPO_ID, "namespace" );
assertEquals( Arrays.asList( TEST_REPO_ID, "other-repo" ), new ArrayList<String>( repository.getRepositories() ) ); assertEquals( Arrays.asList( TEST_REPO_ID, OTHER_REPO_ID ), new ArrayList<String>(
repository.getRepositories() ) );
} }
public void testUpdateProjectVersionMetadataIncomplete() public void testUpdateProjectVersionMetadataIncomplete()
@ -767,7 +774,8 @@ public void testGetArtifactsByChecksumNoResult()
ArtifactMetadata artifact = createArtifact(); ArtifactMetadata artifact = createArtifact();
repository.updateArtifact( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact ); repository.updateArtifact( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, TEST_PROJECT_VERSION, artifact );
assertEquals( Collections.<ArtifactMetadata>emptyList(), repository.getArtifactsByChecksum( TEST_REPO_ID, "not a checksum" ) ); assertEquals( Collections.<ArtifactMetadata>emptyList(), repository.getArtifactsByChecksum( TEST_REPO_ID,
"not a checksum" ) );
} }
public void testDeleteArtifact() public void testDeleteArtifact()
@ -905,7 +913,7 @@ public Map<String, String> toProperties()
{ {
if ( value != null ) if ( value != null )
{ {
if( additionalProps == null ) if ( additionalProps == null )
{ {
return Collections.singletonMap( "foo", value ); return Collections.singletonMap( "foo", value );
} }
@ -914,7 +922,7 @@ public Map<String, String> toProperties()
Map<String, String> props = new HashMap<String, String>(); Map<String, String> props = new HashMap<String, String>();
props.put( "foo", value ); props.put( "foo", value );
for( String key : additionalProps.keySet() ) for ( String key : additionalProps.keySet() )
{ {
props.put( key, additionalProps.get( key ) ); props.put( key, additionalProps.get( key ) );
} }
@ -937,12 +945,12 @@ public void fromProperties( Map<String, String> properties )
properties.remove( "foo" ); properties.remove( "foo" );
if( additionalProps == null ) if ( additionalProps == null )
{ {
additionalProps = new HashMap<String, String>(); additionalProps = new HashMap<String, String>();
} }
for( String key: properties.keySet() ) for ( String key : properties.keySet() )
{ {
additionalProps.put( key, properties.get( key ) ); additionalProps.put( key, properties.get( key ) );
} }

View File

@ -34,6 +34,7 @@
import org.apache.archiva.metadata.model.Scm; import org.apache.archiva.metadata.model.Scm;
import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepository;
import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.MetadataResolutionException;
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.core.TransientRepository; import org.apache.jackrabbit.core.TransientRepository;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -44,7 +45,6 @@
import java.util.Calendar; import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
@ -61,6 +61,12 @@
import javax.jcr.RepositoryException; import javax.jcr.RepositoryException;
import javax.jcr.Session; import javax.jcr.Session;
import javax.jcr.SimpleCredentials; import javax.jcr.SimpleCredentials;
import javax.jcr.ValueFactory;
import javax.jcr.Workspace;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.NodeTypeTemplate;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
/** /**
* @plexus.component role="org.apache.archiva.metadata.repository.MetadataRepository" * @plexus.component role="org.apache.archiva.metadata.repository.MetadataRepository"
@ -96,6 +102,15 @@ public JcrMetadataRepository()
} }
// TODO: shouldn't do this in constructor since it's a singleton // TODO: shouldn't do this in constructor since it's a singleton
session = repository.login( new SimpleCredentials( "username", "password".toCharArray() ) ); session = repository.login( new SimpleCredentials( "username", "password".toCharArray() ) );
Workspace workspace = session.getWorkspace();
workspace.getNamespaceRegistry().registerNamespace( "archiva", "http://archiva.apache.org/jcr" );
NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager();
NodeTypeTemplate nodeType = nodeTypeManager.createNodeTypeTemplate();
nodeType.setMixin( true );
nodeType.setName( "archiva:artifact" );
nodeTypeManager.registerNodeType( nodeType, false );
} }
catch ( LoginException e ) catch ( LoginException e )
{ {
@ -111,9 +126,7 @@ public JcrMetadataRepository()
public void updateProject( String repositoryId, ProjectMetadata project ) public void updateProject( String repositoryId, ProjectMetadata project )
{ {
String namespace = project.getNamespace(); updateProject( repositoryId, project.getNamespace(), project.getId() );
String projectId = project.getId();
updateProject( repositoryId, namespace, projectId );
} }
private void updateProject( String repositoryId, String namespace, String projectId ) private void updateProject( String repositoryId, String namespace, String projectId )
@ -122,8 +135,7 @@ private void updateProject( String repositoryId, String namespace, String projec
try try
{ {
Node namespaceNode = getOrCreateNamespaceNode( repositoryId, namespace ); getOrAddProjectNode( repositoryId, namespace, projectId );
getOrCreateNode( namespaceNode, projectId );
} }
catch ( RepositoryException e ) catch ( RepositoryException e )
{ {
@ -135,14 +147,16 @@ private void updateProject( String repositoryId, String namespace, String projec
public void updateArtifact( String repositoryId, String namespace, String projectId, String projectVersion, public void updateArtifact( String repositoryId, String namespace, String projectId, String projectVersion,
ArtifactMetadata artifactMeta ) ArtifactMetadata artifactMeta )
{ {
updateNamespace( repositoryId, namespace );
try try
{ {
Node node = getOrCreateArtifactNode( repositoryId, namespace, projectId, projectVersion, Node node = getOrAddArtifactNode( repositoryId, namespace, projectId, projectVersion,
artifactMeta.getId() ); artifactMeta.getId() );
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
cal.setTime( artifactMeta.getFileLastModified() ); cal.setTime( artifactMeta.getFileLastModified() );
node.setProperty( "updated", cal ); node.setProperty( "jcr:lastModified", cal );
cal = Calendar.getInstance(); cal = Calendar.getInstance();
cal.setTime( artifactMeta.getWhenGathered() ); cal.setTime( artifactMeta.getWhenGathered() );
@ -155,17 +169,18 @@ public void updateArtifact( String repositoryId, String namespace, String projec
node.setProperty( "version", artifactMeta.getVersion() ); node.setProperty( "version", artifactMeta.getVersion() );
// TODO: namespaced properties instead? // TODO: namespaced properties instead?
Node facetNode = getOrCreateNode( node, "facets" ); Node facetNode = JcrUtils.getOrAddNode( node, "facets" );
for ( MetadataFacet facet : artifactMeta.getFacetList() ) for ( MetadataFacet facet : artifactMeta.getFacetList() )
{ {
// TODO: need to clear it? // TODO: need to clear it?
Node n = getOrCreateNode( facetNode, facet.getFacetId() ); Node n = JcrUtils.getOrAddNode( facetNode, facet.getFacetId() );
for ( Map.Entry<String, String> entry : facet.toProperties().entrySet() ) for ( Map.Entry<String, String> entry : facet.toProperties().entrySet() )
{ {
n.setProperty( entry.getKey(), entry.getValue() ); n.setProperty( entry.getKey(), entry.getValue() );
} }
} }
session.save();
} }
catch ( RepositoryException e ) catch ( RepositoryException e )
{ {
@ -174,14 +189,6 @@ public void updateArtifact( String repositoryId, String namespace, String projec
} }
} }
private Node getOrCreateArtifactNode( String repositoryId, String namespace, String projectId,
String projectVersion, String id )
throws RepositoryException
{
Node versionNode = getOrCreateProjectVersionNode( repositoryId, namespace, projectId, projectVersion );
return getOrCreateNode( versionNode, id );
}
public void updateProjectVersion( String repositoryId, String namespace, String projectId, public void updateProjectVersion( String repositoryId, String namespace, String projectId,
ProjectVersionMetadata versionMetadata ) ProjectVersionMetadata versionMetadata )
{ {
@ -189,7 +196,7 @@ public void updateProjectVersion( String repositoryId, String namespace, String
try try
{ {
Node versionNode = getOrCreateProjectVersionNode( repositoryId, namespace, projectId, Node versionNode = getOrAddProjectVersionNode( repositoryId, namespace, projectId,
versionMetadata.getId() ); versionMetadata.getId() );
versionNode.setProperty( "name", versionMetadata.getName() ); versionNode.setProperty( "name", versionMetadata.getName() );
@ -252,7 +259,7 @@ public void updateProjectVersion( String repositoryId, String namespace, String
} }
// TODO: namespaced properties instead? // TODO: namespaced properties instead?
Node facetNode = getOrCreateNode( versionNode, "facets" ); Node facetNode = JcrUtils.getOrAddNode( versionNode, "facets" );
for ( MetadataFacet facet : versionMetadata.getFacetList() ) for ( MetadataFacet facet : versionMetadata.getFacetList() )
{ {
// TODO: shouldn't need to recreate, just update // TODO: shouldn't need to recreate, just update
@ -275,44 +282,6 @@ public void updateProjectVersion( String repositoryId, String namespace, String
} }
} }
private Node getOrCreateProjectVersionNode( String repositoryId, String namespace, String projectId,
String projectVersion )
throws RepositoryException
{
Node namespaceNode = getOrCreateNamespaceNode( repositoryId, namespace );
Node projectNode = getOrCreateNode( namespaceNode, projectId );
return getOrCreateNode( projectNode, projectVersion );
}
private Node getOrCreateNode( Node baseNode, String name )
throws RepositoryException
{
return baseNode.hasNode( name ) ? baseNode.getNode( name ) : baseNode.addNode( name );
}
private Node getOrCreateNamespaceNode( String repositoryId, String namespace )
throws RepositoryException
{
Node repo = getOrCreateRepositoryContentNode( repositoryId );
return getOrCreateNode( repo, namespace );
}
private Node getOrCreateRepositoryContentNode( String repositoryId )
throws RepositoryException
{
Node node = getOrCreateRepositoryNode( repositoryId );
return getOrCreateNode( node, "content" );
}
private Node getOrCreateRepositoryNode( String repositoryId )
throws RepositoryException
{
Node root = session.getRootNode();
Node node = getOrCreateNode( root, "repositories" );
node = getOrCreateNode( node, repositoryId );
return node;
}
public void updateProjectReference( String repositoryId, String namespace, String projectId, String projectVersion, public void updateProjectReference( String repositoryId, String namespace, String projectId, String projectVersion,
ProjectVersionReference reference ) ProjectVersionReference reference )
{ {
@ -320,14 +289,14 @@ public void updateProjectReference( String repositoryId, String namespace, Strin
// TODO: is this tree the right way up? It differs from the content model // TODO: is this tree the right way up? It differs from the content model
try try
{ {
Node node = getOrCreateRepositoryContentNode( repositoryId ); Node node = getOrAddRepositoryContentNode( repositoryId );
node = getOrCreateNode( node, namespace ); node = JcrUtils.getOrAddNode( node, namespace );
node = getOrCreateNode( node, projectId ); node = JcrUtils.getOrAddNode( node, projectId );
node = getOrCreateNode( node, projectVersion ); node = JcrUtils.getOrAddNode( node, projectVersion );
node = getOrCreateNode( node, "references" ); node = JcrUtils.getOrAddNode( node, "references" );
node = getOrCreateNode( node, reference.getNamespace() ); node = JcrUtils.getOrAddNode( node, reference.getNamespace() );
node = getOrCreateNode( node, reference.getProjectId() ); node = JcrUtils.getOrAddNode( node, reference.getProjectId() );
node = getOrCreateNode( node, reference.getProjectVersion() ); node = JcrUtils.getOrAddNode( node, reference.getProjectVersion() );
node.setProperty( "type", reference.getReferenceType().toString() ); node.setProperty( "type", reference.getReferenceType().toString() );
} }
catch ( RepositoryException e ) catch ( RepositoryException e )
@ -341,7 +310,8 @@ public void updateNamespace( String repositoryId, String namespace )
{ {
try try
{ {
Node node = getOrCreateNamespaceNode( repositoryId, namespace ); // TODO: currently flat
Node node = getOrAddNamespaceNode( repositoryId, namespace );
node.setProperty( "namespace", namespace ); node.setProperty( "namespace", namespace );
} }
catch ( RepositoryException e ) catch ( RepositoryException e )
@ -357,16 +327,17 @@ public List<String> getMetadataFacets( String repositoryId, String facetId )
try try
{ {
Node root = session.getRootNode(); // no need to construct node-by-node here, as we'll find in the next instance, the facet names have / and
Node node = root.getNode( "repositories/" + repositoryId + "/facets/" + facetId ); // are paths themselves
Node node = session.getRootNode().getNode( getFacetPath( repositoryId, facetId ) );
// TODO: could we simply query all nodes with no children? // TODO: could we simply query all nodes with no children? Or perhaps a specific nodetype?
// Might be better to review the purpose of this function - why is the list of paths helpful?
recurse( facets, "", node ); recurse( facets, "", node );
} }
catch ( PathNotFoundException e ) catch ( PathNotFoundException e )
{ {
// TODO: handle this case differently? // ignored - the facet doesn't exist, so return the empty list
// currently ignored
} }
catch ( RepositoryException e ) catch ( RepositoryException e )
{ {
@ -379,10 +350,8 @@ public List<String> getMetadataFacets( String repositoryId, String facetId )
private void recurse( List<String> facets, String prefix, Node node ) private void recurse( List<String> facets, String prefix, Node node )
throws RepositoryException throws RepositoryException
{ {
NodeIterator iterator = node.getNodes(); for ( Node n : JcrUtils.getChildNodes( node ) )
while ( iterator.hasNext() )
{ {
Node n = iterator.nextNode();
String name = prefix + "/" + n.getName(); String name = prefix + "/" + n.getName();
if ( n.hasNodes() ) if ( n.hasNodes() )
{ {
@ -396,24 +365,21 @@ private void recurse( List<String> facets, String prefix, Node node )
} }
} }
public MetadataFacet getMetadataFacet( String repositoryId, String facetId, String name ) public MetadataFacet getMetadataFacet( String repositoryId, String facetId, String name )
{ {
MetadataFacet metadataFacet = null; MetadataFacet metadataFacet = null;
try try
{ {
Node root = session.getRootNode(); Node root = session.getRootNode();
Node node = root.getNode( "repositories/" + repositoryId + "/facets/" + facetId + "/" + name ); Node node = root.getNode( getFacetPath( repositoryId, facetId, name ) );
MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( facetId ); MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( facetId );
if ( metadataFacetFactory != null ) if ( metadataFacetFactory != null )
{ {
metadataFacet = metadataFacetFactory.createMetadataFacet( repositoryId, name ); metadataFacet = metadataFacetFactory.createMetadataFacet( repositoryId, name );
Map<String, String> map = new HashMap<String, String>(); Map<String, String> map = new HashMap<String, String>();
PropertyIterator iterator = node.getProperties(); for ( Property property : JcrUtils.getProperties( node ) )
while ( iterator.hasNext() )
{ {
Property property = iterator.nextProperty();
String p = property.getName(); String p = property.getName();
if ( !p.startsWith( "jcr:" ) ) if ( !p.startsWith( "jcr:" ) )
{ {
@ -425,8 +391,7 @@ public MetadataFacet getMetadataFacet( String repositoryId, String facetId, Stri
} }
catch ( PathNotFoundException e ) catch ( PathNotFoundException e )
{ {
// TODO: handle this case differently? // ignored - the facet doesn't exist, so return null
// currently ignored
} }
catch ( RepositoryException e ) catch ( RepositoryException e )
{ {
@ -440,11 +405,11 @@ public void addMetadataFacet( String repositoryId, MetadataFacet metadataFacet )
{ {
try try
{ {
Node repo = getOrCreateRepositoryNode( repositoryId ); Node repo = getOrAddRepositoryNode( repositoryId );
Node facets = getOrCreateNode( repo, "facets" ); Node facets = JcrUtils.getOrAddNode( repo, "facets" );
String id = metadataFacet.getFacetId(); String id = metadataFacet.getFacetId();
Node facetNode = getOrCreateNode( facets, id ); Node facetNode = JcrUtils.getOrAddNode( facets, id );
Node node = getOrCreatePath( facetNode, metadataFacet.getName() ); Node node = getOrCreatePath( facetNode, metadataFacet.getName() );
@ -466,7 +431,7 @@ private Node getOrCreatePath( Node baseNode, String name )
Node node = baseNode; Node node = baseNode;
for ( String n : name.split( "/" ) ) for ( String n : name.split( "/" ) )
{ {
node = getOrCreateNode( node, n ); node = JcrUtils.getOrAddNode( node, n );
} }
return node; return node;
} }
@ -476,7 +441,7 @@ public void removeMetadataFacets( String repositoryId, String facetId )
try try
{ {
Node root = session.getRootNode(); Node root = session.getRootNode();
String path = "repositories/" + repositoryId + "/facets/" + facetId; String path = getFacetPath( repositoryId, facetId );
// TODO: exception if missing? // TODO: exception if missing?
if ( root.hasNode( path ) ) if ( root.hasNode( path ) )
{ {
@ -495,7 +460,7 @@ public void removeMetadataFacet( String repositoryId, String facetId, String nam
try try
{ {
Node root = session.getRootNode(); Node root = session.getRootNode();
String path = "repositories/" + repositoryId + "/facets/" + facetId + "/" + name; String path = getFacetPath( repositoryId, facetId, name );
// TODO: exception if missing? // TODO: exception if missing?
if ( root.hasNode( path ) ) if ( root.hasNode( path ) )
{ {
@ -518,44 +483,49 @@ public void removeMetadataFacet( String repositoryId, String facetId, String nam
public List<ArtifactMetadata> getArtifactsByDateRange( String repoId, Date startTime, Date endTime ) public List<ArtifactMetadata> getArtifactsByDateRange( String repoId, Date startTime, Date endTime )
{ {
// TODO: this is quite slow - if we are to persist with this repository implementation we should build an index List<ArtifactMetadata> artifacts;
// of this information (eg. in Lucene, as before)
List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>(); String q = "SELECT * FROM [archiva:artifact]";
for ( String ns : getRootNamespaces( repoId ) )
String clause = " WHERE";
if ( startTime != null )
{ {
getArtifactsByDateRange( artifacts, repoId, ns, startTime, endTime ); q += clause + " [whenGathered] >= $start";
clause = " AND";
}
if ( endTime != null )
{
q += clause + " [whenGathered] <= $end";
}
try
{
Query query = session.getWorkspace().getQueryManager().createQuery( q, Query.JCR_SQL2 );
ValueFactory valueFactory = session.getValueFactory();
if ( startTime != null )
{
query.bindValue( "start", valueFactory.createValue( createCalendar( startTime ) ) );
}
if ( endTime != null )
{
query.bindValue( "end", valueFactory.createValue( createCalendar( endTime ) ) );
}
QueryResult result = query.execute();
artifacts = new ArrayList<ArtifactMetadata>();
for ( Node n : JcrUtils.getNodes( result ) )
{
artifacts.add( getArtifactFromNode( repoId, n ) );
}
}
catch ( RepositoryException e )
{
// TODO
throw new RuntimeException( e );
} }
Collections.sort( artifacts, new ArtifactComparator() );
return artifacts; return artifacts;
} }
private void getArtifactsByDateRange( List<ArtifactMetadata> artifacts, String repoId, String ns, Date startTime,
Date endTime )
{
for ( String namespace : getNamespaces( repoId, ns ) )
{
getArtifactsByDateRange( artifacts, repoId, ns + "." + namespace, startTime, endTime );
}
for ( String project : getProjects( repoId, ns ) )
{
for ( String version : getProjectVersions( repoId, ns, project ) )
{
for ( ArtifactMetadata artifact : getArtifacts( repoId, ns, project, version ) )
{
if ( startTime == null || startTime.before( artifact.getWhenGathered() ) )
{
if ( endTime == null || endTime.after( artifact.getWhenGathered() ) )
{
artifacts.add( artifact );
}
}
}
}
}
}
public Collection<String> getRepositories() public Collection<String> getRepositories()
{ {
List<String> repositories; List<String> repositories;
@ -1100,21 +1070,43 @@ public Collection<ArtifactMetadata> getArtifacts( String repositoryId, String na
{ {
Node artifactNode = iterator.nextNode(); Node artifactNode = iterator.nextNode();
ArtifactMetadata artifact = getArtifactFromNode( repositoryId, artifactNode );
artifacts.add( artifact );
}
}
}
catch ( RepositoryException e )
{
// TODO
throw new RuntimeException( e );
}
return artifacts;
}
private ArtifactMetadata getArtifactFromNode( String repositoryId, Node artifactNode )
throws RepositoryException
{
String id = artifactNode.getName(); String id = artifactNode.getName();
ArtifactMetadata artifact = new ArtifactMetadata(); ArtifactMetadata artifact = new ArtifactMetadata();
artifact.setId( id ); artifact.setId( id );
artifact.setRepositoryId( repositoryId ); artifact.setRepositoryId( repositoryId );
artifact.setNamespace( namespace );
artifact.setProject( projectId );
artifact.setProjectVersion( projectVersion );
artifact.setVersion( artifactNode.hasProperty( "version" ) ? artifactNode.getProperty(
"version" ).getString() : projectVersion );
if ( artifactNode.hasProperty( "updated" ) ) Node projectVersionNode = artifactNode.getParent();
Node projectNode = projectVersionNode.getParent();
Node namespaceNode = projectNode.getParent();
artifact.setNamespace( namespaceNode.getProperty( "namespace" ).getString() );
artifact.setProject( projectNode.getName() );
artifact.setProjectVersion( projectVersionNode.getName() );
artifact.setVersion( artifactNode.hasProperty( "version" )
? artifactNode.getProperty( "version" ).getString()
: projectVersionNode.getName() );
if ( artifactNode.hasProperty( "jcr:lastModified" ) )
{ {
artifact.setFileLastModified( artifactNode.getProperty( artifact.setFileLastModified( artifactNode.getProperty( "jcr:lastModified" ).getDate().getTimeInMillis() );
"updated" ).getDate().getTimeInMillis() );
} }
if ( artifactNode.hasProperty( "whenGathered" ) ) if ( artifactNode.hasProperty( "whenGathered" ) )
@ -1166,17 +1158,7 @@ public Collection<ArtifactMetadata> getArtifacts( String repositoryId, String na
} }
} }
} }
artifacts.add( artifact ); return artifact;
}
}
}
catch ( RepositoryException e )
{
// TODO
throw new RuntimeException( e );
}
return artifacts;
} }
void close() void close()
@ -1207,25 +1189,69 @@ public void setMetadataFacetFactories( Map<String, MetadataFacetFactory> metadat
// } // }
} }
private static class ArtifactComparator private static String getFacetPath( String repositoryId, String facetId )
implements Comparator<ArtifactMetadata>
{ {
public int compare( ArtifactMetadata artifact1, ArtifactMetadata artifact2 ) return "repositories/" + repositoryId + "/facets/" + facetId;
{
if ( artifact1.getWhenGathered() == artifact2.getWhenGathered() )
{
return 0;
} }
if ( artifact1.getWhenGathered() == null )
private static String getFacetPath( String repositoryId, String facetId, String name )
{ {
return 1; return getFacetPath( repositoryId, facetId ) + "/" + name;
} }
if ( artifact2.getWhenGathered() == null )
private Node getOrAddRepositoryNode( String repositoryId )
throws RepositoryException
{ {
return -1; Node root = session.getRootNode();
Node node = JcrUtils.getOrAddNode( root, "repositories" );
node = JcrUtils.getOrAddNode( node, repositoryId );
return node;
} }
return artifact1.getWhenGathered().compareTo( artifact2.getWhenGathered() );
private Node getOrAddRepositoryContentNode( String repositoryId )
throws RepositoryException
{
Node node = getOrAddRepositoryNode( repositoryId );
return JcrUtils.getOrAddNode( node, "content" );
} }
private Node getOrAddNamespaceNode( String repositoryId, String namespace )
throws RepositoryException
{
Node repo = getOrAddRepositoryContentNode( repositoryId );
return JcrUtils.getOrAddNode( repo, namespace );
}
private Node getOrAddProjectNode( String repositoryId, String namespace, String projectId )
throws RepositoryException
{
Node namespaceNode = getOrAddNamespaceNode( repositoryId, namespace );
return JcrUtils.getOrAddNode( namespaceNode, projectId );
}
private Node getOrAddProjectVersionNode( String repositoryId, String namespace, String projectId,
String projectVersion )
throws RepositoryException
{
Node projectNode = getOrAddProjectNode( repositoryId, namespace, projectId );
return JcrUtils.getOrAddNode( projectNode, projectVersion );
}
private Node getOrAddArtifactNode( String repositoryId, String namespace, String projectId, String projectVersion,
String id )
throws RepositoryException
{
Node versionNode = getOrAddProjectVersionNode( repositoryId, namespace, projectId, projectVersion );
Node node = JcrUtils.getOrAddNode( versionNode, id );
node.addMixin( "archiva:artifact" );
return node;
}
private static Calendar createCalendar( Date time )
{
Calendar cal = Calendar.getInstance();
cal.setTime( time );
return cal;
} }
private String join( Collection<String> ids ) private String join( Collection<String> ids )
@ -1242,4 +1268,9 @@ private String join( Collection<String> ids )
} }
return null; return null;
} }
public Session getJcrSession()
{
return session;
}
} }

View File

@ -23,8 +23,8 @@
import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest; import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.Map; import java.util.Map;
import javax.jcr.RepositoryException;
public class JcrMetadataRepositoryTest public class JcrMetadataRepositoryTest
extends AbstractMetadataRepositoryTest extends AbstractMetadataRepositoryTest
@ -36,8 +36,7 @@ public void setUp()
{ {
super.setUp(); super.setUp();
File directory = getTestFile( "target/test-repositories" ); FileUtils.deleteDirectory( getTestFile( "target/test-repositories" ) );
FileUtils.deleteDirectory( directory );
Map<String, MetadataFacetFactory> factories = createTestMetadataFacetFactories(); Map<String, MetadataFacetFactory> factories = createTestMetadataFacetFactories();
@ -53,6 +52,15 @@ protected void tearDown()
{ {
super.tearDown(); super.tearDown();
try
{
jcrMetadataRepository.getJcrSession().getRootNode().getNode( "repositories" ).remove();
}
catch ( RepositoryException e )
{
// ignore
}
jcrMetadataRepository.close(); jcrMetadataRepository.close();
} }
} }

View File

@ -22,9 +22,9 @@
<Repository> <Repository>
<FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem"/> <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem"/>
<!--<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem"> <!--<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${rep.home}/repository"/> <param name="path" value="${rep.home}/repository"/>
</FileSystem> --> </FileSystem> -->
<Security appName="Jackrabbit"> <Security appName="Jackrabbit">
<SecurityManager class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager" workspaceName="security"/> <SecurityManager class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager" workspaceName="security"/>
<AccessManager class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager"/> <AccessManager class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager"/>
@ -32,16 +32,20 @@
</Security> </Security>
<Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/> <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
<Workspace name="${wsp.name}"> <Workspace name="${wsp.name}">
<FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem"/> <!--<FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem"/>-->
<PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager"/> <!--<PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager"/>-->
<!--<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem"> <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${wsp.home}"/> <param name="path" value="${wsp.home}"/>
</FileSystem> <PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager"/> --> </FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager"/>
<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
<param name="path" value="${wsp.home}/index"/>
</SearchIndex>
</Workspace> </Workspace>
<Versioning rootPath="${rep.home}/version"> <Versioning rootPath="${rep.home}/version">
<FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem"/> <FileSystem class="org.apache.jackrabbit.core.fs.mem.MemoryFileSystem"/>
<PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager"/> <PersistenceManager class="org.apache.jackrabbit.core.persistence.mem.InMemPersistenceManager"/>
<!--<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem"> <!--<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${rep.home}/version"/> <param name="path" value="${rep.home}/version"/>
</FileSystem> </FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager"/>--> <PersistenceManager class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager"/>-->