further work towards FELIX-1355 - now projects can compile against repositories defined in sigil.properties files as well as those defined in eclipse preferences


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@989695 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/sigil/eclipse/core/plugin.xml b/sigil/eclipse/core/plugin.xml
index 86e49c9..18487fd 100644
--- a/sigil/eclipse/core/plugin.xml
+++ b/sigil/eclipse/core/plugin.xml
@@ -75,18 +75,21 @@
             defaultLevel="-3"
             dynamic="false"
             id="org.apache.felix.sigil.core.workspaceprovider"
+            alias="project"
             type="Workspace Repository">
       </provider>
       <provider
             class="org.apache.felix.sigil.common.core.repository.FileSystemRepositoryProvider"
             dynamic="true"
             id="org.apache.felix.sigil.core.file"
+            alias="filesystem"
             type="File System Repository">
       </provider>
       <provider
             class="org.apache.felix.sigil.common.core.repository.SystemRepositoryProvider"
             dynamic="false"
             id="org.apache.felix.sigil.core.system"
+            alias="system"
             type="System Repository">
       </provider>
    </extension>
diff --git a/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd b/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd
index 90299ac..f760d9d 100644
--- a/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd
+++ b/sigil/eclipse/core/schema/org.apache.felix.sigil.repositoryprovider.exsd
@@ -1,22 +1,4 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
 <!-- Schema file written by PDE -->
 <schema targetNamespace="org.apache.felix.sigil.eclipse.core" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
@@ -74,6 +56,13 @@
                </documentation>
             </annotation>
          </attribute>
+         <attribute name="alias" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
          <attribute name="type" type="string" use="required">
             <annotation>
                <documentation>
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 4f76a03..cfefb58 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
@@ -26,7 +26,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.ResourceBundle;
 import java.util.Set;
@@ -47,8 +46,7 @@
 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.repository.eclipse.GlobalRepositoryManager;
-import org.apache.felix.sigil.eclipse.internal.repository.eclipse.RepositoryMap;
-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.internal.resources.ProjectResourceListener;
 import org.apache.felix.sigil.eclipse.internal.resources.SigilProjectManager;
 import org.apache.felix.sigil.eclipse.model.project.ISigilModelRoot;
@@ -141,8 +139,6 @@
     public static final String PREFERENCES_REMOVE_IMPORT_FOR_EXPORT = BASE
         + ".removeImportForExport";
 
-    private static final Object NULL = new Object();
-
     // The shared instance
     private static SigilCore plugin;
 
@@ -153,7 +149,6 @@
     private static SigilProjectManager projectManager;
     private static OSGiInstallManager installs;
     private static ISigilModelRoot modelRoot;
-    private static HashMap<Object, SigilRepositoryManager> repositoryManagers = new HashMap<Object, SigilRepositoryManager>();
     private static GlobalRepositoryManager globalRepositoryManager;
     private static RepositoryMap repositoryMap;
 
@@ -316,13 +311,6 @@
             serializerTracker = null;
         }
 
-        for (SigilRepositoryManager m : repositoryManagers.values())
-        {
-            m.destroy();
-        }
-
-        repositoryManagers.clear();
-
         globalRepositoryManager.destroy();
         globalRepositoryManager = null;
 
@@ -435,48 +423,18 @@
         return globalRepositoryManager;
     }
 
