]> source.dussan.org Git - archiva.git/blob
a2cb8e2f5632746aec0f6600835b405222508f58
[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.ArrayList;
42 import java.util.Collections;
43 import java.util.Date;
44 import java.util.List;
45 import java.util.Locale;
46 import java.util.Map;
47 import java.util.Set;
48
49 /**
50  * @author Olivier Lamy
51  * @since 1.4-M3
52  */
53 @Service( "systemStatusService#rest" )
54 public class DefaultSystemStatusService
55     extends AbstractRestService
56     implements SystemStatusService
57 {
58
59
60     private Map<String, TaskQueue> queues = null;
61
62     private Map<String, Cache> caches = null;
63
64     private RepositoryScanner scanner;
65
66
67     @Inject
68     public DefaultSystemStatusService( ApplicationContext applicationContext, RepositoryScanner scanner )
69     {
70         this.scanner = scanner;
71
72         queues = getBeansOfType( applicationContext, TaskQueue.class );
73
74         caches = getBeansOfType( applicationContext, Cache.class );
75     }
76
77     public String getMemoryStatus()
78         throws ArchivaRestServiceException
79     {
80         Runtime runtime = Runtime.getRuntime();
81         runtime.gc();
82         long total = runtime.totalMemory();
83         long used = total - runtime.freeMemory();
84         long max = runtime.maxMemory();
85         return formatMemory( used ) + "/" + formatMemory( total ) + " (Max: " + formatMemory( max ) + ")";
86     }
87
88     private static String formatMemory( long l )
89     {
90         return l / ( 1024 * 1024 ) + "M";
91     }
92
93     public String getCurrentServerTime( String locale )
94         throws ArchivaRestServiceException
95     {
96         SimpleDateFormat sdf = new SimpleDateFormat( "EEE, d MMM yyyy HH:mm:ss Z", new Locale( locale ) );
97         return sdf.format( new Date() );
98     }
99
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     public List<CacheEntry> getCacheEntries()
122         throws ArchivaRestServiceException
123     {
124         List<CacheEntry> cacheEntries = new ArrayList<CacheEntry>( caches.size() );
125         DecimalFormat decimalFormat = new DecimalFormat( "#%" );
126
127         for ( Map.Entry<String, Cache> entry : caches.entrySet() )
128         {
129             CacheStatistics cacheStatistics = entry.getValue().getStatistics();
130
131             cacheEntries.add( new CacheEntry( entry.getKey(), cacheStatistics.getSize(), cacheStatistics.getCacheHits(),
132                                               cacheStatistics.getCacheMiss(),
133                                               decimalFormat.format( cacheStatistics.getCacheHitRate() ).toString(),
134                                               cacheStatistics.getInMemorySize() ) );
135         }
136
137         Collections.sort( cacheEntries );
138
139         return cacheEntries;
140     }
141
142     public Boolean clearCache( String cacheKey )
143         throws ArchivaRestServiceException
144     {
145         Cache cache = caches.get( cacheKey );
146         if ( cache == null )
147         {
148             throw new ArchivaRestServiceException( "no cache for key: " + cacheKey,
149                                                    Response.Status.BAD_REQUEST.getStatusCode(), null );
150         }
151
152         cache.clear();
153         return Boolean.TRUE;
154     }
155
156     public Boolean clearAllCaches()
157         throws ArchivaRestServiceException
158     {
159         for ( Cache cache : caches.values() )
160         {
161             cache.clear();
162         }
163         return Boolean.TRUE;
164     }
165
166     public List<RepositoryScannerStatistics> getRepositoryScannerStatistics()
167         throws ArchivaRestServiceException
168     {
169         Set<RepositoryScannerInstance> repositoryScannerInstances = scanner.getInProgressScans();
170         if ( repositoryScannerInstances.isEmpty() )
171         {
172             return Collections.emptyList();
173         }
174         List<RepositoryScannerStatistics> repositoryScannerStatisticsList =
175             new ArrayList<RepositoryScannerStatistics>( repositoryScannerInstances.size() );
176
177         for ( RepositoryScannerInstance instance : repositoryScannerInstances )
178         {
179             RepositoryScannerStatistics repositoryScannerStatistics = new RepositoryScannerStatistics();
180             repositoryScannerStatisticsList.add( repositoryScannerStatistics );
181             repositoryScannerStatistics.setManagedRepository( instance.getRepository() );
182             repositoryScannerStatistics.setNewFileCount( instance.getStats().getNewFileCount() );
183             repositoryScannerStatistics.setTotalFileCount( instance.getStats().getTotalFileCount() );
184             repositoryScannerStatistics.setConsumerScanningStatistics( mapConsumerScanningStatistics( instance ) );
185         }
186
187         return repositoryScannerStatisticsList;
188     }
189
190     private List<ConsumerScanningStatistics> mapConsumerScanningStatistics( RepositoryScannerInstance instance )
191     {
192         DecimalFormat decimalFormat = new DecimalFormat( "###.##" );
193         if ( instance.getConsumerCounts() == null )
194         {
195             return Collections.emptyList();
196         }
197         List<ConsumerScanningStatistics> ret =
198             new ArrayList<ConsumerScanningStatistics>( instance.getConsumerCounts().size() );
199         for ( Map.Entry<String, Long> entry : instance.getConsumerCounts().entrySet() )
200         {
201             ConsumerScanningStatistics consumerScanningStatistics = new ConsumerScanningStatistics();
202             consumerScanningStatistics.setConsumerKey( entry.getKey() );
203             consumerScanningStatistics.setCount( entry.getValue() );
204             consumerScanningStatistics.setTime( instance.getConsumerTimings().get( entry.getKey() ) );
205             if ( consumerScanningStatistics.getCount() > 0 )
206             {
207                 consumerScanningStatistics.setAverage( decimalFormat.format(
208                     consumerScanningStatistics.getTime() / consumerScanningStatistics.getCount() ) );
209             }
210             ret.add( consumerScanningStatistics );
211         }
212         Collections.sort( ret, ConsumerScanningStatisticsComparator.INSTANCE );
213         return ret;
214     }
215 }