View Javadoc

1   package org.apache.archiva.rest.services;
2   /*
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
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   * DefaultReportRepositoriesService
40   *
41   * @author Adrien Lecharpentier <adrien.lecharpentier@zenika.com>
42   * @since 1.4-M3
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 }