-    public static IRepositoryManager getRepositoryManager(String set)
-    {
-        SigilRepositoryManager manager = null;
-
-        if (set == null)
-        {
-            manager = repositoryManagers.get(NULL);
-            if (manager == null)
-            {
-                manager = new SigilRepositoryManager(null, repositoryMap);
-                manager.initialise();
-                repositoryManagers.put(NULL, manager);
-            }
-        }
-        else
-        {
-            manager = repositoryManagers.get(set);
-
-            if (manager == null)
-            {
-                manager = new SigilRepositoryManager(set, repositoryMap);
-                manager.initialise();
-                repositoryManagers.put(set, manager);
-            }
-        }
-
-        return manager;
-    }
-
     public static IRepositoryManager getRepositoryManager(ISigilProjectModel model)
     {
-        return getRepositoryManager(loadProjectRepositorySet(model));
-    }
-
-    private static String loadProjectRepositorySet(ISigilProjectModel model)
-    {
-        if (model == null)
+        if ( model == null ) return globalRepositoryManager;
+        try
         {
-            return null;
+            return model.getRepositoryManager(repositoryMap);
         }
-
-        return model.getPreferences().get(REPOSITORY_SET, null);
+        catch (CoreException e)
+        {
+            warn("Failed to build repository manager for " + model, e);
+            return globalRepositoryManager;
+        }
     }
 
     public static IRepositoryConfiguration getRepositoryConfiguration()
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/model/project/EclipseRepositoryConfig.java
new file mode 100644
index 0000000..5270fd0
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/project/EclipseRepositoryConfig.java
@@ -0,0 +1,157 @@
+/*
+ * 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.internal.model.project;
+
+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;
+import org.apache.felix.sigil.eclipse.SigilCore;
+import org.apache.felix.sigil.eclipse.model.repository.IRepositoryModel;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+/**
+ * @author dave
+ *
+ */
+public class EclipseRepositoryConfig implements IRepositoryConfig
+{
+
+    private final IRepositoryConfig projectConfig;
+    
+    public EclipseRepositoryConfig(IRepositoryConfig projectConfig) {
+        this.projectConfig = projectConfig;
+    }
+    
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getAllRepositories()
+     */
+    public List<String> getAllRepositories()
+    {
+        ArrayList<String> list = new ArrayList<String>(readRepositories().keySet());
+        list.addAll(projectConfig.getAllRepositories());
+        return list;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryConfig(java.lang.String)
+     */
+    public Properties getRepositoryConfig(String name)
+    {
+        Properties props = projectConfig.getRepositoryConfig(name);
+        if ( props.isEmpty() ) {
+            props = readRepositories().get(name);
+        }
+        return props;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryDefinition(java.lang.String)
+     */
+    public URI getRepositoryDefinition(String name)
+    {
+        URI def = projectConfig.getRepositoryDefinition(name);
+        if ( def == null ) {
+            if ( readRepositories().containsKey(name) ) {
+                def = URI.create("sigil:eclipse:preferences");
+            }
+        }
+        return def;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.config.IRepositoryConfig#getRepositoryPath()
+     */
+    public List<String> getRepositoryPath()
+    {
+        return projectConfig.getRepositoryPath();
+    }
+
+    private Map<String, Properties> readRepositories() {
+        HashMap<String, Properties> repos = new HashMap<String, Properties>();
+        IPreferenceStore prefs = SigilCore.getDefault().getPreferenceStore();
+
+        IRepositoryModel[] models = findRepositories();
+        for (IRepositoryModel repo : models)
+        {
+            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);
+                }
+                else
+                {
+                    pref = new Properties();
+                }
+                
+                repos.put(id, pref);
+            }
+            catch (IOException e)
+            {
+                SigilCore.error("Failed to load repository for " + repo, e);
+            }
+        }
+        
+        return repos;
+    }
+    
+    private IRepositoryModel[] findRepositories()
+    {
+        return SigilCore.getRepositoryConfiguration().getDefaultRepositorySet().getRepositories();
+    }
+    
+    private Properties loadPreferences(String loc) throws FileNotFoundException,
+    IOException
+    {
+        FileInputStream in = null;
+        try
+        {
+            Properties pref = new Properties();
+            pref.load(new FileInputStream(loc));
+            return pref;
+        }
+        finally
+        {
+            if (in != null)
+            {
+                try
+                {
+                    in.close();
+                }
+                catch (IOException e)
+                {
+                    SigilCore.error("Failed to close file", e);
+                }
+            }
+        }
+    }    
+}
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 aadb284..2bbd0ef 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
@@ -33,6 +33,7 @@
 
 import org.apache.felix.sigil.common.config.BldFactory;
 import org.apache.felix.sigil.common.config.IBldProject;
