Bug 469656 - When using StorageManager the framework may finalize
partially written files

Change-Id: Ifd96d8cb93e294615dee2bc56f865a18b6279e99
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
index fb723ff..5214667 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
@@ -39,6 +39,7 @@
 import org.eclipse.osgi.storage.bundlefile.*;
 import org.eclipse.osgi.storage.url.reference.Handler;
 import org.eclipse.osgi.storage.url.reference.ReferenceInputStream;
+import org.eclipse.osgi.storagemanager.ManagedOutputStream;
 import org.eclipse.osgi.storagemanager.StorageManager;
 import org.eclipse.osgi.util.ManifestElement;
 import org.eclipse.osgi.util.NLS;
@@ -1026,20 +1027,29 @@
 
 	void save0() throws IOException {
 		StorageManager childStorageManager = null;
+		ManagedOutputStream mos = null;
 		DataOutputStream out = null;
+		boolean success = false;
 		moduleDatabase.readLock();
 		try {
 			synchronized (this.saveMonitor) {
 				if (lastSavedTimestamp == moduleDatabase.getTimestamp())
 					return;
 				childStorageManager = getChildStorageManager();
-				out = new DataOutputStream(new BufferedOutputStream(childStorageManager.getOutputStream(FRAMEWORK_INFO)));
+				mos = childStorageManager.getOutputStream(FRAMEWORK_INFO);
+				out = new DataOutputStream(new BufferedOutputStream(mos));
 				saveGenerations(out);
 				savePermissionData(out);
 				moduleDatabase.store(out, true);
 				lastSavedTimestamp = moduleDatabase.getTimestamp();
+				success = true;
 			}
 		} finally {
+			if (!success) {
+				if (mos != null) {
+					mos.abort();
+				}
+			}
 			if (out != null) {
 				try {
 					out.close();