further work on FELIX-1355, also tidied up repository preferences as part of FELIX-1649


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@990188 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/sigil/eclipse/core/plugin.xml b/sigil/eclipse/core/plugin.xml
index 18487fd..8e61c12 100644
--- a/sigil/eclipse/core/plugin.xml
+++ b/sigil/eclipse/core/plugin.xml
@@ -65,7 +65,7 @@
    <extension
          point="org.eclipse.core.runtime.preferences">
       <initializer
-            class="org.apache.felix.sigil.eclipse.preferences.SigilPreferencesInitializer">
+            class="org.apache.felix.sigil.eclipse.internal.preferences.SigilPreferencesInitializer">
       </initializer>
    </extension>
    <extension
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java
index cfefb58..4cfbbc6 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/SigilCore.java
@@ -44,14 +44,14 @@
 import org.apache.felix.sigil.eclipse.internal.install.OSGiInstallManager;
 import org.apache.felix.sigil.eclipse.internal.model.project.SigilModelRoot;
 import org.apache.felix.sigil.eclipse.internal.model.project.SigilProject;
-import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryConfiguration;
+import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryPreferences;
 import org.apache.felix.sigil.eclipse.internal.repository.eclipse.GlobalRepositoryManager;
 import org.apache.felix.sigil.eclipse.internal.repository.manager.RepositoryMap;
 import org.apache.felix.sigil.eclipse.internal.resources.ProjectResourceListener;
 import org.apache.felix.sigil.eclipse.internal.resources.SigilProjectManager;
 import org.apache.felix.sigil.eclipse.model.project.ISigilModelRoot;
 import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryConfiguration;
+import org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences;
 import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
 import org.eclipse.core.resources.ICommand;
 import org.eclipse.core.resources.IProject;
@@ -145,7 +145,7 @@
     private ServiceTracker descriptorTracker;
     private ServiceTracker registryTracker;
     private ServiceTracker serializerTracker;
-    private static IRepositoryConfiguration repositoryConfig;
+    private static IRepositoryPreferences repositoryPrefs;
     private static SigilProjectManager projectManager;
     private static OSGiInstallManager installs;
     private static ISigilModelRoot modelRoot;
@@ -270,7 +270,7 @@
 
         modelRoot = new SigilModelRoot();
 
-        repositoryConfig = new RepositoryConfiguration();
+        repositoryPrefs = new RepositoryPreferences();
 
         installs = new OSGiInstallManager();
 
@@ -428,23 +428,24 @@
         if ( model == null ) return globalRepositoryManager;
         try
         {
-            return model.getRepositoryManager(repositoryMap);
+            return projectManager.getRepositoryManager(model, repositoryMap);
         }
         catch (CoreException e)
         {
-            warn("Failed to build repository manager for " + model, e);
+            SigilCore.error("Failed to read repository config", e);
             return globalRepositoryManager;
-        }
+        }        
     }
 
