org.locationtech.udig.processingtoolbox.tools.ExportStyleDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.locationtech.udig.processingtoolbox.tools.ExportStyleDialog.java

Source

/*
 * uDig - User Friendly Desktop Internet GIS client
 * (C) MangoSystem - www.mangosystem.com 
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * (http://www.eclipse.org/legal/epl-v10.html), and the Refractions BSD
 * License v1.0 (http://udig.refractions.net/files/bsd3-v10.html).
 */
package org.locationtech.udig.processingtoolbox.tools;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Logger;

import javax.xml.transform.TransformerException;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.PlatformUI;
import org.geotools.data.FeatureSource;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.styling.FeatureTypeConstraint;
import org.geotools.styling.SLDTransformer;
import org.geotools.styling.Style;
import org.geotools.styling.StyleFactory;
import org.geotools.styling.StyledLayerDescriptor;
import org.geotools.styling.UserLayer;
import org.geotools.util.logging.Logging;
import org.locationtech.udig.processingtoolbox.ToolboxPlugin;
import org.locationtech.udig.processingtoolbox.ToolboxView;
import org.locationtech.udig.processingtoolbox.internal.Messages;
import org.locationtech.udig.processingtoolbox.internal.ui.OutputDataWidget;
import org.locationtech.udig.processingtoolbox.internal.ui.OutputDataWidget.FileDataType;
import org.locationtech.udig.processingtoolbox.internal.ui.TableSelectionWidget;
import org.locationtech.udig.project.ILayer;
import org.locationtech.udig.project.IMap;
import org.locationtech.udig.style.sld.SLDContent;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

/**
 * Exports To SLD files
 * 
 * @author MapPlus
 */
public class ExportStyleDialog extends AbstractGeoProcessingDialog implements IRunnableWithProgress {
    protected static final Logger LOGGER = Logging.getLogger(ExportStyleDialog.class);

    private Table inputTable;

    private Button chkOverwrite;

    final StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);

    public ExportStyleDialog(Shell parentShell, IMap map) {
        super(parentShell, map);

        setShellStyle(SWT.CLOSE | SWT.MIN | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | SWT.RESIZE);

        this.windowTitle = Messages.ExportStyleDialog_title;
        this.windowDesc = Messages.ExportStyleDialog_description;
        this.windowSize = new Point(650, 500);
    }

    @Override
    protected Control createDialogArea(final Composite parent) {
        Composite area = (Composite) super.createDialogArea(parent);

        Composite container = new Composite(area, SWT.BORDER);
        container.setLayout(new GridLayout(2, false));
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        Group group = uiBuilder.createGroup(container, Messages.FormatConversionDialog_SelectLayers, false, 2);
        inputTable = uiBuilder.createTable(group, new String[] { Messages.FormatConversionDialog_Name,
                Messages.FormatConversionDialog_Type, Messages.FormatConversionDialog_CRS }, 2);

        TableSelectionWidget tblSelection = new TableSelectionWidget(inputTable);
        tblSelection.create(group, SWT.NONE, 2, 1);

        chkOverwrite = uiBuilder.createCheckbox(container, Messages.ExportStyleDialog_overwrite, null, 1);

        locationView = new OutputDataWidget(FileDataType.FOLDER, SWT.OPEN);
        locationView.create(container, SWT.BORDER, 2, 1);
        locationView.setFolder(ToolboxView.getWorkspace());

        // load layers
        loadlayers(inputTable);

        area.pack(true);
        return area;
    }

    private void loadlayers(Table table) {
        table.removeAll();
        for (ILayer layer : map.getMapLayers()) {
            if (layer.getName() != null) {
                Style style = (Style) layer.getStyleBlackboard().get(SLDContent.ID);
                if (style == null) {
                    continue;
                }

                TableItem item = new TableItem(table, SWT.NONE);

                String type = "Raster"; //$NON-NLS-1$
                if (layer.hasResource(FeatureSource.class)) {
                    type = layer.getSchema().getGeometryDescriptor().getType().getBinding().getSimpleName();
                }

                CoordinateReferenceSystem crs = layer.getCRS();
                item.setText(new String[] { layer.getName(), type, crs.toString() });
                item.setData(layer);
            }
        }
    }

    @Override
    protected void okPressed() {
        if (!existCheckedItem(inputTable)) {
            openInformation(getShell(), Messages.FormatConversionDialog_Warning);
            return;
        }

        try {
            PlatformUI.getWorkbench().getProgressService().run(false, true, this);
            openInformation(getShell(), Messages.General_Completed);
            super.okPressed();
        } catch (InvocationTargetException e) {
            MessageDialog.openError(getShell(), Messages.General_Error, e.getMessage());
        } catch (InterruptedException e) {
            MessageDialog.openInformation(getShell(), Messages.General_Cancelled, e.getMessage());
        }
    }

    @Override
    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        monitor.beginTask(String.format(Messages.Task_Executing, windowTitle),
                inputTable.getItems().length * increment);
        try {
            monitor.worked(increment);

            final String outputFolder = locationView.getFolder();
            final boolean overwriter = chkOverwrite.getSelection();
            final String ext = ".sld"; //$NON-NLS-1$

            for (TableItem item : inputTable.getItems()) {
                monitor.subTask(item.getText());
                if (item.getChecked()) {
                    ILayer layer = (ILayer) item.getData();
                    File sldFile = new File(outputFolder, layer.getName() + ext);

                    if (sldFile.exists()) {
                        if (overwriter) {
                            sldFile.delete();
                        } else {
                            continue;
                        }
                    }

                    Style style = (Style) layer.getStyleBlackboard().get(SLDContent.ID);
                    saveToSldFile(layer.getName(), style, sldFile);
                }
                monitor.worked(increment);
            }
        } catch (Exception e) {
            ToolboxPlugin.log(e.getMessage());
            throw new InvocationTargetException(e.getCause(), e.getMessage());
        } finally {
            monitor.done();
        }
    }

    private void saveToSldFile(String styleName, Style style, File sldFile) {
        UserLayer userLayer = sf.createUserLayer();
        userLayer.setLayerFeatureConstraints(new FeatureTypeConstraint[] { null });
        userLayer.setName(styleName);
        userLayer.addUserStyle(style);

        StyledLayerDescriptor styledLayerDesc = sf.createStyledLayerDescriptor();
        styledLayerDesc.addStyledLayer(userLayer);

        try {
            SLDTransformer transformer = new SLDTransformer();
            transformer.setEncoding(java.nio.charset.Charset.forName("UTF-8")); //$NON-NLS-1$
            transformer.setIndentation(2);

            FileOutputStream fos = new FileOutputStream(sldFile);
            transformer.transform(styledLayerDesc, fos);
            fos.close();
        } catch (TransformerException e) {
            ToolboxPlugin.log(e.getMessage());
        } catch (FileNotFoundException e) {
            ToolboxPlugin.log(e.getMessage());
        } catch (IOException e) {
            ToolboxPlugin.log(e.getMessage());
        }
    }
}