/******************************************************************************* * Copyright (c) 2009 Zhao 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: * Zhao - initial API and implementation *******************************************************************************/ package org.eclipse.php.internal.core.phar; import java.io.*; import java.net.URI; import java.util.zip.GZIPOutputStream; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourceAttributes; import org.eclipse.core.runtime.CoreException; import org.eclipse.php.internal.core.tar.CBZip2OutputStreamForPhar; import org.eclipse.php.internal.core.tar.TarEntry; import org.eclipse.php.internal.core.tar.TarOutputStream; /** * Exports resources to a .tar.gz file. * * @since 3.1 */ public class TarFileExporter extends AbstractFileExporter { private TarOutputStream outputStream; // private GZIPOutputStream gzipOutputStream; /** * Create an instance of this class. * * @param filename * java.lang.String * @param compress * boolean * @exception java.io.IOException */ public TarFileExporter(PharPackage pharPackage) throws IOException { super(pharPackage); OutputStream os = fileContentStream; if (PharConstants.BZ2_COMPRESSED == pharPackage.getCompressType()) { // i think here should be CBZip2OutputStream,but it does not work // and CBZip2OutputStreamForPhar works well. // i do not know why os = new CBZip2OutputStreamForPhar(os); } else if (PharConstants.GZ_COMPRESSED == pharPackage.getCompressType()) { os = new GZIPOutputStream(os); } outputStream = new TarOutputStream(os); } /** * Do all required cleanup now that we're finished with the currently-open * .tar.gz * * @exception java.io.IOException */ public void finished() throws IOException { // super.finished(); outputStream.close(); // if(gzipOutputStream != null) { // gzipOutputStream.close(); // } } /** * Write the contents of the file to the tar archive. * * @param entry * @param contents * @exception java.io.IOException * @exception org.eclipse.core.runtime.CoreException */ // private void write(TarEntry entry, IFile contents) throws IOException, // CoreException { // // write(entry, contents.getContents(false)); // } /** * Write the passed resource to the current archive. * * @param resource * org.eclipse.core.resources.IFile * @param destinationPath * java.lang.String * @exception java.io.IOException * @exception org.eclipse.core.runtime.CoreException */ public void write(IFile resource, String destinationPath) throws IOException, CoreException { TarEntry newEntry = new TarEntry(destinationPath); if (resource.getLocalTimeStamp() != IResource.NULL_STAMP) { newEntry.setTime(resource.getLocalTimeStamp() / 1000); } ResourceAttributes attributes = resource.getResourceAttributes(); if (attributes != null && attributes.isExecutable()) { newEntry.setMode(newEntry.getMode() | 0111); } if (attributes != null && attributes.isReadOnly()) { newEntry.setMode(newEntry.getMode() & ~0222); } final URI location = resource.getLocationURI(); if (location == null) { throw new FileNotFoundException(resource.getFullPath().toOSString()); } newEntry.setSize(EFS.getStore(location).fetchInfo().getLength()); write(newEntry, resource.getContents(false)); } public void writeStub(IStub stub) throws IOException, CoreException { ByteArrayInputStream stubInput = PharUtil.getStubInputStream(stub); TarEntry newEntry = new TarEntry(PharConstants.STUB_PATH); newEntry.setSize(stubInput.available()); write(newEntry, stubInput); } private void write(TarEntry entry, InputStream contentStream) throws IOException { outputStream.putNextEntry(entry); try { int n; byte[] readBuffer = new byte[4096]; while ((n = contentStream.read(readBuffer)) > 0) { outputStream.write(readBuffer, 0, n); } } finally { if (contentStream != null) { contentStream.close(); } } outputStream.closeEntry(); } public void write(IFolder resource, String destinationPath) throws IOException, CoreException { TarEntry newEntry = new TarEntry(destinationPath); if (resource.getLocalTimeStamp() != IResource.NULL_STAMP) { newEntry.setTime(resource.getLocalTimeStamp() / 1000); } ResourceAttributes attributes = resource.getResourceAttributes(); if (attributes != null && attributes.isExecutable()) { newEntry.setMode(newEntry.getMode() | 0111); } if (attributes != null && attributes.isReadOnly()) { newEntry.setMode(newEntry.getMode() & ~0222); } final URI location = resource.getLocationURI(); if (location == null) { throw new FileNotFoundException(resource.getFullPath().toOSString()); } outputStream.putNextEntry(newEntry); outputStream.closeEntry(); } public void doWriteSignature() throws IOException { byte[] signature = fileContentStream.getSignature(); if (signature != null) { signature = PharUtil.getWholeSignature(signature, pharPackage); TarEntry newEntry = new TarEntry(PharConstants.SIGNATURE_PATH); newEntry.setSize(signature.length); write(newEntry, PharUtil.getInputStream(signature)); } } }