Changeset 16589 in josm


Ignore:
Timestamp:
2020-06-09T23:44:55+02:00 (4 years ago)
Author:
simon04
Message:

fix #19364 - Remote control /imagery: support all imagery options

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/StructUtils.java

    r16545 r16589  
    88import java.lang.reflect.Field;
    99import java.util.ArrayList;
     10import java.util.Arrays;
    1011import java.util.Collection;
    1112import java.util.Collections;
     
    5354     * Indicates that a certain field should be considered in the conversion process. Otherwise it is ignored.
    5455     *
    55      * @see #serializeStruct(java.lang.Object, java.lang.Class)
     56     * @see #serializeStruct
    5657     * @see #deserializeStruct(java.util.Map, java.lang.Class)
    5758     */
     
    6364     * Indicates that a certain field should be written to the map, even if the value is the same as the default value.
    6465     *
    65      * @see #serializeStruct(java.lang.Object, java.lang.Class)
     66     * @see #serializeStruct
    6667     */
    6768    @Retention(RetentionPolicy.RUNTIME) // keep annotation at runtime
     
    128129
    129130    /**
     131     * Options for {@link #serializeStruct}
     132     */
     133    public enum SerializeOptions {
     134        /**
     135         * Serialize {@code null} values
     136         */
     137        INCLUDE_NULL,
     138        /**
     139         * Serialize default values
     140         */
     141        INCLUDE_DEFAULT
     142    }
     143
     144    /**
    130145     * Convert an object to a String Map, by using field names and values as map key and value.
    131146     *
     
    141156     * @param struct the object to be converted
    142157     * @param klass the class T
     158     * @param options optional serialization options
    143159     * @return the resulting map (same data content as <code>struct</code>)
    144160     */
    145     public static <T> HashMap<String, String> serializeStruct(T struct, Class<T> klass) {
     161    public static <T> HashMap<String, String> serializeStruct(T struct, Class<T> klass, SerializeOptions... options) {
     162        List<SerializeOptions> optionsList = Arrays.asList(options);
    146163        T structPrototype;
    147164        try {
     
    160177                Object fieldValue = f.get(struct);
    161178                Object defaultFieldValue = f.get(structPrototype);
    162                 if (fieldValue != null && (
    163                         f.getAnnotation(WriteExplicitly.class) != null ||
    164                         !Objects.equals(fieldValue, defaultFieldValue))) {
     179                boolean serializeNull = optionsList.contains(SerializeOptions.INCLUDE_NULL) || fieldValue != null;
     180                boolean serializeDefault = optionsList.contains(SerializeOptions.INCLUDE_DEFAULT)
     181                        || f.getAnnotation(WriteExplicitly.class) != null
     182                        || !Objects.equals(fieldValue, defaultFieldValue);
     183                if (serializeNull && serializeDefault) {
    165184                    String key = f.getName().replace('_', '-');
    166185                    if (fieldValue instanceof Map) {
     
    168187                    } else if (fieldValue instanceof MultiMap) {
    169188                        hash.put(key, multiMapToJson((MultiMap<?, ?>) fieldValue));
     189                    } else if (fieldValue == null) {
     190                        hash.put(key, null);
    170191                    } else {
    171192                        hash.put(key, fieldValue.toString());
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/RemoteControl.java

    r16324 r16589  
    3232     */
    3333    static final int protocolMajorVersion = 1;
    34     static final int protocolMinorVersion = 9;
     34    static final int protocolMinorVersion = 10;
    3535
    3636    /**
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java

    r16436 r16589  
    66import java.util.Arrays;
    77
     8import org.openstreetmap.josm.data.StructUtils;
    89import org.openstreetmap.josm.data.imagery.ImageryInfo;
     10import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
    911import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
    10 import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
    1112import org.openstreetmap.josm.gui.MainApplication;
    1213import org.openstreetmap.josm.gui.layer.ImageryLayer;
    1314import org.openstreetmap.josm.gui.util.GuiHelper;
    1415import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
     16import org.openstreetmap.josm.tools.CheckParameterUtil;
    1517import org.openstreetmap.josm.tools.Logging;
    1618import org.openstreetmap.josm.tools.Utils;
     
    4042    @Override
    4143    public String[] getOptionalParams() {
    42         return new String[] {"title", "type", "cookies", "min_zoom", "max_zoom"};
     44        return StructUtils.serializeStruct(new ImageryPreferenceEntry(), ImageryPreferenceEntry.class,
     45                StructUtils.SerializeOptions.INCLUDE_NULL, StructUtils.SerializeOptions.INCLUDE_DEFAULT
     46        ).keySet().toArray(new String[0]);
    4347    }
    4448
     
    4852    }
    4953
    50     protected static ImageryInfo findBingEntry() {
    51         return ImageryLayerInfo.instance.getDefaultLayers().stream()
    52                 .filter(i -> ImageryType.BING == i.getImageryType())
    53                 .findFirst().orElse(null);
    54     }
    55 
    5654    protected ImageryInfo buildImageryInfo() {
    57         String url = args.get("url");
    58         String title = args.get("title");
    59         String type = args.get("type");
    60         final ImageryInfo bing = ImageryType.BING.getTypeString().equals(type) ? findBingEntry() : null;
    61         if ((title == null || title.isEmpty()) && bing != null) {
    62             title = bing.getName();
    63         }
    64         if (title == null || title.isEmpty()) {
    65             title = tr("Remote imagery");
    66         }
    67         String cookies = args.get("cookies");
    68         final ImageryInfo imgInfo = new ImageryInfo(title, url, type, null, cookies);
    69         if (bing != null) {
    70             imgInfo.setIcon(bing.getIcon());
    71         }
    72         String minZoom = args.get("min_zoom");
    73         if (minZoom != null && !minZoom.isEmpty()) {
    74             try {
    75                 imgInfo.setDefaultMinZoom(Integer.parseInt(minZoom));
    76             } catch (NumberFormatException e) {
    77                 Logging.error(e);
    78             }
    79         }
    80         String maxZoom = args.get("max_zoom");
    81         if (maxZoom != null && !maxZoom.isEmpty()) {
    82             try {
    83                 imgInfo.setDefaultMaxZoom(Integer.parseInt(maxZoom));
    84             } catch (NumberFormatException e) {
    85                 Logging.error(e);
    86             }
    87         }
    88         return imgInfo;
     55        args.computeIfAbsent("type", ignore -> ImageryType.WMS.getDefault().getTypeString());
     56        args.computeIfAbsent("name", ignore -> args.getOrDefault("title", tr("Remote imagery")));
     57        ImageryPreferenceEntry imageryPreferenceEntry = StructUtils.deserializeStruct(args, ImageryPreferenceEntry.class);
     58        return new ImageryInfo(imageryPreferenceEntry);
    8959    }
    9060
     
    11181    @Override
    11282    protected void validateRequest() throws RequestHandlerBadRequestException {
    113         String url = args != null ? args.get("url") : null;
    114         String type = args != null ? args.get("type") : null;
    115         String cookies = args != null ? args.get("cookies") : null;
    11683        try {
    117             ImageryLayer.create(new ImageryInfo(null, url, type, null, cookies));
     84            CheckParameterUtil.ensureParameterNotNull(args);
     85            CheckParameterUtil.ensureParameterNotNull(args.get("url"));
     86            ImageryLayer.create(buildImageryInfo());
    11887        } catch (IllegalArgumentException e) {
    11988            throw new RequestHandlerBadRequestException(e.getMessage(), e);
  • trunk/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandlerTest.java

    r16588 r16589  
    22package org.openstreetmap.josm.io.remotecontrol.handler;
    33
     4import static org.hamcrest.CoreMatchers.hasItem;
    45import static org.junit.Assert.assertEquals;
     6import static org.junit.Assert.assertThat;
     7
     8import java.util.Arrays;
     9import java.util.List;
    510
    611import org.junit.Rule;
     
    8186
    8287    /**
     88     * Unit test for {@link ImageryHandler#getOptionalParams()}
     89     * @throws Exception if any error occurs
     90     */
     91    @Test
     92    public void testOptionalParams() throws Exception {
     93        List<String> optionalParams = Arrays.asList(newHandler("").getOptionalParams());
     94        assertThat(optionalParams, hasItem("type"));
     95        assertThat(optionalParams, hasItem("min-zoom"));
     96        assertThat(optionalParams, hasItem("max-zoom"));
     97        assertThat(optionalParams, hasItem("category"));
     98    }
     99
     100    /**
    83101     * Unit test for {@link ImageryHandler#buildImageryInfo()}
    84102     * @throws Exception if any error occurs
     
    87105    public void testBuildImageryInfo() throws Exception {
    88106        String url = "https://localhost/imagery?title=osm"
    89                 + "&type=tms&min_zoom=3&max_zoom=23"
     107                + "&type=tms&min_zoom=3&max_zoom=23&category=osmbasedmap&country_code=XA"
    90108                + "&url=https://a.tile.openstreetmap.org/%7Bzoom%7D/%7Bx%7D/%7By%7D.png";
    91109        ImageryInfo imageryInfo = newHandler(url).buildImageryInfo();
     
    95113        assertEquals(3, imageryInfo.getMinZoom());
    96114        assertEquals(23, imageryInfo.getMaxZoom());
     115        assertEquals(ImageryInfo.ImageryCategory.OSMBASEDMAP, imageryInfo.getImageryCategory());
     116        assertEquals("XA", imageryInfo.getCountryCode());
    97117    }
    98118}
Note: See TracChangeset for help on using the changeset viewer.