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());
+
}
}