[234399] Archive problems when mixing CommonArchive and IArchive
diff --git a/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java b/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java
index 9dc880c..30f8442 100644
--- a/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java
+++ b/plugins/org.eclipse.jst.j2ee.jca/rarproject/org/eclipse/jst/j2ee/jca/modulecore/util/ConnectorArtifactEdit.java
@@ -31,8 +31,6 @@
 import org.eclipse.jst.j2ee.jca.ConnectorResource;
 import org.eclipse.jst.j2ee.jca.JcaFactory;
 import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.jee.archive.ArchiveOptions;
-import org.eclipse.jst.jee.archive.IArchive;
 import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
@@ -390,18 +388,7 @@
 	public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException {
 		if (isBinary()) {
 			JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper();
-			IArchive iArchive = null;
-			try{
-				iArchive = helper.accessArchive();
-				IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH);
-				org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions options = new org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions();
-				options.setIsReadOnly(true);
-				options.setRendererType(org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions.SAX);
-				options.setUseJavaReflection(false);
-				return CommonarchiveFactory.eINSTANCE.openRARFile(options, path.toOSString());
-			} finally {
-				helper.releaseArchive(iArchive);
-			}
+			return helper.accessLegacyArchive();
 		} else {
 			ConnectorComponentLoadStrategyImpl loader = new ConnectorComponentLoadStrategyImpl(getComponent(), includeClasspathComponents);
 			loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java
index 9622a10..f3f19e6 100644
--- a/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java
+++ b/plugins/org.eclipse.jst.j2ee.web/webproject/org/eclipse/jst/j2ee/web/componentcore/util/WebArtifactEdit.java
@@ -39,8 +39,6 @@
 import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
 import org.eclipse.jst.j2ee.webapplication.WelcomeFile;
 import org.eclipse.jst.j2ee.webapplication.WelcomeFileList;
-import org.eclipse.jst.jee.archive.ArchiveOptions;
-import org.eclipse.jst.jee.archive.IArchive;
 import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
@@ -634,18 +632,7 @@
 		verifyOperationSupported();
 		if (isBinary()) {
 			JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper();
-			IArchive iArchive = null;
-			try{
-				iArchive = helper.accessArchive();
-				IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH);
-				org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions options = new org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions();
-				options.setIsReadOnly(true);
-				options.setRendererType(org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions.SAX);
-				options.setUseJavaReflection(false);
-				return CommonarchiveFactory.eINSTANCE.openWARFile(options, path.toOSString());
-			} finally {
-				helper.releaseArchive(iArchive);
-			}
+			return helper.accessLegacyArchive();
 		} else {
 			WebComponentLoadStrategyImpl loader = new WebComponentLoadStrategyImpl(getComponent(), includeClasspathComponents);
 			loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java
index 28c627d..aa9d2f2 100644
--- a/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java
+++ b/plugins/org.eclipse.jst.j2ee/appclientcreation/org/eclipse/jst/j2ee/applicationclient/componentcore/util/AppClientArtifactEdit.java
@@ -35,8 +35,6 @@
 import org.eclipse.jst.j2ee.internal.componentcore.JavaEEBinaryComponentHelper;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.jee.archive.ArchiveOptions;
-import org.eclipse.jst.jee.archive.IArchive;
 import org.eclipse.wst.common.componentcore.ArtifactEdit;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
@@ -388,18 +386,7 @@
 	public Archive asArchive(boolean includeSource, boolean includeClasspathComponents) throws OpenFailureException{
 		if (isBinary()) {
 			JavaEEBinaryComponentHelper helper = (JavaEEBinaryComponentHelper)getBinaryComponentHelper();
-			IArchive iArchive = null;
-			try{
-				iArchive = helper.accessArchive();
-				IPath path = (IPath)iArchive.getArchiveOptions().getOption(ArchiveOptions.ARCHIVE_PATH);
-				org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions options = new org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions();
-				options.setIsReadOnly(true);
-				options.setRendererType(org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions.SAX);
-				options.setUseJavaReflection(false);
-				return CommonarchiveFactory.eINSTANCE.openApplicationClientFile(options, path.toOSString());
-			} finally {
-				helper.releaseArchive(iArchive);
-			}
+			return helper.accessLegacyArchive();
 		} else {
 			AppClientComponentLoadStrategyImpl loader = new AppClientComponentLoadStrategyImpl(getComponent());
 			loader.setExportSource(includeSource);
diff --git a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ArchiveWrapper.java b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ArchiveWrapper.java
index 54ed138..9d10f37 100644
--- a/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ArchiveWrapper.java
+++ b/plugins/org.eclipse.jst.j2ee/archiveops/org/eclipse/jst/j2ee/internal/archive/ArchiveWrapper.java
@@ -118,10 +118,10 @@
 
 	public void close() {
 		try {
-			if (commonArchive != null) {
+			if (commonArchive != null && commonArchive.isOpen()) {
 				commonArchive.close();
 			}
-			if (archive != null) {
+			if (archive != null && archive.isOpen()) {
 				JavaEEArchiveUtilities.INSTANCE.closeArchive(archive);
 			}
 		} catch (RuntimeException e) {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java
index 257e486..5831ab6 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/AppClientBinaryComponentHelper.java
@@ -10,12 +10,14 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.componentcore;
 
+import java.io.File;
 import java.io.IOException;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.ApplicationClientFile;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ApplicationClientFileImpl;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.AppClient12ImportStrategyImpl;
@@ -69,6 +71,7 @@
 		}
 
 		public void close() {
+			helper.aboutToClose();
 			synchronized (this) {
 				count--;
 				if (count > 0) {
@@ -80,6 +83,7 @@
 		
 		public void forceClose(){
 			count = 0;
+			helper.aboutToClose();
 			super.close();
 		}
 		
@@ -100,13 +104,20 @@
 				throw new IOException(e.getMessage());
 			}
 		}
-
+		
+		@Override
+		protected void cleanupAfterTempSave(String uri, File original, File destinationFile) throws SaveFailureException {
+			helper.preCleanupAfterTempSave(uri, original, destinationFile);
+			super.cleanupAfterTempSave(uri, original, destinationFile);
+			helper.postCleanupAfterTempSave(uri, original, destinationFile);
+		}
 	}
 
 	protected ArchiveTypeDiscriminator getDiscriminator() {
 		return Discriminator.getInstance();
 	}
 
+	
 	public AppClientBinaryComponentHelper(IVirtualComponent component) {
 		super(component);
 	}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java
index 3a34a35..234ddbb 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EJBBinaryComponentHelper.java
@@ -10,12 +10,14 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.componentcore;
 
+import java.io.File;
 import java.io.IOException;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.EJBJarFile;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.EJBJarFileImpl;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.EjbJar11ImportStrategyImpl;
@@ -69,6 +71,7 @@
 		}
 
 		public void close() {
+			helper.aboutToClose();
 			synchronized (this) {
 				count--;
 				if (count > 0) {
@@ -80,6 +83,7 @@
 		
 		public void forceClose(){
 			count = 0;
+			helper.aboutToClose();
 			super.close();
 		}
 		
@@ -100,6 +104,13 @@
 				throw new IOException(e.getMessage());
 			}
 		}
+		
+		@Override
+		protected void cleanupAfterTempSave(String uri, File original, File destinationFile) throws SaveFailureException {
+			helper.preCleanupAfterTempSave(uri, original, destinationFile);
+			super.cleanupAfterTempSave(uri, original, destinationFile);
+			helper.postCleanupAfterTempSave(uri, original, destinationFile);
+		}
 	}
 
 	protected ArchiveTypeDiscriminator getDiscriminator() {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java
index 9a07a24..ad70d64 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/EnterpriseBinaryComponentHelper.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.componentcore;
 
+import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -64,7 +65,7 @@
 		return helper;
 	}
 	
-	private IReferenceCountedArchive archive = null;
+	IReferenceCountedArchive archive = null;
 
 	protected EnterpriseBinaryComponentHelper(IVirtualComponent component) {
 		super(component);
@@ -197,6 +198,17 @@
 	protected static void physicallyClose(IReferenceCountedArchive archive) {
 		((BinaryZipFileLoadStrategy)archive.getLoadStrategy()).physicallyClose();
 	}
+	
+	protected void aboutToClose() {
+		//default is to do nothing
+	}
+	
+	protected void preCleanupAfterTempSave(String uri, File original, File destinationFile) {
+		//default is to do nothing
+	}
+	protected void postCleanupAfterTempSave(String uri, File original, File destinationFile) {
+		//default is to do nothing
+	}
 
 	private static class BinaryZipFileLoadStrategy extends ZipFileLoadStrategyImpl {
 		
@@ -209,6 +221,11 @@
 		public BinaryZipFileLoadStrategy(java.io.File file) throws IOException {
 			super(file);
 		}
+		
+		public void close() {
+			physicallyOpen = false;
+			super.close();
+		}
 
 		public boolean isPhysicallyOpen(){
 			return physicallyOpen;
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java
index 4fdfdf0..a7f5110 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JCABinaryComponentHelper.java
@@ -10,12 +10,14 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.componentcore;
 
+import java.io.File;
 import java.io.IOException;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.RARFile;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.RARFileImpl;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy;
@@ -69,6 +71,7 @@
 		}
 
 		public void close() {
+			helper.aboutToClose();
 			synchronized (this) {
 				count--;
 				if (count > 0) {
@@ -80,6 +83,7 @@
 		
 		public void forceClose(){
 			count = 0;
+			helper.aboutToClose();
 			super.close();
 		}
 		
@@ -99,7 +103,14 @@
 			} catch (OpenFailureException e) {
 				throw new IOException(e.getMessage());
 			}
-		}		
+		}
+		
+		@Override
+		protected void cleanupAfterTempSave(String uri, File original, File destinationFile) throws SaveFailureException {
+			helper.preCleanupAfterTempSave(uri, original, destinationFile);
+			super.cleanupAfterTempSave(uri, original, destinationFile);
+			helper.postCleanupAfterTempSave(uri, original, destinationFile);
+		}
 	}
 
 	protected ArchiveTypeDiscriminator getDiscriminator() {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java
index 0c770ba..5eaf259 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/JavaEEBinaryComponentHelper.java
@@ -1,5 +1,6 @@
 package org.eclipse.jst.j2ee.internal.componentcore;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Hashtable;
@@ -14,8 +15,10 @@
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
+import org.eclipse.jst.j2ee.internal.componentcore.EnterpriseBinaryComponentHelper.IReferenceCountedArchive;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.javaee.applicationclient.ApplicationClient;
 import org.eclipse.jst.javaee.applicationclient.ApplicationclientFactory;
@@ -40,6 +43,7 @@
 public class JavaEEBinaryComponentHelper extends BinaryComponentHelper {
 
 	private IArchive archive;
+	private EnterpriseBinaryComponentHelper legacyBinaryHelper;
 
 	private int localArchiveAccessCount = 0;
 
@@ -155,6 +159,16 @@
 		}
 		return archive;
 	}
+	
+	protected void safeReleaseArchive(IArchive archive){
+		int count = 0;
+		synchronized(this){
+			count = localArchiveAccessCount;
+		}
+		if(count > 0){
+			releaseArchive(archive);
+		}
+	}
 
 	public void releaseArchive(IArchive archive) {
 		if (archive != this.archive) {
@@ -169,10 +183,113 @@
 		}
 	}
 
+	private int preSwapAccessCount = 0;
+	protected void preFileSwap(){
+		int count = 0;
+		synchronized (this) {
+			preSwapAccessCount = localArchiveAccessCount;
+			count = preSwapAccessCount;
+		}
+		while (count > 0){
+			count --;
+			releaseArchive(archive);
+		}
+	}
+	
+	protected void postFileSwap() {
+		int count = 0;
+		synchronized (this) {
+			count = preSwapAccessCount;
+			preSwapAccessCount = 0;
+		}
+		while(count > 0){
+			count --;
+			accessArchive();
+		}
+	}
+	
+	public Archive accessLegacyArchive() {
+		if(legacyBinaryHelper == null){
+			JavaEEQuickPeek qp = getJavaEEQuickPeek(getComponent());
+			IPath ddPath = null;
+			switch (qp.getType()) {
+			case JavaEEQuickPeek.APPLICATION_CLIENT_TYPE:
+				legacyBinaryHelper = new AppClientBinaryComponentHelper(getComponent()){
+					protected void aboutToClose() {
+						safeReleaseArchive(JavaEEBinaryComponentHelper.this.archive);
+					}
+					protected void preCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						preFileSwap();
+					}
+					protected void postCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						postFileSwap();
+					}
+				};
+				break;
+			case JavaEEQuickPeek.EJB_TYPE:
+				legacyBinaryHelper = new EJBBinaryComponentHelper(getComponent()){
+					protected void aboutToClose() {
+						safeReleaseArchive(JavaEEBinaryComponentHelper.this.archive);
+					}
+					protected void preCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						preFileSwap();
+					}
+					protected void postCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						postFileSwap();
+					}
+				};
+				break;
+			case JavaEEQuickPeek.WEB_TYPE:
+				legacyBinaryHelper = new WebBinaryComponentHelper(getComponent()){
+					protected void aboutToClose() {
+						safeReleaseArchive(JavaEEBinaryComponentHelper.this.archive);
+					}
+					protected void preCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						preFileSwap();
+					}
+					protected void postCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						postFileSwap();
+					}
+				};
+				break;
+			case JavaEEQuickPeek.CONNECTOR_TYPE:
+				legacyBinaryHelper = new JCABinaryComponentHelper(getComponent()){
+					protected void aboutToClose() {
+						safeReleaseArchive(JavaEEBinaryComponentHelper.this.archive);
+					}
+					protected void preCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						preFileSwap();
+					}
+					protected void postCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						postFileSwap();
+					}
+				};
+				break;
+			default: //utility jar
+				legacyBinaryHelper = new UtilityBinaryComponentHelper(getComponent()){
+					protected void aboutToClose() {
+						safeReleaseArchive(JavaEEBinaryComponentHelper.this.archive);
+					}
+					protected void preCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						preFileSwap();
+					}
+					protected void postCleanupAfterTempSave(String uri, File original, File destinationFile) {
+						postFileSwap();
+					}
+				};
+				break;
+			}
+		}
+		accessArchive();
+		Archive legacyArchive = legacyBinaryHelper.accessArchive();
+		return legacyArchive;
+	}
+	
 	@Override
 	public void dispose() {
 		super.dispose();
 		int count = 0;
+		int legacyCount = 0;
 		synchronized (this) {
 			count = localArchiveAccessCount;
 		}
@@ -185,6 +302,12 @@
 				}
 			}
 		}
