001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import org.openstreetmap.josm.Main;
007
008public enum UploadStrategy {
009    /**
010     * Uploads the objects individually, one request per object
011     */
012    INDIVIDUAL_OBJECTS_STRATEGY("individualobjects"),
013    /**
014     * Upload the objects in junks of n objects using m diff uploads
015     */
016    CHUNKED_DATASET_STRATEGY("chunked"),
017    /**
018     * Upload the objects in one request using 1 diff upload
019     */
020    SINGLE_REQUEST_STRATEGY("singlerequest");
021
022    private String preferenceValue;
023
024    UploadStrategy(String preferenceValue) {
025        this.preferenceValue = preferenceValue;
026    }
027
028    public static UploadStrategy fromPreference(String preferenceValue) {
029        if (preferenceValue == null) return null;
030        preferenceValue = preferenceValue.trim().toLowerCase();
031        for (UploadStrategy strategy: values()) {
032            if (strategy.getPreferenceValue().equals(preferenceValue))
033                return strategy;
034        }
035        return null;
036    }
037
038    /**
039     * Replies the value which is written to the preferences for a specific
040     * upload strategy
041     *
042     * @return the value which is written to the preferences for a specific
043     * upload strategy
044     */
045    public String getPreferenceValue() {
046        return preferenceValue;
047    }
048
049    /**
050     * the default upload strategy
051     */
052    public static final UploadStrategy DEFAULT_UPLOAD_STRATEGY = SINGLE_REQUEST_STRATEGY;
053
054    /**
055     * Replies the upload strategy currently configured in the preferences.
056     *
057     * First checks for the preference key <pre>osm-server.upload-strategy</pre>. If not
058     * present, checks for the legacy preference key <pre>osm-server.atomic-upload</pre>.
059     *
060     * If both are missing or if the preference value is illegal, {@link #DEFAULT_UPLOAD_STRATEGY}
061     * is replied.
062     *
063     * @return the upload strategy currently configured in the preferences.
064     */
065    public static UploadStrategy getFromPreferences() {
066        String v = Main.pref.get("osm-server.upload-strategy", null);
067        if (v == null) {
068            // legacy support. Until 12/2009 we had osm-server.atomic-upload only.
069            // If we still find "osm-server.atomic-upload" we use it and remove it.
070            // When the preferences are saved the next time, "osm-server.upload-strategy"
071            // will be inserted.
072            v = Main.pref.get("osm-server.atomic-upload", null);
073            if (v != null) {
074                Main.pref.removeFromCollection("osm-server.atomic-upload", v);
075            } else {
076                v = "";
077            }
078            v = v.trim().toLowerCase();
079            if ("true".equals(v))
080                return SINGLE_REQUEST_STRATEGY;
081            else if ("false".equals(v))
082                return INDIVIDUAL_OBJECTS_STRATEGY;
083            else
084                return DEFAULT_UPLOAD_STRATEGY;
085        }
086        UploadStrategy strategy = fromPreference(v);
087        if (strategy == null) {
088            Main.warn(tr("Unexpected value for key ''{0}'' in preferences, got ''{1}''", "osm-server.upload-strategy", v ));
089            return DEFAULT_UPLOAD_STRATEGY;
090        }
091        return strategy;
092    }
093
094    /**
095     * Saves the upload strategy <code>strategy</code> to the preferences.
096     *
097     * @param strategy the strategy to save
098     */
099    public static void saveToPreferences(UploadStrategy strategy) {
100        Main.pref.put("osm-server.upload-strategy", strategy.getPreferenceValue());
101    }
102}