]> source.dussan.org Git - archiva.git/blob
89663e1b6d5123dc356e7a21b0a72a7af610a06c
[archiva.git] /
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.redback.components.cache.Cache;
22 import org.apache.archiva.redback.components.cache.CacheStatistics;
23 import org.apache.archiva.redback.components.taskqueue.TaskQueue;
24 import org.apache.archiva.redback.components.taskqueue.TaskQueueException;
25 import org.apache.archiva.repository.scanner.RepositoryScanner;
26 import org.apache.archiva.repository.scanner.RepositoryScannerInstance;
27 import org.apache.archiva.rest.api.model.CacheEntry;
28 import org.apache.archiva.rest.api.model.ConsumerScanningStatistics;
29 import org.apache.archiva.rest.api.model.QueueEntry;
30 import org.apache.archiva.rest.api.model.RepositoryScannerStatistics;
31 import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
32 import org.apache.archiva.rest.api.services.SystemStatusService;
33 import org.apache.archiva.rest.services.utils.ConsumerScanningStatisticsComparator;
34 import org.springframework.context.ApplicationContext;
35 import org.springframework.stereotype.Service;
36
37 import javax.inject.Inject;
38 import javax.ws.rs.core.Response;
39 import java.text.DecimalFormat;
40 import java.text.SimpleDateFormat;
41 import java.util.*;
42
43 /**
44  * @author Olivier Lamy
45  * @since 1.4-M3
46  */
47 @Service( "systemStatusService#rest" )
48 public class DefaultSystemStatusService
49     extends AbstractRestService
50     implements SystemStatusService
51 {
52
53
54     private Map<String, TaskQueue> queues = null;
55
56     private Map<String, Cache> caches = null;
57
58     private RepositoryScanner scanner;
59
60     // display spring scheduled
61     //@Inject @Named (value="springScheduler");
62
63
64     @Inject
65     public DefaultSystemStatusService( ApplicationContext applicationContext, RepositoryScanner scanner )
66     {
67         this.scanner = scanner;
68
69         queues = getBeansOfType( applicationContext, TaskQueue.class );
70
71         caches = getBeansOfType( applicationContext, Cache.class );
72     }
73
74     @Override
75     public String getMemoryStatus()
76         throws ArchivaRestServiceException
77     {
78         Runtime runtime = Runtime.getRuntime();
79
80         long total = runtime.totalMemory();
81         long used = total - runtime.freeMemory();
82         long max = runtime.maxMemory();
83         return formatMemory( used ) + "/" + formatMemory( total ) + " (Max: " + formatMemory( max ) + ")";
84     }
85
86     private static String formatMemory( long l )
87     {
88         return l / ( 1024 * 1024 ) + "M";
89     }
90
91     @Override
92     public String getCurrentServerTime( String locale )
93         throws ArchivaRestServiceException
94     {
95         SimpleDateFormat sdf = new SimpleDateFormat( "EEE, d MMM yyyy HH:mm:ss Z", new Locale( locale ) );
96         return sdf.format( new Date() );
97     }
98
99     @Override
100     public List<QueueEntry> getQueueEntries()
101         throws ArchivaRestServiceException
102     {
103         try
104         {
105             List<QueueEntry> queueEntries = new ArrayList<QueueEntry>( queues.size() );
106             for ( Map.Entry<String, TaskQueue> entry : queues.entrySet() )
107             {
108                 queueEntries.add( new QueueEntry( entry.getKey(), entry.getValue().getQueueSnapshot().size() ) );
109             }
110
111             return queueEntries;
112         }
113         catch ( TaskQueueException e )
114         {
115             log.error( e.getMessage(), e );
116             throw new ArchivaRestServiceException( e.getMessage(),
117                                                    Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );
118         }
119     }
120
121     @Override
122     public List<CacheEntry> getCacheEntries()
123         throws ArchivaRestServiceException
124     {
125         List<CacheEntry> cacheEntries = new ArrayList<CacheEntry>( caches.size() );
126         DecimalFormat decimalFormat = new DecimalFormat( "#%" );
127
128         for ( Map.Entry<String, Cache> entry : caches.entrySet() )
129         {
130             CacheStatistics cacheStatistics = entry.getValue().getStatistics();
131
132             cacheEntries.add( new CacheEntry( entry.getKey(), cacheStatistics.getSize(), cacheStatistics.getCacheHits(),
133                                               cacheStatistics.getCacheMiss(),
134                                               decimalFormat.format( cacheStatistics.getCacheHitRate() ).toString(),
135                                               cacheStatistics.getInMemorySize() ) );
136         }
137
138         Collections.sort( cacheEntries );
139
140         return cacheEntries;
141     }
142
143     @Override
144     public Boolean clearCache( String cacheKey )
145         throws ArchivaRestServiceException
146     {
147         Cache cache = caches.get( cacheKey );
148         if ( cache == null )
149         {
150             throw new ArchivaRestServiceException( "no cache for key: " + cacheKey,
151                                                    Response.Status.BAD_REQUEST.getStatusCode(), null );
152         }
153
154         cache.clear();
155         return Boolean.TRUE;
156     }
157
158     @Override
159     public Boolean clearAllCaches()
160         throws ArchivaRestServiceException
161     {
162         for ( Cache cache : caches.values() )
163         {
164             cache.clear();
165         }
166         return Boolean.TRUE;
167     }
168
169     @Override
170     public List<RepositoryScannerStatistics> getRepositoryScannerStatistics()
171         throws ArchivaRestServiceException
172     {
173         Set<RepositoryScannerInstance> repositoryScannerInstances = scanner.getInProgressScans();
174         if ( repositoryScannerInstances.isEmpty() )
175         {
176             return Collections.emptyList();
177         }
178         List<RepositoryScannerStatistics> repositoryScannerStatisticsList =
179             new ArrayList<RepositoryScannerStatistics>( repositoryScannerInstances.size() );
180
181         for ( RepositoryScannerInstance instance : repositoryScannerInstances )
182         {
183             RepositoryScannerStatistics repositoryScannerStatistics = new RepositoryScannerStatistics();
184             repositoryScannerStatisticsList.add( repositoryScannerStatistics );
185             repositoryScannerStatistics.setManagedRepository( instance.getRepository() );
186             repositoryScannerStatistics.setNewFileCount( instance.getStats().getNewFileCount() );
187             repositoryScannerStatistics.setTotalFileCount( instance.getStats().getTotalFileCount() );
188             repositoryScannerStatistics.setConsumerScanningStatistics( mapConsumerScanningStatistics( instance ) );
189         }
190
191         return repositoryScannerStatisticsList;
192     }
193
194     private List<ConsumerScanningStatistics> mapConsumerScanningStatistics( RepositoryScannerInstance instance )
195     {
196         DecimalFormat decimalFormat = new DecimalFormat( "###.##" );
197         if ( instance.getConsumerCounts() == null )
198         {
199             return Collections.emptyList();
200         }
201         List<ConsumerScanningStatistics> ret =
202             new ArrayList<ConsumerScanningStatistics>( instance.getConsumerCounts().size() );
203         for ( Map.Entry<String, Long> entry : instance.getConsumerCounts().entrySet() )
204         {
205             ConsumerScanningStatistics consumerScanningStatistics = new ConsumerScanningStatistics();
206             consumerScanningStatistics.setConsumerKey( entry.getKey() );
207             consumerScanningStatistics.setCount( entry.getValue() );
208             consumerScanningStatistics.setTime( instance.getConsumerTimings().get( entry.getKey() ) );
209             if ( consumerScanningStatistics.getCount() > 0 )
210             {
211                 consumerScanningStatistics.setAverage( decimalFormat.format(
212                     consumerScanningStatistics.getTime() / consumerScanningStatistics.getCount() ) );
213             }
214             ret.add( consumerScanningStatistics );
215         }
216         Collections.sort( ret, ConsumerScanningStatisticsComparator.INSTANCE );
217         return ret;
218     }
219 }