]> source.dussan.org Git - archiva.git/blob
e950143600cc8d5395b6961a7bb682d5d4f6b815
[archiva.git] /
1 package org.apache.maven.archiva.scheduler.executors;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.maven.archiva.common.consumers.Consumer;
23 import org.apache.maven.archiva.common.consumers.ConsumerException;
24 import org.apache.maven.archiva.common.consumers.ConsumerFactory;
25 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
26 import org.apache.maven.archiva.configuration.Configuration;
27 import org.apache.maven.archiva.configuration.ConfiguredRepositoryFactory;
28 import org.apache.maven.archiva.configuration.RepositoryConfiguration;
29 import org.apache.maven.archiva.discoverer.Discoverer;
30 import org.apache.maven.archiva.discoverer.DiscovererException;
31 import org.apache.maven.archiva.discoverer.DiscovererStatistics;
32 import org.apache.maven.archiva.scheduler.task.DataRefreshTask;
33 import org.apache.maven.artifact.repository.ArtifactRepository;
34 import org.codehaus.plexus.logging.AbstractLogEnabled;
35 import org.codehaus.plexus.taskqueue.Task;
36 import org.codehaus.plexus.taskqueue.execution.TaskExecutionException;
37 import org.codehaus.plexus.taskqueue.execution.TaskExecutor;
38
39 import java.io.IOException;
40 import java.util.ArrayList;
41 import java.util.Iterator;
42 import java.util.List;
43
44 /**
45  * DataRefreshExecutor 
46  *
47  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
48  * @version $Id$
49  * 
50  * @plexus.component role="org.codehaus.plexus.taskqueue.execution.TaskExecutor" 
51  *      role-hint="data-refresh"
52  */
53 public class DataRefreshExecutor
54     extends AbstractLogEnabled
55     implements TaskExecutor
56 {
57     public static final String DATAREFRESH_FILE = ".datarefresh";
58
59     /**
60      * Configuration store.
61      *
62      * @plexus.requirement
63      */
64     private ArchivaConfiguration archivaConfiguration;
65
66     /**
67      * @plexus.requirement
68      */
69     private ConfiguredRepositoryFactory repoFactory;
70
71     /**
72      * @plexus.requirement
73      */
74     private DataRefreshConsumers consumerNames;
75
76     /**
77      * @plexus.requirement
78      */
79     private Discoverer discoverer;
80
81     /**
82      * @plexus.requirement
83      */
84     private ConsumerFactory consumerFactory;
85
86     public void executeTask( Task task )
87         throws TaskExecutionException
88     {
89         DataRefreshTask indexerTask = (DataRefreshTask) task;
90
91         getLogger().info( "Executing task from queue with job name: " + indexerTask.getJobName() );
92
93         execute();
94     }
95
96     public void execute()
97         throws TaskExecutionException
98     {
99         Configuration configuration = archivaConfiguration.getConfiguration();
100
101         List consumers = new ArrayList();
102
103         for ( Iterator it = consumerNames.iterator(); it.hasNext(); )
104         {
105             String name = (String) it.next();
106             try
107             {
108                 Consumer consumer = consumerFactory.createConsumer( name );
109                 consumers.add( consumer );
110             }
111             catch ( ConsumerException e )
112             {
113                 getLogger().warn( e.getMessage(), e );
114                 throw new TaskExecutionException( e.getMessage(), e );
115             }
116         }
117
118         long time = System.currentTimeMillis();
119
120         for ( Iterator i = configuration.getRepositories().iterator(); i.hasNext(); )
121         {
122             RepositoryConfiguration repositoryConfiguration = (RepositoryConfiguration) i.next();
123
124             if ( !repositoryConfiguration.isIndexed() )
125             {
126                 continue;
127             }
128
129             ArtifactRepository repository = repoFactory.createRepository( repositoryConfiguration );
130
131             List filteredConsumers = filterConsumers( consumers, repository );
132
133             DiscovererStatistics lastRunStats = new DiscovererStatistics( repository );
134             try
135             {
136                 lastRunStats.load( DATAREFRESH_FILE );
137             }
138             catch ( IOException e )
139             {
140                 getLogger().info(
141                                   "Unable to load last run statistics for repository [" + repository.getId() + "]: "
142                                       + e.getMessage() );
143             }
144
145             try
146             {
147                 DiscovererStatistics stats = discoverer
148                     .walkRepository( repository, filteredConsumers, repositoryConfiguration.isIncludeSnapshots(),
149                                      lastRunStats.getTimestampFinished(), null, null );
150
151                 stats.dump( getLogger() );
152                 stats.save( DATAREFRESH_FILE );
153             }
154             catch ( DiscovererException e )
155             {
156                 getLogger().error(
157                                    "Unable to run data refresh against repository [" + repository.getId() + "]: "
158                                        + e.getMessage(), e );
159             }
160             catch ( IOException e )
161             {
162                 getLogger().warn(
163                                   "Unable to save last run statistics for repository [" + repository.getId() + "]: "
164                                       + e.getMessage() );
165             }
166         }
167
168         time = System.currentTimeMillis() - time;
169
170         getLogger().info( "Finished data refresh process in " + time + "ms." );
171     }
172
173     /**
174      * Not all consumers work with all repositories.
175      * This will filter out those incompatible consumers based on the provided repository.
176      * 
177      * @param consumers the initial list of consumers.
178      * @param repository the repository to test consumer against.
179      * @return the filtered list of consumers.
180      */
181     private List filterConsumers( List consumers, ArtifactRepository repository )
182     {
183         List filtered = new ArrayList();
184
185         for ( Iterator it = consumers.iterator(); it.hasNext(); )
186         {
187             Consumer consumer = (Consumer) it.next();
188             if ( consumer.init( repository ) )
189             {
190                 // Approved!
191                 filtered.add( consumer );
192             }
193             else
194             {
195                 getLogger().info( "Disabling consumer [" + consumer.getName() + "] for repository " + repository );
196             }
197         }
198
199         return filtered;
200     }
201 }