+import org.apache.felix.sigil.common.config.IRepositoryConfig;
 import org.apache.felix.sigil.common.model.AbstractCompoundModelElement;
 import org.apache.felix.sigil.common.model.ICapabilityModelElement;
 import org.apache.felix.sigil.common.model.IModelElement;
@@ -50,7 +51,9 @@
 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;
@@ -60,16 +63,12 @@
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ProjectScope;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener;
 import org.eclipse.jdt.core.ClasspathContainerInitializer;
 import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.IJavaElement;
@@ -80,7 +79,6 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 import org.osgi.framework.Version;
-import org.osgi.service.prefs.Preferences;
 
 /**
  * @author dave
@@ -97,8 +95,6 @@
 
     private ISigilBundle bundle;
 
-    private IEclipsePreferences preferences;
-
     private List<IRequirementModelElement> lastReqs = new LinkedList<IRequirementModelElement>();
     private List<ICapabilityModelElement> lastCaps = new LinkedList<ICapabilityModelElement>();
 
@@ -329,59 +325,6 @@
         marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
     }
 
-    /**
-     * Returns the project custom preference pool.
-     * Project preferences may include custom encoding.
-     * @return IEclipsePreferences or <code>null</code> if the project
-     * 	does not have a java nature.
-     */
-    public Preferences getPreferences()
-    {
-        synchronized (this)
-        {
-            if (preferences == null)
-            {
-                preferences = loadPreferences();
-            }
-
-            return preferences;
-        }
-    }
-
-    /**
-     * @return
-     */
-    private synchronized IEclipsePreferences loadPreferences()
-    {
-        IScopeContext context = new ProjectScope(getProject());
-        final IEclipsePreferences eclipsePreferences = context.getNode(SigilCore.PLUGIN_ID);
-
-        // Listen to node removal from parent in order to reset cache
-        INodeChangeListener nodeListener = new IEclipsePreferences.INodeChangeListener()
-        {
-            public void added(IEclipsePreferences.NodeChangeEvent event)
-            {
-                // do nothing
-            }
-
-            public void removed(IEclipsePreferences.NodeChangeEvent event)
-            {
-                if (event.getChild() == eclipsePreferences)
-                {
-                    synchronized (SigilProject.this)
-                    {
-                        preferences = null;
-                    }
-                    ((IEclipsePreferences) eclipsePreferences.parent()).removeNodeChangeListener(this);
-                }
-            }
-        };
-
-        ((IEclipsePreferences) eclipsePreferences.parent()).addNodeChangeListener(nodeListener);
-
-        return eclipsePreferences;
-    }
-
     public Collection<IClasspathEntry> findExternalClasspath(IProgressMonitor monitor)
         throws CoreException
     {
@@ -728,6 +671,24 @@
         }
     }
 
+    public IRepositoryConfig getRepositoryConfig() throws CoreException
+    {
+        try
+        {
+            return BldFactory.getConfig(project.getFile(IBldProject.PROJECT_FILE).getLocationURI());
+        }
+        catch (IOException e)
+        {
+            throw SigilCore.newCoreException("Failed to get project file: ", e);
+        }
+    }
+    
+    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())
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/RepositoryConfiguration.java
index 081dc5a..4a8366e 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/RepositoryConfiguration.java
@@ -139,9 +139,10 @@
                 String type = c.getAttribute("type");
                 boolean dynamic = Boolean.valueOf(c.getAttribute("dynamic"));
                 String icon = c.getAttribute("icon");
+                String provider = c.getAttribute("alias");
                 Image image = (icon == null || icon.trim().length() == 0) ? null
                     : loadImage(e, icon);
