/*******************************************************************************
* Copyright (c) 2008
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the individual
* copyright holders listed below, as Initial Contributors under such license.
* The text of such license is available at
* http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Henrik Lindberg
*******************************************************************************/
package org.eclipse.equinox.p2.authoring.internal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.equinox.internal.p2.metadata.InstallableUnit;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.part.FileEditorInput;
/**
* A runnable capable of saving a query to a certain location. The location must be relative to the root of the local
* file-system. Once saved, the resulting {@link org.eclipse.ui.IEditorInput IEditorInput} can be obtained through a
* call to {@link #getSavedInput()}. That editor input will either be an
* {@link org.eclipse.buckminster.ui.ExternalFileEditorInput ExternalFileEditorInput} or a
* {@link org.eclipse.ui.IFileEditorInput IFileEditorInput} depending on if the location could be mapped to a file in an
* existing project or not.
*
* @author Thomas Hallgren
* @author Henrik Lindberg
*/
@SuppressWarnings("restriction")
public class SaveIURunnable implements IRunnableWithProgress
{
private final InstallableUnit m_unit;
private final IPath m_location;
private IEditorInput m_newInput;
/**
* Creates a new instance that will save the <code>unit</code> at the specificed <code>location</code>.
*
* @param unit
* The InstallableUnit to save.
* @param location
* A location relative to the root of the local file-system.
*/
public SaveIURunnable(InstallableUnit unit, IPath location)
{
m_unit = unit;
m_location = location;
}
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
{
try
{
if(m_location.segmentCount() > 1)
{
IContainer container = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(
m_location.removeLastSegments(1));
if(container != null)
{
// Workspace file.
//
InputStream stream = null;
try
{
IFile file = container.getFile(new Path(m_location.lastSegment()));
stream = P2MetadataWriter.getInputStream(m_unit);
if(file.exists())
file.setContents(stream, IResource.KEEP_HISTORY, monitor);
else
file.create(stream, false, monitor);
m_newInput = new FileEditorInput(file);
}
finally
{
if(stream != null)
{
try
{
stream.close();
}
catch(IOException e)
{
}
}
}
return;
}
}
// External file.
//
OutputStream stream = null;
try
{
File file = m_location.toFile();
stream = new FileOutputStream(file);
P2MetadataWriter.writeInstallableUnit(m_unit, stream);
m_newInput = new ExternalFileEditorInput(file);
}
finally
{
if(stream != null)
{
try
{
stream.close();
}
catch(IOException e)
{
}
}
}
}
catch(OperationCanceledException e)
{
throw new InterruptedException();
}
catch(Throwable e)
{
throw new InvocationTargetException(e);
}
}
public IEditorInput getSavedInput()
{
return m_newInput;
}
}