This project has retired. For details please refer to its Attic page.
DefaultMergedRemoteIndexesScheduler xref
View Javadoc
1   package org.apache.archiva.indexer.merger;
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.archiva.admin.model.beans.RepositoryGroup;
23  import org.apache.archiva.scheduler.MergedRemoteIndexesScheduler;
24  import org.apache.commons.lang.StringUtils;
25  import org.slf4j.Logger;
26  import org.slf4j.LoggerFactory;
27  import org.springframework.scheduling.TaskScheduler;
28  import org.springframework.scheduling.support.CronTrigger;
29  import org.springframework.stereotype.Service;
30  
31  import javax.inject.Inject;
32  import javax.inject.Named;
33  import java.nio.file.Path;
34  import java.util.List;
35  import java.util.Map;
36  import java.util.concurrent.ConcurrentHashMap;
37  import java.util.concurrent.ScheduledFuture;
38  
39  /**
40   * @author Olivier Lamy
41   * @since 2.0.0
42   */
43  @Service( "mergedRemoteIndexesScheduler#default" )
44  public class DefaultMergedRemoteIndexesScheduler
45      implements MergedRemoteIndexesScheduler
46  {
47  
48      private Logger logger = LoggerFactory.getLogger( getClass() );
49  
50      @Inject
51      @Named( value = "taskScheduler#mergeRemoteIndexes" )
52      private TaskScheduler taskScheduler;
53  
54      @Inject
55      private IndexMerger indexMerger;
56  
57      private Map<String, ScheduledFuture> scheduledFutureMap = new ConcurrentHashMap<>();
58  
59      @Override
60      public void schedule( RepositoryGroup repositoryGroup, Path directory )
61      {
62          if ( StringUtils.isEmpty( repositoryGroup.getCronExpression() ) )
63          {
64              return;
65          }
66          CronTrigger cronTrigger = new CronTrigger( repositoryGroup.getCronExpression() );
67  
68          List<String> repositories = repositoryGroup.getRepositories();
69  
70          IndexMergerRequest indexMergerRequest =
71              new IndexMergerRequest( repositories, true, repositoryGroup.getId(), repositoryGroup.getMergedIndexPath(),
72                                      repositoryGroup.getMergedIndexTtl() ).mergedIndexDirectory( directory );
73  
74          MergedRemoteIndexesTaskRequest taskRequest =
75              new MergedRemoteIndexesTaskRequest( indexMergerRequest, indexMerger );
76  
77          logger.info( "schedule merge remote index for group {} with cron {}", repositoryGroup.getId(),
78                       repositoryGroup.getCronExpression() );
79  
80          ScheduledFuture scheduledFuture =
81              taskScheduler.schedule( new MergedRemoteIndexesTask( taskRequest ), cronTrigger );
82          scheduledFutureMap.put( repositoryGroup.getId(), scheduledFuture );
83      }
84  
85      @Override
86      public void unschedule( RepositoryGroup repositoryGroup )
87      {
88          ScheduledFuture scheduledFuture = scheduledFutureMap.remove( repositoryGroup.getId() );
89          if ( scheduledFuture != null )
90          {
91              scheduledFuture.cancel( true );
92          }
93      }
94  }