diff --git a/bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF
index 2392378..526183c 100644
--- rt.equinox.p2/bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF
+++ rt.equinox.p2/bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF
@@ -7,7 +7,7 @@
Bundle-Activator: org.eclipse.equinox.internal.p2.core.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
-Export-Package: org.eclipse.equinox.internal.p2.core;x-friends:="org.eclipse.equinox.p2.publisher,org.eclipse.equinox.p2.repository",
+Export-Package: org.eclipse.equinox.internal.p2.core;x-friends:="org.eclipse.equinox.p2.publisher,org.eclipse.equinox.p2.repository,org.eclipse.equinox.p2.engine",
org.eclipse.equinox.internal.p2.core.helpers;
x-friends:="org.eclipse.equinox.frameworkadmin.test,
org.eclipse.equinox.p2.artifact.optimizers,
diff --git a/bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF
index cb812be2..21ba682 100644
--- rt.equinox.p2/bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF
+++ rt.equinox.p2/bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF
@@ -25,16 +25,19 @@
J2SE-1.4,
CDC-1.1/Foundation-1.1
Bundle-ActivationPolicy: lazy
-Service-Component: OSGI-INF/profileRegistry.xml, OSGI-INF/engine.xml
+Service-Component: OSGI-INF/profileRegistry.xml, OSGI-INF/engine.xml,
+ OSGI-INF/MasterRepositoryPreferenceProvider.xml
Import-Package: javax.xml.parsers,
org.eclipse.core.internal.preferences,
org.eclipse.core.runtime.preferences,
+ org.eclipse.equinox.internal.p2.core,
org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.metadata,
org.eclipse.equinox.internal.p2.metadata.index,
org.eclipse.equinox.internal.p2.metadata.repository.io,
org.eclipse.equinox.internal.p2.persistence,
org.eclipse.equinox.internal.p2.repository,
+ org.eclipse.equinox.internal.p2.repository.helpers,
org.eclipse.equinox.internal.provisional.p2.core.eventbus,
org.eclipse.equinox.internal.provisional.p2.repository,
org.eclipse.equinox.p2.core;version="[2.0.0,3.0.0)",
diff --git a/bundles/org.eclipse.equinox.p2.engine/MasterRepositoryPreferenceProvider.xml b/bundles/org.eclipse.equinox.p2.engine/MasterRepositoryPreferenceProvider.xml
new file mode 100644
index 0000000..026fa0e
--- /dev/null
+++ rt.equinox.p2/bundles/org.eclipse.equinox.p2.engine/OSGI-INF/MasterRepositoryPreferenceProvider.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/MasterProfilePreferencesProvider.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/MasterProfilePreferencesProvider.java
new file mode 100644
index 0000000..0fef156
--- /dev/null
+++ rt.equinox.p2/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/MasterProfilePreferencesProvider.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Red Hat,Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat,Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.p2.engine;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Hashtable;
+import org.eclipse.core.runtime.URIUtil;
+import org.eclipse.equinox.internal.p2.core.ProvisioningAgent;
+import org.eclipse.equinox.internal.p2.engine.EngineActivator;
+import org.eclipse.equinox.internal.p2.repository.Activator;
+import org.eclipse.equinox.internal.p2.repository.helpers.IMasterProfilePreferencesProvider;
+import org.eclipse.equinox.p2.core.IAgentLocation;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.prefs.Preferences;
+
+public class MasterProfilePreferencesProvider implements IMasterProfilePreferencesProvider {
+
+ public Preferences getMasterPreferences(String profileName, String node) {
+
+ URI location;
+ try {
+ String sharedConfig = Activator.getContext().getProperty("osgi.sharedConfiguration.area"); //$NON-NLS-1$
+
+ if (sharedConfig == null)
+ return null;
+ //find where the profile is located by default
+ location = URIUtil.fromString(sharedConfig + "../p2" + '/'); //$NON-NLS-1$
+
+ } catch (URISyntaxException e1) {
+ //should not happen as Equinox will complain first.
+ return null;
+ }
+
+ if (location == null) {
+ // no master location, quit
+ return null;
+ }
+
+ // This is copied from tests
+ ProvisioningAgent agent = new ProvisioningAgent();
+ agent.setLocation(location);
+ agent.setBundleContext(EngineActivator.getContext());
+ IAgentLocation agentLocation = (IAgentLocation) agent.getService(IAgentLocation.SERVICE_NAME);
+ Hashtable props = new Hashtable();
+ props.put("locationURI", location.toString()); //$NON-NLS-1$
+
+ @SuppressWarnings("rawtypes")
+ ServiceRegistration reg = EngineActivator.getContext().registerService(IProvisioningAgent.SERVICE_NAME, agent, props);
+ try {
+ return new ProfileScope(agentLocation, profileName).getNode(node);
+ } finally {
+ reg.unregister();
+ }
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF
index e32ff0f..b1d12c1 100644
--- rt.equinox.p2/bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF
+++ rt.equinox.p2/bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF
@@ -26,7 +26,8 @@
org.eclipse.equinox.p2.operations,
org.eclipse.equinox.p2.repository.tools,
org.eclipse.equinox.p2.ui,
- org.eclipse.equinox.p2.updatesite",
+ org.eclipse.equinox.p2.updatesite,
+ org.eclipse.equinox.p2.engine",
org.eclipse.equinox.internal.provisional.p2.repository,
org.eclipse.equinox.p2.repository;version="2.0.0",
org.eclipse.equinox.p2.repository.artifact;version="2.1.0",
@@ -41,6 +42,7 @@
CDC-1.1/Foundation-1.1
Bundle-ActivationPolicy: lazy
Import-Package: javax.xml.parsers,
+ org.eclipse.core.internal.preferences,
org.eclipse.core.runtime.jobs,
org.eclipse.core.runtime.preferences;version="3.2.0",
org.eclipse.equinox.internal.p2.core,
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/IMasterProfilePreferencesProvider.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/IMasterProfilePreferencesProvider.java
new file mode 100644
index 0000000..fac54ea
--- /dev/null
+++ rt.equinox.p2/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/IMasterProfilePreferencesProvider.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Red Hat,Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat,Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.repository.helpers;
+
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * This service does its best to locate master profile and get preferences
+ * stored in master ProfileScope.
+ *
+ */
+public interface IMasterProfilePreferencesProvider {
+ public Preferences getMasterPreferences(String profileName, String node);
+}
--- rt.equinox.p2/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/AbstractRepositoryManager.java.orig 2012-05-05 15:24:03.000000000 +0200
+++ rt.equinox.p2/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/AbstractRepositoryManager.java 2012-05-18 16:18:18.029669647 +0200
@@ -9,6 +9,7 @@
* IBM Corporation - initial API and implementation
* Wind River - fix for bug 299227
* Sonatype, Inc. - transport split
+ * Red Hat,Inc. - fix for bug 249133
*******************************************************************************/
package org.eclipse.equinox.internal.p2.repository.helpers;
@@ -33,6 +34,7 @@
import org.eclipse.osgi.util.NLS;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
+import org.osgi.util.tracker.ServiceTracker;
/**
* Common code shared between artifact and metadata repository managers.
@@ -981,6 +983,61 @@
saveToPreferences();
}
+ private void restoreFromMasterPreferences() {
+ // restore the list of repositories from the preference store
+ Preferences node = getPreferences();
+ if (node == null)
+ return;
+
+ {
+ ServiceTracker tracker = new ServiceTracker(Activator.getContext(), IMasterProfilePreferencesProvider.class.getName(), null);
+ tracker.open();
+ IMasterProfilePreferencesProvider pprovider = tracker.getService();
+ if(pprovider == null) return;
+ String profileName = node.parent().parent().name();
+ String nodeName = node.parent().name();
+
+ Preferences rootNode = pprovider.getMasterPreferences(profileName, nodeName);
+
+ if (rootNode == null)
+ return;
+
+ /*repositories*/
+ node = rootNode.node(NODE_REPOSITORIES);
+ }
+
+ String[] children;
+ try {
+ children = node.childrenNames();
+ } catch (BackingStoreException e) {
+ log("Error restoring repositories from preferences", e); //$NON-NLS-1$
+ return;
+ }
+
+ for (int i = 0; i < children.length; i++) {
+ Preferences child = node.node(children[i]);
+ URI location = getRepositoryLocation(child);
+ if (location == null) {
+ try {
+ child.removeNode();
+ continue;
+ } catch (BackingStoreException e) {
+ log("Error removing invalid repository", e); //$NON-NLS-1$
+ }
+ }
+ RepositoryInfo info = new RepositoryInfo();
+ info.location = location;
+ info.name = child.get(KEY_NAME, null);
+ info.nickname = child.get(KEY_NICKNAME, null);
+ info.description = child.get(KEY_DESCRIPTION, null);
+ info.isSystem = child.getBoolean(KEY_SYSTEM, false);
+ info.isEnabled = child.getBoolean(KEY_ENABLED, true);
+ info.suffix = child.get(KEY_SUFFIX, null);
+ repositories.put(getKey(info.location), info);
+ }
+ }
+
+
private void restoreFromSystemProperty() {
String locationString = Activator.getContext().getProperty(getRepositorySystemProperty());
if (locationString != null) {
@@ -1004,6 +1062,7 @@
restoreSpecialRepositories();
restoreFromSystemProperty();
restoreFromPreferences();
+ restoreFromMasterPreferences();
}
}