Bug 245323 Extension location repos are not kept in synch in some cases
diff --git a/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/ExtensionLocationArtifactRepository.java b/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/ExtensionLocationArtifactRepository.java
index 81117f4..892e062 100644
--- a/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/ExtensionLocationArtifactRepository.java
+++ b/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/ExtensionLocationArtifactRepository.java
@@ -29,7 +29,7 @@
 	public static final String TYPE = "org.eclipse.equinox.p2.extensionlocation.artifactRepository"; //$NON-NLS-1$
 	public static final Integer VERSION = new Integer(1);
 
-	final IFileArtifactRepository artifactRepository;
+	IFileArtifactRepository artifactRepository;
 	private File base;
 	private Object state = SiteListener.UNINITIALIZED;
 
@@ -64,9 +64,21 @@
 		if (state == SiteListener.INITIALIZED || state == SiteListener.INITIALIZING)
 			return;
 		// if the repo has not been synchronized for us already, synchronize it.
+		// Note: this will reload "artifactRepository"
 		SiteListener.synchronizeRepositories(null, this, base);
 	}
 
+	void reload() {
+		try {
+			ExtensionLocationArtifactRepository repo = (ExtensionLocationArtifactRepository) new ExtensionLocationArtifactRepositoryFactory().load(getLocation(), null);
+			artifactRepository = repo.artifactRepository;
+		} catch (ProvisionException e) {
+			//unexpected
+			e.printStackTrace();
+			throw new IllegalStateException(e.getMessage());
+		}
+	}
+
 	void state(Object value) {
 		state = value;
 	}
@@ -187,10 +199,12 @@
 	}
 
 	public Map getProperties() {
+		ensureInitialized();
 		return artifactRepository.getProperties();
 	}
 
 	public String setProperty(String key, String value) {
+		ensureInitialized();
 		return artifactRepository.setProperty(key, value);
 	}
 }
diff --git a/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/ExtensionLocationMetadataRepository.java b/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/ExtensionLocationMetadataRepository.java
index 5cc250e..c700035 100644
--- a/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/ExtensionLocationMetadataRepository.java
+++ b/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/ExtensionLocationMetadataRepository.java
@@ -30,7 +30,7 @@
 	public static final String TYPE = "org.eclipse.equinox.p2.extensionlocation.metadataRepository"; //$NON-NLS-1$
 	public static final Integer VERSION = new Integer(1);
 
-	final IMetadataRepository metadataRepository;
+	IMetadataRepository metadataRepository;
 	private File base;
 	private Object state = SiteListener.UNINITIALIZED;
 
@@ -64,9 +64,21 @@
 		if (state == SiteListener.INITIALIZED || state == SiteListener.INITIALIZING)
 			return;
 		// if the repo has not been synchronized for us already, synchronize it.
+		// Note: this will reload "metadataRepository"
 		SiteListener.synchronizeRepositories(this, null, base);
 	}
 
+	void reload() {
+		try {
+			ExtensionLocationMetadataRepository repo = (ExtensionLocationMetadataRepository) new ExtensionLocationMetadataRepositoryFactory().load(getLocation(), null);
+			metadataRepository = repo.metadataRepository;
+		} catch (ProvisionException e) {
+			//unexpected
+			e.printStackTrace();
+			throw new IllegalStateException(e.getMessage());
+		}
+	}
+
 	void state(Object value) {
 		state = value;
 	}
@@ -154,6 +166,7 @@
 	 * @see org.eclipse.equinox.internal.provisional.spi.p2.core.repository.AbstractRepository#getProperties()
 	 */
 	public Map getProperties() {
+		ensureInitialized();
 		return metadataRepository.getProperties();
 	}
 
@@ -162,6 +175,7 @@
 	}
 
 	public String setProperty(String key, String value) {
+		ensureInitialized();
 		return metadataRepository.setProperty(key, value);
 	}
 }
diff --git a/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/SiteListener.java b/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/SiteListener.java
index 9635a05..1eab349 100644
--- a/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/SiteListener.java
+++ b/bundles/org.eclipse.equinox.p2.extensionlocation/src/org/eclipse/equinox/internal/p2/extensionlocation/SiteListener.java
@@ -73,9 +73,11 @@
 	public static synchronized void synchronizeRepositories(ExtensionLocationMetadataRepository metadataRepository, ExtensionLocationArtifactRepository artifactRepository, File base) {
 		try {
 			if (metadataRepository == null) {
+				artifactRepository.reload();
 				ExtensionLocationMetadataRepositoryFactory factory = new ExtensionLocationMetadataRepositoryFactory();
 				metadataRepository = (ExtensionLocationMetadataRepository) factory.load(artifactRepository.getLocation(), null);
 			} else if (artifactRepository == null) {
+				metadataRepository.reload();
 				ExtensionLocationArtifactRepositoryFactory factory = new ExtensionLocationArtifactRepositoryFactory();
 				artifactRepository = (ExtensionLocationArtifactRepository) factory.load(metadataRepository.getLocation(), null);
 			}