You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2021/07/11 17:23:40 UTC

[archiva] 02/04: New test for group handler

This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva.git

commit 678d0c98ea47b0a2fb866556ad2255f5bb30a01e
Author: Martin Stockhammer <ma...@apache.org>
AuthorDate: Tue Jul 6 20:46:51 2021 +0200

    New test for group handler
---
 .../archiva/repository/RepositoryHandler.java      |  14 +-
 .../base/group/RepositoryGroupHandler.java         |  11 +-
 .../base/managed/ManagedRepositoryHandler.java     |   4 +-
 .../base/group/RepositoryGroupHandlerTest.java     |  46 +++++
 .../repository/mock/RepositoryProviderMock.java    |  21 +-
 .../src/test/resources/archiva-group.xml           | 212 +++++++++++++++++++++
 .../src/test/resources/spring-context-group.xml    |  57 ++++++
 7 files changed, 348 insertions(+), 17 deletions(-)

diff --git a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java
index efd6c47..058fd65 100644
--- a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java
+++ b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryHandler.java
@@ -22,7 +22,6 @@ import org.apache.archiva.repository.validation.CheckedResult;
 import org.apache.archiva.repository.validation.RepositoryChecker;
 import org.apache.archiva.repository.validation.RepositoryValidator;
 import org.apache.archiva.repository.validation.ValidationError;
-import org.apache.archiva.repository.validation.ValidationResponse;
 
 import java.util.Collection;
 import java.util.List;
@@ -57,7 +56,7 @@ public interface RepositoryHandler<R extends Repository, C>
      * Initializes the repository. E.g. starts scheduling and activate additional processes.
      * @param repository the repository to initialize
      */
-    void initialize( R repository );
+    void activateRepository( R repository );
 
     /**
      * Creates new instances from the archiva configuration. The instances are not registered in the registry.
@@ -77,7 +76,7 @@ public interface RepositoryHandler<R extends Repository, C>
     R newInstance( RepositoryType type, String id ) throws RepositoryException;
 
     /**
-     * Creates a new instance and updates the given configuration object.
+     * Creates a new instance based on the given configuration instance. The instance is not activated and not registered.
      *
      * @param repositoryConfiguration the configuration instance
      * @return a newly created instance
@@ -152,10 +151,11 @@ public interface RepositoryHandler<R extends Repository, C>
     void remove( String id, Configuration configuration ) throws RepositoryException;
 
     /**
-     * Returns the repository with the given identifier or <code>null</code>, if it is not registered.
+     * Returns the repository with the given identifier or <code>null</code>, if no repository is registered
+     * with the given id.
      *
      * @param id the repository id
-     * @return if the retrieval failed
+     * @return the repository instance or <code>null</code>
      */
     R get( String id );
 
@@ -222,12 +222,12 @@ public interface RepositoryHandler<R extends Repository, C>
     boolean has( String id );
 
     /**
-     * Initializes
+     * Initializes the handler. This method must be called before using the repository handler.
      */
     void init( );
 
     /**
-     * Closes the handler
+     * Closes the handler. After closing, the repository handler instance is not usable anymore.
      */
     void close( );
 
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/group/RepositoryGroupHandler.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/group/RepositoryGroupHandler.java
index 560eb72..4036576 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/group/RepositoryGroupHandler.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/group/RepositoryGroupHandler.java
@@ -42,7 +42,6 @@ import org.apache.archiva.repository.storage.StorageAsset;
 import org.apache.archiva.repository.validation.RepositoryChecker;
 import org.apache.archiva.repository.validation.RepositoryValidator;
 import org.apache.archiva.repository.validation.ValidationError;
-import org.apache.archiva.repository.validation.ValidationResponse;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -125,7 +124,7 @@ public class RepositoryGroupHandler
         this.repositoryGroups.putAll( newInstancesFromConfig( ) );
         for ( RepositoryGroup group : this.repositoryGroups.values( ) )
         {
-            initialize( group );
+            activateRepository( group );
         }
     }
 
