Patch for FELIX-2180 - now global repository and project specific repository managers share a common repository map to ensure same objects are used throughout the IDE

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@920362 13f79535-47bb-0310-9956-ffa450edef68
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 b2b3fa8..80d9db4 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
@@ -40,6 +40,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.resources.ProjectResourceListener;
 import org.apache.felix.sigil.eclipse.internal.resources.SigilProjectManager;
@@ -132,14 +133,13 @@
     private ServiceTracker descriptorTracker;
     private ServiceTracker registryTracker;
     private ServiceTracker serializerTracker;
-
     private static IRepositoryConfiguration repositoryConfig;
     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;
 
     /**
      * Returns the shared instance
@@ -277,7 +277,8 @@
 
         installs = new OSGiInstallManager();
 
-        globalRepositoryManager = new GlobalRepositoryManager();
+        repositoryMap = new RepositoryMap();
+        globalRepositoryManager = new GlobalRepositoryManager(repositoryMap);
         globalRepositoryManager.initialise();
         
         projectManager = new SigilProjectManager();
@@ -449,7 +450,7 @@
             manager = repositoryManagers.get( NULL );
             if ( manager == null )
             {
-                manager = new SigilRepositoryManager( null );
+                manager = new SigilRepositoryManager( null, repositoryMap );
                 manager.initialise();
                 repositoryManagers.put( NULL, manager );
             }
@@ -460,7 +461,7 @@
 
             if ( manager == null )
             {
-                manager = new SigilRepositoryManager( set );
+                manager = new SigilRepositoryManager( set, repositoryMap );
                 manager.initialise();
                 repositoryManagers.put( set, manager );
             }
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 25d84ef..1ca31c7 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
@@ -31,9 +31,9 @@
 public class GlobalRepositoryManager extends SigilRepositoryManager implements IRepositoryManager
 {
 
-    public GlobalRepositoryManager()
+    public GlobalRepositoryManager(RepositoryMap map)
     {
-        super( null );
+        super( null, map );
     }
 
 
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/eclipse/RepositoryMap.java
new file mode 100644
index 0000000..5f3a5e7
--- /dev/null
+++ b/sigil/eclipse/core/src/org/apache/felix/sigil/eclipse/internal/repository/eclipse/RepositoryMap.java
@@ -0,0 +1,70 @@
+/*
+ * 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.eclipse;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Properties;
+
+import org.apache.felix.sigil.repository.IBundleRepository;
+
+public class RepositoryMap
+{
+    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)
+    {
+        for ( Iterator<String> i = cachedRepositories.keySet().iterator(); i.hasNext(); )
+        {
+            if ( !ids.contains( i.next() ) )
+            {
+                i.remove();
+            }
+        }
+    }
+
+    synchronized RepositoryCache get(String id)
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    synchronized void put(String id, RepositoryCache cache)
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
+
+}
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 8a29575..3116b2c 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,12 +24,11 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Properties;
 
 import org.apache.felix.sigil.eclipse.SigilCore;
+import org.apache.felix.sigil.eclipse.internal.repository.eclipse.RepositoryMap.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;
@@ -55,25 +54,12 @@
 
     private final String repositorySet;
 
-    private HashMap<String, RepositoryCache> cachedRepositories = new HashMap<String, RepositoryCache>();
+    private RepositoryMap cachedRepositories;
 
-    class RepositoryCache
-    {
-        private final Properties pref;
-        private final IBundleRepository repo;
-
-
-        RepositoryCache( Properties pref, IBundleRepository repo )
-        {
-            this.pref = pref;
-            this.repo = repo;
-        }
-    }
-
-
-    public SigilRepositoryManager( String repositorySet )
+    public SigilRepositoryManager( String repositorySet, RepositoryMap cachedRepositories )
     {
         this.repositorySet = repositorySet;
+        this.cachedRepositories = cachedRepositories;
     }
 
 
@@ -134,13 +120,7 @@
 
         setRepositories( repos.toArray( new IBundleRepository[repos.size()] ) );
 
-        for ( Iterator<String> i = cachedRepositories.keySet().iterator(); i.hasNext(); )
-        {
-            if ( !ids.contains( i.next() ) )
-            {
-                i.remove();
-            }
-        }
+        cachedRepositories.retainAll( ids );
     }