eu.esdihumboldt.hale.ui.io.target.FileTarget.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.ui.io.target.FileTarget.java

Source

/*
 * Copyright (c) 2015 Data Harmonisation Panel
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */

package eu.esdihumboldt.hale.ui.io.target;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;

import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FileFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;

import de.fhg.igd.slf4jplus.ALogger;
import de.fhg.igd.slf4jplus.ALoggerFactory;
import eu.esdihumboldt.hale.common.core.io.ExportProvider;
import eu.esdihumboldt.hale.common.core.io.HaleIO;
import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier;
import eu.esdihumboldt.hale.common.core.io.supplier.LocatableOutputSupplier;
import eu.esdihumboldt.hale.ui.util.io.SaveFileFieldEditor;

/**
 * File as export target.
 * 
 * @author Simon Templer
 * @param <P> the export provider type
 */
public class FileTarget<P extends ExportProvider> extends AbstractTarget<P> {

    private static final ALogger log = ALoggerFactory.getLogger(FileTarget.class);

    /**
     * The file field editor for the target file
     */
    private SaveFileFieldEditor targetFile;

    @Override
    public void createControls(Composite parent) {
        getPage().setDescription("Please select a destination file for the export");

        parent.setLayout(new GridLayout(3, false));

        targetFile = new SaveFileFieldEditor("targetFile", "Target file:", true,
                FileFieldEditor.VALIDATE_ON_KEY_STROKE, parent);
        targetFile.setEmptyStringAllowed(false);
        targetFile.setAllowUri(true);
        targetFile.setPage(getPage());
        targetFile.setPropertyChangeListener(new IPropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent event) {
                if (event.getProperty().equals(FieldEditor.IS_VALID)) {
                    updateState();
                } else if (event.getProperty().equals(FieldEditor.VALUE)) {
                    updateContentType();
                }
            }
        });

        updateState();
    }

    @Override
    public boolean updateConfiguration(P provider) {
        try {
            URI uri = new URI(targetFile.getStringValue());
            if (!uri.isAbsolute()) {
                // was a file
                uri = new File(targetFile.getStringValue()).toURI();
            }
            final URI location = uri;
            provider.setTarget(new LocatableOutputSupplier<OutputStream>() {

                @Override
                public OutputStream getOutput() throws IOException {
                    File file = new File(location);
                    return new FileOutputStream(file);

                    // XXX other URIs unsupported for now
                }

                @Override
                public URI getLocation() {
                    return location;
                }
            });
            return true;
        } catch (URISyntaxException e) {
            // ignore, assume it's a file
        }

        File file = new File(targetFile.getStringValue());
        provider.setTarget(new FileIOSupplier(file));
        return true;
    }

    /**
     * Update the content type
     */
    private void updateContentType() {
        IContentType contentType = null;

        if (getWizard().getProviderFactory() != null && targetFile.isValid()) {
            Collection<IContentType> types = getAllowedContentTypes();
            if (types != null && !types.isEmpty()) {
                if (types.size() == 1) {
                    // if only one content type is possible for the export we
                    // can assume that it is used
                    contentType = types.iterator().next();
                } else {
                    Collection<IContentType> filteredTypes = HaleIO.findContentTypesFor(types, null,
                            targetFile.getStringValue());
                    if (!filteredTypes.isEmpty()) {
                        contentType = filteredTypes.iterator().next();
                    }
                }
            } else {
                // no supported content types!
                log.error("Export provider {0} doesn't support any content types",
                        getWizard().getProviderFactory().getDisplayName());
            }
        }

        setContentType(contentType);
        if (contentType != null) {
            getPage().setMessage(contentType.getName(), DialogPage.INFORMATION);
        } else {
            getPage().setMessage(null);
        }
    }

    private void updateState() {
        updateContentType();

        setValid(targetFile.isValid());
    }

    @Override
    public void onShowPage(boolean firstShow) {
        // update file editor with possibly changed file extensions
        targetFile.setContentTypes(getAllowedContentTypes());
    }

    /**
     * Get the target file name
     * 
     * @return the target file name
     */
    public String getTargetFileName() {
        return targetFile.getStringValue();
    }

    /**
     * @return the file field editor for the target file
     */
    protected SaveFileFieldEditor getSaveFieldEditor() {
        return targetFile;
    }

}