org.eclipse.buckminster.ui.SaveRunnable.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.buckminster.ui.SaveRunnable.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2005
 * Thomas Hallgren, Kenneth Olwing, Mitch Sonies
 * Pontus Rydin, Nils Unden, Peer Torngren
 * 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 above, as Initial Contributors under such license.
 * The text of such license is available at www.eclipse.org.
 *******************************************************************************/

package org.eclipse.buckminster.ui;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;

import org.eclipse.buckminster.runtime.IOUtils;
import org.eclipse.buckminster.sax.ISaxable;
import org.eclipse.buckminster.sax.Utils;
import org.eclipse.buckminster.ui.editor.ExternalFileEditorInput;
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.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.editor.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
 */
public class SaveRunnable implements IRunnableWithProgress {
    private final ISaxable saxable;

    private final IPath location;

    private IEditorInput newInput;

    /**
     * Creates a new instance that will save the <code>query</code> at the
     * specificed <code>location</code>.
     * 
     * @param saxable
     *            The SAX output enabled element to be saved.
     * @param location
     *            A location relative to the root of the local file-system.
     */
    public SaveRunnable(ISaxable saxable, IPath location) {
        this.saxable = saxable;
        this.location = location;
    }

    public IEditorInput getSavedInput() {
        return newInput;
    }

    @Override
    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        try {
            if (location.segmentCount() > 1) {
                IContainer container = ResourcesPlugin.getWorkspace().getRoot()
                        .getContainerForLocation(location.removeLastSegments(1));
                if (container != null) {
                    // Workspace file.
                    //
                    InputStream stream = null;
                    try {
                        IFile file = container.getFile(new Path(location.lastSegment()));
                        stream = Utils.getInputStream(saxable);
                        if (file.exists())
                            file.setContents(stream, IResource.KEEP_HISTORY, monitor);
                        else
                            file.create(stream, false, monitor);
                        newInput = new FileEditorInput(file);
                    } finally {
                        IOUtils.close(stream);
                    }
                    return;
                }
            }

            // External file.
            //
            OutputStream stream = null;
            try {
                File file = location.toFile();
                stream = new FileOutputStream(file);
                Utils.serialize(saxable, stream);
                newInput = new ExternalFileEditorInput(file);
            } finally {
                IOUtils.close(stream);
            }
        } catch (OperationCanceledException e) {
            throw new InterruptedException();
        } catch (Throwable e) {
            throw new InvocationTargetException(e);
        }
    }
}