blob: 17e7b41381f91a12925bf883d2990db295c5dff0 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}