1 package org.apache.archiva.rest.services;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import org.apache.archiva.metadata.repository.MetadataRepository;
22 import org.apache.archiva.metadata.repository.MetadataRepositoryException;
23 import org.apache.archiva.metadata.repository.RepositorySession;
24 import org.apache.archiva.metadata.repository.stats.RepositoryStatistics;
25 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
26 import org.apache.archiva.reports.RepositoryProblemFacet;
27 import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
28 import org.apache.archiva.rest.api.services.ReportRepositoriesService;
29 import org.apache.commons.lang.StringUtils;
30 import org.springframework.stereotype.Service;
31
32 import javax.inject.Inject;
33 import java.util.ArrayList;
34 import java.util.Collections;
35 import java.util.Date;
36 import java.util.List;
37
38
39
40
41
42
43
44 @Service( "reportRepositoriesService#rest" )
45 public class DefaultReportRepositoriesService
46 extends AbstractRestService
47 implements ReportRepositoriesService
48 {
49
50 private static final String ALL_REPOSITORIES = "all";
51
52 @Inject
53 private RepositoryStatisticsManager repositoryStatisticsManager;
54
55 public List<RepositoryStatistics> getStatisticsReport( List<String> repositoriesId, int rowCount, Date startDate,
56 Date endDate )
57 throws ArchivaRestServiceException
58 {
59 switch ( repositoriesId.size() )
60 {
61 case 0:
62 throw new ArchivaRestServiceException( "report.statistics.report.missing-repositories", null );
63 case 1:
64 return getUniqueRepositoryReport( repositoriesId.get( 0 ), rowCount, startDate, endDate );
65 default:
66 return getMultipleRepositoriesReport( repositoriesId, rowCount );
67 }
68 }
69
70 private List<RepositoryStatistics> getMultipleRepositoriesReport( List<String> repositoriesId, int rowCount )
71 {
72 RepositorySession repositorySession = repositorySessionFactory.createSession();
73 try
74 {
75 MetadataRepository metadataRepository = repositorySession.getRepository();
76 List<RepositoryStatistics> stats = new ArrayList<RepositoryStatistics>();
77 for ( String repo : repositoriesId )
78 {
79 try
80 {
81 stats.add( repositoryStatisticsManager.getLastStatistics( metadataRepository, repo ) );
82 }
83 catch ( MetadataRepositoryException e )
84 {
85 log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e );
86 }
87 }
88
89 return stats.subList( 0, stats.size() > rowCount ? rowCount : stats.size() );
90 }
91 finally
92 {
93 repositorySession.close();
94 }
95 }
96
97 private List<RepositoryStatistics> getUniqueRepositoryReport( String repositoryId, int rowCount, Date startDate,
98 Date endDate )
99 {
100 RepositorySession repositorySession = repositorySessionFactory.createSession();
101 try
102 {
103 MetadataRepository metadataRepository = repositorySession.getRepository();
104 List<RepositoryStatistics> stats = null;
105 try
106 {
107 stats = repositoryStatisticsManager.getStatisticsInRange( metadataRepository, repositoryId, startDate,
108 endDate );
109 }
110 catch ( MetadataRepositoryException e )
111 {
112 log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e );
113 }
114 if ( stats == null || stats.isEmpty() )
115 {
116 return Collections.<RepositoryStatistics>emptyList();
117 }
118
119 return stats.subList( 0, stats.size() > rowCount ? rowCount : stats.size() );
120 }
121 finally
122 {
123 repositorySession.close();
124 }
125 }
126
127 public List<RepositoryProblemFacet> getHealthReport( String repository, String groupId, int rowCount )
128 throws ArchivaRestServiceException
129 {
130 RepositorySession repositorySession = repositorySessionFactory.createSession();
131 try
132 {
133 List<String> observableRepositories = getObservableRepos();
134 if ( !ALL_REPOSITORIES.equals( repository ) && !observableRepositories.contains( repository ) )
135 {
136 throw new ArchivaRestServiceException(
137 "${$.i18n.prop('report.repository.illegal-access', " + repository + ")}", "repositoryId",
138 new IllegalAccessException() );
139 }
140
141 if ( !ALL_REPOSITORIES.equals( repository ) )
142 {
143 observableRepositories = Collections.<String>singletonList( repository );
144 }
145
146 List<RepositoryProblemFacet> problemArtifacts = new ArrayList<RepositoryProblemFacet>();
147 MetadataRepository metadataRepository = repositorySession.getRepository();
148 for ( String repoId : observableRepositories )
149 {
150 for ( String name : metadataRepository.getMetadataFacets( repoId, RepositoryProblemFacet.FACET_ID ) )
151 {
152 RepositoryProblemFacet metadataFacet =
153 (RepositoryProblemFacet) metadataRepository.getMetadataFacet( repoId,
154 RepositoryProblemFacet.FACET_ID,
155 name );
156 if ( StringUtils.isEmpty( groupId ) || groupId.equals( metadataFacet.getNamespace() ) )
157 {
158 problemArtifacts.add( metadataFacet );
159 }
160 }
161 }
162
163 return problemArtifacts;
164 }
165 catch ( MetadataRepositoryException e )
166 {
167 throw new ArchivaRestServiceException( e.getMessage(), e );
168 }
169 finally
170 {
171 repositorySession.close();
172 }
173 }
174 }