+		if(legacyBinaryHelper != null){
+			IReferenceCountedArchive legacyArchive = legacyBinaryHelper.archive;
+			if(legacyArchive != null){
+				legacyArchive.forceClose();
+			}
+		}
 	}
 
 	protected IArchive getArchive() {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java
index a5ea3dd..d400135 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/UtilityBinaryComponentHelper.java
@@ -10,11 +10,13 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.componentcore;
 
+import java.io.File;
 import java.io.IOException;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminatorImpl;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ArchiveImpl;
@@ -73,6 +75,7 @@
 		}
 
 		public void close() {
+			helper.aboutToClose();
 			synchronized (this) {
 				count--;
 				if (count > 0) {
@@ -84,6 +87,7 @@
 		
 		public void forceClose(){
 			count = 0;
+			helper.aboutToClose();
 			super.close();
 		}
 		
@@ -104,6 +108,13 @@
 				throw new IOException(e.getMessage());
 			}
 		}
+		
+		@Override
+		protected void cleanupAfterTempSave(String uri, File original, File destinationFile) throws SaveFailureException {
+			helper.preCleanupAfterTempSave(uri, original, destinationFile);
+			super.cleanupAfterTempSave(uri, original, destinationFile);
+			helper.postCleanupAfterTempSave(uri, original, destinationFile);
+		}
 	}
 
 	protected ArchiveTypeDiscriminator getDiscriminator() {
diff --git a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java
index a5b1296..9b7591e 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eecreation/org/eclipse/jst/j2ee/internal/componentcore/WebBinaryComponentHelper.java
@@ -10,12 +10,14 @@
  *******************************************************************************/
 package org.eclipse.jst.j2ee.internal.componentcore;
 
+import java.io.File;
 import java.io.IOException;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveTypeDiscriminator;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.impl.WARFileImpl;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy;
@@ -69,6 +71,7 @@
 		}
 
 		public void close() {
+			helper.aboutToClose();
 			synchronized (this) {
 				count--;
 				if (count > 0) {
@@ -80,6 +83,7 @@
 		
 		public void forceClose(){
 			count = 0;
+			helper.aboutToClose();
 			super.close();
 		}
 		
@@ -100,6 +104,13 @@
 				throw new IOException(e.getMessage());
 			}
 		}
+		
+		@Override
+		protected void cleanupAfterTempSave(String uri, File original, File destinationFile) throws SaveFailureException {
+			helper.preCleanupAfterTempSave(uri, original, destinationFile);
+			super.cleanupAfterTempSave(uri, original, destinationFile);
+			helper.postCleanupAfterTempSave(uri, original, destinationFile);
+		}
 	}
 
 	protected ArchiveTypeDiscriminator getDiscriminator() {