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)