1 package org.apache.archiva.scheduler.indexing;
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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
21 import org.apache.archiva.admin.model.RepositoryAdminException;
22 import org.apache.archiva.admin.model.beans.NetworkProxy;
23 import org.apache.archiva.admin.model.beans.RemoteRepository;
24 import org.apache.archiva.admin.model.networkproxy.NetworkProxyAdmin;
25 import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin;
26 import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
27 import org.apache.archiva.common.ArchivaException;
28 import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;
29 import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
30 import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
31 import org.apache.archiva.configuration.ArchivaConfiguration;
32 import org.apache.archiva.configuration.ConfigurationEvent;
33 import org.apache.archiva.configuration.ConfigurationListener;
34 import org.apache.archiva.proxy.common.WagonFactory;
35 import org.apache.commons.lang.StringUtils;
36 import org.apache.maven.index.NexusIndexer;
37 import org.apache.maven.index.context.IndexingContext;
38 import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;
39 import org.apache.maven.index.packer.IndexPacker;
40 import org.apache.maven.index.updater.IndexUpdater;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43 import org.springframework.scheduling.TaskScheduler;
44 import org.springframework.scheduling.support.CronTrigger;
45 import org.springframework.stereotype.Service;
47 import javax.annotation.PostConstruct;
48 import javax.annotation.PreDestroy;
49 import javax.inject.Inject;
50 import javax.inject.Named;
51 import java.io.IOException;
52 import java.util.Date;
53 import java.util.List;
54 import java.util.concurrent.CopyOnWriteArrayList;
57 * @author Olivier Lamy
60 @Service ("downloadRemoteIndexScheduler#default")
61 public class DefaultDownloadRemoteIndexScheduler
62 implements ConfigurationListener, DownloadRemoteIndexScheduler
65 private Logger log = LoggerFactory.getLogger( getClass() );
68 @Named (value = "taskScheduler#indexDownloadRemote")
69 private TaskScheduler taskScheduler;
72 private ArchivaConfiguration archivaConfiguration;
75 private WagonFactory wagonFactory;
78 private RemoteRepositoryAdmin remoteRepositoryAdmin;
81 private ProxyConnectorAdmin proxyConnectorAdmin;
84 private NetworkProxyAdmin networkProxyAdmin;
87 private PlexusSisuBridge plexusSisuBridge;
90 private MavenIndexerUtils mavenIndexerUtils;
92 private NexusIndexer nexusIndexer;
94 private IndexUpdater indexUpdater;
96 private IndexPacker indexPacker;
98 // store ids about currently running remote download : updated in DownloadRemoteIndexTask
99 private List<String> runningRemoteDownloadIds = new CopyOnWriteArrayList<String>();
102 public void startup()
103 throws ArchivaException, RepositoryAdminException, PlexusSisuBridgeException, IOException,
104 UnsupportedExistingLuceneIndexException, DownloadRemoteIndexException
106 archivaConfiguration.addListener( this );
107 // TODO add indexContexts even if null
109 nexusIndexer = plexusSisuBridge.lookup( NexusIndexer.class );
111 indexUpdater = plexusSisuBridge.lookup( IndexUpdater.class );
113 this.indexPacker = plexusSisuBridge.lookup( IndexPacker.class );
115 for ( RemoteRepository remoteRepository : remoteRepositoryAdmin.getRemoteRepositories() )
117 String contextKey = "remote-" + remoteRepository.getId();
118 IndexingContext context = nexusIndexer.getIndexingContexts().get( contextKey );
119 if ( context == null )
124 // TODO record jobs from configuration
125 if ( remoteRepository.isDownloadRemoteIndex() && StringUtils.isNotEmpty(
126 remoteRepository.getCronExpression() ) )
128 boolean fullDownload = context.getIndexDirectoryFile().list().length == 0;
129 scheduleDownloadRemote( remoteRepository.getId(), false, fullDownload );
137 public void shutdown()
138 throws RepositoryAdminException, IOException
140 for ( RemoteRepository remoteRepository : remoteRepositoryAdmin.getRemoteRepositories() )
142 String contextKey = "remote-" + remoteRepository.getId();
143 IndexingContext context = nexusIndexer.getIndexingContexts().get( contextKey );
144 if ( context == null )
148 nexusIndexer.removeIndexingContext( context, false );
152 public void configurationEvent( ConfigurationEvent event )
154 // TODO remove jobs and add again
158 public void scheduleDownloadRemote( String repositoryId, boolean now, boolean fullDownload )
159 throws DownloadRemoteIndexException
163 RemoteRepository remoteRepository = remoteRepositoryAdmin.getRemoteRepository( repositoryId );
164 if ( remoteRepository == null )
166 log.warn( "ignore scheduleDownloadRemote for repo with id {} as not exists", repositoryId );
169 NetworkProxy networkProxy = null;
170 if ( StringUtils.isNotBlank( remoteRepository.getRemoteDownloadNetworkProxyId() ) )
172 networkProxy = networkProxyAdmin.getNetworkProxy( remoteRepository.getRemoteDownloadNetworkProxyId() );
173 if ( networkProxy == null )
176 "your remote repository is configured to download remote index trought a proxy we cannot find id:{}",
177 remoteRepository.getRemoteDownloadNetworkProxyId() );
181 DownloadRemoteIndexTaskRequest downloadRemoteIndexTaskRequest =
182 new DownloadRemoteIndexTaskRequest().setRemoteRepository( remoteRepository ).setNetworkProxy(
183 networkProxy ).setFullDownload( fullDownload ).setWagonFactory(
184 wagonFactory ).setRemoteRepositoryAdmin( remoteRepositoryAdmin ).setIndexUpdater(
185 indexUpdater ).setIndexPacker( this.indexPacker );
189 log.info( "schedule download remote index for repository {}", remoteRepository.getId() );
191 taskScheduler.schedule(
192 new DownloadRemoteIndexTask( downloadRemoteIndexTaskRequest, this.runningRemoteDownloadIds ),
197 log.info( "schedule download remote index for repository {} with cron expression {}",
198 remoteRepository.getId(), remoteRepository.getCronExpression() );
201 CronTrigger cronTrigger = new CronTrigger( remoteRepository.getCronExpression() );
202 taskScheduler.schedule(
203 new DownloadRemoteIndexTask( downloadRemoteIndexTaskRequest, this.runningRemoteDownloadIds ),
206 catch ( IllegalArgumentException e )
208 log.warn( "Unable to schedule remote index download: " + e.getLocalizedMessage() );
211 if ( remoteRepository.isDownloadRemoteIndexOnStartup() )
214 "remote repository {} configured with downloadRemoteIndexOnStartup schedule now a download",
215 remoteRepository.getId() );
216 taskScheduler.schedule(
217 new DownloadRemoteIndexTask( downloadRemoteIndexTaskRequest, this.runningRemoteDownloadIds ),
223 catch ( RepositoryAdminException e )
225 log.error( e.getMessage(), e );
226 throw new DownloadRemoteIndexException( e.getMessage(), e );
230 public TaskScheduler getTaskScheduler()
232 return taskScheduler;
235 public void setTaskScheduler( TaskScheduler taskScheduler )
237 this.taskScheduler = taskScheduler;
240 public List<String> getRunningRemoteDownloadIds()
242 return runningRemoteDownloadIds;