@@ -147,7 +146,7 @@ public class RepositoryGroupHandler
     }
 
     @Override
-    public void initialize( RepositoryGroup repositoryGroup )
+    public void activateRepository( RepositoryGroup repositoryGroup )
     {
         StorageAsset indexDirectory = getMergedIndexDirectory( repositoryGroup );
         if ( !indexDirectory.exists( ) )
@@ -296,7 +295,7 @@ public class RepositoryGroupHandler
                 configuration.addRepositoryGroup( newCfg );
                 configurationHandler.save( configuration, ConfigurationHandler.REGISTRY_EVENT_TAG );
                 setLastState( repositoryGroup, RepositoryState.SAVED );
-                initialize( repositoryGroup );
+                activateRepository( repositoryGroup );
             }
             finally
             {
@@ -357,7 +356,7 @@ public class RepositoryGroupHandler
                 configurationHandler.save( configuration, ConfigurationHandler.REGISTRY_EVENT_TAG );
                 updateReferences( currentRepository, repositoryGroupConfiguration );
                 setLastState( currentRepository, RepositoryState.REFERENCES_SET );
-                initialize( currentRepository );
+                activateRepository( currentRepository );
                 this.repositoryGroups.put( id, currentRepository );
                 setLastState( currentRepository, RepositoryState.REGISTERED );
             }
@@ -379,7 +378,7 @@ public class RepositoryGroupHandler
                     }
                     updateReferences( oldRepository, oldCfg  );
                     setLastState( oldRepository, RepositoryState.REFERENCES_SET );
-                    initialize( oldRepository );
+                    activateRepository( oldRepository );
                     repositoryGroups.put( id, oldRepository );
                     setLastState( oldRepository, RepositoryState.REGISTERED );
                 } else {
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java
index c7b10c6..6cfb228 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/base/managed/ManagedRepositoryHandler.java
@@ -77,13 +77,13 @@ implements RepositoryHandler<ManagedRepository, ManagedRepositoryConfiguration>
         this.managedRepositories.putAll( newInstancesFromConfig( ) );
         for ( ManagedRepository managedRepository : this.managedRepositories.values( ) )
         {
-            initialize( managedRepository );
+            activateRepository( managedRepository );
         }
 
     }
 
     @Override
-    public void initialize( ManagedRepository repository )
+    public void activateRepository( ManagedRepository repository )
     {
 
     }
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java
index 0043ee0..09c1c1d 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/base/group/RepositoryGroupHandlerTest.java
@@ -18,20 +18,66 @@ package org.apache.archiva.repository.base.group;
  * under the License.
  */
 
+import org.apache.archiva.configuration.ArchivaConfiguration;
+import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
+import org.apache.archiva.repository.Repository;
+import org.apache.archiva.repository.RepositoryRegistry;
+import org.apache.archiva.repository.base.ArchivaRepositoryRegistry;
+import org.apache.archiva.repository.base.ConfigurationHandler;
+import org.apache.archiva.repository.validation.RepositoryValidator;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * @author Martin Stockhammer <ma...@apache.org>
  */
