/************************************************************************************* * Copyright (c) 2014 Red Hat, Inc. 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: * JBoss by Red Hat - Initial implementation. ************************************************************************************/ package org.jboss.tools.runtime.core.extract.internal; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.GZIPInputStream; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.osgi.util.NLS; import org.jboss.tools.runtime.core.RuntimeCoreActivator; import org.jboss.tools.runtime.core.extract.IOverwrite; public class UntarGZUtility extends UntarUtility { public UntarGZUtility(File file) { super(file); } @Override public IStatus extract(File destination, IOverwrite overwriteQuery, IProgressMonitor progress) throws CoreException { String name = file.getName(); progress.beginTask(NLS.bind("Extracting {0}", name), 1000); IPath path = new Path(destination.getAbsolutePath()); int slashIdx = name.lastIndexOf('/'); if (slashIdx >= 0) name = name.substring(slashIdx + 1); FileInputStream in = null; try { in = new FileInputStream(file); File tarFile = File.createTempFile("runtime", ".tar"); tarFile.deleteOnExit(); String tarName = name; if (slashIdx >= 0) tarName = name.substring(0, name.length() - 3); progress.subTask(NLS.bind("Extracting {0}", tarName)); int tempSize = Integer.MAX_VALUE; if (file.length() < Integer.MAX_VALUE) tempSize = (int)file.length(); ungzip(in, tarFile, new SubProgressMonitor(progress, 500), tempSize); if (!progress.isCanceled()) { in = new FileInputStream(tarFile); untar(in, path, new SubProgressMonitor(progress, 500)); } } catch (Exception e) { throw new CoreException(new Status(IStatus.ERROR, RuntimeCoreActivator.PLUGIN_ID, 0, NLS.bind("Error extracting runtime {0}", e.getLocalizedMessage()), e)); } finally { try { if (in != null) in.close(); } catch (IOException e) { // ignore } progress.done(); } return Status.OK_STATUS; } protected void ungzip(InputStream in, File tarFile, IProgressMonitor monitor, int size) throws IOException { GZIPInputStream gzin = null; FileOutputStream fout = null; try { gzin = new GZIPInputStream(in); fout = new FileOutputStream(tarFile); copyWithSize(gzin, fout, monitor, size); } finally { if (gzin != null) { try { gzin.close(); } catch (IOException e) { // ignore } if (fout != null) { try { fout.close(); } catch (IOException e) { // ignore } } } } } }