/******************************************************************************* * Copyright (c) 2010 Stefan A. Tzeggai. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Stefan A. Tzeggai - initial API and implementation ******************************************************************************/ package org.geopublishing.atlasStyler.swing; import java.awt.Component; import java.awt.Desktop; import java.awt.event.ActionEvent; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JOptionPane; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.geopublishing.atlasStyler.ASUtil; import org.geopublishing.atlasStyler.AtlasStyler; import org.geopublishing.atlasViewer.swing.Icons; import org.geotools.styling.StyledLayer; import de.schmitzm.geotools.styling.StyledLayerInterface; import de.schmitzm.geotools.styling.StylingUtil; import de.schmitzm.io.IOUtil; import de.schmitzm.swing.ExceptionDialog; import de.schmitzm.versionnumber.ReleaseUtil; /** * Action to save the SLD of the {@link StyledLayer} to a {@link File}. Two * versions of the SLD are saved. The normal one, and an optimized one for * production use. The later can not be properly reimported yet. */ public class AtlasStylerSaveLayerToSLDAction extends AbstractAction { private static final long serialVersionUID = 4726448851995462364L; static private final Logger LOGGER = Logger .getLogger(AtlasStylerSaveLayerToSLDAction.class);; private final StyledLayerInterface<?> styledLayer; private final Component owner; private JButton open; public AtlasStylerSaveLayerToSLDAction(Component owner, StyledLayerInterface<?> styledLayer) { super(ASUtil.R("AtlasStylerGUI.saveToSLDFile"), Icons.ICON_EXPORT); this.owner = owner; this.styledLayer = styledLayer; // This action in only enabled if the SLD changed AND a SLD file has // been associated AND the file can be saved. setEnabled(IOUtil.canWriteOrCreate(styledLayer.getSldFile()) // && StylingUtil.isStyleDifferent(styledLayer.getStyle(), // styledLayer.getSldFile()) ); } @Override public void actionPerformed(ActionEvent e) { boolean backup = false; if (styledLayer.getSldFile().exists()) { // if (StylingUtil.isStyleDifferent(styledLayer.getStyle(), // styledLayer.getSldFile())){ // return; // } try { FileUtils.copyFile(styledLayer.getSldFile(), IOUtil .changeFileExt(styledLayer.getSldFile(), "sld.bak")); backup = true; } catch (IOException e1) { LOGGER.warn("could not create a backup of the existing .sld", e1); return; } } try { StylingUtil.saveStyleToSld(styledLayer.getStyle(), styledLayer.getSldFile()); StylingUtil.saveStyleToSld( styledLayer.getStyle(), ASUtil.changeToOptimizedFilename(styledLayer.getSldFile()), true, "AtlasStyler " + ReleaseUtil.getVersionInfo(AtlasStyler.class) + ", Layer:" + styledLayer.getTitle() + ", Export-Mode: PRODUCTION"); Object[] options = { "OK", ASUtil.R("AtlasStylerSaveLayerToSLD.OpenFile"), ASUtil.R("AtlasStylerSaveLayerToSLD.OpenProductive") }; int dialogValue = 0; if (backup) { dialogValue = JOptionPane.showOptionDialog(owner, ASUtil.R( "AtlasStylerGUI.saveToSLDFileSuccessAndBackedUp", IOUtil.escapePath(styledLayer.getSldFile())), "", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]); } else { dialogValue = JOptionPane.showOptionDialog( owner, ASUtil.R("AtlasStylerGUI.saveToSLDFileSuccess", IOUtil.escapePath(styledLayer.getSldFile())), "", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]); } if (dialogValue == JOptionPane.NO_OPTION) { Desktop desktop = Desktop.getDesktop(); desktop.open(styledLayer.getSldFile()); } if (dialogValue == JOptionPane.CANCEL_OPTION) { Desktop desktop = Desktop.getDesktop(); desktop.open(ASUtil.changeToOptimizedFilename(styledLayer .getSldFile())); } List<Exception> es = StylingUtil.validateSld(new FileInputStream( styledLayer.getSldFile())); if (es.size() > 0) { ExceptionDialog.show( owner, new IllegalStateException(ASUtil.R( "AtlasStylerExport.WarningSLDNotValid", IOUtil.escapePath(styledLayer.getSldFile())), es.get(0))); } } catch (Exception e1) { LOGGER.error("saveStyleToSLD", e1); ExceptionDialog.show(owner, e1); return; } } }