| /******************************************************************************* |
| * Copyright (c) 2001, 2005 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 |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.j2ee.commonarchivecore.internal.strategy; |
| |
| |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.util.zip.ZipEntry; |
| import java.util.zip.ZipOutputStream; |
| |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.URIConverter; |
| import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive; |
| import org.eclipse.jst.j2ee.commonarchivecore.internal.File; |
| import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException; |
| import org.eclipse.jst.j2ee.internal.J2EEConstants; |
| import org.eclipse.wst.common.internal.emf.resource.CompatibilityURIConverter; |
| import org.eclipse.wst.common.internal.emf.utilities.Revisit; |
| |
| |
| /** |
| * This is a concrete implentation of SaveStrategy. All the contents of the archive, including xmi |
| * resources, will be output to a ZipOutputStream. The output stream should be passed in by the |
| * client. |
| */ |
| public class ZipStreamSaveStrategyImpl extends SaveStrategyImpl implements SaveStrategy { |
| protected OutputStream destinationStream; |
| /** Used internally */ |
| protected ZipOutputStream zipOutputStream; |
| |
| /** |
| * Wraps a new zip output stream around the parameter |
| */ |
| public ZipStreamSaveStrategyImpl(OutputStream out) { |
| setDestinationStream(out); |
| setZipOutputStream(new ZipOutputStream(out)); |
| } |
| |
| public void close() throws IOException { |
| getDestinationStream().close(); |
| } |
| |
| protected SaveStrategy createNestedSaveStrategy(Archive anArchive) { |
| return new ZipStreamSaveStrategyImpl(getZipOutputStream()); |
| } |
| |
| public void finish() throws IOException { |
| getZipOutputStream().finish(); |
| //If this is not nested, close the stream to free up the resource |
| //otherwise, don't close it because the parent may not be done |
| if (!(getDestinationStream() instanceof ZipOutputStream)) |
| getDestinationStream().close(); |
| } |
| |
| /** |
| * @return java.io.OutputStream |
| */ |
| public java.io.OutputStream getDestinationStream() { |
| return destinationStream; |
| } |
| |
| /** |
| * @see com.ibm.etools.archive.impl.SaveStrategyImpl |
| */ |
| protected java.io.OutputStream getOutputStreamForResource(Resource aResource) throws java.io.IOException { |
| return getZipOutputStream(); |
| } |
| |
| /** |
| * @see com.ibm.etools.archive.SaveStrategy#saveMofResource(Resource) |
| */ |
| public void saveMofResource(Resource aResource, OutputStream out) throws IOException { |
| Revisit.revisit(); |
| URI uri = aResource.getURI(); |
| //Ensure container relative URI |
| URIConverter conv = getArchive().getResourceSet().getURIConverter(); |
| if (conv instanceof CompatibilityURIConverter) |
| uri = ((CompatibilityURIConverter) conv).deNormalize(uri); |
| ZipEntry entry = new ZipEntry(uri.toString()); |
| zipOutputStream.putNextEntry(entry); |
| super.saveMofResource(aResource, out); |
| zipOutputStream.closeEntry(); |
| } |
| |
| /** |
| * @return java.util.zip.ZipOutputStream |
| */ |
| protected java.util.zip.ZipOutputStream getZipOutputStream() { |
| return zipOutputStream; |
| } |
| |
| /** |
| * @see com.ibm.etools.archive.SaveStrategy |
| */ |
| public void save(org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest aManifest) throws SaveFailureException { |
| try { |
| ZipEntry entry = new ZipEntry(J2EEConstants.MANIFEST_URI); |
| getZipOutputStream().putNextEntry(entry); |
| aManifest.write(getZipOutputStream()); |
| getZipOutputStream().closeEntry(); |
| } catch (IOException iox) { |
| throw new SaveFailureException(J2EEConstants.MANIFEST_URI, iox); |
| } |
| } |
| |
| public void save(Archive anArchive) throws SaveFailureException { |
| try { |
| ZipEntry entry = new ZipEntry(anArchive.getURI()); |
| getZipOutputStream().putNextEntry(entry); |
| super.save(anArchive); |
| getZipOutputStream().closeEntry(); |
| } catch (IOException iox) { |
| throw new SaveFailureException(anArchive.getURI(), iox); |
| } |
| } |
| |
| public void save(File aFile, InputStream in) throws SaveFailureException { |
| try { |
| String entryName = aFile.getURI(); |
| if (aFile.isDirectoryEntry() && !entryName.endsWith("/"))//$NON-NLS-1$ |
| entryName = entryName + '/'; |
| ZipEntry entry = new ZipEntry(entryName); |
| if (aFile.getLastModified() > 0) |
| entry.setTime(aFile.getLastModified()); |
| getZipOutputStream().putNextEntry(entry); |
| if (!aFile.isDirectoryEntry()) { |
| org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil.copy(in, getZipOutputStream()); |
| } |
| getZipOutputStream().closeEntry(); |
| } catch (IOException iox) { |
| throw new SaveFailureException(aFile.getURI(), iox); |
| } |
| } |
| |
| /** |
| * @param newDestinationStream |
| * java.io.OutputStream |
| */ |
| public void setDestinationStream(java.io.OutputStream newDestinationStream) { |
| destinationStream = newDestinationStream; |
| } |
| |
| /** |
| * @param newZipOutputStream |
| * java.util.zip.ZipOutputStream |
| */ |
| protected void setZipOutputStream(java.util.zip.ZipOutputStream newZipOutputStream) { |
| zipOutputStream = newZipOutputStream; |
| } |
| } |