You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by oc...@apache.org on 2009/10/08 12:01:32 UTC
svn commit: r823109 - in
/archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src:
main/java/org/apache/archiva/web/xmlrpc/services/
test/java/org/apache/archiva/web/xmlrpc/services/
Author: oching
Date: Thu Oct 8 10:01:32 2009
New Revision: 823109
URL: http://svn.apache.org/viewvc?rev=823109&view=rev
Log:
[MRM-1230] Type of artifact is allways "pom"
o for each search hit, get project model thru repositorybrowse#selectVersion(..) where complete project model is retrieved instead of just the bare artifact obj
o added tests
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java
archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java?rev=823109&r1=823108&r2=823109&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java Thu Oct 8 10:01:32 2009
@@ -31,13 +31,17 @@
import org.apache.archiva.web.xmlrpc.api.beans.Artifact;
import org.apache.archiva.web.xmlrpc.api.beans.Dependency;
import org.apache.archiva.web.xmlrpc.security.XmlRpcUserRepositories;
+import org.apache.maven.archiva.common.utils.VersionUtil;
import org.apache.maven.archiva.database.ArchivaDAO;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
import org.apache.maven.archiva.database.ArtifactDAO;
import org.apache.maven.archiva.database.ObjectNotFoundException;
+import org.apache.maven.archiva.database.ProjectModelDAO;
import org.apache.maven.archiva.database.browsing.BrowsingResults;
import org.apache.maven.archiva.database.browsing.RepositoryBrowsing;
import org.apache.maven.archiva.database.constraints.ArtifactsByChecksumConstraint;
+import org.apache.maven.archiva.database.constraints.ArtifactsRelatedConstraint;
+import org.apache.maven.archiva.database.constraints.UniqueVersionConstraint;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.ArchivaProjectModel;
import org.slf4j.Logger;
@@ -46,6 +50,14 @@
/**
* SearchServiceImpl
*
+ * quick/general text search which returns a list of artifacts
+ * query for an artifact based on a checksum
+ * query for all available versions of an artifact, sorted in version significance order
+ * query for all available versions of an artifact since a given date
+ * query for an artifact's direct dependencies
+ * query for an artifact's dependency tree (as with mvn dependency:tree - no duplicates should be included)
+ * query for all artifacts that depend on a given artifact
+ *
* @version $Id: SearchServiceImpl.java
*/
public class SearchServiceImpl
@@ -69,24 +81,11 @@
this.repoBrowsing = repoBrowsing;
this.search = search;
}
-
- /*
- * quick/general text search which returns a list of artifacts
- * query for an artifact based on a checksum
- * query for all available versions of an artifact, sorted in version significance order
- * query for all available versions of an artifact since a given date
- * query for an artifact's direct dependencies
- * query for an artifact's dependency tree (as with mvn dependency:tree - no duplicates should be included)
- * query for all artifacts that depend on a given artifact
- */
-
+
+ @SuppressWarnings( "unchecked" )
public List<Artifact> quickSearch( String queryString )
throws Exception
{
- // 1. check whether bytecode search or ordinary search
- // 2. get observable repos
- // 3. convert results to a list of Artifact objects
-
List<Artifact> artifacts = new ArrayList<Artifact>();
List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();
SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
@@ -94,48 +93,70 @@
results = search.search( "", observableRepos, queryString, limits, null );
- List<SearchResultHit> hits = results.getHits();
-
- for( SearchResultHit hit : hits )
- {
- ArtifactDAO artifactDAO = archivaDAO.getArtifactDAO();
-
- List<String> versions = hit.getVersions();
- if( versions != null )
+ for ( SearchResultHit resultHit : results.getHits() )
+ {
+ // double-check all versions as done in SearchAction
+ final List<String> versions =
+ (List<String>) archivaDAO.query( new UniqueVersionConstraint( observableRepos, resultHit.getGroupId(),
+ resultHit.getArtifactId() ) );
+ if ( versions != null && !versions.isEmpty() )
{
- for( String version : versions )
- {
- for( String repo : observableRepos )
+ resultHit.setVersion( null );
+ resultHit.setVersions( filterTimestampedSnapshots( versions ) );
+ }
+
+ List<String> resultHitVersions = resultHit.getVersions();
+ if( resultHitVersions != null )
+ {
+ for( String version : resultHitVersions )
+ {
+ try
{
- try
- {
- ArchivaArtifact pomArtifact = artifactDAO.getArtifact(
- hit.getGroupId(), hit.getArtifactId(), version, null, "pom", repo );
- if( pomArtifact != null )
- {
- Artifact artifact = new Artifact( pomArtifact.getModel().getRepositoryId(), pomArtifact.getGroupId(), pomArtifact.getArtifactId(), pomArtifact.getVersion(),
- pomArtifact.getType() );
- //pomArtifact.getType(), pomArtifact.getModel().getWhenGathered() );
- artifacts.add( artifact );
- break;
- }
- }
- catch( ObjectNotFoundException e )
+ ArchivaProjectModel model = repoBrowsing.selectVersion( "", observableRepos, resultHit.getGroupId(), resultHit.getArtifactId(), version );
+
+ Artifact artifact = null;
+ if( model == null )
{
- log.debug( "Unable to find pom artifact : " + e.getMessage() );
+ artifact = new Artifact( resultHit.getRepositoryId(), resultHit.getGroupId(), resultHit.getArtifactId(), version, "jar" );
}
- catch( ArchivaDatabaseException e )
- {
- log.debug( "Error occurred while getting pom artifact from database : " + e.getMessage() );
+ else
+ {
+ artifact = new Artifact( resultHit.getRepositoryId(), model.getGroupId(), model.getArtifactId(), version, model.getPackaging() );
}
- }
+ artifacts.add( artifact );
+ }
+ catch( ObjectNotFoundException e )
+ {
+ log.debug( "Unable to find pom artifact : " + e.getMessage() );
+ }
+ catch( ArchivaDatabaseException e )
+ {
+ log.debug( "Error occurred while getting pom artifact from database : " + e.getMessage() );
+ }
}
}
- }
+ }
return artifacts;
}
+ /**
+ * Remove timestamped snapshots from versions
+ */
+ private static List<String> filterTimestampedSnapshots(List<String> versions)
+ {
+ final List<String> filtered = new ArrayList<String>();
+ for (final String version : versions)
+ {
+ final String baseVersion = VersionUtil.getBaseVersion(version);
+ if (!filtered.contains(baseVersion))
+ {
+ filtered.add(baseVersion);
+ }
+ }
+ return filtered;
+ }
+
public List<Artifact> getArtifactByChecksum( String checksum )
throws Exception
{
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java?rev=823109&r1=823108&r2=823109&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java Thu Oct 8 10:01:32 2009
@@ -25,6 +25,10 @@
import java.util.List;
import org.apache.archiva.indexer.search.RepositorySearch;
+import org.apache.archiva.indexer.search.SearchResultHit;
+import org.apache.archiva.indexer.search.SearchResultLimits;
+import org.apache.archiva.indexer.search.SearchResults;
+import org.apache.archiva.indexer.util.SearchUtil;
import org.apache.archiva.web.xmlrpc.api.SearchService;
import org.apache.archiva.web.xmlrpc.api.beans.Artifact;
import org.apache.archiva.web.xmlrpc.api.beans.Dependency;
@@ -35,6 +39,7 @@
import org.apache.maven.archiva.database.browsing.BrowsingResults;
import org.apache.maven.archiva.database.browsing.RepositoryBrowsing;
import org.apache.maven.archiva.database.constraints.ArtifactsByChecksumConstraint;
+import org.apache.maven.archiva.database.constraints.UniqueVersionConstraint;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.ArchivaProjectModel;
import org.codehaus.plexus.spring.PlexusInSpringTestCase;
@@ -79,20 +84,136 @@
userRepos = ( XmlRpcUserRepositories ) userReposControl.getMock();
archivaDAOControl = MockControl.createControl( ArchivaDAO.class );
+ archivaDAOControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
archivaDAO = ( ArchivaDAO ) archivaDAOControl.getMock();
repoBrowsingControl = MockControl.createControl( RepositoryBrowsing.class );
repoBrowsing = ( RepositoryBrowsing ) repoBrowsingControl.getMock();
searchControl = MockControl.createControl( RepositorySearch.class );
+ searchControl.setDefaultMatcher( MockControl.ALWAYS_MATCHER );
search = ( RepositorySearch ) searchControl.getMock();
searchService = new SearchServiceImpl( userRepos, archivaDAO, repoBrowsing, search );
- artifactDAOControl = MockControl.createControl( ArtifactDAO.class );
+ artifactDAOControl = MockControl.createControl( ArtifactDAO.class );
artifactDAO = ( ArtifactDAO ) artifactDAOControl.getMock();
}
+ // MRM-1230
+ public void testQuickSearchModelPackagingIsUsed()
+ throws Exception
+ {
+ List<String> observableRepoIds = new ArrayList<String>();
+ observableRepoIds.add( "repo1.mirror" );
+ observableRepoIds.add( "public.releases" );
+
+ userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds );
+
+ SearchResults results = new SearchResults();
+ List<String> versions = new ArrayList<String>();
+ versions.add( "1.0" );
+
+ SearchResultHit resultHit = new SearchResultHit();
+ resultHit.setGroupId( "org.apache.archiva" );
+ resultHit.setArtifactId( "archiva-webapp" );
+ resultHit.setRepositoryId("repo1.mirror");
+ resultHit.setVersions( versions );
+
+ results.addHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-webapp" ), resultHit );
+
+ SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
+
+ searchControl.expectAndDefaultReturn( search.search( "", observableRepoIds, "archiva", limits, null ), results );
+
+ archivaDAOControl.expectAndReturn( archivaDAO.query( new UniqueVersionConstraint( observableRepoIds, resultHit.getGroupId(),
+ resultHit.getArtifactId() ) ), null );
+
+ ArchivaProjectModel model = new ArchivaProjectModel();
+ model.setGroupId( "org.apache.archiva" );
+ model.setArtifactId( "archiva-webapp" );
+ model.setVersion( "1.0" );
+ model.setPackaging( "war" );
+
+ repoBrowsingControl.expectAndReturn( repoBrowsing.selectVersion( "", observableRepoIds, "org.apache.archiva", "archiva-webapp", "1.0" ), model );
+
+ userReposControl.replay();
+ searchControl.replay();
+ repoBrowsingControl.replay();
+ archivaDAOControl.replay();
+
+ List<Artifact> artifacts = searchService.quickSearch( "archiva" );
+
+ userReposControl.verify();
+ searchControl.verify();
+ repoBrowsingControl.verify();
+ archivaDAOControl.verify();
+
+ assertNotNull( artifacts );
+ assertEquals( 1, artifacts.size() );
+
+ Artifact hit = artifacts.get( 0 );
+ assertEquals( "org.apache.archiva", hit.getGroupId() );
+ assertEquals( "archiva-webapp", hit.getArtifactId() );
+ assertEquals( "1.0", hit.getVersion() );
+ assertEquals( "war", hit.getType() );
+ assertEquals( "repo1.mirror", hit.getRepositoryId() );
+ }
+
+ // returned model is null!
+ public void testQuickSearchDefaultPackagingIsUsed()
+ throws Exception
+ {
+ List<String> observableRepoIds = new ArrayList<String>();
+ observableRepoIds.add( "repo1.mirror" );
+ observableRepoIds.add( "public.releases" );
+
+ userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds );
+
+ SearchResults results = new SearchResults();
+ List<String> versions = new ArrayList<String>();
+ versions.add( "1.0" );
+
+ SearchResultHit resultHit = new SearchResultHit();
+ resultHit.setRepositoryId( "repo1.mirror" );
+ resultHit.setGroupId( "org.apache.archiva" );
+ resultHit.setArtifactId( "archiva-test" );
+ resultHit.setVersions( versions );
+
+ results.addHit( SearchUtil.getHitId( "org.apache.archiva", "archiva-test" ), resultHit );
+
+ SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
+
+ searchControl.expectAndDefaultReturn( search.search( "", observableRepoIds, "archiva", limits, null ), results );
+
+ archivaDAOControl.expectAndReturn( archivaDAO.query( new UniqueVersionConstraint( observableRepoIds, resultHit.getGroupId(),
+ resultHit.getArtifactId() ) ), null );
+
+ repoBrowsingControl.expectAndReturn( repoBrowsing.selectVersion( "", observableRepoIds, "org.apache.archiva", "archiva-test", "1.0" ), null );
+
+ userReposControl.replay();
+ searchControl.replay();
+ repoBrowsingControl.replay();
+ archivaDAOControl.replay();
+
+ List<Artifact> artifacts = searchService.quickSearch( "archiva" );
+
+ userReposControl.verify();
+ searchControl.verify();
+ repoBrowsingControl.verify();
+ archivaDAOControl.verify();
+
+ assertNotNull( artifacts );
+ assertEquals( 1, artifacts.size() );
+
+ Artifact hit = artifacts.get( 0 );
+ assertEquals( "org.apache.archiva", hit.getGroupId() );
+ assertEquals( "archiva-test", hit.getArtifactId() );
+ assertEquals( "1.0", hit.getVersion() );
+ assertEquals( "jar", hit.getType() );
+ assertEquals( "repo1.mirror", hit.getRepositoryId() );
+ }
+
/*
* quick/general text search which returns a list of artifacts
* query for an artifact based on a checksum