Bug 345548 - [Backport] ObjectNotFoundException prevents opening workspace
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java
index 1df55e5..6335763 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/SaveManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2011 IBM Corporation 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
@@ -23,6 +23,30 @@
 import org.eclipse.osgi.util.NLS;
 
 public class SaveManager implements IElementInfoFlattener, IManager, IStringPoolParticipant {
+	class MasterTable extends Properties {
+		private static final long serialVersionUID = 1L;
+
+		/* (non-Javadoc)
+		 * @see java.util.Hashtable#put(java.lang.Object, java.lang.Object)
+		 */
+		public synchronized Object put(Object key, Object value) {
+			Object prev = super.put(key, value);
+			if (prev != null && ROOT_SEQUENCE_NUMBER_KEY.equals(key)) {
+				int prevSeqNum = new Integer((String) prev).intValue();
+				int currSeqNum = new Integer((String) value).intValue();
+				if (prevSeqNum > currSeqNum) {
+					//revert last put operation
+					super.put(key, prev);
+					//notify about the problem, do not throw exception but add the exception to know where it occurred
+					String message = "Cannot set lower sequence number for root (previous: " + prevSeqNum + ", new: " + currSeqNum + "). Ignoring the new value."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+					Policy.log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, IResourceStatus.INTERNAL_ERROR, message, new IllegalArgumentException(message)));
+				}
+			}
+			return prev;
+		}
+	}
+
+	protected static final String ROOT_SEQUENCE_NUMBER_KEY = Path.ROOT.toString() + LocalMetaArea.F_TREE;
 	protected static final String CLEAR_DELTA_PREFIX = "clearDelta_"; //$NON-NLS-1$
 	protected static final String DELTA_EXPIRATION_PREFIX = "deltaExpiration_"; //$NON-NLS-1$
 	protected static final int DONE_SAVING = 3;
@@ -44,7 +68,7 @@
 	protected static final String SAVE_NUMBER_PREFIX = "saveNumber_"; //$NON-NLS-1$
 	protected static final int SAVING = 2;
 	protected ElementTree lastSnap;
-	protected Properties masterTable;
+	protected MasterTable masterTable;
 
 	/**
 	 * A flag indicating that a save operation is occurring.  This is a signal
@@ -738,7 +762,7 @@
 
 	protected void restoreMasterTable() throws CoreException {
 		long start = System.currentTimeMillis();
-		masterTable = new Properties();
+		masterTable = new MasterTable();
 		IPath location = workspace.getMetaArea().getSafeTableLocationFor(ResourcesPlugin.PI_RESOURCES);
 		java.io.File target = location.toFile();
 		if (!target.exists()) {