-    public static IRepositoryConfiguration getRepositoryConfiguration()
+    public static IRepositoryPreferences getRepositoryPreferences()
     {
-        return repositoryConfig;
+        return repositoryPrefs;
     }
 
     public static void rebuildAllBundleDependencies(IProgressMonitor monitor)
     {
         Collection<ISigilProjectModel> projects = getRoot().getProjects();
+        
         if (!projects.isEmpty())
         {
             SubMonitor progress = SubMonitor.convert(monitor, projects.size() * 20);
@@ -480,7 +481,7 @@
     {
         try
         {
-            dependent.resetClasspath(progress.newChild(10));
+            dependent.resetClasspath(progress.newChild(10), false);
             dependent.getProject().build(IncrementalProjectBuilder.FULL_BUILD,
                 progress.newChild(10));
         }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java
index 3c8a5eb..97fe428 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilModelRoot.java
@@ -93,7 +93,7 @@
                         else if (element instanceof ILibraryImport)
                         {
                             ILibraryImport l = (ILibraryImport) element;
-                            ILibrary lib = SigilCore.getRepositoryManager(sigil).resolveLibrary(
+                            ILibrary lib = sigil.getRepositoryManager().resolveLibrary(
                                 l);
 
                             if (lib != null)
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
index 2bbd0ef..1138a84 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/SigilProject.java
@@ -51,9 +51,7 @@
 import org.apache.felix.sigil.common.repository.ResolutionException;
 import org.apache.felix.sigil.eclipse.PathUtil;
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.internal.repository.manager.EclipseRepositoryManager;
 import org.apache.felix.sigil.eclipse.job.ThreadProgressMonitor;
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap;
 import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
 import org.apache.felix.sigil.eclipse.model.util.JavaHelper;
 import org.apache.felix.sigil.eclipse.progress.ProgressAdapter;
@@ -178,7 +176,7 @@
     {
         SubMonitor progress = SubMonitor.convert(monitor, 100);
 
-        IRepositoryManager manager = SigilCore.getRepositoryManager(this);
+        IRepositoryManager manager = getRepositoryManager();
         ResolutionConfig config = new ResolutionConfig(ResolutionConfig.INCLUDE_OPTIONAL
             | ResolutionConfig.IGNORE_ERRORS);
 
@@ -444,8 +442,12 @@
         return "SigilProject[" + getSymbolicName() + ":" + getVersion() + "]";
     }
 
-    public void resetClasspath(IProgressMonitor monitor) throws CoreException
+    public void resetClasspath(IProgressMonitor monitor, boolean forceResolve) throws CoreException
     {
+        if (forceResolve) {
+            processRequirementsChanges(monitor);
+        }
+        
         Path containerPath = new Path(SigilCore.CLASSPATH_CONTAINER_PATH);
         IJavaProject java = getJavaModel();
         ClasspathContainerInitializer init = JavaCore.getClasspathContainerInitializer(SigilCore.CLASSPATH_CONTAINER_PATH);
@@ -493,7 +495,7 @@
                     IRequiredBundle rb = (IRequiredBundle) element;
                     try
                     {
-                        IRepositoryManager manager = SigilCore.getRepositoryManager(SigilProject.this);
+                        IRepositoryManager manager = SigilProject.this.getRepositoryManager();
                         ResolutionConfig config = new ResolutionConfig(
                             ResolutionConfig.IGNORE_ERRORS);
                         IResolution res = manager.getBundleResolver().resolve(rb, config,
@@ -683,12 +685,6 @@
         }
     }
     
-    public IRepositoryManager getRepositoryManager(IRepositoryMap repositoryMap) throws CoreException {
-        IRepositoryConfig config = getRepositoryConfig();
-        config = new EclipseRepositoryConfig(config);
-        return new EclipseRepositoryManager(config, repositoryMap);
-    }
-    
     public boolean isInBundleClasspath(IPackageFragment root) throws JavaModelException
     {
         if (getBundle().getClasspathEntrys().isEmpty())
@@ -712,4 +708,12 @@
             return getBundle().getClasspathEntrys().contains(enc.trim());
         }
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel#getRepositoryManager()
+     */
+    public IRepositoryManager getRepositoryManager()
+    {
+        return SigilCore.getRepositoryManager(this);
+    }
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryConfiguration.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java
similarity index 73%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryConfiguration.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java
index 4a8366e..7eb22f3 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryConfiguration.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryPreferences.java
@@ -23,6 +23,8 @@
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
@@ -30,11 +32,9 @@
 import java.util.UUID;
 
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryConfiguration;
+import org.apache.felix.sigil.eclipse.model.repository.IRepositoryPreferences;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositorySet;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
-import org.apache.felix.sigil.eclipse.model.repository.RepositorySet;
 import org.apache.felix.sigil.eclipse.preferences.PrefsUtils;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -48,19 +48,21 @@
 import org.eclipse.swt.graphics.Image;
 import org.osgi.framework.Bundle;
 
-public class RepositoryConfiguration implements IRepositoryConfiguration
+public class RepositoryPreferences implements IRepositoryPreferences
 {
 
     private static final String REPOSITORY = "repository.";
-    private static final String REPOSITORY_SET = REPOSITORY + "set.";
-    private static final String REPOSITORY_SETS = REPOSITORY + "sets";
-    private static final String REPOSITORY_TIMESTAMP = REPOSITORY + "timestamp";
+    private static final String REPOSITORY_ORDER = REPOSITORY + "order";
     private static final String INSTANCES = ".instances";
     private static final String NAME = ".name";
     private static final String LOC = ".loc";
     private static final String TIMESTAMP = ".timestamp";
 
-    public static final String REPOSITORY_DEFAULT_SET = REPOSITORY + "default.set";
+    private static final HashMap<String, String> migrationTable = new HashMap<String, String>();
+    
+    static {
+        migrationTable.put("org.apache.felix.sigil.core.file", "filesystem");
+    }
 
     public List<IRepositoryModel> loadRepositories()
     {
@@ -91,6 +93,27 @@
             }
 
         }
+        
+        final List<String> order = PrefsUtils.stringToList(prefs.getString(REPOSITORY_ORDER));
+        
+        Collections.sort(repositories, new Comparator<IRepositoryModel>() {
+            public int compare(IRepositoryModel o1, IRepositoryModel o2)
+            {
+                int i1 = order.indexOf(o1.getId());
+                int i2 = order.indexOf(o2.getId());
+                
+                if ( i1 < i2 ) {
+                    return -1;
+                }
+                else if ( i1 > i2 ) {
+                    return 1;
+                }
+                else {
+                    return 0;
+                }
+            }
+            
+        });
 
         return repositories;
     }
@@ -118,9 +141,23 @@
         saveRepositoryPreferences(repositories, mapped);
         createNewEntries(mapped, prefs);
         deleteOldEntries(repositories, prefs);
-        // time stamp is used as a signal to the manager
-        // to update its view of the stored repositories
-        timeStamp(prefs);
+        // do this last as it is a signal to preferences
+        // listeners to read repo config
+        setRepositoryOrder(repositories, prefs);
+    }
+
+    /**
+     * @param repositories
+     * @param prefs
+     */
+    private void setRepositoryOrder(List<IRepositoryModel> repositories,
+        IPreferenceStore prefs)
+    {        
+        ArrayList<String> ids = new ArrayList<String>();
+        for(IRepositoryModel model : repositories) {
+            ids.add(model.getId());
+        }
+        prefs.setValue(REPOSITORY_ORDER, PrefsUtils.listToString(ids));
     }
 
     public List<RepositoryType> loadRepositoryTypes()
@@ -139,7 +176,7 @@
                 String type = c.getAttribute("type");
                 boolean dynamic = Boolean.valueOf(c.getAttribute("dynamic"));
                 String icon = c.getAttribute("icon");
-                String provider = c.getAttribute("alias");
+                String provider = c.getAttribute("alias");                
                 Image image = (icon == null || icon.trim().length() == 0) ? null
                     : loadImage(e, icon);
                 repositories.add(new RepositoryType(id, provider, type, dynamic, image));
@@ -159,117 +196,6 @@
         return element;
     }
 
-    public IRepositorySet getDefaultRepositorySet()
-    {
-        ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
-        for (String s : PrefsUtils.stringToArray(getPreferences().getString(
-            REPOSITORY_DEFAULT_SET)))
-        {
-            IRepositoryModel rep = findRepository(s);
-            if (rep == null)
-            {
-                SigilCore.error("Missing repository for " + s);
-            }
-            else
-            {
-                reps.add(rep);
-            }
-        }
-        return new RepositorySet(reps);
-    }
-
-    public IRepositorySet getRepositorySet(String name)
-    {
-        String key = REPOSITORY_SET + name;
-        if (getPreferences().contains(key))
-        {
-            ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
-            for (String s : PrefsUtils.stringToArray(getPreferences().getString(key)))
-            {
-                IRepositoryModel rep = findRepository(s);
-                if (rep == null)
-                {
-                    throw new IllegalStateException("Missing repository for " + s);
-                }
-                reps.add(rep);
-            }
-            return new RepositorySet(reps);
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public Map<String, IRepositorySet> loadRepositorySets()
-    {
-        IPreferenceStore store = getPreferences();
-
-        HashMap<String, IRepositorySet> sets = new HashMap<String, IRepositorySet>();
-
-        for (String name : PrefsUtils.stringToArray(store.getString(REPOSITORY_SETS)))
-        {
-            String key = REPOSITORY_SET + name;
-            ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
-            for (String s : PrefsUtils.stringToArray(getPreferences().getString(key)))
-            {
-                reps.add(findRepository(s));
-            }
-            sets.put(name, new RepositorySet(reps));
-        }
-
-        return sets;
-    }
-
-    public void saveRepositorySets(Map<String, IRepositorySet> sets)
-    {
-        IPreferenceStore store = getPreferences();
-
-        ArrayList<String> names = new ArrayList<String>();
-
-        for (Map.Entry<String, IRepositorySet> set : sets.entrySet())
-        {
-            String name = set.getKey();
-            String key = REPOSITORY_SET + name;
-            ArrayList<String> ids = new ArrayList<String>();
-            for (IRepositoryModel m : set.getValue().getRepositories())
-            {
-                ids.add(m.getId());
-            }
-            store.setValue(key, PrefsUtils.listToString(ids));
-            names.add(name);
-        }
-
-        for (String name : PrefsUtils.stringToArray(store.getString(REPOSITORY_SETS)))
-        {
-            if (!names.contains(name))
-            {
-                String key = REPOSITORY_SET + name;
-                store.setToDefault(key);
-            }
-        }
-
-        store.setValue(REPOSITORY_SETS, PrefsUtils.listToString(names));
-        timeStamp(store);
-    }
-
-    public void setDefaultRepositorySet(IRepositorySet defaultSet)
-    {
-        ArrayList<String> ids = new ArrayList<String>();
-        for (IRepositoryModel m : defaultSet.getRepositories())
-        {
-            ids.add(m.getId());
-        }
-        IPreferenceStore prefs = getPreferences();
-        prefs.setValue(REPOSITORY_DEFAULT_SET, PrefsUtils.listToString(ids));
-        timeStamp(prefs);
-    }
-
-    private void timeStamp(IPreferenceStore prefs)
-    {
-        prefs.setValue(REPOSITORY_TIMESTAMP, System.currentTimeMillis());
-    }
-
     private IPreferenceStore getPreferences()
     {
         return SigilCore.getDefault().getPreferenceStore();
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/SigilPreferencesInitializer.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java
similarity index 80%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/SigilPreferencesInitializer.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java
index 7dbfc0d..f0fdaca 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/preferences/SigilPreferencesInitializer.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/preferences/SigilPreferencesInitializer.java
@@ -17,11 +17,12 @@
  * under the License.
  */
 
-package org.apache.felix.sigil.eclipse.preferences;
+package org.apache.felix.sigil.eclipse.internal.preferences;
 
 import org.apache.felix.sigil.common.osgi.VersionRangeBoundingRule;
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryConfiguration;
+import org.apache.felix.sigil.eclipse.preferences.PrefsUtils;
+import org.apache.felix.sigil.eclipse.preferences.PromptablePreference;
 import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
 import org.eclipse.jface.preference.IPreferenceStore;
 
@@ -35,7 +36,15 @@
     public void initializeDefaultPreferences()
     {
         IPreferenceStore store = SigilCore.getDefault().getPreferenceStore();
+        setUpDefaults(store);
+        migrateOldPreferences(store);
+    }
 
+    /**
+     * @param store
+     */
+    private void setUpDefaults(IPreferenceStore store)
+    {
         store.setDefault(SigilCore.OSGI_INSTALL_CHECK_PREFERENCE, true);
 
         store.setDefault(SigilCore.DEFAULT_VERSION_LOWER_BOUND,
@@ -54,7 +63,14 @@
         store.setDefault(SigilCore.PREFERENCES_REBUILD_PROJECTS,
             PromptablePreference.Prompt.name());
 
-        store.setDefault(RepositoryConfiguration.REPOSITORY_DEFAULT_SET,
+        store.setDefault("repository.order",
             "org.apache.felix.sigil.core.workspaceprovider");
     }
+    
+    /**
+     * @param store
+     */
+    private void migrateOldPreferences(IPreferenceStore store)
+    {
+    }
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/GlobalRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/GlobalRepositoryManager.java
index a1a8b09..7e4c21c 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/GlobalRepositoryManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/GlobalRepositoryManager.java
@@ -19,27 +19,17 @@
 
 package org.apache.felix.sigil.eclipse.internal.repository.eclipse;
 
-import java.util.List;
-
 import org.apache.felix.sigil.common.repository.IRepositoryManager;
-import org.apache.felix.sigil.eclipse.SigilCore;
 import org.apache.felix.sigil.eclipse.internal.repository.eclipse.SigilRepositoryManager;
 import org.apache.felix.sigil.eclipse.internal.repository.manager.RepositoryMap;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
 
 public class GlobalRepositoryManager extends SigilRepositoryManager implements IRepositoryManager
 {
 
     public GlobalRepositoryManager(RepositoryMap map)
     {
-        super(null, map);
+        super(map);
     }
 
-    @Override
-    protected IRepositoryModel[] findRepositories()
-    {
-        List<IRepositoryModel> repos = SigilCore.getRepositoryConfiguration().loadRepositories();
-        return repos.toArray(new IRepositoryModel[repos.size()]);
-    }
 
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/SigilRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/SigilRepositoryManager.java
index cf74d3c..d6fb658 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/SigilRepositoryManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/SigilRepositoryManager.java
@@ -24,6 +24,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Properties;
 
 import org.apache.felix.sigil.common.repository.AbstractRepositoryManager;
@@ -33,9 +34,8 @@
 import org.apache.felix.sigil.common.repository.RepositoryException;
 import org.apache.felix.sigil.eclipse.SigilCore;
 import org.apache.felix.sigil.eclipse.internal.repository.manager.RepositoryMap;
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap.RepositoryCache;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.IRepositoryMap.RepositoryCache;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
-import org.apache.felix.sigil.eclipse.model.repository.IRepositorySet;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -50,13 +50,10 @@
 public class SigilRepositoryManager extends AbstractRepositoryManager implements IRepositoryManager, IPropertyChangeListener
 {
 
-    private final String repositorySet;
-
     private RepositoryMap cachedRepositories;
 
-    public SigilRepositoryManager(String repositorySet, RepositoryMap cachedRepositories)
+    public SigilRepositoryManager(RepositoryMap cachedRepositories)
     {
-        this.repositorySet = repositorySet;
         this.cachedRepositories = cachedRepositories;
     }
 
@@ -84,7 +81,7 @@
         ArrayList<IBundleRepository> repos = new ArrayList<IBundleRepository>();
         HashSet<String> ids = new HashSet<String>();
 
-        IRepositoryModel[] models = findRepositories();
+        List<IRepositoryModel> models = findRepositories();
         for (IRepositoryModel repo : models)
         {
             try
@@ -141,26 +138,9 @@
         return null;
     }
 
-    protected IRepositoryModel[] findRepositories()
+    protected List<IRepositoryModel> findRepositories()
     {
-        if (repositorySet == null)
-        {
-            return SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories();
-        }
-        else
-        {
-            IRepositorySet set = SigilCore.getRepositoryConfiguration().getRepositorySet(
-                repositorySet);
-            if (set == null)
-            {
-                SigilCore.error("Unknown repository set " + repositorySet);
-                return SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories();
-            }
-            else
-            {
-                return set.getRepositories();
-            }
-        }
+        return SigilCore.getRepositoryPreferences().loadRepositories();
     }
 
     private IBundleRepository loadRepository(String id, Properties pref,
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/EclipseRepositoryConfig.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryConfig.java
similarity index 66%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/EclipseRepositoryConfig.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryConfig.java
index 5270fd0..1846846 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/EclipseRepositoryConfig.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryConfig.java
@@ -17,16 +17,14 @@
  * under the License.
  */
 
-package org.apache.felix.sigil.eclipse.internal.model.project;
+package org.apache.felix.sigil.eclipse.internal.repository.manager;
 
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Properties;
 
 import org.apache.felix.sigil.common.config.IRepositoryConfig;
@@ -52,8 +50,8 @@
      */
     public List<String> getAllRepositories()
     {
-        ArrayList<String> list = new ArrayList<String>(readRepositories().keySet());
-        list.addAll(projectConfig.getAllRepositories());
+        ArrayList<String> list = new ArrayList<String>(projectConfig.getAllRepositories());
+        list.addAll(readRepositoryNames());
         return list;
     }
 
@@ -63,8 +61,8 @@
     public Properties getRepositoryConfig(String name)
     {
         Properties props = projectConfig.getRepositoryConfig(name);
-        if ( props.isEmpty() ) {
-            props = readRepositories().get(name);
+        if ( props == null ) {
+            props = readRepositoryConfig(name);
         }
         return props;
     }
@@ -76,7 +74,7 @@
     {
         URI def = projectConfig.getRepositoryDefinition(name);
         if ( def == null ) {
-            if ( readRepositories().containsKey(name) ) {
+            if ( readRepositoryNames().contains(name) ) {
                 def = URI.create("sigil:eclipse:preferences");
             }
         }
@@ -91,29 +89,48 @@
         return projectConfig.getRepositoryPath();
     }
 
-    private Map<String, Properties> readRepositories() {
-        HashMap<String, Properties> repos = new HashMap<String, Properties>();
+    /**
+     * @return
+     */
+    private static List<String> readRepositoryNames()
+    {
+        List<IRepositoryModel> models = findRepositories();
+        ArrayList<String> repos = new ArrayList<String>(models.size());
+        for (IRepositoryModel repo : models)
+        {
+            String id = repo.getId();
+            repos.add(id);
+        }
+        
+        return repos;
+    }
+
+    private static Properties readRepositoryConfig(String name) {
         IPreferenceStore prefs = SigilCore.getDefault().getPreferenceStore();
 
-        IRepositoryModel[] models = findRepositories();
-        for (IRepositoryModel repo : models)
+        for (IRepositoryModel repo : findRepositories())
         {
             try
             {
                 String id = repo.getId();
-                Properties pref = null;
-                if (repo.getType().isDynamic())
-                {
-                    String instance = "repository." + repo.getType().getId() + "." + id;
-                    String loc = prefs.getString(instance + ".loc");
-                    pref = loadPreferences(loc);
+                if ( name.equals(id) ) {
+                    Properties pref = null;
+                    if (repo.getType().isDynamic())
+                    {
+                        String instance = "repository." + repo.getType().getId() + "." + id;
+                        String loc = prefs.getString(instance + ".loc");
+                        pref = loadPreferences(loc);                     
+                    }
+                    else
+                    {
+                        pref = new Properties();
+                    }
+                    
+                    if (!pref.containsKey(IRepositoryConfig.REPOSITORY_PROVIDER)) {
+                        pref.put(IRepositoryConfig.REPOSITORY_PROVIDER, repo.getType().getProvider());
+                    }
+                    return pref;
                 }
-                else
-                {
-                    pref = new Properties();
-                }
-                
-                repos.put(id, pref);
             }
             catch (IOException e)
             {
@@ -121,15 +138,16 @@
             }
         }
         
-        return repos;
+        // ok not found
+        return null;
     }
     
-    private IRepositoryModel[] findRepositories()
+    private static final List<IRepositoryModel> findRepositories()
     {
-        return SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories();
+        return SigilCore.getRepositoryPreferences().loadRepositories();
     }
     
-    private Properties loadPreferences(String loc) throws FileNotFoundException,
+    private static final Properties loadPreferences(String loc) throws FileNotFoundException,
     IOException
     {
         FileInputStream in = null;
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java
index 2e081ec..fb9b46c 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java
@@ -31,14 +31,16 @@
 import org.apache.felix.sigil.common.repository.IRepositoryProvider;
 import org.apache.felix.sigil.common.repository.RepositoryException;
 import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap;
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap.RepositoryCache;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.IRepositoryMap.RepositoryCache;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 
 /**
  * @author dave
  *
  */
-public class EclipseRepositoryManager extends AbstractRepositoryManager
+public class EclipseRepositoryManager extends AbstractRepositoryManager implements IPropertyChangeListener
 {
     private final IRepositoryConfig config;
     private final IRepositoryMap repositoryMap;
@@ -49,9 +51,25 @@
      */
     public EclipseRepositoryManager(IRepositoryConfig config, IRepositoryMap repositoryMap)
     {
-        this.config = config;
+        this.config = new EclipseRepositoryConfig(config);
         this.repositoryMap = repositoryMap;
     }
+    
+    @Override
+    public void initialise()
+    {
+        super.initialise();
+        SigilCore.getDefault().getPreferenceStore().addPropertyChangeListener(this);
+    }
+
+    public void destroy()
+    {
+        IPreferenceStore prefs = SigilCore.getDefault().getPreferenceStore();
+        if (prefs != null)
+        {
+            prefs.removePropertyChangeListener(this);
+        }
+    }    
 
     /* (non-Javadoc)
      * @see org.apache.felix.sigil.common.repository.AbstractRepositoryManager#loadRepositories()
@@ -91,12 +109,14 @@
             }
             else {
                 Properties props = config.getRepositoryConfig(name);
-                String uid = config.getRepositoryDefinition(name).toString() + name;
-                IBundleRepository repo = buildRepository(uid, name, props);
-                
-                if ( repo != null ) {
-                    list.add(repo);
-                }                
+                if (props != null) {
+                    String uid = config.getRepositoryDefinition(name).toString() + '#' + name;
+                    IBundleRepository repo = buildRepository(uid, name, props);
+                    
+                    if ( repo != null ) {
+                        list.add(repo);
+                    }
+                }
             }
         }
     }
@@ -122,6 +142,8 @@
                 SigilCore.log(msg);
             else
                 SigilCore.warn(msg);
+            
+            return null;
         }
 
         try
@@ -169,5 +191,16 @@
             throw new RepositoryException("Failed to build repositories", e);
         }
     }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+     */
+    public void propertyChange(PropertyChangeEvent event)
+    {
+        if (event.getProperty().equals("repository.order"))
+        {
+            loadRepositories();
+        }
+    }
     
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/IRepositoryMap.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryMap.java
similarity index 95%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/IRepositoryMap.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryMap.java
index f36a501..c2dc1fa 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/IRepositoryMap.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/IRepositoryMap.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.felix.sigil.eclipse.model.project;
+package org.apache.felix.sigil.eclipse.internal.repository.manager;
 
 import java.util.Properties;
 
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
index c9158c2..f103964 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
@@ -23,7 +23,6 @@
 import java.util.HashMap;
 import java.util.Iterator;
 
-import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap;
 
 public class RepositoryMap implements IRepositoryMap
 {
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java
index 340f95e..340d560 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/ProjectResourceListener.java
@@ -35,11 +35,6 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 
-//import org.eclipse.core.runtime.IProgressMonitor;
-//import org.eclipse.core.runtime.IStatus;
-//import org.eclipse.core.runtime.Status;
-//import org.eclipse.core.runtime.jobs.Job;
-
 public class ProjectResourceListener implements IResourceChangeListener
 {
     public static final int EVENT_MASKS = IResourceChangeEvent.PRE_DELETE
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java
index 03a8826..ad9e348 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/resources/SigilProjectManager.java
@@ -20,20 +20,26 @@
 
 import java.util.HashMap;
 
+import org.apache.felix.sigil.common.config.IRepositoryConfig;
+import org.apache.felix.sigil.common.repository.IRepositoryManager;
 import org.apache.felix.sigil.eclipse.SigilCore;
 import org.apache.felix.sigil.eclipse.internal.model.project.SigilProject;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.EclipseRepositoryManager;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.IRepositoryMap;
+import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 
 public class SigilProjectManager
 {
-    private static HashMap<IProject, SigilProject> projects = new HashMap<IProject, SigilProject>();
+    private static HashMap<IProject, ISigilProjectModel> projects = new HashMap<IProject, ISigilProjectModel>();
+    private static HashMap<ISigilProjectModel, EclipseRepositoryManager> repositoryManagers = new HashMap<ISigilProjectModel, EclipseRepositoryManager>();
 
-    public SigilProject getSigilProject(IProject project) throws CoreException
+    public ISigilProjectModel getSigilProject(IProject project) throws CoreException
     {
         if (project.hasNature(SigilCore.NATURE_ID))
         {
-            SigilProject p = null;
+            ISigilProjectModel p = null;
             synchronized (projects)
             {
                 p = projects.get(project);
@@ -54,9 +60,35 @@
 
     public void flushSigilProject(IProject project)
     {
-        synchronized (project)
+        synchronized (projects)
         {
-            projects.remove(project);
+            ISigilProjectModel model = projects.remove(project);
+            if ( model != null ) {
+                EclipseRepositoryManager manager = repositoryManagers.remove(model);
+                manager.destroy();           
+            }            
+        }
+    }
+
+    /**
+     * @param model
+     * @param repositoryMap 
+     * @throws CoreException 
+     */
+    public IRepositoryManager getRepositoryManager(ISigilProjectModel model, IRepositoryMap repositoryMap) throws CoreException
+    {
+        synchronized( projects ) {
+            EclipseRepositoryManager manager = repositoryManagers.get(model);
+            
+            if ( manager == null ) {
+                IRepositoryConfig config = model.getRepositoryConfig();
+                
+                manager = new EclipseRepositoryManager(config, repositoryMap);
+                
+                repositoryManagers.put(model, manager);
+            }
+            
+            return manager;
         }
     }
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
index 0d53a03..8fc7cba 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/ISigilProjectModel.java
@@ -95,7 +95,7 @@
      */
     IJavaProject getJavaModel();
 
-    void resetClasspath(IProgressMonitor monitor) throws CoreException;
+    void resetClasspath(IProgressMonitor monitor, boolean forceResolve) throws CoreException;
 
     IPath findBundleLocation() throws CoreException;
 
@@ -121,9 +121,8 @@
         throws CoreException;
 
     /**
-     * @param repositoryMap 
      * @return
      * @throws CoreException 
      */
-    IRepositoryManager getRepositoryManager(IRepositoryMap repositoryMap) throws CoreException;
+    IRepositoryManager getRepositoryManager();
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryConfiguration.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java
similarity index 79%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryConfiguration.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java
index f3683b6..708b74e 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryConfiguration.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryPreferences.java
@@ -20,14 +20,12 @@
 package org.apache.felix.sigil.eclipse.model.repository;
 
 import java.util.List;
-import java.util.Map;
 
 import org.apache.felix.sigil.eclipse.internal.model.repository.RepositoryType;
 import org.eclipse.core.runtime.CoreException;
 
-public interface IRepositoryConfiguration
+public interface IRepositoryPreferences
 {
-
     List<IRepositoryModel> loadRepositories();
 
     IRepositoryModel findRepository(String id);
@@ -37,14 +35,4 @@
     List<RepositoryType> loadRepositoryTypes();
 
     IRepositoryModel newRepositoryElement(IRepositoryType type);
-
-    IRepositorySet getDefaultRepositorySet();
-
-    void setDefaultRepositorySet(IRepositorySet defaultSet);
-
-    IRepositorySet getRepositorySet(String name);
-
-    Map<String, IRepositorySet> loadRepositorySets();
-
-    void saveRepositorySets(Map<String, IRepositorySet> sets);
 }
\ No newline at end of file
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositorySet.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositorySet.java
deleted file mode 100644
index 8ebb46c..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositorySet.java
+++ /dev/null
@@ -1,31 +0,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.
- */
-
-package org.apache.felix.sigil.eclipse.model.repository;
-
-public interface IRepositorySet
-{
-    void setRepository(IRepositoryModel id, int position);
-
-    void removeRepository(IRepositoryModel id);
-
-    IRepositoryModel[] getRepositories();
-
-    void setRepositories(IRepositoryModel[] repositories);
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/RepositorySet.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/RepositorySet.java
deleted file mode 100644
index 1d80a8a..0000000
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/RepositorySet.java
+++ /dev/null
@@ -1,71 +0,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.
- */
-
-package org.apache.felix.sigil.eclipse.model.repository;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-public class RepositorySet implements IRepositorySet
-{
-
-    private static final IRepositoryModel[] EMPTY = new IRepositoryModel[0];
-
-    private IRepositoryModel[] reps;
-
-    public RepositorySet()
-    {
-        this(EMPTY);
-    }
-
-    public RepositorySet(Collection<IRepositoryModel> reps)
-    {
-        this(reps.toArray(new IRepositoryModel[reps.size()]));
-    }
-
-    public RepositorySet(IRepositoryModel[] repositories)
-    {
-        this.reps = repositories;
-    }
-
-    public void setRepository(IRepositoryModel id, int position)
-    {
-        ArrayList<IRepositoryModel> tmp = new ArrayList<IRepositoryModel>(reps.length + 1);
-        tmp.remove(id);
-        tmp.add(position, id);
-        reps = tmp.toArray(new IRepositoryModel[tmp.size()]);
-    }
-
-    public IRepositoryModel[] getRepositories()
-    {
-        return reps;
-    }
-
-    public void removeRepository(IRepositoryModel id)
-    {
-        ArrayList<IRepositoryModel> tmp = new ArrayList<IRepositoryModel>(reps.length + 1);
-        tmp.remove(id);
-        reps = tmp.toArray(new IRepositoryModel[tmp.size()]);
-    }
-
-    public void setRepositories(IRepositoryModel[] repositories)
-    {
-        reps = repositories == null ? EMPTY : repositories;
-    }
-}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java
index fe34711..e4ac348 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/util/JavaHelper.java
@@ -168,7 +168,7 @@
     {
         final LinkedList<IPackageExport> results = new LinkedList<IPackageExport>();
 
-        SigilCore.getRepositoryManager(project).visit(new IModelWalker()
+        project.getRepositoryManager().visit(new IModelWalker()
         {
             public boolean visit(IModelElement element)
             {
@@ -312,7 +312,7 @@
                 else if (element instanceof IRequiredBundle)
                 {
                     IRequiredBundle rb = (IRequiredBundle) element;
-                    IRepositoryManager manager = SigilCore.getRepositoryManager(project);
+                    IRepositoryManager manager = project.getRepositoryManager();
                     ResolutionConfig config = new ResolutionConfig(
                         ResolutionConfig.INCLUDE_OPTIONAL
                             | ResolutionConfig.IGNORE_ERRORS);
@@ -366,7 +366,7 @@
         IResolution resolution;
         try
         {
-            resolution = SigilCore.getRepositoryManager(sigil).getBundleResolver().resolve(
+            resolution = sigil.getRepositoryManager().getBundleResolver().resolve(
                 sigil, config, new ResolutionMonitorAdapter(monitor));
         }
         catch (ResolutionException e)