handle singleton repository providers more intelligently part of FELIX-1355


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@991616 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryManager.java b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryManager.java
index 6e105b6..bfd04db 100644
--- a/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryManager.java
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/manager/AbstractEclipseRepositoryManager.java
@@ -28,8 +28,8 @@
 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.eclipse.SigilCore;
+import org.apache.felix.sigil.eclipse.internal.repository.manager.EclipseRepositoryFactory.EclipseRepositoryProviderWrapper;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.PropertyChangeEvent;
@@ -108,11 +108,13 @@
             else {
                 Properties props = config.getRepositoryConfig(name);
                 if (props != null) {
-                    String uid = config.getRepositoryDefinition(name).toString() + '#' + name;
-                    IBundleRepository repo = buildRepository(uid, props);
-                    
+                    String def = config.getRepositoryDefinition(name).toString();
+                    IBundleRepository repo = buildRepository(def, name, props);
                     if ( repo != null ) {
-                        list.add(repo);
+                        // filter singletons but maintain order
+                        if ( !list.contains(repo) ) {
+                            list.add(repo);
+                        }
                     }
                 }
             }
@@ -123,7 +125,7 @@
      * @param repo
      * @return 
      */
-    private IBundleRepository buildRepository(String uid, Properties repo)
+    private IBundleRepository buildRepository(String def, String name, Properties repo)
     {
         String disabled = repo.getProperty("disabled", "false");
         if (Boolean.parseBoolean(disabled.trim())) return null;
@@ -134,7 +136,7 @@
         String alias = repo.getProperty(IRepositoryConfig.REPOSITORY_PROVIDER);
         if (alias == null)
         {
-            String msg = "provider not specified for repository: " + uid;
+            String msg = "provider not specified for repository: " + def + "->" + name;
             
             if (optional)            
                 SigilCore.log(msg);
@@ -146,8 +148,9 @@
 
         try
         {
-            IRepositoryProvider instance = EclipseRepositoryFactory.getProvider(alias);
-            IBundleRepository repository = repositoryCache.getRepository(uid, repo, instance);
+            EclipseRepositoryProviderWrapper wrapper = EclipseRepositoryFactory.getProvider(alias);
+            String uid = wrapper.getType().isDynamic() ? def + "#" + name : wrapper.getType().getName();
+            IBundleRepository repository = repositoryCache.getRepository(uid, repo, wrapper);
             return repository;
         }
         catch (Exception e)
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
index c87af41..65f65c8 100644
--- 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
@@ -61,12 +61,16 @@
         {
             return new EclipseBundleRepository(delegate, type, id, properties);
         }
+        
+        public IRepositoryType getType() {
+            return type;
+        }
     }
     /**
      * @param alias
      * @return
      */
-    public static IRepositoryProvider getProvider(String alias)
+    public static EclipseRepositoryProviderWrapper getProvider(String alias)
     throws CoreException
     {
         IExtensionRegistry registry = Platform.getExtensionRegistry();