[MRM-1843] provide mechanism to obtain the latest version of an artifact

Implements LATEST keyword
This commit is contained in:
Olivier Lamy 2014-05-21 10:12:43 +10:00
parent 511858d4ab
commit b272a1bc2f
1 changed files with 25 additions and 27 deletions

View File

@ -19,6 +19,7 @@ package org.apache.archiva.rest.services;
* under the License. * under the License.
*/ */
import org.apache.archiva.common.utils.VersionComparator;
import org.apache.archiva.indexer.search.RepositorySearch; import org.apache.archiva.indexer.search.RepositorySearch;
import org.apache.archiva.indexer.search.RepositorySearchException; import org.apache.archiva.indexer.search.RepositorySearchException;
import org.apache.archiva.indexer.search.SearchFields; import org.apache.archiva.indexer.search.SearchFields;
@ -43,16 +44,19 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.TreeMap;
/** /**
* @author Olivier Lamy * @author Olivier Lamy
*/ */
@Service("searchService#rest") @Service( "searchService#rest" )
public class DefaultSearchService public class DefaultSearchService
extends AbstractRestService extends AbstractRestService
implements SearchService implements SearchService
{ {
private static final String LATEST_KEYWORD = "LATEST";
@Inject @Inject
private RepositorySearch repositorySearch; private RepositorySearch repositorySearch;
@ -265,35 +269,14 @@ public class DefaultSearchService
} ).build(); } ).build();
} }
if ( StringUtils.isEmpty( version ) )
{
return Response.status( new Response.StatusType()
{
@Override
public int getStatusCode()
{
return Response.Status.BAD_REQUEST.getStatusCode();
}
@Override
public Response.Status.Family getFamily()
{
return Response.Status.BAD_REQUEST.getFamily();
}
@Override
public String getReasonPhrase()
{
return "version mandatory";
}
} ).build();
}
SearchFields searchField = new SearchFields(); SearchFields searchField = new SearchFields();
searchField.setGroupId( groupId ); searchField.setGroupId( groupId );
searchField.setArtifactId( artifactId ); searchField.setArtifactId( artifactId );
searchField.setPackaging( StringUtils.isBlank( packaging ) ? "jar" : packaging ); searchField.setPackaging( StringUtils.isBlank( packaging ) ? "jar" : packaging );
searchField.setVersion( version ); if ( !StringUtils.equals( version, LATEST_KEYWORD ) )
{
searchField.setVersion( version );
}
searchField.setClassifier( classifier ); searchField.setClassifier( classifier );
List<String> userRepos = getObservablesRepoIds().getStrings(); List<String> userRepos = getObservablesRepoIds().getStrings();
searchField.setRepositories( searchField.setRepositories(
@ -343,7 +326,7 @@ public class DefaultSearchService
} }
// TODO return json result of the query ? // TODO return json result of the query ?
if ( artifacts.size() > 1 ) if ( artifacts.size() > 1 && !StringUtils.equals( version, LATEST_KEYWORD ) )
{ {
return Response.status( new Response.StatusType() return Response.status( new Response.StatusType()
{ {
@ -367,6 +350,21 @@ public class DefaultSearchService
} ).build(); } ).build();
} }
// version is LATEST so we have to find the latest one from the result
if ( artifacts.size() > 1 && StringUtils.equals( version, LATEST_KEYWORD ) )
{
TreeMap<String, Artifact> artifactPerVersion = new TreeMap<>( VersionComparator.getInstance() );
for ( Artifact artifact : artifacts )
{
artifactPerVersion.put( artifact.getVersion(), artifact );
}
return Response.temporaryRedirect(
new URI( artifactPerVersion.lastEntry().getValue().getUrl() ) ).build();
}
Artifact artifact = artifacts.get( 0 ); Artifact artifact = artifacts.get( 0 );
return Response.temporaryRedirect( new URI( artifact.getUrl() ) ).build(); return Response.temporaryRedirect( new URI( artifact.getUrl() ) ).build();