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