-                repositories.add(new RepositoryType(id, type, dynamic, image));
+                repositories.add(new RepositoryType(id, provider, type, dynamic, image));
             }
         }
 
@@ -160,7 +161,6 @@
 
     public IRepositorySet getDefaultRepositorySet()
     {
-        //int level = findLevel( key + LEVEL, type, prefs );
         ArrayList<IRepositoryModel> reps = new ArrayList<IRepositoryModel>();
         for (String s : PrefsUtils.stringToArray(getPreferences().getString(
             REPOSITORY_DEFAULT_SET)))
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java
index d65c174..53889b7 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/model/repository/RepositoryType.java
@@ -24,16 +24,18 @@
 
 public class RepositoryType implements IRepositoryType
 {
-    private String type;
-    private String id;
-    private Image icon;
-    private boolean dynamic;
+    private final String type;
+    private final String id;
+    private final String provider;
+    private final Image icon;
+    private final boolean dynamic;
 
-    public RepositoryType(String id, String type, boolean dynamic, Image icon)
+    public RepositoryType(String id, String provider, String type, boolean dynamic, Image icon)
     {
         this.id = id;
         this.type = type;
         this.dynamic = dynamic;
+        this.provider = provider;
         this.icon = icon;
     }
 
@@ -41,6 +43,10 @@
     {
         return type;
     }
+    
+    public String getProvider() {
+        return provider;
+    }
 
     public String getId()
     {
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 688c041..a1a8b09 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
@@ -24,6 +24,7 @@
 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
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 1edf9ef..cf74d3c 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
@@ -32,7 +32,8 @@
 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.internal.repository.eclipse.RepositoryMap.RepositoryCache;
+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.model.repository.IRepositoryModel;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositorySet;
 import org.apache.felix.sigil.eclipse.model.repository.IRepositoryType;
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java
new file mode 100644
index 0000000..24f6c2b
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryFactory.java
@@ -0,0 +1,62 @@
+/*
+ * 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.internal.repository.manager;
+
+import org.apache.felix.sigil.common.repository.IRepositoryProvider;
+import org.apache.felix.sigil.eclipse.SigilCore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * @author dave
+ *
+ */
+public class EclipseRepositoryFactory
+{
+
+    /**
+     * @param alias
+     * @return
+     */
+    public static IRepositoryProvider getProvider(String alias)
+    throws CoreException
+    {
+        IExtensionRegistry registry = Platform.getExtensionRegistry();
+        IExtensionPoint p = registry.getExtensionPoint(SigilCore.REPOSITORY_PROVIDER_EXTENSION_POINT_ID);
+
+        for (IExtension e : p.getExtensions())
+        {
+            for (IConfigurationElement c : e.getConfigurationElements())
+            {
+                if (alias.equals(c.getAttribute("alias")))
+                {
+                    IRepositoryProvider provider = (IRepositoryProvider) c.createExecutableExtension("class");
+                    return provider;
+                }
+            }
+        }
+
+        return 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
new file mode 100644
index 0000000..2e081ec
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/EclipseRepositoryManager.java
@@ -0,0 +1,173 @@
+/*
+ * 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.internal.repository.manager;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.sigil.common.config.IRepositoryConfig;
+import org.apache.felix.sigil.common.repository.AbstractRepositoryManager;
+import org.apache.felix.sigil.common.repository.IBundleRepository;
+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;
+
+/**
+ * @author dave
+ *
+ */
+public class EclipseRepositoryManager extends AbstractRepositoryManager
+{
+    private final IRepositoryConfig config;
+    private final IRepositoryMap repositoryMap;
+    
+    /**
+     * @param config
+     * @param repositoryMap2 
+     */
+    public EclipseRepositoryManager(IRepositoryConfig config, IRepositoryMap repositoryMap)
+    {
+        this.config = config;
+        this.repositoryMap = repositoryMap;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.felix.sigil.common.repository.AbstractRepositoryManager#loadRepositories()
+     */
+    @Override
+    protected void loadRepositories()
+    {
+        List<IBundleRepository> list = new ArrayList<IBundleRepository>();
+        scanRepositories(config.getRepositoryPath(), list);
+        setRepositories(list.toArray(new IBundleRepository[list.size()]));
+    }
+    
+    /**
+     * @param list 
+     * @param config2
+     * @param i
+     */
+    private void scanRepositories(List<String> path, List<IBundleRepository> list)
+    {
+        for (String name : path)
+        {
+            if ( IRepositoryConfig.WILD_CARD.equals(name) ) {
+                HashSet<String> defined = new HashSet<String>();
+                for (String n : path) {
+                    if (!IRepositoryConfig.WILD_CARD.equals(n)) {
+                        defined.add(n);
+                    }
+                }
+                List<String> subpath = new LinkedList<String>();
+                for (String key : config.getAllRepositories()) {
+                    if (!defined.contains(key))
+                    {
+                        subpath.add(key);
+                    }
+                }
+                scanRepositories(subpath, list);
+            }
+            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);
+                }                
+            }
+        }
+    }
+
+    /**
+     * @param repo
+     * @return 
+     */
+    private IBundleRepository buildRepository(String uid, String name, Properties repo)
+    {
+        String disabled = repo.getProperty("disabled");
+        if ("true".equalsIgnoreCase(disabled == null ? null : disabled.trim())) return null;
+        
+        String optStr = repo.getProperty("optional", "false");
+        boolean optional = Boolean.parseBoolean(optStr.trim());
+
+        String alias = repo.getProperty(IRepositoryConfig.REPOSITORY_PROVIDER);
+        if (alias == null)
+        {
+            String msg = "provider not specified for repository: " + name;
+            
+            if (optional)            
+                SigilCore.log(msg);
+            else
+                SigilCore.warn(msg);
+        }
+
+        try
+        {
+            IRepositoryProvider instance = EclipseRepositoryFactory.getProvider(alias);
+            IBundleRepository repository = loadRepository(uid, name, repo, instance);
+            return repository;
+        }
+        catch (Exception e)
+        {
+            String msg = "failed to create repository: ";
+            
+            if (optional)            
+                SigilCore.log(msg + e);
+            else
+                SigilCore.warn(msg, e);
+        }
+        
+        return null;
+    }
+    
+    private IBundleRepository loadRepository(String uid, String id, Properties pref,
+        IRepositoryProvider provider) throws RepositoryException
+    {
+        try
+        {
+            if (pref == null)
+            {
+                pref = new Properties();
+            }
+
+            RepositoryCache cache = repositoryMap.get(uid);
+
+            if (cache == null || !cache.pref.equals(pref))
+            {
+                IBundleRepository repo = provider.createRepository(id, pref);
+                cache = new RepositoryCache(pref, repo);
+                repositoryMap.put(uid, cache);
+            }
+
+            return cache.repo;
+        }
+        catch (RuntimeException e)
+        {
+            throw new RepositoryException("Failed to build repositories", e);
+        }
+    }
+    
+}
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/RepositoryMap.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
similarity index 68%
rename from sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/RepositoryMap.java
rename to sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
index a8157e3..c9158c2 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/RepositoryMap.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/RepositoryMap.java
@@ -17,32 +17,19 @@
  * under the License.
  */
 
-package org.apache.felix.sigil.eclipse.internal.repository.eclipse;
+package org.apache.felix.sigil.eclipse.internal.repository.manager;
 
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Properties;
 
-import org.apache.felix.sigil.common.repository.IBundleRepository;
+import org.apache.felix.sigil.eclipse.model.project.IRepositoryMap;
 
-public class RepositoryMap
+public class RepositoryMap implements IRepositoryMap
 {
-    static class RepositoryCache
-    {
-        final Properties pref;
-        final IBundleRepository repo;
-
-        RepositoryCache(Properties pref, IBundleRepository repo)
-        {
-            this.pref = pref;
-            this.repo = repo;
-        }
-    }
-
     private HashMap<String, RepositoryCache> cachedRepositories = new HashMap<String, RepositoryCache>();
 
-    synchronized void retainAll(Collection<String> ids)
+    public synchronized void retainAll(Collection<String> ids)
     {
         for (Iterator<String> i = cachedRepositories.keySet().iterator(); i.hasNext();)
         {
@@ -53,12 +40,12 @@
         }
     }
 
-    synchronized RepositoryCache get(String id)
+    public synchronized RepositoryCache get(String id)
     {
         return cachedRepositories.get(id);
     }
 
-    synchronized void put(String id, RepositoryCache cache)
+    public synchronized void put(String id, RepositoryCache cache)
     {
         cachedRepositories.put(id, cache);
     }
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/model/project/IRepositoryMap.java
new file mode 100644
index 0000000..f36a501
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/project/IRepositoryMap.java
@@ -0,0 +1,57 @@
+/*
+ * 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.project;
+
+import java.util.Properties;
+
+import org.apache.felix.sigil.common.repository.IBundleRepository;
+
+/**
+ * @author dave
+ *
+ */
+public interface IRepositoryMap
+{
+
+    public static class RepositoryCache
+    {
+        public final Properties pref;
+        public final IBundleRepository repo;
+
+        public RepositoryCache(Properties pref, IBundleRepository repo)
+        {
+            this.pref = pref;
+            this.repo = repo;
+        }
+    }
+
+    /**
+     * @param uid
+     * @return
+     */
+    RepositoryCache get(String uid);
+
+    /**
+     * @param uid
+     * @param cache
+     */
+    void put(String uid, RepositoryCache cache);
+
+}
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 0b80c5b..0d53a03 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
@@ -22,10 +22,12 @@
 import java.util.Collection;
 
 import org.apache.felix.sigil.common.config.IBldProject;
+import org.apache.felix.sigil.common.config.IRepositoryConfig;
 import org.apache.felix.sigil.common.core.BldCore;
 import org.apache.felix.sigil.common.model.ICompoundModelElement;
 import org.apache.felix.sigil.common.model.IModelElement;
 import org.apache.felix.sigil.common.model.eclipse.ISigilBundle;
+import org.apache.felix.sigil.common.repository.IRepositoryManager;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -35,7 +37,6 @@
 import org.eclipse.jdt.core.IPackageFragment;
 import org.eclipse.jdt.core.JavaModelException;
 import org.osgi.framework.Version;
-import org.osgi.service.prefs.Preferences;
 
 /**
  * Represents a sigil project. To get a reference to a ISigilProjectModel you can use the 
@@ -55,8 +56,6 @@
     // shortcut to getProject().getName()
     String getName();
 
-    Preferences getPreferences();
-
     /**
      * 
      * @param monitor
@@ -113,6 +112,18 @@
 
     IBldProject getBldProject() throws CoreException;
 
+    /**
+     * @return
+     */
+    IRepositoryConfig getRepositoryConfig() throws CoreException;
+    
     Collection<IClasspathEntry> findExternalClasspath(IProgressMonitor monitor)
         throws CoreException;
+
+    /**
+     * @param repositoryMap 
+     * @return
+     * @throws CoreException 
+     */
+    IRepositoryManager getRepositoryManager(IRepositoryMap repositoryMap) throws CoreException;
 }
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java
index d56ba7c..7c706d1 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/model/repository/IRepositoryType.java
@@ -32,4 +32,5 @@
 
     boolean isDynamic();
 
+    String getProvider();
 }
\ No newline at end of file
diff --git a/sigil/eclipse/obr/plugin.xml b/sigil/eclipse/obr/plugin.xml
index 39b1af2..df40b46 100644
--- a/sigil/eclipse/obr/plugin.xml
+++ b/sigil/eclipse/obr/plugin.xml
@@ -25,6 +25,7 @@
             class="org.apache.felix.sigil.common.obr.OBRRepositoryProvider"
             dynamic="true"
             id="org.apache.felix.sigil.obr.provider"
+            alias="obr"
             type="OSGi Bundle Repository (OBR)">
       </provider>
    </extension>
diff --git a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java
index c376444..459a05d 100644
--- a/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java
+++ b/sigil/eclipse/runtime/src/org/apache/felix/sigil/eclipse/runtime/OSGiLauncher.java
@@ -88,8 +88,8 @@
 
         try
         {
-            String name = LaunchHelper.getRepositoryManagerName(config);
-            IRepositoryManager manager = SigilCore.getRepositoryManager(name);
+            // TODO need to figure out a sensible repository manager for launch configs
+            IRepositoryManager manager = SigilCore.getRepositoryManager(null);
             client.apply(form.resolve(new RuntimeBundleResolver(manager, config)));
         }
         catch (Exception e)
diff --git a/sigil/eclipse/ui/plugin.xml b/sigil/eclipse/ui/plugin.xml
index 238460c..8ca3bb2 100644
--- a/sigil/eclipse/ui/plugin.xml
+++ b/sigil/eclipse/ui/plugin.xml
@@ -146,22 +146,6 @@
       </wizard>
    </extension>
    <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            class="org.apache.felix.sigil.eclipse.ui.internal.preferences.project.ProjectPropertyPage"
-            id="org.apache.felix.sigil.ui.projectpage"
-            name="Repositories">
-         <filter
-               name="projectNature"
-               value="org.apache.felix.sigil.sigilnature"/>
-         <enabledWhen>
-            <adapt
-                  type="org.eclipse.core.resources.IProject">
-            </adapt>
-         </enabledWhen>
-      </page>
-   </extension>
-   <extension
          point="org.eclipse.ui.menus">
       <menuContribution
             locationURI="popup:org.eclipse.ui.popup.any">
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/project/ProjectPropertyPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/project/ProjectPropertyPage.java
deleted file mode 100644
index ce23d9b..0000000
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/internal/preferences/project/ProjectPropertyPage.java
+++ /dev/null
@@ -1,218 +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.ui.internal.preferences.project;
-
-import java.util.concurrent.Callable;
-
-import org.apache.felix.sigil.eclipse.SigilCore;
-import org.apache.felix.sigil.eclipse.model.project.ISigilProjectModel;
-import org.apache.felix.sigil.eclipse.ui.util.DefaultTableProvider;
-import org.apache.felix.sigil.eclipse.ui.util.ProjectUtils;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IWorkbenchPropertyPage;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-import org.eclipse.ui.dialogs.PropertyPage;
-import org.osgi.service.prefs.BackingStoreException;
-
-public class ProjectPropertyPage extends PropertyPage implements IWorkbenchPropertyPage
-{
-
-    private boolean projectSpecific;
-    private ComboViewer setView;
-    private Composite settings;
-    private Button projectSpecificBtn;
-
-    @Override
-    protected Control createContents(Composite parent)
-    {
-        final Composite control = new Composite(parent, SWT.NONE);
-
-        projectSpecificBtn = new Button(control, SWT.CHECK);
-        projectSpecificBtn.setText("Enable project specific settings");
-        projectSpecificBtn.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(SelectionEvent e)
-            {
-                setProjectSpecific(!projectSpecific);
-            }
-        });
-
-        Label link = new Label(control, SWT.UNDERLINE_SINGLE);
-        link.addMouseListener(new MouseAdapter()
-        {
-            @Override
-            public void mouseDown(MouseEvent e)
-            {
-                PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(null,
-                    SigilCore.REPOSITORIES_PREFERENCES_ID, null, null);
-                dialog.open();
-            }
-        });
-
-        link.setText("Configure workspace settings");
-
-        settings = new Composite(control, SWT.BORDER);
-        settings.setLayout(new GridLayout(1, false));
-        createSettings(settings);
-
-        setFonts(control);
-
-        // layout
-        control.setLayout(new GridLayout(2, false));
-        projectSpecificBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-        settings.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
-        // load settings
-        String currentSet = getCurrentSet();
-
-        if (currentSet == null)
-        {
-            setProjectSpecific(false);
-        }
-        else
-        {
-            setView.setSelection(new StructuredSelection(currentSet));
-            setProjectSpecific(true);
-        }
-
-        return control;
-    }
-
-    private void setFonts(Composite control)
-    {
-        Composite p = control.getParent();
-        for (Control c : control.getChildren())
-        {
-            c.setFont(p.getFont());
-            if (c instanceof Composite)
-            {
-                setFonts((Composite) c);
-            }
-        }
-    }
-
-    private void setProjectSpecific(boolean projectSpecific)
-    {
-        if (this.projectSpecific != projectSpecific)
-        {
-            this.projectSpecific = projectSpecific;
-            settings.setEnabled(projectSpecific);
-            for (Control c : settings.getChildren())
-            {
-                c.setEnabled(projectSpecific);
-            }
-            projectSpecificBtn.setSelection(projectSpecific);
-        }
-    }
-
-    private void createSettings(Composite parent)
-    {
-        Composite control = new Composite(parent, SWT.NONE);
-
-        new Label(control, SWT.NONE).setText("Repository Set:");
-        Combo combo = new Combo(control, SWT.SINGLE);
-
-        setView = new ComboViewer(combo);
-        setView.setContentProvider(new DefaultTableProvider()
-        {
-            public Object[] getElements(Object inputElement)
-            {
-                return toArray(inputElement);
-            }
-        });
-
-        setView.setInput(SigilCore.getRepositoryConfiguration().loadRepositorySets().keySet());
-
-        // layout
-        control.setLayout(new GridLayout(2, false));
-    }
-
-    private String getCurrentSet()
-    {
-        try
-        {
-            IProject p = (IProject) getElement().getAdapter(IProject.class);
-            ISigilProjectModel model = SigilCore.create(p);
-            return model.getPreferences().get(SigilCore.REPOSITORY_SET, null);
-        }
-        catch (CoreException e)
-        {
-            SigilCore.error("Failed to read repository set", e);
-            return null;
-        }
-    }
-
-    @Override
-    public boolean okToLeave()
-    {
-        if (projectSpecific)
-        {
-            if (setView.getSelection().isEmpty())
-            {
-                setErrorMessage("Must select a repository set");
-                return false;
-            }
-        }
-        setErrorMessage(null);
-        return true;
-    }
-
-    @Override
-    public boolean performOk()
-    {
-        return ProjectUtils.runTaskWithRebuildCheck(new Callable<Boolean>()
-        {
-            public Boolean call() throws CoreException, BackingStoreException
-            {
-                String set = null;
-                if (projectSpecific)
-                {
-                    set = (String) ((IStructuredSelection) setView.getSelection()).getFirstElement();
-                }
-
-                IProject p = (IProject) getElement().getAdapter(IProject.class);
-                ISigilProjectModel model = SigilCore.create(p);
-                model.getPreferences().put(SigilCore.REPOSITORY_SET, set);
-                model.getPreferences().flush();
-                return true;
-            }
-
-        }, getShell());
-    }
-
-}
diff --git a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java
index 0a89a61..ca922d2 100644
--- a/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java
+++ b/sigil/eclipse/ui/src/org/apache/felix/sigil/eclipse/ui/wizard/repository/RepositoryWizardPage.java
@@ -121,6 +121,8 @@
         {
             e.store();
         }
+        getModel().getPreferences().setValue("provider", getModel().getType().getProvider());
+
     }
 
 }