Changeset 17534 in josm


Ignore:
Timestamp:
2021-02-23T11:59:08+01:00 (4 years ago)
Author:
Don-vip
Message:

fix #20310 - Allow JpgImporter to import remote images (patch by taylor.smock)

Location:
trunk/src/org/openstreetmap/josm
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java

    r16505 r17534  
    1717import java.util.Collection;
    1818import java.util.Collections;
     19import java.util.EnumSet;
    1920import java.util.HashSet;
    2021import java.util.LinkedHashSet;
    2122import java.util.LinkedList;
    2223import java.util.List;
     24import java.util.Objects;
    2325import java.util.Set;
    2426import java.util.concurrent.Future;
    2527import java.util.regex.Matcher;
    2628import java.util.regex.Pattern;
     29import java.util.stream.Stream;
    2730
    2831import javax.swing.JOptionPane;
     
    3841import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter;
    3942import org.openstreetmap.josm.gui.io.importexport.FileImporter;
     43import org.openstreetmap.josm.gui.io.importexport.Options;
    4044import org.openstreetmap.josm.gui.util.GuiHelper;
    4145import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
     
    96100     */
    97101    public static Future<?> openFiles(List<File> fileList) {
    98         return openFiles(fileList, false);
     102        return openFiles(fileList, (Options[]) null);
    99103    }
    100104
     
    105109     * @return the future task
    106110     * @since 11986 (return task)
    107      */
     111     * @deprecated Since 17534, use {@link OpenFileAction#openFiles(List, Options...)} with {@link Options#RECORD_HISTORY} instead.
     112     */
     113    @Deprecated
    108114    public static Future<?> openFiles(List<File> fileList, boolean recordHistory) {
     115        Options[] options = recordHistory ? new Options[] {Options.RECORD_HISTORY} : null;
     116        return openFiles(fileList, options);
     117    }
     118
     119    /**
     120     * Open a list of files. The complete list will be passed to batch importers.
     121     * @param fileList A list of files
     122     * @param options The options to use
     123     * @return the future task
     124     * @since 17534 ({@link Options})
     125     */
     126    public static Future<?> openFiles(List<File> fileList, Options... options) {
    109127        OpenFileTask task = new OpenFileTask(fileList, null);
    110         task.setRecordHistory(recordHistory);
     128        task.setOptions(options);
    111129        return MainApplication.worker.submit(task);
    112130    }
     
    122140        private final FileFilter fileFilter;
    123141        private boolean canceled;
    124         private boolean recordHistory;
     142        private final EnumSet<Options> options = EnumSet.noneOf(Options.class);
    125143
    126144        /**
     
    168186         * Sets whether to save filename in history (for list of recently opened files).
    169187         * @param recordHistory {@code true} to save filename in history (default: false)
    170          */
     188         * @deprecated since 17534 (use {@link #setOptions} instead).
     189         */
     190        @Deprecated
    171191        public void setRecordHistory(boolean recordHistory) {
    172             this.recordHistory = recordHistory;
     192            if (recordHistory) {
     193                this.options.add(Options.RECORD_HISTORY);
     194            } else {
     195                this.options.remove(Options.RECORD_HISTORY);
     196            }
     197        }
     198
     199        /**
     200         * Set the options for the task.
     201         * @param options The options to set
     202         * @see Options
     203         * @since 17534
     204         */
     205        public void setOptions(Options[] options) {
     206            this.options.clear();
     207            if (options != null) {
     208                Stream.of(options).filter(Objects::nonNull).forEach(this.options::add);
     209            }
    173210        }
    174211
     
    178215         */
    179216        public boolean isRecordHistory() {
    180             return recordHistory;
     217            return this.options.contains(Options.RECORD_HISTORY);
     218        }
     219
     220        /**
     221         * Get the options for this task
     222         * @return A set of options
     223         * @since 17534
     224         */
     225        public Set<Options> getOptions() {
     226            return Collections.unmodifiableSet(this.options);
    181227        }
    182228
     
    340386            }
    341387
    342             if (recordHistory) {
     388            if (this.options.contains(Options.RECORD_HISTORY)) {
    343389                Collection<String> oldFileHistory = Config.getPref().getList("file-open.history");
    344390                fileHistory.addAll(oldFileHistory);
     
    356402         */
    357403        public void importData(FileImporter importer, List<File> files) {
     404            importer.setOptions(this.options.toArray(new Options[0]));
    358405            if (importer.isBatchImporter()) {
    359406                if (canceled) return;
     
    373420                }
    374421            }
    375             if (recordHistory && !importer.isBatchImporter()) {
     422            if (this.options.contains(Options.RECORD_HISTORY) && !importer.isBatchImporter()) {
    376423                for (File f : files) {
    377424                    try {
  • trunk/src/org/openstreetmap/josm/gui/io/importexport/FileImporter.java

    r16553 r17534  
    66import java.io.File;
    77import java.io.IOException;
     8import java.util.EnumSet;
    89import java.util.List;
     10import java.util.Objects;
     11import java.util.stream.Stream;
    912
    1013import javax.swing.JOptionPane;
     
    3639
    3740    private boolean enabled;
     41
     42    protected final EnumSet<Options> options = EnumSet.noneOf(Options.class);
    3843
    3944    /**
     
    191196        this.enabled = enabled;
    192197    }
     198
     199    /**
     200     * Set the options for the {@code FileImporter}.
     201     * @param options The options to set
     202     * @since 17534
     203     */
     204    public final void setOptions(Options[] options) {
     205        this.options.clear();
     206        if (options != null) {
     207            Stream.of(options).filter(Objects::nonNull).forEach(this.options::add);
     208        }
     209    }
    193210}
  • trunk/src/org/openstreetmap/josm/gui/io/importexport/JpgImporter.java

    r16970 r17534  
    88import java.util.ArrayList;
    99import java.util.Arrays;
     10import java.util.EnumSet;
    1011import java.util.HashSet;
    1112import java.util.List;
    1213import java.util.Set;
     14import java.util.regex.Matcher;
     15import java.util.regex.Pattern;
    1316
    1417import org.openstreetmap.josm.actions.ExtensionFileFilter;
     
    1619import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
    1720import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     21import org.openstreetmap.josm.io.CachedFile;
    1822import org.openstreetmap.josm.io.IllegalDataException;
    1923
     
    2327 */
    2428public class JpgImporter extends FileImporter {
     29    /** Check if the filename starts with a borked path ({@link java.io.File#File} drops consecutive {@code /} characters). */
     30    private static final Pattern URL_START_BAD = Pattern.compile("^(https?:/)([^/].*)$");
     31    /** Check for the beginning of a "good" url */
     32    private static final Pattern URL_START_GOOD = Pattern.compile("^https?://.*$");
     33
    2534    private GpxLayer gpx;
    2635
     
    7483            List<File> files = new ArrayList<>();
    7584            Set<String> visitedDirs = new HashSet<>();
    76             addRecursiveFiles(files, visitedDirs, sel, progressMonitor.createSubTaskMonitor(1, true));
     85            addRecursiveFiles(this.options, files, visitedDirs, sel, progressMonitor.createSubTaskMonitor(1, true));
    7786
    7887            if (progressMonitor.isCanceled())
     
    9099    static void addRecursiveFiles(List<File> files, Set<String> visitedDirs, List<File> sel, ProgressMonitor progressMonitor)
    91100            throws IOException {
     101        addRecursiveFiles(EnumSet.noneOf(Options.class), files, visitedDirs, sel, progressMonitor);
     102    }
     103
     104    static void addRecursiveFiles(Set<Options> options, List<File> files, Set<String> visitedDirs, List<File> sel,
     105            ProgressMonitor progressMonitor) throws IOException {
    92106
    93107        if (progressMonitor.isCanceled())
     
    101115                        File[] dirFiles = f.listFiles(); // Can be null for some strange directories (like lost+found)
    102116                        if (dirFiles != null) {
    103                             addRecursiveFiles(files, visitedDirs, Arrays.asList(dirFiles), progressMonitor.createSubTaskMonitor(1, true));
     117                            addRecursiveFiles(options, files, visitedDirs, Arrays.asList(dirFiles),
     118                                    progressMonitor.createSubTaskMonitor(1, true));
    104119                        }
    105120                    } else {
     
    107122                    }
    108123                } else {
    109                     if (FILE_FILTER.accept(f)) {
     124                    /* Check if the path is a web path, and if so, ensure that it is "correct" */
     125                    final String path = f.getPath();
     126                    Matcher matcherBad = URL_START_BAD.matcher(path);
     127                    final String realPath;
     128                    if (matcherBad.matches()) {
     129                        realPath = matcherBad.replaceFirst(matcherBad.group(1) + "/" + matcherBad.group(2));
     130                    } else {
     131                        realPath = path;
     132                    }
     133                    if (URL_START_GOOD.matcher(realPath).matches() && FILE_FILTER.accept(f)
     134                            && options.contains(Options.ALLOW_WEB_RESOURCES)) {
     135                        try (CachedFile cachedFile = new CachedFile(realPath)) {
     136                            files.add(cachedFile.getFile());
     137                        }
     138                    } else if (FILE_FILTER.accept(f)) {
    110139                        files.add(f);
    111140                    }
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java

    r16190 r17534  
    3030    public static final PermissionPrefWithDefault OPEN_FILES =
    3131            new PermissionPrefWithDefault("remotecontrol.permission.open-files", false, tr("Open local files"));
     32    /** Open web files */
     33    public static final PermissionPrefWithDefault ALLOW_WEB_RESOURCES =
     34            new PermissionPrefWithDefault("remotecontrol.permission.open-remote-files", false, tr("Open remote files"));
    3235    /** Load imagery layers */
    3336    public static final PermissionPrefWithDefault LOAD_IMAGERY =
     
    4548    public static final PermissionPrefWithDefault READ_PROTOCOL_VERSION =
    4649            new PermissionPrefWithDefault("remotecontrol.permission.read-protocolversion", true, tr("Read protocol version"));
     50
    4751    /**
    4852     * name of the preference setting to permit the remote operation
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java

    r17330 r17534  
    163163            addRequestHandlerClass(ImportHandler.command, ImportHandler.class, true);
    164164            addRequestHandlerClass(OpenFileHandler.command, OpenFileHandler.class, true);
     165            PermissionPrefWithDefault.addPermissionPref(PermissionPrefWithDefault.ALLOW_WEB_RESOURCES);
    165166            addRequestHandlerClass(ImageryHandler.command, ImageryHandler.class, true);
    166167            PermissionPrefWithDefault.addPermissionPref(PermissionPrefWithDefault.CHANGE_SELECTION);
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/OpenFileHandler.java

    r10615 r17534  
    66import java.io.File;
    77import java.util.Arrays;
     8import java.util.EnumSet;
    89
    910import org.openstreetmap.josm.actions.OpenFileAction;
     11import org.openstreetmap.josm.gui.io.importexport.Options;
    1012import org.openstreetmap.josm.gui.util.GuiHelper;
    1113import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
     
    4345    @Override
    4446    protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
    45         GuiHelper.runInEDTAndWait(() -> OpenFileAction.openFiles(Arrays.asList(new File(args.get("filename")))));
     47        EnumSet<Options> options = EnumSet.noneOf(Options.class);
     48        if (PermissionPrefWithDefault.ALLOW_WEB_RESOURCES.isAllowed()) {
     49            options.add(Options.ALLOW_WEB_RESOURCES);
     50        }
     51        GuiHelper.runInEDTAndWait(() ->
     52            OpenFileAction.openFiles(Arrays.asList(new File(args.get("filename"))), options.toArray(new Options[0])));
    4653    }
    4754
Note: See TracChangeset for help on using the changeset viewer.