+@ExtendWith( SpringExtension.class)
+@ContextConfiguration(locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context-group.xml" })
 class RepositoryGroupHandlerTest
 {
 
+    @Inject
+    @Named("repositoryRegistry")
+    ArchivaRepositoryRegistry repositoryRegistry;
+
+    @Inject
+    ConfigurationHandler configurationHandler;
+
+    @Inject
+    @Named( "mergedRemoteIndexesScheduler#default" )
+    MergedRemoteIndexesScheduler mergedRemoteIndexesScheduler;
+
+    @Inject
+    List<RepositoryValidator<? extends Repository>> repositoryValidatorList;
+
+    @Inject
+    ArchivaConfiguration archivaConfiguration;
+
+
+    private RepositoryGroupHandler createHandler() {
+        RepositoryGroupHandler groupHandler = new RepositoryGroupHandler( repositoryRegistry, configurationHandler, mergedRemoteIndexesScheduler, repositoryValidatorList );
+        groupHandler.init();
+        return groupHandler;
+    }
 
     @Test
     void initializeFromConfig( )
     {
+        RepositoryGroupHandler groupHandler = createHandler( );
+        assertNotNull( groupHandler );
+        groupHandler.initializeFromConfig();
+        assertEquals( 1, groupHandler.getAll( ).size( ) );
+        assertNotNull( groupHandler.get( "test-group-01" ).getRepositories( ) );
+        assertEquals( "internal", groupHandler.get( "test-group-01" ).getRepositories( ).get( 0 ).getId() );
     }
 
     @Test
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
index c98ba06..5a4c9f5 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
@@ -25,6 +25,7 @@ import org.apache.archiva.configuration.RepositoryGroupConfiguration;
 import org.apache.archiva.event.EventHandler;
 import org.apache.archiva.repository.*;
 import org.apache.archiva.event.Event;
+import org.apache.archiva.repository.base.group.BasicRepositoryGroup;
 import org.apache.archiva.repository.event.RepositoryEvent;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
 import org.apache.archiva.repository.features.IndexCreationFeature;
@@ -81,7 +82,15 @@ public class RepositoryProviderMock implements RepositoryProvider
 
     @Override
     public EditableRepositoryGroup createRepositoryGroup(String id, String name) {
-        return null;
+        try
+        {
+            return BasicRepositoryGroup.newFilesystemInstance( id, name, Paths.get( "target/groups" ) );
+        }
+        catch ( IOException e )
+        {
+            throw new RuntimeException( );
+        }
+
     }
 
     @Override
@@ -195,7 +204,15 @@ public class RepositoryProviderMock implements RepositoryProvider
 
     @Override
     public RepositoryGroup createRepositoryGroup(RepositoryGroupConfiguration configuration) throws RepositoryException {
-        return null;
+        EditableRepositoryGroup group = createRepositoryGroup( configuration.getId( ), configuration.getName( ) );
+        updateGroupInstance( group, configuration );
+        return group;
+    }
+
+    private void updateGroupInstance( EditableRepositoryGroup group, RepositoryGroupConfiguration configuration )
+    {
+        group.setMergedIndexTTL( configuration.getMergedIndexTtl() );
+        group.setSchedulingDefinition( configuration.getCronExpression() );
     }
 
     @Override
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/archiva-group.xml b/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/archiva-group.xml
new file mode 100644
index 0000000..693d106
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/archiva-group.xml
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<configuration>
+  <version>3.0.0</version>
+  <managedRepositories>
+    <managedRepository>
+      <id>internal</id>
+      <name>Archiva Managed Internal Repository</name>
+      <description>This is internal repository.</description>
+      <location>${appserver.base}/repositories/internal</location>
+      <indexDir>${appserver.base}/repositories/internal/.indexer</indexDir>
+      <layout>default</layout>
+      <releases>true</releases>
+      <snapshots>false</snapshots>
+      <blockRedeployments>true</blockRedeployments>
+      <scanned>true</scanned>
+      <refreshCronExpression>0 0 * * * ?</refreshCronExpression>
+      <retentionPeriod>30</retentionPeriod>
+    </managedRepository>
+    <managedRepository>
+      <id>staging</id>
+      <name>Repository with staging</name>
+      <description>This is repository with staging.</description>
+      <location>${appserver.base}/repositories/internal</location>
+      <indexDir>${appserver.base}/repositories/internal/.indexer</indexDir>
+      <layout>default</layout>
+      <releases>true</releases>
+      <snapshots>false</snapshots>
+      <blockRedeployments>true</blockRedeployments>
+      <scanned>true</scanned>
+      <refreshCronExpression>0 0 * * * ?</refreshCronExpression>
+      <retentionPeriod>30</retentionPeriod>
+      <stageRepoNeeded>true</stageRepoNeeded>
+    </managedRepository>
+    <managedRepository>
+      <id>snapshots</id>
+      <name>Archiva Managed Snapshot Repository</name>
+      <location>${appserver.base}/repositories/snapshots</location>
+      <indexDir>${appserver.base}/repositories/snapshots/.indexer</indexDir>
+      <layout>default</layout>
+      <releases>false</releases>
+      <snapshots>true</snapshots>
+      <blockRedeployments>false</blockRedeployments>
+      <scanned>true</scanned>
+      <refreshCronExpression>0 0\,30 * * * ?</refreshCronExpression>
+      <retentionPeriod>30</retentionPeriod>
+    </managedRepository>
+  </managedRepositories>
+  <remoteRepositories>
+    <remoteRepository>
+      <id>central</id>
+      <name>Central Repository</name>
+      <url>https://repo.maven.apache.org/maven2</url>
+      <layout>default</layout>
+      <timeout>35</timeout>
+    </remoteRepository>
+  </remoteRepositories>
+  <repositoryGroups>
+    <repositoryGroup>
+      <id>test-group-01</id>
+      <name>Test Group 01</name>
+      <type>MAVEN</type>
+      <repositories>
+        <repository>internal</repository>
+      </repositories>
+    </repositoryGroup>
+  </repositoryGroups>
+
+  <proxyConnectors>
+    <proxyConnector>
+      <sourceRepoId>internal</sourceRepoId>
+      <targetRepoId>central</targetRepoId>
+      <proxyId/>
+      <policies>
+        <snapshots>disabled</snapshots>
+        <releases>once</releases>
+        <checksum>fix</checksum>
+        <cache-failures>cached</cache-failures>
+      </policies>
+      <whiteListPatterns>
+        <whiteListPattern>**/*</whiteListPattern>
+      </whiteListPatterns>
+    </proxyConnector>
+  </proxyConnectors>
+
+  <legacyArtifactPaths>
+    <legacyArtifactPath>
+        <path>jaxen/jars/jaxen-1.0-FCS-full.jar</path>
+        <artifact>jaxen:jaxen:1.0-FCS:full:jar</artifact>
+    </legacyArtifactPath>
+  </legacyArtifactPaths>
+
+  <repositoryScanning>
+    <fileTypes>
+      <fileType>
+        <id>artifacts</id>
+        <patterns>
+          <pattern>**/*.pom</pattern>
+          <pattern>**/*.jar</pattern>
+          <pattern>**/*.ear</pattern>
+          <pattern>**/*.war</pattern>
+          <pattern>**/*.car</pattern>
+          <pattern>**/*.sar</pattern>
+          <pattern>**/*.mar</pattern>
+          <pattern>**/*.rar</pattern>
+          <pattern>**/*.dtd</pattern>
+          <pattern>**/*.tld</pattern>
+          <pattern>**/*.tar.gz</pattern>
+          <pattern>**/*.tar.bz2</pattern>
+          <pattern>**/*.zip</pattern>
+        </patterns>
+      </fileType>
+      <fileType>
+        <id>indexable-content</id>
+        <patterns>
+          <pattern>**/*.txt</pattern>
+          <pattern>**/*.TXT</pattern>
+          <pattern>**/*.block</pattern>
+          <pattern>**/*.config</pattern>
+          <pattern>**/*.pom</pattern>
+          <pattern>**/*.xml</pattern>
+          <pattern>**/*.xsd</pattern>
+          <pattern>**/*.dtd</pattern>
+          <pattern>**/*.tld</pattern>
+        </patterns>
+      </fileType>
+      <fileType>
+        <id>auto-remove</id>
+        <patterns>
+          <pattern>**/*.bak</pattern>
+          <pattern>**/*~</pattern>
+          <pattern>**/*-</pattern>
+        </patterns>
+      </fileType>
+      <fileType>
+        <id>ignored</id>
+        <patterns>
+          <pattern>**/.htaccess</pattern>
+          <pattern>**/KEYS</pattern>
+          <pattern>**/*.rb</pattern>
+          <pattern>**/*.sh</pattern>
+          <pattern>**/.svn/**</pattern>
+          <pattern>**/.DAV/**</pattern>
+          <pattern>.index/**</pattern>
+          <pattern>.indexer/**</pattern>
+        </patterns>
+      </fileType>
+    </fileTypes>
+    <knownContentConsumers>
+      <knownContentConsumer>create-missing-checksums</knownContentConsumer>
+      <knownContentConsumer>validate-checksum</knownContentConsumer>
+      <knownContentConsumer>validate-signature</knownContentConsumer>
+      <knownContentConsumer>index-content</knownContentConsumer>
+      <knownContentConsumer>auto-remove</knownContentConsumer>
+      <knownContentConsumer>auto-rename</knownContentConsumer>
+      <knownContentConsumer>metadata-updater</knownContentConsumer>
+      <knownContentConsumer>create-archiva-metadata</knownContentConsumer>
+      <knownContentConsumer>duplicate-artifacts</knownContentConsumer>
+      <!--knownContentConsumer>repository-purge</knownContentConsumer-->
+    </knownContentConsumers>
+    <invalidContentConsumers>
+      <invalidContentConsumer>update-db-bad-content</invalidContentConsumer>
+    </invalidContentConsumers>
+  </repositoryScanning>
+
+  <webapp>
+    <ui>
+      <showFindArtifacts>true</showFindArtifacts>
+      <appletFindEnabled>true</appletFindEnabled>
+    </ui>
+  </webapp>
+
+  <redbackRuntimeConfiguration>
+    <userManagerImpls>
+      <userManagerImpl>jpa</userManagerImpl>
+    </userManagerImpls>
+    <rbacManagerImpls>
+      <rbacManagerImpl>cached</rbacManagerImpl>
+    </rbacManagerImpls>
+  </redbackRuntimeConfiguration>
+
+  <archivaDefaultConfiguration>
+    <defaultCheckPaths>
+      <defaultCheckPath>
+        <url>http://download.oracle.com/maven</url>
+        <path>com/sleepycat/je/license.txt</path>
+      </defaultCheckPath>
+      <defaultCheckPath>
+        <url>https://download.oracle.com/maven</url>
+        <path>com/sleepycat/je/license.txt</path>
+      </defaultCheckPath>
+    </defaultCheckPaths>
+  </archivaDefaultConfiguration>
+
+</configuration>
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/spring-context-group.xml b/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/spring-context-group.xml
new file mode 100644
index 0000000..ccf6211
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/spring-context-group.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+           http://www.springframework.org/schema/beans/spring-beans.xsd
+           http://www.springframework.org/schema/context 
+           http://www.springframework.org/schema/context/spring-context.xsd"
+       default-lazy-init="true">
+
+  <context:annotation-config/>
+  <context:component-scan base-package="org.apache.archiva.repository.mock"/>
+
+
+  <bean name="commons-configuration" class="org.apache.archiva.components.registry.commons.CommonsConfigurationRegistry">
+    <property name="initialConfiguration">
+      <value>
+        <![CDATA[
+        <configuration>
+          <system/>
+          <xml fileName="archiva-group.xml" config-forceCreate="true"
+               config-optional="true"
+               config-name="org.apache.archiva.base" config-at="org.apache.archiva"/>
+        </configuration>
+        ]]>
+      </value>
+    </property>
+  </bean>
+
+
+  <bean name="taskScheduler#mergeRemoteIndexes"
+        class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
+    <property name="poolSize" value="4"/>
+    <property name="threadGroupName" value="mergeRemoteIndexes"/>
+  </bean>
+
+
+</beans>
\ No newline at end of file