001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.io;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.io.File;
007    import java.io.FileInputStream;
008    import java.io.IOException;
009    import java.io.ObjectInputStream;
010    
011    import org.openstreetmap.josm.Main;
012    import org.openstreetmap.josm.actions.ExtensionFileFilter;
013    import org.openstreetmap.josm.gui.layer.WMSLayer;
014    import org.openstreetmap.josm.gui.progress.ProgressMonitor;
015    import org.openstreetmap.josm.gui.util.GuiHelper;
016    import org.openstreetmap.josm.tools.CheckParameterUtil;
017    
018    /**
019     * Import a WMS layer from a serialized binary file previously exported via {@link WMSLayerExporter}.
020     * @since 5457
021     */
022    public class WMSLayerImporter extends FileImporter {
023    
024        /**
025         * The file filter used in "open" and "save" dialogs for WMS layers.
026         */
027        public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
028                "wms", "wms", tr("WMS Files (*.wms)"));
029        
030        private final WMSLayer wmsLayer;
031    
032        /**
033         * Constructs a new {@code WMSLayerImporter}.
034         */
035        public WMSLayerImporter() {
036            this(new WMSLayer());
037        }
038    
039        /**
040         * Constructs a new {@code WMSLayerImporter} that will import data to the specified WMS layer.
041         * @param wmsLayer The WMS layer.
042         */
043        public WMSLayerImporter(WMSLayer wmsLayer) {
044            super(FILE_FILTER);
045            this.wmsLayer = wmsLayer;
046        }
047    
048        @Override
049        public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
050            CheckParameterUtil.ensureParameterNotNull(file, "file");
051            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
052            try {
053                wmsLayer.readExternal(ois);
054            } catch (ClassNotFoundException e) {
055                throw new IllegalDataException(e);
056            } finally {
057                ois.close();
058            }
059            
060            // FIXME: remove UI stuff from IO subsystem
061            GuiHelper.runInEDT(new Runnable() {
062                @Override
063                public void run() {
064                    Main.main.addLayer(wmsLayer);
065                    wmsLayer.onPostLoadFromFile();
066                }
067            });
068        }
069    
070        /**
071         * Replies the imported WMS layer.
072         * @return The imported WMS layer.
073         * @see #importData(File, ProgressMonitor)
074         */
075        public final WMSLayer getWmsLayer() {
076            return wmsLayer;
077        }
078    }