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 2018/03/24 16:46:28 UTC

[2/4] archiva git commit: Switching repository admin and dependent classes to RepositoryRegistry

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java
index 6c1a285..8df9883 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java
@@ -19,10 +19,14 @@ package org.apache.archiva.repository;
  * under the License.
  */
 
+import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.StagingRepositoryFeature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Locale;
 
@@ -35,8 +39,8 @@ import java.util.Locale;
 public class BasicManagedRepository extends AbstractManagedRepository
 
 {
+    Logger log = LoggerFactory.getLogger(BasicManagedRepository.class);
     ArtifactCleanupFeature artifactCleanupFeature = new ArtifactCleanupFeature(  );
-    IndexCreationFeature indexCreationFeature = new IndexCreationFeature(  );
     StagingRepositoryFeature stagingRepositoryFeature = new StagingRepositoryFeature( );
 
 
@@ -60,6 +64,7 @@ public class BasicManagedRepository extends AbstractManagedRepository
     }
 
     private void initFeatures() {
+        IndexCreationFeature indexCreationFeature = new IndexCreationFeature(this.getId(), this);
         addFeature( artifactCleanupFeature );
         addFeature( indexCreationFeature );
         addFeature( stagingRepositoryFeature );

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java
index 64b705c..70c38a5 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java
@@ -19,8 +19,13 @@ package org.apache.archiva.repository;
  * under the License.
  */
 
+import org.apache.archiva.indexer.ArchivaIndexingContext;
+import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Locale;
 
@@ -33,13 +38,17 @@ import java.util.Locale;
 public class BasicRemoteRepository extends AbstractRemoteRepository
 
 {
+    Logger log = LoggerFactory.getLogger(BasicRemoteRepository.class);
+
     RemoteIndexFeature remoteIndexFeature = new RemoteIndexFeature();
+    IndexCreationFeature indexCreationFeature = new IndexCreationFeature(true);
 
 
     static final StandardCapabilities CAPABILITIES = new StandardCapabilities( new ReleaseScheme[] {
         ReleaseScheme.RELEASE, ReleaseScheme.SNAPSHOT
     }, new String[] {"default"}, new String[0], new String[] {
-        RemoteIndexFeature.class.toString()
+        RemoteIndexFeature.class.toString(),
+            IndexCreationFeature.class.toString()
     }, true, true, true, true, true  );
 
     public BasicRemoteRepository( String id, String name, Path basePath )
@@ -56,6 +65,7 @@ public class BasicRemoteRepository extends AbstractRemoteRepository
 
     private void initFeatures() {
         addFeature( remoteIndexFeature );
+        addFeature( indexCreationFeature );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
index 557ee9e..17a08f7 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
@@ -26,24 +26,22 @@ import org.apache.archiva.configuration.ConfigurationListener;
 import org.apache.archiva.configuration.IndeterminateConfigurationException;
 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
-import org.apache.archiva.indexer.ArchivaIndexingContext;
-import org.apache.archiva.indexer.IndexManagerFactory;
+import org.apache.archiva.indexer.*;
 import org.apache.archiva.redback.components.registry.RegistryException;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
+import org.apache.archiva.repository.features.IndexCreationEvent;
+import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.StagingRepositoryFeature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.io.IOException;
+import java.util.*;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -58,7 +56,7 @@ import java.util.stream.Stream;
  * TODO: Audit events should be sent, but we don't want dependency to the repsitory-metadata-api
  */
 @Service( "repositoryRegistry" )
-public class RepositoryRegistry implements ConfigurationListener {
+public class RepositoryRegistry implements ConfigurationListener, RepositoryEventHandler, RepositoryEventListener {
 
     private static final Logger log = LoggerFactory.getLogger( RepositoryRegistry.class );
 
@@ -78,6 +76,7 @@ public class RepositoryRegistry implements ConfigurationListener {
     @Named("repositoryContentFactory#default")
     RepositoryContentFactory repositoryContentFactory;
 
+    private List<RepositoryEventListener> listeners = new ArrayList<>();
 
 
     private Map<String, ManagedRepository> managedRepositories = new HashMap<>( );
@@ -98,8 +97,15 @@ public class RepositoryRegistry implements ConfigurationListener {
         rwLock.writeLock( ).lock( );
         try
         {
+            log.debug("Initializing repository registry");
+            for(ManagedRepository rep : managedRepositories.values()) {
+                rep.close();
+            }
             managedRepositories.clear( );
             managedRepositories.putAll( getManagedRepositoriesFromConfig( ) );
+            for (RemoteRepository repo : remoteRepositories.values()) {
+                repo.close();
+            }
             remoteRepositories.clear( );
             remoteRepositories.putAll( getRemoteRepositoriesFromConfig( ) );
             // archivaConfiguration.addChangeListener(this);
@@ -111,6 +117,18 @@ public class RepositoryRegistry implements ConfigurationListener {
         }
     }
 
+    @PreDestroy
+    public void destroy() {
+        for(ManagedRepository rep : managedRepositories.values()) {
+            rep.close();
+        }
+        for (RemoteRepository repo : remoteRepositories.values()) {
+            repo.close();
+        }
+    }
+
+
+
     private Map<RepositoryType, RepositoryProvider> createProviderMap( )
     {
         Map<RepositoryType, RepositoryProvider> map = new HashMap<>( );
@@ -173,7 +191,9 @@ public class RepositoryRegistry implements ConfigurationListener {
 
     private ManagedRepository createNewManagedRepository( RepositoryProvider provider, ManagedRepositoryConfiguration cfg ) throws RepositoryException
     {
+        log.debug("Creating repo {}", cfg.getId());
         ManagedRepository repo = provider.createManagedInstance( cfg );
+        repo.addListener(this);
         updateRepositoryReferences( provider, repo, cfg , null);
         return repo;
 
@@ -181,6 +201,7 @@ public class RepositoryRegistry implements ConfigurationListener {
 
     private void updateRepositoryReferences(RepositoryProvider provider, ManagedRepository repo, ManagedRepositoryConfiguration cfg, Configuration configuration) throws RepositoryException
     {
+        log.debug("Updating references of repo {}",repo.getId());
         if ( repo.supportsFeature( StagingRepositoryFeature.class ) )
         {
             StagingRepositoryFeature feature = repo.getFeature( StagingRepositoryFeature.class ).get( );
@@ -194,9 +215,33 @@ public class RepositoryRegistry implements ConfigurationListener {
                 }
             }
         }
-        if ( repo instanceof EditableManagedRepository && repo.getContent() == null)
+        if ( repo instanceof EditableManagedRepository)
         {
-            ( (EditableManagedRepository) repo ).setContent( repositoryContentFactory.getManagedRepositoryContent( repo ) );
+            EditableManagedRepository editableRepo = (EditableManagedRepository) repo;
+            if (repo.getContent()==null) {
+                editableRepo.setContent(repositoryContentFactory.getManagedRepositoryContent(repo));
+            }
+            log.debug("Index repo: "+repo.hasIndex());
+            if (repo.hasIndex() && repo.getIndexingContext()==null) {
+                log.debug("Creating indexing context for {}", repo.getId());
+                createIndexingContext(editableRepo);
+            }
+        }
+
+    }
+
+    private ArchivaIndexManager getIndexManager(RepositoryType type) {
+        return indexManagerFactory.getIndexManager(type);
+    }
+
+    private void createIndexingContext(EditableRepository editableRepo) throws RepositoryException {
+        if (editableRepo.supportsFeature(IndexCreationFeature.class)) {
+            ArchivaIndexManager idxManager = getIndexManager(editableRepo.getType());
+            try {
+                editableRepo.setIndexingContext(idxManager.createContext(editableRepo));
+            } catch (IndexCreationFailedException e) {
+                throw new RepositoryException("Could not create index for repository "+editableRepo.getId()+": "+e.getMessage(),e);
+            }
         }
     }
 
@@ -263,7 +308,9 @@ public class RepositoryRegistry implements ConfigurationListener {
 
     private RemoteRepository createNewRemoteRepository( RepositoryProvider provider, RemoteRepositoryConfiguration cfg ) throws RepositoryException
     {
+        log.debug("Creating remote repo {}", cfg.getId());
         RemoteRepository repo = provider.createRemoteInstance( cfg );
+        repo.addListener(this);
         updateRepositoryReferences( provider, repo, cfg , null);
         return repo;
 
@@ -273,7 +320,13 @@ public class RepositoryRegistry implements ConfigurationListener {
     {
         if ( repo instanceof EditableRemoteRepository && repo.getContent() == null)
         {
-            ( (EditableRemoteRepository) repo ).setContent( repositoryContentFactory.getRemoteRepositoryContent( repo ) );
+            EditableRemoteRepository editableRepo = (EditableRemoteRepository) repo;
+            if (repo.getContent()==null) {
+                editableRepo.setContent( repositoryContentFactory.getRemoteRepositoryContent( repo ) );
+            }
+            if (repo.supportsFeature(IndexCreationFeature.class) && repo.getIndexingContext()==null ) {
+                createIndexingContext(editableRepo);
+            }
         }
     }
 
@@ -346,12 +399,15 @@ public class RepositoryRegistry implements ConfigurationListener {
         rwLock.readLock( ).lock( );
         try
         {
+            log.debug("getRepository {}", repoId);
             if ( managedRepositories.containsKey( repoId ) )
             {
+                log.debug("Managed repo");
                 return managedRepositories.get( repoId );
             }
             else
             {
+                log.debug("Remote repo");
                 return remoteRepositories.get( repoId );
             }
         }
@@ -422,6 +478,9 @@ public class RepositoryRegistry implements ConfigurationListener {
             ManagedRepository originRepo = managedRepositories.put( id, managedRepository );
             try
             {
+                if (originRepo!=null) {
+                    originRepo.close();
+                }
                 RepositoryProvider provider = getProvider( managedRepository.getType() );
                 ManagedRepositoryConfiguration newCfg = provider.getManagedConfiguration( managedRepository );
                 Configuration configuration = getArchivaConfiguration( ).getConfiguration( );
@@ -521,6 +580,7 @@ public class RepositoryRegistry implements ConfigurationListener {
             } else
             {
                 repo = getProvider( repoType ).createManagedInstance( managedRepositoryConfiguration );
+                repo.addListener(this);
                 managedRepositories.put(id, repo);
             }
             updateRepositoryReferences( getProvider( repoType  ), repo, managedRepositoryConfiguration, configuration );
@@ -563,6 +623,9 @@ public class RepositoryRegistry implements ConfigurationListener {
             RemoteRepositoryConfiguration newCfg=null;
             try
             {
+                if (originRepo!=null) {
+                    originRepo.close();
+                }
                 final RepositoryProvider provider = getProvider( remoteRepository.getType() );
                 newCfg = provider.getRemoteConfiguration( remoteRepository );
                 updateRepositoryReferences( provider, remoteRepository, newCfg, configuration );
@@ -698,6 +761,7 @@ public class RepositoryRegistry implements ConfigurationListener {
             } else
             {
                 repo = getProvider( repoType ).createRemoteInstance( remoteRepositoryConfiguration );
+                repo.addListener(this);
                 remoteRepositories.put(id, repo);
             }
             updateRepositoryReferences( getProvider( repoType  ), repo, remoteRepositoryConfiguration, configuration );
@@ -712,6 +776,12 @@ public class RepositoryRegistry implements ConfigurationListener {
 
     }
 
+    public void removeRepository(String repoId) throws RepositoryException {
+        Repository repo = getRepository(repoId);
+        if (repo!=null) {
+            removeRepository(repo);
+        }
+    }
     public void removeRepository(Repository repo) throws RepositoryException
     {
         if (repo instanceof RemoteRepository ) {
@@ -739,6 +809,7 @@ public class RepositoryRegistry implements ConfigurationListener {
             try {
                 repo = managedRepositories.remove( id );
                 if (repo!=null) {
+                    repo.close();
                     Configuration configuration = getArchivaConfiguration().getConfiguration();
                     ManagedRepositoryConfiguration cfg = configuration.findManagedRepositoryById( id );
                     if (cfg!=null) {
@@ -754,8 +825,7 @@ public class RepositoryRegistry implements ConfigurationListener {
                 log.error("Could not save config after repository removal: {}", e.getMessage(), e);
                 managedRepositories.put(repo.getId(), repo);
                 throw new RepositoryException( "Could not save configuration after repository removal: "+e.getMessage() );
-            }
-            finally
+            } finally
             {
                 rwLock.writeLock().unlock();
             }
@@ -771,13 +841,13 @@ public class RepositoryRegistry implements ConfigurationListener {
             try {
                 repo = managedRepositories.remove( id );
                 if (repo!=null) {
+                    repo.close();
                     ManagedRepositoryConfiguration cfg = configuration.findManagedRepositoryById( id );
                     if (cfg!=null) {
                         configuration.removeManagedRepository( cfg );
                     }
                 }
-            }
-            finally
+            } finally
             {
                 rwLock.writeLock().unlock();
             }
@@ -800,7 +870,9 @@ public class RepositoryRegistry implements ConfigurationListener {
             rwLock.writeLock().lock();
             try {
                 repo = remoteRepositories.remove( id );
+
                 if (repo!=null) {
+                    repo.close();
                     Configuration configuration = getArchivaConfiguration().getConfiguration();
                     RemoteRepositoryConfiguration cfg = configuration.findRemoteRepositoryById( id );
                     if (cfg!=null) {
@@ -816,8 +888,7 @@ public class RepositoryRegistry implements ConfigurationListener {
                 log.error("Could not save config after repository removal: {}", e.getMessage(), e);
                 remoteRepositories.put(repo.getId(), repo);
                 throw new RepositoryException( "Could not save configuration after repository removal: "+e.getMessage() );
-            }
-            finally
+            } finally
             {
                 rwLock.writeLock().unlock();
             }
@@ -833,13 +904,13 @@ public class RepositoryRegistry implements ConfigurationListener {
             try {
                 repo = remoteRepositories.remove( id );
                 if (repo!=null) {
+                    repo.close();
                     RemoteRepositoryConfiguration cfg = configuration.findRemoteRepositoryById( id );
                     if (cfg!=null) {
                         configuration.removeRemoteRepository( cfg );
                     }
                 }
-            }
-            finally
+            } finally
             {
                 rwLock.writeLock().unlock();
             }
@@ -854,6 +925,20 @@ public class RepositoryRegistry implements ConfigurationListener {
         initialize();
     }
 
+    /**
+     * Resets the indexing context of a given repository.
+     *
+     * @param repo
+     * @throws IndexUpdateFailedException
+     */
+    public void resetIndexingContext(Repository repo) throws IndexUpdateFailedException {
+        if (repo.hasIndex() && repo instanceof EditableRepository) {
+            EditableRepository eRepo = (EditableRepository) repo;
+            ArchivaIndexingContext newCtx = getIndexManager(repo.getType()).reset(repo.getIndexingContext());
+            eRepo.setIndexingContext(newCtx);
+        }
+    }
+
 
     /**
      * Creates a new repository instance with the same settings as this one. The cloned repository is not
@@ -871,6 +956,7 @@ public class RepositoryRegistry implements ConfigurationListener {
         ManagedRepositoryConfiguration cfg = provider.getManagedConfiguration(repo);
         cfg.setId(newId);
         ManagedRepository cloned = provider.createManagedInstance(cfg);
+        cloned.addListener(this);
         return cloned;
     }
 
@@ -900,6 +986,7 @@ public class RepositoryRegistry implements ConfigurationListener {
         RemoteRepositoryConfiguration cfg = provider.getRemoteConfiguration(repo);
         cfg.setId(newId);
         RemoteRepository cloned = provider.createRemoteInstance(cfg);
+        cloned.addListener(this);
         return cloned;
     }
 
@@ -910,5 +997,41 @@ public class RepositoryRegistry implements ConfigurationListener {
     }
 
 
+    @Override
+    public void addListener(RepositoryEventListener listener) {
+        if (!this.listeners.contains(listener)) {
+            this.listeners.add(listener);
+        }
+    }
+
+    @Override
+    public void removeListener(RepositoryEventListener listener) {
+        this.listeners.remove(listener);
+    }
+
+    @Override
+    public void clearListeners() {
+        this.listeners.clear();
+    }
 
+    @Override
+    public <T> void raise(RepositoryEvent<T> event) {
+        if (event.getType().equals(IndexCreationEvent.Index.URI_CHANGE)) {
+            if (managedRepositories.containsKey(event.getRepositoryId()) ||
+                    remoteRepositories.containsKey(event.getRepositoryId())) {
+                EditableRepository repo = (EditableRepository) getRepository(event.getRepositoryId());
+                if (repo != null && repo.getIndexingContext()!=null) {
+                    try {
+                        ArchivaIndexingContext newCtx = getIndexManager(repo.getType()).move(repo.getIndexingContext(), repo);
+                        repo.setIndexingContext(newCtx);
+                    } catch (IndexCreationFailedException e) {
+                        log.error("Could not move index to new directory {}", e.getMessage(), e);
+                    }
+                }
+            }
+        }
+        for(RepositoryEventListener listener : listeners) {
+            listener.raise(event);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/AbstractFeature.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/AbstractFeature.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/AbstractFeature.java
new file mode 100644
index 0000000..2f5831f
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/AbstractFeature.java
@@ -0,0 +1,66 @@
+package org.apache.archiva.repository.features;
+
+/*
+ * 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.
+ */
+
+import org.apache.archiva.repository.RepositoryEvent;
+import org.apache.archiva.repository.RepositoryEventListener;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class AbstractFeature {
+    private List<RepositoryEventListener> listener = new ArrayList<>();
+
+    AbstractFeature() {
+
+    }
+
+    AbstractFeature(RepositoryEventListener listener) {
+        this.listener.add(listener);
+    }
+
+    AbstractFeature(Collection<RepositoryEventListener> listeners) {
+        this.listener.addAll(listeners);
+    }
+
+    public void addListener(RepositoryEventListener listener) {
+        if (!this.listener.contains(listener)) {
+            this.listener.add(listener);
+        }
+        this.listener.add(listener);
+    }
+
+    public void removeListener(RepositoryEventListener listener) {
+        this.listener.remove(listener);
+    }
+
+    public void clearListeners() {
+        this.listener.clear();
+    }
+
+    protected void raiseEvent(RepositoryEvent event) {
+        for(RepositoryEventListener listr : listener) {
+            listr.raise(event);
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationEvent.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationEvent.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationEvent.java
new file mode 100644
index 0000000..f871dc9
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationEvent.java
@@ -0,0 +1,35 @@
+package org.apache.archiva.repository.features;
+
+/*
+ * 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.
+ */
+
+import org.apache.archiva.repository.RepositoryEvent;
+
+import java.net.URI;
+
+public class IndexCreationEvent extends RepositoryEvent<URI> {
+
+    public enum Index implements EventType {
+        URI_CHANGE
+    }
+
+    IndexCreationEvent(String repo, URI oldValue, URI value) {
+        super(Index.URI_CHANGE, repo, oldValue, value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java
index 9c6b70c..eaf532f 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java
@@ -20,26 +20,36 @@ package org.apache.archiva.repository.features;
  */
 
 
+import org.apache.archiva.repository.Repository;
+import org.apache.archiva.repository.RepositoryEventListener;
 import org.apache.commons.lang.StringUtils;
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.List;
 
 /**
  *
  * This feature provides some information about index creation.
  *
  */
-public class IndexCreationFeature implements RepositoryFeature<IndexCreationFeature> {
+public class IndexCreationFeature extends AbstractFeature implements RepositoryFeature<IndexCreationFeature>{
+
 
     private boolean skipPackedIndexCreation = false;
 
     private URI indexPath;
 
-    public IndexCreationFeature() {
+    private String repo;
+
+    public IndexCreationFeature(String repoId, RepositoryEventListener listener) {
+        super(listener);
+        this.repo = repoId;
         try
         {
-            this.indexPath = new URI(".indexer");
+            setIndexPath(new URI(".indexer"));
         }
         catch ( URISyntaxException e )
         {
@@ -89,7 +99,10 @@ public class IndexCreationFeature implements RepositoryFeature<IndexCreationFeat
      */
     public void setIndexPath( URI indexPath )
     {
+        URI oldVal = this.indexPath;
         this.indexPath = indexPath;
+        raiseEvent(new IndexCreationEvent(repo, oldVal, this.indexPath));
+
     }
 
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ArchivaIndexManagerMock.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ArchivaIndexManagerMock.java b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ArchivaIndexManagerMock.java
new file mode 100644
index 0000000..e81bcff
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ArchivaIndexManagerMock.java
@@ -0,0 +1,85 @@
+package org.apache.archiva.repository.mock;
+
+/*
+ * 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.
+ */
+
+import org.apache.archiva.indexer.ArchivaIndexManager;
+import org.apache.archiva.indexer.ArchivaIndexingContext;
+import org.apache.archiva.indexer.IndexCreationFailedException;
+import org.apache.archiva.indexer.IndexUpdateFailedException;
+import org.apache.archiva.repository.Repository;
+import org.apache.archiva.repository.RepositoryType;
+import org.springframework.stereotype.Service;
+
+import java.net.URI;
+import java.util.Collection;
+
+/**
+ * @author Martin Stockhammer <ma...@apache.org>
+ */
+@Service("archivaIndexManager#maven")
+public class ArchivaIndexManagerMock implements ArchivaIndexManager {
+
+
+
+    @Override
+    public void pack(ArchivaIndexingContext context) throws IndexUpdateFailedException {
+
+    }
+
+    @Override
+    public void scan(ArchivaIndexingContext context) throws IndexUpdateFailedException {
+
+    }
+
+    @Override
+    public void update(ArchivaIndexingContext context, boolean fullUpdate) throws IndexUpdateFailedException {
+
+    }
+
+    @Override
+    public void addArtifactsToIndex(ArchivaIndexingContext context, Collection<URI> artifactReference) throws IndexUpdateFailedException {
+
+    }
+
+    @Override
+    public void removeArtifactsFromIndex(ArchivaIndexingContext context, Collection<URI> artifactReference) throws IndexUpdateFailedException {
+
+    }
+
+    @Override
+    public boolean supportsRepository(RepositoryType type) {
+        return true;
+    }
+
+    @Override
+    public ArchivaIndexingContext createContext(Repository repository) throws IndexCreationFailedException {
+        return null;
+    }
+
+    @Override
+    public ArchivaIndexingContext reset(ArchivaIndexingContext context) throws IndexUpdateFailedException {
+        return null;
+    }
+
+    @Override
+    public ArchivaIndexingContext move(ArchivaIndexingContext context, Repository repo) throws IndexCreationFailedException {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
----------------------------------------------------------------------
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 d4a78a6..82e1047 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
@@ -21,18 +21,7 @@ package org.apache.archiva.repository.mock;
 
 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
-import org.apache.archiva.repository.BasicManagedRepository;
-import org.apache.archiva.repository.BasicRemoteRepository;
-import org.apache.archiva.repository.EditableManagedRepository;
-import org.apache.archiva.repository.EditableRemoteRepository;
-import org.apache.archiva.repository.ManagedRepository;
-import org.apache.archiva.repository.PasswordCredentials;
-import org.apache.archiva.repository.ReleaseScheme;
-import org.apache.archiva.repository.RemoteRepository;
-import org.apache.archiva.repository.RepositoryCredentials;
-import org.apache.archiva.repository.RepositoryException;
-import org.apache.archiva.repository.RepositoryProvider;
-import org.apache.archiva.repository.RepositoryType;
+import org.apache.archiva.repository.*;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
@@ -230,4 +219,8 @@ public class RepositoryProviderMock implements RepositoryProvider
         return configuration;
     }
 
+    @Override
+    public <T> void raise(RepositoryEvent<T> event) {
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml
index 2f2c624..66e6e5e 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/pom.xml
@@ -184,6 +184,12 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>archiva-maven2-indexer</artifactId>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
 
   <build>

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutor.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutor.java b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutor.java
index 1bab921..4893bcd 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutor.java
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutor.java
@@ -22,6 +22,8 @@ package org.apache.archiva.scheduler.indexing;
 
 import org.apache.archiva.admin.model.RepositoryAdminException;
 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
+import org.apache.archiva.indexer.ArchivaIndexingContext;
+import org.apache.archiva.indexer.UnsupportedBaseContextException;
 import org.apache.archiva.redback.components.taskqueue.Task;
 import org.apache.archiva.redback.components.taskqueue.execution.TaskExecutionException;
 import org.apache.archiva.redback.components.taskqueue.execution.TaskExecutor;
@@ -86,7 +88,16 @@ public class ArchivaIndexingTaskExecutor
         ArtifactIndexingTask indexingTask = (ArtifactIndexingTask) task;
 
         ManagedRepository repository = indexingTask.getRepository( );
-        IndexingContext context = indexingTask.getContext( );
+        ArchivaIndexingContext archivaContext = indexingTask.getContext( );
+        IndexingContext context = null;
+        try {
+            context = archivaContext.getBaseContext(IndexingContext.class);
+        } catch (UnsupportedBaseContextException e) {
+            throw new TaskExecutionException("Bad repository type.", e);
+        }
+        if (!nexusIndexer.getIndexingContexts().containsKey(context.getId())) {
+            nexusIndexer.addIndexingContext(context);
+        }
 
         if ( ArtifactIndexingTask.Action.FINISH.equals( indexingTask.getAction( ) )
             && indexingTask.isExecuteOnEntireRepo( ) )
@@ -117,9 +128,10 @@ public class ArchivaIndexingTaskExecutor
                         ( indexingTask.getResourceFile( ) == null
                             ? "none"
                             : indexingTask.getResourceFile( ) ) );
-                    context = managedRepositoryAdmin.createIndexContext( repository );
+                    archivaContext = repository.getIndexingContext();
+                    context = archivaContext.getBaseContext(IndexingContext.class);
                 }
-                catch ( RepositoryAdminException e )
+                catch ( UnsupportedBaseContextException e )
                 {
                     log.error( "Error occurred while creating context: {}", e.getMessage( ) );
                     throw new TaskExecutionException( "Error occurred while creating context: " + e.getMessage( ), e );

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArtifactIndexingTask.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArtifactIndexingTask.java b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArtifactIndexingTask.java
index d2ca16e..dcf7428 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArtifactIndexingTask.java
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArtifactIndexingTask.java
@@ -19,9 +19,9 @@ package org.apache.archiva.scheduler.indexing;
  * under the License.
  */
 
+import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.redback.components.taskqueue.Task;
 import org.apache.archiva.repository.ManagedRepository;
-import org.apache.maven.index.context.IndexingContext;
 
 import java.nio.file.Path;
 
@@ -42,7 +42,7 @@ public class ArtifactIndexingTask
 
     private final Action action;
 
-    private final IndexingContext context;
+    private final ArchivaIndexingContext context;
 
     private boolean executeOnEntireRepo = true;
 
@@ -52,7 +52,7 @@ public class ArtifactIndexingTask
     private boolean onlyUpdate = false;
 
     public ArtifactIndexingTask( ManagedRepository repository, Path resourceFile, Action action,
-                                 IndexingContext context )
+                                 ArchivaIndexingContext context )
     {
         this.repository = repository;
         this.resourceFile = resourceFile;
@@ -61,14 +61,14 @@ public class ArtifactIndexingTask
     }
 
     public ArtifactIndexingTask( ManagedRepository repository, Path resourceFile, Action action,
-                                 IndexingContext context, boolean executeOnEntireRepo )
+                                 ArchivaIndexingContext context, boolean executeOnEntireRepo )
     {
         this( repository, resourceFile, action, context );
         this.executeOnEntireRepo = executeOnEntireRepo;
     }
 
     public ArtifactIndexingTask( ManagedRepository repository, Path resourceFile, Action action,
-                                 IndexingContext context, boolean executeOnEntireRepo, boolean onlyUpdate )
+                                 ArchivaIndexingContext context, boolean executeOnEntireRepo, boolean onlyUpdate )
     {
         this( repository, resourceFile, action, context, executeOnEntireRepo );
         this.onlyUpdate = onlyUpdate;
@@ -111,7 +111,7 @@ public class ArtifactIndexingTask
         return repository;
     }
 
-    public IndexingContext getContext()
+    public ArchivaIndexingContext getContext()
     {
         return context;
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DefaultDownloadRemoteIndexScheduler.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DefaultDownloadRemoteIndexScheduler.java b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DefaultDownloadRemoteIndexScheduler.java
index b1f3955..d936bdd 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DefaultDownloadRemoteIndexScheduler.java
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DefaultDownloadRemoteIndexScheduler.java
@@ -29,7 +29,10 @@ import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
 import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.configuration.ConfigurationEvent;
 import org.apache.archiva.configuration.ConfigurationListener;
+import org.apache.archiva.indexer.UnsupportedBaseContextException;
 import org.apache.archiva.proxy.common.WagonFactory;
+import org.apache.archiva.repository.RepositoryRegistry;
+import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.index.NexusIndexer;
 import org.apache.maven.index.context.IndexingContext;
@@ -67,6 +70,9 @@ public class DefaultDownloadRemoteIndexScheduler
     private TaskScheduler taskScheduler;
 
     @Inject
+    RepositoryRegistry repositoryRegistry;
+
+    @Inject
     private ArchivaConfiguration archivaConfiguration;
 
     @Inject
@@ -95,24 +101,25 @@ public class DefaultDownloadRemoteIndexScheduler
 
     @PostConstruct
     public void startup()
-        throws ArchivaException, RepositoryAdminException, PlexusSisuBridgeException, IOException,
-        UnsupportedExistingLuceneIndexException, DownloadRemoteIndexException
-    {
+            throws ArchivaException, RepositoryAdminException, PlexusSisuBridgeException, IOException,
+            UnsupportedExistingLuceneIndexException, DownloadRemoteIndexException, UnsupportedBaseContextException {
         archivaConfiguration.addListener( this );
         // TODO add indexContexts even if null
 
-        for ( RemoteRepository remoteRepository : remoteRepositoryAdmin.getRemoteRepositories() )
+        for ( org.apache.archiva.repository.RemoteRepository remoteRepository : repositoryRegistry.getRemoteRepositories() )
         {
             String contextKey = "remote-" + remoteRepository.getId();
-            IndexingContext context = nexusIndexer.getIndexingContexts().get( contextKey );
+            IndexingContext context = remoteRepository.getIndexingContext().getBaseContext(IndexingContext.class);
             if ( context == null )
             {
                 continue;
             }
+            RemoteIndexFeature rif = remoteRepository.getFeature(RemoteIndexFeature.class).get();
+
 
             // TODO record jobs from configuration
-            if ( remoteRepository.isDownloadRemoteIndex() && StringUtils.isNotEmpty(
-                remoteRepository.getCronExpression() ) )
+            if ( rif.isDownloadRemoteIndex() && StringUtils.isNotEmpty(
+                remoteRepository.getSchedulingDefinition() ) )
             {
                 boolean fullDownload = context.getIndexDirectoryFile().list().length == 0;
                 scheduleDownloadRemote( remoteRepository.getId(), false, fullDownload );

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
index d0e6532..ebfcb55 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
@@ -22,9 +22,9 @@ package org.apache.archiva.scheduler.indexing;
 import junit.framework.TestCase;
 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
 import org.apache.archiva.common.utils.PathUtil;
-import org.apache.archiva.repository.BasicManagedRepository;
-import org.apache.archiva.repository.ManagedRepository;
-import org.apache.archiva.repository.ReleaseScheme;
+import org.apache.archiva.indexer.ArchivaIndexingContext;
+import org.apache.archiva.indexer.UnsupportedBaseContextException;
+import org.apache.archiva.repository.*;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
 import org.apache.maven.index.ArtifactInfo;
@@ -57,6 +57,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -76,10 +77,7 @@ public class ArchivaIndexingTaskExecutorTest
     private NexusIndexer indexer;
 
     @Inject
-    List<IndexCreator> indexCreators;
-
-    @Inject
-    ManagedRepositoryAdmin managedRepositoryAdmin;
+    RepositoryRegistry repositoryRegistry;
 
     @Inject
     private IndexUpdater indexUpdater;
@@ -99,7 +97,7 @@ public class ArchivaIndexingTaskExecutorTest
         repositoryConfig.setScanned( true );
         repositoryConfig.addActiveReleaseScheme( ReleaseScheme.RELEASE );
         repositoryConfig.removeActiveReleaseScheme( ReleaseScheme.SNAPSHOT );
-        managedRepositoryAdmin.createIndexContext( repositoryConfig );
+        repositoryRegistry.putRepository(repositoryConfig);
     }
 
     @After
@@ -112,6 +110,7 @@ public class ArchivaIndexingTaskExecutorTest
         {
             indexer.removeIndexingContext( indexingContext, true );
         }
+        repositoryRegistry.destroy();
         /*
         removeIndexingContext with true cleanup files.
         // delete created index in the repository
@@ -126,9 +125,12 @@ public class ArchivaIndexingTaskExecutorTest
         super.tearDown();
     }
 
-    protected IndexingContext getIndexingContext()
-    {
-        return indexer.getIndexingContexts().get( repositoryConfig.getId() );
+    protected IndexingContext getIndexingContext() throws UnsupportedBaseContextException {
+        Repository repo = repositoryRegistry.getRepository(repositoryConfig.getId());
+        assert repo != null;
+        ArchivaIndexingContext ctx = repo.getIndexingContext();
+        assert ctx != null;
+        return ctx.getBaseContext(IndexingContext.class);
     }
 
     @Test
@@ -139,12 +141,14 @@ public class ArchivaIndexingTaskExecutorTest
         Path artifactFile = basePath.resolve(
                                       "org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" );
 
+        ManagedRepository repo = repositoryRegistry.getManagedRepository(repositoryConfig.getId());
         ArtifactIndexingTask task =
             new ArtifactIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.ADD,
-                                      getIndexingContext() );
+                                      repo.getIndexingContext());
 
         indexingExecutor.executeTask( task );
 
+        Map<String, IndexingContext> ctxs = indexer.getIndexingContexts();
         BooleanQuery q = new BooleanQuery();
         q.add( indexer.constructQuery( MAVEN.GROUP_ID, new StringSearchExpression( "org.apache.archiva" ) ),
                BooleanClause.Occur.SHOULD );
@@ -152,17 +156,6 @@ public class ArchivaIndexingTaskExecutorTest
             indexer.constructQuery( MAVEN.ARTIFACT_ID, new StringSearchExpression( "archiva-index-methods-jar-test" ) ),
             BooleanClause.Occur.SHOULD );
 
-        if ( !indexer.getIndexingContexts().containsKey( repositoryConfig.getId() ) )
-        {
-            IndexingContext context = indexer.addIndexingContext( repositoryConfig.getId(), //
-                                                                  repositoryConfig.getId(), //
-                                                                  basePath.toFile(), //
-                                                                  basePath.resolve(".indexer" ).toFile()
-                                                                  //
-                , null, null, indexCreators );
-            context.setSearchable( true );
-        }
-
         FlatSearchRequest request = new FlatSearchRequest( q );
         FlatSearchResponse response = indexer.searchFlat( request );
 
@@ -187,9 +180,10 @@ public class ArchivaIndexingTaskExecutorTest
         Path artifactFile = basePath.resolve(
                                       "org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" );
 
+        ManagedRepository repo = repositoryRegistry.getManagedRepository(repositoryConfig.getId());
         ArtifactIndexingTask task =
             new ArtifactIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.ADD,
-                                      getIndexingContext() );
+                                      repo.getIndexingContext() );
 
         indexingExecutor.executeTask( task );
         indexingExecutor.executeTask( task );
@@ -201,7 +195,7 @@ public class ArchivaIndexingTaskExecutorTest
             indexer.constructQuery( MAVEN.ARTIFACT_ID, new StringSearchExpression( "archiva-index-methods-jar-test" ) ),
             BooleanClause.Occur.SHOULD );
 
-        IndexingContext ctx = indexer.getIndexingContexts().get( repositoryConfig.getId() );
+        IndexingContext ctx = getIndexingContext();
 
         IndexSearcher searcher = ctx.acquireIndexSearcher();
         TopDocs topDocs = searcher.search( q, null, 10 );
@@ -224,9 +218,10 @@ public class ArchivaIndexingTaskExecutorTest
         Path artifactFile = basePath.resolve(
                                       "org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" );
 
+        ManagedRepository repo = repositoryRegistry.getManagedRepository(repositoryConfig.getId());
         ArtifactIndexingTask task =
             new ArtifactIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.ADD,
-                                      getIndexingContext() );
+                                      repo.getIndexingContext() );
 
         // add artifact to index
         indexingExecutor.executeTask( task );
@@ -251,11 +246,11 @@ public class ArchivaIndexingTaskExecutorTest
 
         // remove added artifact from index
         task = new ArtifactIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.DELETE,
-                                         getIndexingContext() );
+                        repo.getIndexingContext());
         indexingExecutor.executeTask( task );
 
         task = new ArtifactIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.FINISH,
-                                         getIndexingContext() );
+                                         repo.getIndexingContext() );
         indexingExecutor.executeTask( task );
 
         q = new BooleanQuery();
@@ -301,16 +296,16 @@ public class ArchivaIndexingTaskExecutorTest
 
         Path artifactFile = basePath.resolve(
                                       "org/apache/archiva/archiva-index-methods-jar-test/1.0/archiva-index-methods-jar-test-1.0.jar" );
-
+        ManagedRepository repo = repositoryRegistry.getManagedRepository(repositoryConfig.getId());
         ArtifactIndexingTask task =
             new ArtifactIndexingTask( repositoryConfig, artifactFile, ArtifactIndexingTask.Action.ADD,
-                                      getIndexingContext() );
+                                      repo.getIndexingContext() );
         task.setExecuteOnEntireRepo( false );
 
         indexingExecutor.executeTask( task );
 
         task = new ArtifactIndexingTask( repositoryConfig, null, ArtifactIndexingTask.Action.FINISH,
-                                         getIndexingContext() );
+                                         repo.getIndexingContext() );
 
         task.setExecuteOnEntireRepo( false );
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTaskTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTaskTest.java b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTaskTest.java
index 0c80cd4..aeeaa67 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTaskTest.java
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTaskTest.java
@@ -21,11 +21,10 @@ package org.apache.archiva.scheduler.indexing;
 import org.apache.archiva.admin.model.beans.RemoteRepository;
 import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
 import org.apache.archiva.common.utils.FileUtils;
+import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
-import org.apache.maven.index.FlatSearchRequest;
-import org.apache.maven.index.FlatSearchResponse;
-import org.apache.maven.index.MAVEN;
-import org.apache.maven.index.NexusIndexer;
+import org.apache.maven.index.*;
+import org.apache.maven.index.context.IndexingContext;
 import org.apache.maven.index.expr.StringSearchExpression;
 import org.apache.maven.index_shaded.lucene.search.BooleanClause;
 import org.apache.maven.index_shaded.lucene.search.BooleanQuery;
@@ -77,12 +76,27 @@ public class DownloadRemoteIndexTaskTest
     DefaultDownloadRemoteIndexScheduler downloadRemoteIndexScheduler;
 
     @Inject
+    Indexer indexer;
+
+    @Inject
+    RepositoryRegistry repositoryRegistry;
+
+    @Inject
     NexusIndexer nexusIndexer;
 
     @Before
     public void initialize()
         throws Exception
     {
+        Path cfgFile = Paths.get("target/appserver-base/conf/archiva.xml");
+        if (Files.exists(cfgFile)) {
+            Files.delete(cfgFile);
+        }
+        try {
+            remoteRepositoryAdmin.deleteRemoteRepository("test-repo-re", null);
+        } catch (Exception e) {
+            // Ignore
+        }
         server = new Server( );
         serverConnector = new ServerConnector( server, new HttpConnectionFactory());
         server.addConnector( serverConnector );
@@ -108,7 +122,13 @@ public class DownloadRemoteIndexTaskTest
     public void tearDown()
         throws Exception
     {
-        server.stop();
+        if (server!=null) {
+            server.stop();
+        }
+        Path cfgFile = Paths.get("target/appserver-base/conf/archiva.xml");
+        if (Files.exists(cfgFile)) {
+            Files.delete(cfgFile);
+        }
     }
 
     @Test
@@ -121,23 +141,24 @@ public class DownloadRemoteIndexTaskTest
 
         downloadRemoteIndexScheduler.startup();
 
-        downloadRemoteIndexScheduler.scheduleDownloadRemote( "test-repo", true, true );
+        downloadRemoteIndexScheduler.scheduleDownloadRemote( "test-repo-re", true, true );
 
         ( (ThreadPoolTaskScheduler) downloadRemoteIndexScheduler.getTaskScheduler() ).getScheduledExecutor().awaitTermination(
             10, TimeUnit.SECONDS );
 
-        remoteRepositoryAdmin.deleteRemoteRepository( "test-repo", null );
+        remoteRepositoryAdmin.deleteRemoteRepository( "test-repo-re", null );
 
         // search
         BooleanQuery iQuery = new BooleanQuery();
-        iQuery.add( nexusIndexer.constructQuery( MAVEN.GROUP_ID, new StringSearchExpression( "commons-logging" ) ),
+        iQuery.add( indexer.constructQuery( MAVEN.GROUP_ID, new StringSearchExpression( "commons-logging" ) ),
                     BooleanClause.Occur.SHOULD );
 
+        remoteRepositoryAdmin.addRemoteRepository(remoteRepository,  null);
         FlatSearchRequest rq = new FlatSearchRequest( iQuery );
         rq.setContexts(
-            Arrays.asList( nexusIndexer.getIndexingContexts().get( "remote-" + getRemoteRepository().getId() ) ) );
+            Arrays.asList( repositoryRegistry.getRemoteRepository(remoteRepository.getId()).getIndexingContext().getBaseContext(IndexingContext.class) ) );
 
-        FlatSearchResponse response = nexusIndexer.searchFlat( rq );
+        FlatSearchResponse response = indexer.searchFlat(rq);
 
         log.info( "returned hit count:{}", response.getReturnedHitsCount() );
         assertThat( response.getReturnedHitsCount() ).isEqualTo( 8 );
@@ -155,9 +176,10 @@ public class DownloadRemoteIndexTaskTest
         remoteRepository.setName( "foo" );
         remoteRepository.setIndexDirectory( indexDirectory.toAbsolutePath().toString() );
         remoteRepository.setDownloadRemoteIndex( true );
-        remoteRepository.setId( "test-repo" );
+        remoteRepository.setId( "test-repo-re" );
         remoteRepository.setUrl( "http://localhost:" + port );
         remoteRepository.setRemoteIndexUrl( "http://localhost:" + port + "/index-updates/" );
+
         return remoteRepository;
     }
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/resources/spring-context.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/resources/spring-context.xml b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/resources/spring-context.xml
index fc6f65a..3c9ef40 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/resources/spring-context.xml
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/resources/spring-context.xml
@@ -25,7 +25,7 @@
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
        default-lazy-init="true">
 
-  <context:component-scan base-package="org.apache.archiva.repository.content.maven2" />
+  <context:component-scan base-package="org.apache.archiva.repository.content.maven2,org.apache.archiva.indexer.maven" />
 
   <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler">
     <property name="properties">

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/MockManagedRepositoryAdmin.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/MockManagedRepositoryAdmin.java b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/MockManagedRepositoryAdmin.java
index 22aea17..3f28ddd 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/MockManagedRepositoryAdmin.java
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/MockManagedRepositoryAdmin.java
@@ -121,16 +121,5 @@ public class MockManagedRepositoryAdmin
         this.archivaConfiguration = archivaConfiguration;
     }
 
-    @Override
-    public IndexingContext createIndexContext( ManagedRepository repository )
-        throws RepositoryAdminException
-    {
-        return null;
-    }
 
-    @Override
-    public IndexingContext createIndexContext( org.apache.archiva.repository.ManagedRepository repository ) throws RepositoryAdminException
-    {
-        return null;
-    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
index 74a963a..28c507e 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
@@ -439,7 +439,10 @@
             <include>**/*Tests.java</include>
             <include>**/*Test.java</include>
           </includes>
+          <!--
           <argLine>-Xms1024m -Xmx3072m -server -XX:MaxPermSize=256m @{jacocoproperty}</argLine>
+          -->
+          <argLine>-Xms1024m -Xmx3072m -server -XX:MaxPermSize=256m</argLine>
           <systemPropertyVariables>
             <appserver.base>${project.build.directory}/appserver-base</appserver.base>
             <plexus.home>${project.build.directory}/appserver-base</plexus.home>

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
index 155546d..eaf37c3 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
@@ -200,10 +200,9 @@ public class DefaultRepositoriesService
 
             org.apache.archiva.repository.ManagedRepository repository = repositoryRegistry.getManagedRepository( repositoryId );
 
-            IndexingContext context = managedRepositoryAdmin.createIndexContext( repository );
 
             ArtifactIndexingTask task =
-                new ArtifactIndexingTask( repository, null, ArtifactIndexingTask.Action.FINISH, context );
+                new ArtifactIndexingTask( repository, null, ArtifactIndexingTask.Action.FINISH, repository.getIndexingContext() );
 
             task.setExecuteOnEntireRepo( true );
             task.setOnlyUpdate( !fullScan );

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
index c055aee..c4247c0 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
@@ -448,7 +448,7 @@ public abstract class AbstractArchivaRestTest
 
         managedRepository.setLocation( Paths.get( repoPath ).toString() );
         managedRepository.setIndexDirectory(
-            System.getProperty( "java.io.tmpdir" ) + "/target/.index-" + Long.toString( new Date().getTime() ) );
+            System.getProperty( "java.io.tmpdir" ) + "/.index-" + Long.toString( new Date().getTime() ) );
 
         managedRepository.setStageRepoNeeded( stageNeeded );
         managedRepository.setSnapshots( true );

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/resources/log4j2-test.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/resources/log4j2-test.xml b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/resources/log4j2-test.xml
index 1c258ef..0da8a7f 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/resources/log4j2-test.xml
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/resources/log4j2-test.xml
@@ -24,17 +24,29 @@
     <Console name="console" target="SYSTEM_OUT">
       <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} [%L] [%t] %-5level %logger{3} - %msg%n}" />
     </Console>
+    <RollingRandomAccessFile name="rolling" fileName="/tmp/archiva.log"
+                             filePattern="/tmp/archiva-%d{yyyyMMdd}.log"
+                             immediateFlush="true" append="true">
+      <PatternLayout>
+        <pattern>%d [%t] %-5p %c %x - %m%n</pattern>
+      </PatternLayout>
+      <Policies>
+        <TimeBasedTriggeringPolicy />
+      </Policies>
+    </RollingRandomAccessFile>
   </appenders>
+
   <loggers>
 
     <logger name="org.apache.archiva.redback.rest.services" level="error"/>
     <logger name="JPOX" level="error"/>
     <logger name="org.apache.archiva.rest.services" level="info"/>
-    <logger name="org.springframework" level="error"/>
-    <logger name="org.apache.commons.configuration" level="error"/>
+    <logger name="org.springframework" level="info"/>
+    <logger name="org.apache.commons.configuration" level="info"/>
 
     <root level="info">
       <appender-ref ref="console"/>
+      <appender-ref ref="rolling" />
     </root>
   </loggers>
 </configuration>

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-security/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-security/pom.xml b/archiva-modules/archiva-web/archiva-security/pom.xml
index 913d6ed..6e6a1da 100644
--- a/archiva-modules/archiva-web/archiva-security/pom.xml
+++ b/archiva-modules/archiva-web/archiva-security/pom.xml
@@ -197,6 +197,11 @@
       <artifactId>xercesImpl</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>archiva-maven2-indexer</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <plugins>

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/AbstractSecurityTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/AbstractSecurityTest.java b/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/AbstractSecurityTest.java
index 25b0ed6..b58aae8 100644
--- a/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/AbstractSecurityTest.java
+++ b/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/AbstractSecurityTest.java
@@ -96,9 +96,8 @@ public abstract class AbstractSecurityTest
         repoConfig.setLocation( Paths.get( "target/test-repo/" + repoId ).toString() );
         if ( !archivaConfiguration.getConfiguration().getManagedRepositoriesAsMap().containsKey( repoId ) )
         {
-            archivaConfiguration.getConfiguration().addManagedRepository( repoConfig );
+            repositoryRegistry.putRepository( repoConfig );
         }
-        repositoryRegistry.reload();
 
         // Add repo roles to security.
         userRepos.createMissingRepositoryRoles( repoId );
@@ -152,6 +151,9 @@ public abstract class AbstractSecurityTest
         // Setup Guest User.
         User guestUser = createUser( USER_GUEST, "Guest User" );
         roleManager.assignRole( ArchivaRoleConstants.TEMPLATE_GUEST, guestUser.getUsername() );
+
+        repositoryRegistry.setArchivaConfiguration(archivaConfiguration);
+        repositoryRegistry.reload();
     }
 
     protected void restoreGuestInitialValues( String userId )

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/DefaultUserRepositoriesTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/DefaultUserRepositoriesTest.java b/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/DefaultUserRepositoriesTest.java
index cef6887..c92dc43 100644
--- a/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/DefaultUserRepositoriesTest.java
+++ b/archiva-modules/archiva-web/archiva-security/src/test/java/org/apache/archiva/security/DefaultUserRepositoriesTest.java
@@ -73,7 +73,7 @@ public class DefaultUserRepositoriesTest
 
         assertRepoIds( new String[]{ "central", "corporate" }, userRepos.getObservableRepositoryIds( USER_ALPACA ) );
         assertRepoIds( new String[]{ "coporate" }, userRepos.getObservableRepositoryIds( USER_GUEST ) );
-        assertRepoIds( new String[]{ "central", "internal", "corporate", "snapshots", "secret" },
+        assertRepoIds( new String[]{ "central", "internal","corporate", "snapshots", "secret" },
                        userRepos.getObservableRepositoryIds( USER_ADMIN ) );
 
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-web-common/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-web-common/pom.xml b/archiva-modules/archiva-web/archiva-web-common/pom.xml
index 92c056d..0f4d583 100644
--- a/archiva-modules/archiva-web/archiva-web-common/pom.xml
+++ b/archiva-modules/archiva-web/archiva-web-common/pom.xml
@@ -495,7 +495,10 @@
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
           <reuseForks>false</reuseForks>
+<!--
           <argLine>-Xms1024m -Xmx2048m -server -XX:MaxPermSize=256m @{jacocoproperty}</argLine>
+-->
+          <argLine>-Xms1024m -Xmx2048m -server -XX:MaxPermSize=256m</argLine>
           <systemPropertyVariables>
             <appserver.base>${project.build.directory}/appserver-base</appserver.base>
             <plexus.home>${project.build.directory}/appserver-base</plexus.home>

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-webdav/pom.xml
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/pom.xml b/archiva-modules/archiva-web/archiva-webdav/pom.xml
index adfa9ac..0dc99c9 100644
--- a/archiva-modules/archiva-web/archiva-webdav/pom.xml
+++ b/archiva-modules/archiva-web/archiva-webdav/pom.xml
@@ -257,6 +257,7 @@
       <artifactId>assertj-core</artifactId>
       <scope>test</scope>
     </dependency>
+
   </dependencies>
   <build>
     <plugins>

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
index ce2d851..1a65a35 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
@@ -142,8 +142,6 @@ public abstract class AbstractRepositoryServletTestCase
             createManagedRepository( REPOID_INTERNAL, "Internal Test Repo", repoRootInternal, true ) );
         repositoryRegistry.reload();
 
-        managedRepositoryAdmin.createIndexContext( managedRepositoryAdmin.getManagedRepository( REPOID_INTERNAL ) );
-
         config.getProxyConnectors().clear();
 
         config.getRemoteRepositories().clear();

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java
index a453021..90e13c4 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java
@@ -67,7 +67,7 @@ public class RepositoryServletBrowseTest
 
         // dumpResponse( response );
 
-        List<String> expectedLinks = Arrays.asList( ".indexer/", "commons-lang/", "net/", "org/" );
+        List<String> expectedLinks = Arrays.asList( "commons-lang/", "net/", "org/" );
 
         Document document = Jsoup.parse( response.getContentAsString() );
         Elements elements = document.getElementsByTag( "a" );

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java
index 4678950..62089c8 100644
--- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java
+++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java
@@ -20,10 +20,8 @@ package org.apache.archiva.metadata.repository.storage.maven2;
  */
 
 import org.apache.archiva.admin.model.RepositoryAdminException;
-import org.apache.archiva.admin.model.beans.ManagedRepository;
 import org.apache.archiva.admin.model.beans.NetworkProxy;
 import org.apache.archiva.admin.model.beans.ProxyConnector;
-import org.apache.archiva.admin.model.beans.RemoteRepository;
 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
 import org.apache.archiva.admin.model.networkproxy.NetworkProxyAdmin;
 import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin;
@@ -45,9 +43,10 @@ import org.apache.archiva.model.SnapshotVersion;
 import org.apache.archiva.policies.ProxyDownloadException;
 import org.apache.archiva.proxy.common.WagonFactory;
 import org.apache.archiva.proxy.model.RepositoryProxyConnectors;
-import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.archiva.repository.*;
 import org.apache.archiva.repository.content.PathParser;
-import org.apache.archiva.repository.LayoutException;
+import org.apache.archiva.repository.features.RepositoryFeature;
+import org.apache.archiva.repository.features.StagingRepositoryFeature;
 import org.apache.archiva.xml.XMLException;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
@@ -99,10 +98,7 @@ public class Maven2RepositoryStorage
     private ModelBuilder builder;
 
     @Inject
-    private RemoteRepositoryAdmin remoteRepositoryAdmin;
-
-    @Inject
-    private ManagedRepositoryAdmin managedRepositoryAdmin;
+    RepositoryRegistry repositoryRegistry;
 
     @Inject
     private ProxyConnectorAdmin proxyConnectorAdmin;
@@ -155,8 +151,9 @@ public class Maven2RepositoryStorage
     {
         try
         {
-            ManagedRepository managedRepository =
-                managedRepositoryAdmin.getManagedRepository( readMetadataRequest.getRepositoryId() );
+            ManagedRepository managedRepository = repositoryRegistry.getManagedRepository(readMetadataRequest.getRepositoryId());
+            boolean isReleases = managedRepository.getActiveReleaseSchemes().contains(ReleaseScheme.RELEASE);
+            boolean isSnapshots = managedRepository.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT);
             String artifactVersion = readMetadataRequest.getProjectVersion();
             // olamy: in case of browsing via the ui we can mix repos (parent of a SNAPSHOT can come from release repo)
             if ( !readMetadataRequest.isBrowsingRequest() )
@@ -164,7 +161,7 @@ public class Maven2RepositoryStorage
                 if ( VersionUtil.isSnapshot( artifactVersion ) )
                 {
                     // skygo trying to improve speed by honoring managed configuration MRM-1658
-                    if ( managedRepository.isReleases() && !managedRepository.isSnapshots() )
+                    if ( isReleases && !isSnapshots )
                     {
                         throw new RepositoryStorageRuntimeException( "lookforsnaponreleaseonly",
                                                                      "managed repo is configured for release only" );
@@ -172,7 +169,7 @@ public class Maven2RepositoryStorage
                 }
                 else
                 {
-                    if ( !managedRepository.isReleases() && managedRepository.isSnapshots() )
+                    if ( !isReleases && isSnapshots)
                     {
                         throw new RepositoryStorageRuntimeException( "lookforsreleaseonsneponly",
                                                                      "managed repo is configured for snapshot only" );
@@ -231,7 +228,7 @@ public class Maven2RepositoryStorage
                 for ( ProxyConnector proxyConnector : proxyConnectors )
                 {
                     RemoteRepository remoteRepoConfig =
-                        remoteRepositoryAdmin.getRemoteRepository( proxyConnector.getTargetRepoId() );
+                        repositoryRegistry.getRemoteRepository( proxyConnector.getTargetRepoId() );
 
                     if ( remoteRepoConfig != null )
                     {
@@ -253,7 +250,7 @@ public class Maven2RepositoryStorage
             // can have released parent pom
             if ( readMetadataRequest.isBrowsingRequest() )
             {
-                remoteRepositories.addAll( remoteRepositoryAdmin.getRemoteRepositories() );
+                remoteRepositories.addAll( repositoryRegistry.getRemoteRepositories() );
             }
 
             ModelBuildingRequest req =
@@ -516,16 +513,9 @@ public class Maven2RepositoryStorage
     private Path getRepositoryBasedir( String repoId )
         throws RepositoryStorageRuntimeException
     {
-        try
-        {
-            ManagedRepository repositoryConfiguration = managedRepositoryAdmin.getManagedRepository( repoId );
+        ManagedRepository repositoryConfiguration = repositoryRegistry.getManagedRepository( repoId );
 
-            return Paths.get( repositoryConfiguration.getLocation() );
-        }
-        catch ( RepositoryAdminException e )
-        {
-            throw new RepositoryStorageRuntimeException( "repo-admin", e.getMessage(), e );
-        }
+        return Paths.get( repositoryConfiguration.getLocation() );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java
index b769fb2..a6c3c24 100644
--- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java
+++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java
@@ -19,9 +19,7 @@ package org.apache.archiva.metadata.repository.storage.maven2;
  * under the License.
  */
 
-import org.apache.archiva.admin.model.beans.ManagedRepository;
 import org.apache.archiva.admin.model.beans.NetworkProxy;
-import org.apache.archiva.admin.model.beans.RemoteRepository;
 import org.apache.archiva.common.utils.VersionUtil;
 import org.apache.archiva.maven2.metadata.MavenMetadataReader;
 import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
@@ -30,8 +28,13 @@ import org.apache.archiva.model.SnapshotVersion;
 import org.apache.archiva.proxy.common.WagonFactory;
 import org.apache.archiva.proxy.common.WagonFactoryException;
 import org.apache.archiva.proxy.common.WagonFactoryRequest;
+import org.apache.archiva.repository.ManagedRepository;
+import org.apache.archiva.repository.RemoteRepository;
+import org.apache.archiva.repository.RepositoryCredentials;
+import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.archiva.xml.XMLException;
 import org.apache.commons.lang.StringUtils;
+import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.maven.model.Repository;
 import org.apache.maven.model.building.FileModelSource;
 import org.apache.maven.model.building.ModelSource;
@@ -53,6 +56,7 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.time.temporal.ChronoUnit;
 import java.util.List;
 import java.util.Map;
 
@@ -228,15 +232,15 @@ public class RepositoryModelResolver
         Path tmpSha1 = null;
         Path tmpResource = null;
         String artifactPath = pathTranslator.toPath( groupId, artifactId, version, filename );
-        Path resource = Paths.get( targetRepository.getLocation(), artifactPath );
+        Path resource = Paths.get(targetRepository.getLocation()).resolve( artifactPath );
 
-        Path workingDirectory = createWorkingDirectory( targetRepository.getLocation() );
+        Path workingDirectory = createWorkingDirectory( targetRepository.getLocation().toString() );
         try
         {
             Wagon wagon = null;
             try
             {
-                String protocol = getProtocol( remoteRepository.getUrl() );
+                String protocol = getProtocol( remoteRepository.getLocation().toString() );
                 final NetworkProxy networkProxy = this.networkProxyMap.get( remoteRepository.getId() );
 
                 wagon = wagonFactory.getWagon(
@@ -357,7 +361,7 @@ public class RepositoryModelResolver
             networkProxy.setPassword( proxyConnector.getPassword() );
 
             String msg = "Using network proxy " + networkProxy.getHost() + ":" + networkProxy.getPort()
-                + " to connect to remote repository " + remoteRepository.getUrl();
+                + " to connect to remote repository " + remoteRepository.getLocation();
             if ( networkProxy.getNonProxyHosts() != null )
             {
                 msg += "; excluding hosts: " + networkProxy.getNonProxyHosts();
@@ -372,19 +376,24 @@ public class RepositoryModelResolver
         }
 
         AuthenticationInfo authInfo = null;
-        String username = remoteRepository.getUserName();
-        String password = remoteRepository.getPassword();
+        RepositoryCredentials creds = remoteRepository.getLoginCredentials();
+        String username = "";
+        String password = "";
+        if (creds instanceof UsernamePasswordCredentials) {
+            UsernamePasswordCredentials c = (UsernamePasswordCredentials) creds;
+            username = c.getUserName();
+            password = c.getPassword();
+        }
 
         if ( StringUtils.isNotBlank( username ) && StringUtils.isNotBlank( password ) )
         {
-            log.debug( "Using username {} to connect to remote repository {}", username, remoteRepository.getUrl() );
+            log.debug( "Using username {} to connect to remote repository {}", username, remoteRepository.getLocation() );
             authInfo = new AuthenticationInfo();
             authInfo.setUserName( username );
             authInfo.setPassword( password );
         }
 
-        // Convert seconds to milliseconds
-        int timeoutInMilliseconds = remoteRepository.getTimeout() * 1000;
+        int timeoutInMilliseconds = ((int)remoteRepository.getTimeout().getSeconds())*1000;
         // FIXME olamy having 2 config values
         // Set timeout
         wagon.setReadTimeout( timeoutInMilliseconds );
@@ -393,7 +402,7 @@ public class RepositoryModelResolver
         try
         {
             org.apache.maven.wagon.repository.Repository wagonRepository =
-                new org.apache.maven.wagon.repository.Repository( remoteRepository.getId(), remoteRepository.getUrl() );
+                new org.apache.maven.wagon.repository.Repository( remoteRepository.getId(), remoteRepository.getLocation().toString() );
             if ( networkProxy != null )
             {
                 wagon.connect( wagonRepository, authInfo, networkProxy );