Adding checksum support
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepository.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepository.java
index 1093bb3..e7bb70d 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepository.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepository.java
@@ -14,6 +14,7 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.*;
+import java.util.zip.*;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.equinox.internal.p2.core.helpers.FileUtils;
@@ -51,11 +52,17 @@
 
 			DefaultSiteParser siteParser = new DefaultSiteParser();
 			long start = System.currentTimeMillis();
-			InputStream is = new BufferedInputStream(location.openStream());
+			Checksum checksum = new CRC32();
+			InputStream is = new CheckedInputStream(new BufferedInputStream(location.openStream()), checksum);
 			SiteModel siteModel = siteParser.parse(is);
-			System.out.println("Time Fetching Site " + location + " was: " + (System.currentTimeMillis() - start) + " ms");
+			System.out.println("Time Fetching Artifact Site " + location + " was: " + (System.currentTimeMillis() - start) + " ms");
 
-			// For now we will always refresh the contents. We can do a checksum here.
+			String savedChecksum = (String) artifactRepository.getProperties().get("site.checksum");
+			String checksumString = Long.toString(checksum.getValue());
+			if (savedChecksum != null && savedChecksum.equals(checksumString))
+				return;
+
+			artifactRepository.setProperty("site.checksum", checksumString);
 			artifactRepository.removeAll();
 
 			SiteFeature[] siteFeatures = siteModel.getFeatures();
@@ -91,7 +98,7 @@
 			IArtifactDescriptor[] descriptors = (IArtifactDescriptor[]) allSiteArtifacts.toArray(new IArtifactDescriptor[allSiteArtifacts.size()]);
 			artifactRepository.addDescriptors(descriptors);
 
-			System.out.println("Time Fetching Site and Features for " + location + " was: " + (System.currentTimeMillis() - start) + " ms");
+			System.out.println("Time Fetching Artifact Site and Features for " + location + " was: " + (System.currentTimeMillis() - start) + " ms");
 
 		} catch (IOException e) {
 			// TODO Auto-generated catch block
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepository.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepository.java
index 8842119..0391d53 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepository.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepository.java
@@ -14,6 +14,7 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.*;
+import java.util.zip.*;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.equinox.internal.p2.core.helpers.FileUtils;
 import org.eclipse.equinox.internal.p2.metadata.generator.features.*;
@@ -56,11 +57,17 @@
 
 			DefaultSiteParser siteParser = new DefaultSiteParser();
 			long start = System.currentTimeMillis();
-			InputStream is = new BufferedInputStream(location.openStream());
+			Checksum checksum = new CRC32();
+			InputStream is = new CheckedInputStream(new BufferedInputStream(location.openStream()), checksum);
 			SiteModel siteModel = siteParser.parse(is);
-			System.out.println("Time Fetching Site " + location + " was: " + (System.currentTimeMillis() - start) + " ms");
+			System.out.println("Time Fetching Metadata Site " + location + " was: " + (System.currentTimeMillis() - start) + " ms");
 
-			// For now we will always refresh the contents. We can do a checksum here.
+			String savedChecksum = (String) metadataRepository.getProperties().get("site.checksum");
+			String checksumString = Long.toString(checksum.getValue());
+			if (savedChecksum != null && savedChecksum.equals(checksumString))
+				return;
+
+			metadataRepository.setProperty("site.checksum", checksumString);
 			metadataRepository.removeAll();
 
 			Map categoryNameToFeatureIUs = new HashMap();
@@ -80,7 +87,6 @@
 				System.out.println(siteFeature.getFeatureIdentifier());
 				URL featureURL = new URL(location, siteFeature.getURLString());
 				Feature feature = parseFeature(featureParser, featureURL);
-
 				FeatureEntry[] featureEntries = feature.getEntries();
 				for (int j = 0; j < featureEntries.length; j++) {
 					FeatureEntry entry = featureEntries[j];
@@ -119,7 +125,7 @@
 
 			IInstallableUnit[] ius = (IInstallableUnit[]) allSiteIUs.toArray(new IInstallableUnit[allSiteIUs.size()]);
 			metadataRepository.addInstallableUnits(ius);
-			System.out.println("Time Fetching Site and Features for " + location + " was: " + (System.currentTimeMillis() - start) + " ms");
+			System.out.println("Time Fetching Metadata Site and Features for " + location + " was: " + (System.currentTimeMillis() - start) + " ms");
 
 		} catch (IOException e) {
 			// TODO Auto-generated catch block