/******************************************************************************* * Copyright (c) 2007, 2008 compeople AG 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: * compeople AG (Stefan Liebig) - initial API and implementation * IBM Corporation - ongoing development *******************************************************************************/ package org.eclipse.equinox.internal.p2.artifact.processing; import java.io.*; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.equinox.internal.p2.artifact.repository.Activator; import org.eclipse.equinox.internal.p2.core.helpers.FileUtils; import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStep; import org.eclipse.osgi.util.NLS; public abstract class AbstractBufferingStep extends ProcessingStep { private static final String WORK_DIR_PREFIX = "work"; //$NON-NLS-1$ private static final String WORK_DIR_SUFFIX = ""; //$NON-NLS-1$ protected static final String JAR_SUFFIX = ".jar"; //$NON-NLS-1$ protected static final String INCOMING_ROOT = "p2.optimizers.incoming"; //$NON-NLS-1$ protected static final String RESULT_ROOT = "p2.optimizers.result"; //$NON-NLS-1$ protected static final String PREDECESSOR_ROOT = "p2.optimizers.predecessor"; //$NON-NLS-1$ protected OutputStream incomingStream; private File workDir; protected AbstractBufferingStep() { super(); } public void write(int b) throws IOException { OutputStream stream = getOutputStream(); stream.write(b); } protected OutputStream getOutputStream() throws IOException { if (incomingStream != null) return incomingStream; // if buffering, store input stream in temporary file incomingStream = createIncomingStream(); return incomingStream; } protected abstract OutputStream createIncomingStream() throws IOException; public void close() throws IOException { // When we go to close we must have seen all the content we are going to see. // If no one wrote to the temp stream then we return an error. If there is // content then close the temporary stream and perform the processing. // Performing the step should result in the new content being written to // the destination. Make sure we delete the temporary file if any. try { if (incomingStream != null) { incomingStream.close(); // if canceled then skip processing if (getStatus() != null && getStatus().getSeverity() != IStatus.CANCEL) performProcessing(); } else { setStatus(new Status(IStatus.ERROR, Activator.ID, Messages.Empty_stream)); } } finally { incomingStream = null; cleanupTempFiles(); cleanupWorkDir(); } super.close(); // TODO need to get real status here. sometimes the optimizers do not give // any reasonable return status // COMMENT status is initially set to OK! } protected abstract void performProcessing() throws IOException; protected void cleanupTempFiles() { } private void cleanupWorkDir() throws IOException { if (workDir != null) { FileUtils.deleteAll(workDir); // TODO try twice since there seems to be some cases where the dir is not // deleted the first time. At least on Windows... FileUtils.deleteAll(workDir); } } protected File getWorkDir() throws IOException { if (workDir != null) return workDir; workDir = File.createTempFile(WORK_DIR_PREFIX, WORK_DIR_SUFFIX); if (!workDir.delete()) throw new IOException(NLS.bind(Messages.Can_not_delete_temp_dir, workDir)); if (!workDir.mkdirs()) throw new IOException(NLS.bind(Messages.Can_not_create_temp_dir, workDir)); return workDir; } }