mirror of https://github.com/apache/archiva.git
[MRM-1574] add rest method to get repositoty statistics
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1233310 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
0cb6235dfa
commit
4ada471449
|
@ -56,5 +56,4 @@ public interface RepositoryCommonValidator
|
||||||
*/
|
*/
|
||||||
String removeExpressions( String directory );
|
String removeExpressions( String directory );
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
package org.apache.archiva.rest.api.model;
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
* @since 1.4-M3
|
||||||
|
*/
|
||||||
|
@XmlRootElement( name = "archivaRepositoryStatistics" )
|
||||||
|
public class ArchivaRepositoryStatistics
|
||||||
|
{
|
||||||
|
private Date scanEndTime;
|
||||||
|
|
||||||
|
private Date scanStartTime;
|
||||||
|
|
||||||
|
private long totalArtifactCount;
|
||||||
|
|
||||||
|
private long totalArtifactFileSize;
|
||||||
|
|
||||||
|
private long totalFileCount;
|
||||||
|
|
||||||
|
private long totalGroupCount;
|
||||||
|
|
||||||
|
private long totalProjectCount;
|
||||||
|
|
||||||
|
private long newFileCount;
|
||||||
|
|
||||||
|
public ArchivaRepositoryStatistics()
|
||||||
|
{
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getScanEndTime()
|
||||||
|
{
|
||||||
|
return scanEndTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScanEndTime( Date scanEndTime )
|
||||||
|
{
|
||||||
|
this.scanEndTime = scanEndTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getScanStartTime()
|
||||||
|
{
|
||||||
|
return scanStartTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScanStartTime( Date scanStartTime )
|
||||||
|
{
|
||||||
|
this.scanStartTime = scanStartTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalArtifactCount()
|
||||||
|
{
|
||||||
|
return totalArtifactCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalArtifactCount( long totalArtifactCount )
|
||||||
|
{
|
||||||
|
this.totalArtifactCount = totalArtifactCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalArtifactFileSize()
|
||||||
|
{
|
||||||
|
return totalArtifactFileSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalArtifactFileSize( long totalArtifactFileSize )
|
||||||
|
{
|
||||||
|
this.totalArtifactFileSize = totalArtifactFileSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalFileCount()
|
||||||
|
{
|
||||||
|
return totalFileCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalFileCount( long totalFileCount )
|
||||||
|
{
|
||||||
|
this.totalFileCount = totalFileCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalGroupCount()
|
||||||
|
{
|
||||||
|
return totalGroupCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalGroupCount( long totalGroupCount )
|
||||||
|
{
|
||||||
|
this.totalGroupCount = totalGroupCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalProjectCount()
|
||||||
|
{
|
||||||
|
return totalProjectCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalProjectCount( long totalProjectCount )
|
||||||
|
{
|
||||||
|
this.totalProjectCount = totalProjectCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getNewFileCount()
|
||||||
|
{
|
||||||
|
return newFileCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNewFileCount( long newFileCount )
|
||||||
|
{
|
||||||
|
this.newFileCount = newFileCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append( "ArchivaRepositoryStatistics" );
|
||||||
|
sb.append( "{scanEndTime=" ).append( scanEndTime );
|
||||||
|
sb.append( ", scanStartTime=" ).append( scanStartTime );
|
||||||
|
sb.append( ", totalArtifactCount=" ).append( totalArtifactCount );
|
||||||
|
sb.append( ", totalArtifactFileSize=" ).append( totalArtifactFileSize );
|
||||||
|
sb.append( ", totalFileCount=" ).append( totalFileCount );
|
||||||
|
sb.append( ", totalGroupCount=" ).append( totalGroupCount );
|
||||||
|
sb.append( ", totalProjectCount=" ).append( totalProjectCount );
|
||||||
|
sb.append( ", newFileCount=" ).append( newFileCount );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ package org.apache.archiva.rest.api.services;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.archiva.admin.model.beans.ManagedRepository;
|
import org.apache.archiva.admin.model.beans.ManagedRepository;
|
||||||
|
import org.apache.archiva.rest.api.model.ArchivaRepositoryStatistics;
|
||||||
import org.apache.archiva.security.common.ArchivaRoleConstants;
|
import org.apache.archiva.security.common.ArchivaRoleConstants;
|
||||||
import org.codehaus.plexus.redback.authorization.RedbackAuthorization;
|
import org.codehaus.plexus.redback.authorization.RedbackAuthorization;
|
||||||
|
|
||||||
|
@ -87,5 +88,12 @@ public interface ManagedRepositoriesService
|
||||||
Boolean fileLocationExists( @QueryParam( "fileLocation" ) String fileLocation )
|
Boolean fileLocationExists( @QueryParam( "fileLocation" ) String fileLocation )
|
||||||
throws ArchivaRestServiceException;
|
throws ArchivaRestServiceException;
|
||||||
|
|
||||||
|
@Path( "getManagedRepositoryStatistics/{repositoryId}" )
|
||||||
|
@GET
|
||||||
|
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
|
||||||
|
@RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
|
||||||
|
ArchivaRepositoryStatistics getManagedRepositoryStatistics( @PathParam( "repositoryId" ) String repositoryId )
|
||||||
|
throws ArchivaRestServiceException;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,17 +18,26 @@ package org.apache.archiva.rest.services;
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import net.sf.beanlib.provider.replicator.BeanReplicator;
|
||||||
import org.apache.archiva.admin.model.RepositoryAdminException;
|
import org.apache.archiva.admin.model.RepositoryAdminException;
|
||||||
import org.apache.archiva.admin.model.RepositoryCommonValidator;
|
import org.apache.archiva.admin.model.RepositoryCommonValidator;
|
||||||
import org.apache.archiva.admin.model.beans.ManagedRepository;
|
import org.apache.archiva.admin.model.beans.ManagedRepository;
|
||||||
import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
|
import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
|
||||||
import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
|
import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
|
||||||
|
import org.apache.archiva.metadata.repository.MetadataRepository;
|
||||||
|
import org.apache.archiva.metadata.repository.MetadataRepositoryException;
|
||||||
|
import org.apache.archiva.metadata.repository.RepositorySession;
|
||||||
|
import org.apache.archiva.metadata.repository.RepositorySessionFactory;
|
||||||
|
import org.apache.archiva.metadata.repository.stats.RepositoryStatistics;
|
||||||
|
import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
|
||||||
|
import org.apache.archiva.rest.api.model.ArchivaRepositoryStatistics;
|
||||||
import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
|
import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
|
||||||
import org.apache.archiva.rest.api.services.ManagedRepositoriesService;
|
import org.apache.archiva.rest.api.services.ManagedRepositoriesService;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -52,6 +61,13 @@ public class DefaultManagedRepositoriesService
|
||||||
@Inject
|
@Inject
|
||||||
private RepositoryCommonValidator repositoryCommonValidator;
|
private RepositoryCommonValidator repositoryCommonValidator;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private RepositoryStatisticsManager repositoryStatisticsManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
@Named( value = "repositorySessionFactory" )
|
||||||
|
protected RepositorySessionFactory repositorySessionFactory;
|
||||||
|
|
||||||
|
|
||||||
public List<ManagedRepository> getManagedRepositories()
|
public List<ManagedRepository> getManagedRepositories()
|
||||||
throws ArchivaRestServiceException
|
throws ArchivaRestServiceException
|
||||||
|
@ -143,4 +159,37 @@ public class DefaultManagedRepositoriesService
|
||||||
String location = repositoryCommonValidator.removeExpressions( fileLocation );
|
String location = repositoryCommonValidator.removeExpressions( fileLocation );
|
||||||
return new File( location ).exists();
|
return new File( location ).exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ArchivaRepositoryStatistics getManagedRepositoryStatistics( String repositoryId )
|
||||||
|
throws ArchivaRestServiceException
|
||||||
|
{
|
||||||
|
RepositorySession repositorySession = repositorySessionFactory.createSession();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MetadataRepository metadataRepository = repositorySession.getRepository();
|
||||||
|
|
||||||
|
RepositoryStatistics stats = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
stats = repositoryStatisticsManager.getLastStatistics( metadataRepository, repositoryId );
|
||||||
|
}
|
||||||
|
catch ( MetadataRepositoryException e )
|
||||||
|
{
|
||||||
|
log.warn( "Error retrieving repository statistics: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
if ( stats != null )
|
||||||
|
{
|
||||||
|
ArchivaRepositoryStatistics archivaRepositoryStatistics =
|
||||||
|
new BeanReplicator().replicateBean( stats, ArchivaRepositoryStatistics.class );
|
||||||
|
|
||||||
|
return archivaRepositoryStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
repositorySession.close();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,14 +30,17 @@ import org.apache.archiva.rest.api.services.RemoteRepositoriesService;
|
||||||
import org.apache.archiva.rest.api.services.RepositoriesService;
|
import org.apache.archiva.rest.api.services.RepositoriesService;
|
||||||
import org.apache.archiva.rest.api.services.RepositoryGroupService;
|
import org.apache.archiva.rest.api.services.RepositoryGroupService;
|
||||||
import org.apache.archiva.rest.api.services.SearchService;
|
import org.apache.archiva.rest.api.services.SearchService;
|
||||||
|
import org.apache.archiva.security.common.ArchivaRoleConstants;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
|
import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
|
||||||
import org.apache.cxf.jaxrs.client.WebClient;
|
import org.apache.cxf.jaxrs.client.WebClient;
|
||||||
import org.codehaus.redback.rest.services.AbstractRestServicesTest;
|
import org.codehaus.redback.rest.services.AbstractRestServicesTest;
|
||||||
|
import org.junit.Before;
|
||||||
|
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Olivier Lamy
|
* @author Olivier Lamy
|
||||||
|
@ -57,6 +60,24 @@ public abstract class AbstractArchivaRestTest
|
||||||
|
|
||||||
// END SNIPPET: authz-header
|
// END SNIPPET: authz-header
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Before
|
||||||
|
public void startServer()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
File appServerBase = new File( System.getProperty( "appserver.base" ) );
|
||||||
|
|
||||||
|
File jcrDirectory = new File( appServerBase, "jcr" );
|
||||||
|
|
||||||
|
if ( jcrDirectory.exists() )
|
||||||
|
{
|
||||||
|
FileUtils.deleteDirectory( jcrDirectory );
|
||||||
|
}
|
||||||
|
|
||||||
|
super.startServer();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getSpringConfigLocation()
|
protected String getSpringConfigLocation()
|
||||||
{
|
{
|
||||||
|
@ -264,4 +285,40 @@ public abstract class AbstractArchivaRestTest
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void createAndIndexRepo( String testRepoId, String repoPath )
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
if ( getManagedRepositoriesService( authorizationHeader ).getManagedRepository( testRepoId ) != null )
|
||||||
|
{
|
||||||
|
getManagedRepositoriesService( authorizationHeader ).deleteManagedRepository( testRepoId, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
ManagedRepository managedRepository = new ManagedRepository();
|
||||||
|
managedRepository.setId( testRepoId );
|
||||||
|
managedRepository.setName( "test repo" );
|
||||||
|
|
||||||
|
managedRepository.setLocation( new File( repoPath ).getPath() );
|
||||||
|
managedRepository.setIndexDirectory(
|
||||||
|
System.getProperty( "java.io.tmpdir" ) + "/target/.index-" + Long.toString( new Date().getTime() ) );
|
||||||
|
|
||||||
|
ManagedRepositoriesService service = getManagedRepositoriesService( authorizationHeader );
|
||||||
|
service.addManagedRepository( managedRepository );
|
||||||
|
|
||||||
|
getRoleManagementService( authorizationHeader ).assignTemplatedRole(
|
||||||
|
ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, testRepoId, "admin" );
|
||||||
|
|
||||||
|
getRepositoriesService( authorizationHeader ).scanRepositoryNow( testRepoId, true );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void deleteTestRepo( String id )
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
if ( getManagedRepositoriesService( authorizationHeader ).getManagedRepository( id ) != null )
|
||||||
|
{
|
||||||
|
getManagedRepositoriesService( authorizationHeader ).deleteManagedRepository( id, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,9 @@ package org.apache.archiva.rest.services;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.archiva.admin.model.beans.ManagedRepository;
|
import org.apache.archiva.admin.model.beans.ManagedRepository;
|
||||||
|
import org.apache.archiva.rest.api.model.ArchivaRepositoryStatistics;
|
||||||
import org.apache.archiva.rest.api.services.ManagedRepositoriesService;
|
import org.apache.archiva.rest.api.services.ManagedRepositoriesService;
|
||||||
|
import org.apache.archiva.rest.api.services.RepositoriesService;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -96,5 +98,33 @@ public class ManagedRepositoriesServiceTest
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getManagedRepositoryStatistics()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
String testRepoId = "test-repo";
|
||||||
|
// force guest user creation if not exists
|
||||||
|
if ( getUserService( authorizationHeader ).getGuestUser() == null )
|
||||||
|
{
|
||||||
|
assertNotNull( getUserService( authorizationHeader ).createGuestUser() );
|
||||||
|
}
|
||||||
|
|
||||||
|
createAndIndexRepo( testRepoId, "src/test/repo-with-osgi" );
|
||||||
|
|
||||||
|
ManagedRepositoriesService service = getManagedRepositoriesService( authorizationHeader );
|
||||||
|
|
||||||
|
RepositoriesService repositoriesService = getRepositoriesService( authorizationHeader );
|
||||||
|
|
||||||
|
ArchivaRepositoryStatistics archivaRepositoryStatistics = service.getManagedRepositoryStatistics( testRepoId );
|
||||||
|
|
||||||
|
assertNotNull( archivaRepositoryStatistics );
|
||||||
|
|
||||||
|
log.info( "archivaRepositoryStatistics:" + archivaRepositoryStatistics.toString() );
|
||||||
|
|
||||||
|
assertEquals( 92, archivaRepositoryStatistics.getNewFileCount() );
|
||||||
|
assertEquals( 92, archivaRepositoryStatistics.getTotalFileCount() );
|
||||||
|
|
||||||
|
deleteTestRepo( testRepoId );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -358,42 +358,6 @@ public class SearchServiceTest
|
||||||
deleteTestRepo( testRepoId );
|
deleteTestRepo( testRepoId );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createAndIndexRepo( String testRepoId, String repoPath )
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
if ( getManagedRepositoriesService( authorizationHeader ).getManagedRepository( testRepoId ) != null )
|
|
||||||
{
|
|
||||||
getManagedRepositoriesService( authorizationHeader ).deleteManagedRepository( testRepoId, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
ManagedRepository managedRepository = new ManagedRepository();
|
|
||||||
managedRepository.setId( testRepoId );
|
|
||||||
managedRepository.setName( "test repo" );
|
|
||||||
|
|
||||||
managedRepository.setLocation( new File( repoPath ).getPath() );
|
|
||||||
managedRepository.setIndexDirectory( "target/.index-" + Long.toString( new Date().getTime() ) );
|
|
||||||
|
|
||||||
ManagedRepositoriesService service = getManagedRepositoriesService( authorizationHeader );
|
|
||||||
service.addManagedRepository( managedRepository );
|
|
||||||
|
|
||||||
getRoleManagementService( authorizationHeader ).assignTemplatedRole(
|
|
||||||
ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, testRepoId, "admin" );
|
|
||||||
|
|
||||||
getRepositoriesService( authorizationHeader ).scanRepositoryNow( testRepoId, true );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void deleteTestRepo( String id )
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
if ( getManagedRepositoriesService( authorizationHeader ).getManagedRepository( id ) != null )
|
|
||||||
{
|
|
||||||
getManagedRepositoriesService( authorizationHeader ).deleteManagedRepository( id, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue