Ignore:
Timestamp:
2018-01-26T23:21:57+01:00 (6 years ago)
Author:
Don-vip
Message:

fix #15830 - Support (and autodetect) WMS 1.3.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/imagery/WMSImagery.java

    r13346 r13358  
    1818import java.util.NoSuchElementException;
    1919import java.util.Set;
     20import java.util.regex.Matcher;
    2021import java.util.regex.Pattern;
    2122import java.util.stream.Collectors;
     
    121122    private URL serviceUrl;
    122123    private List<String> formats;
     124    private String version = "1.1.1";
    123125
    124126    /**
     
    136138    public URL getServiceUrl() {
    137139        return serviceUrl;
     140    }
     141
     142    /**
     143     * Returns the WMS version used.
     144     * @return the WMS version used (1.1.1 or 1.3.0)
     145     * @since 13358
     146     */
     147    public String getVersion() {
     148        return version;
    138149    }
    139150
     
    198209    public String buildGetMapUrl(Collection<LayerDetails> selectedLayers, String format) {
    199210        return buildRootUrl() + "FORMAT=" + format + (imageFormatHasTransparency(format) ? "&TRANSPARENT=TRUE" : "")
    200                 + "&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS="
     211                + "&VERSION=" + version + "&SERVICE=WMS&REQUEST=GetMap&LAYERS="
    201212                + selectedLayers.stream().map(x -> x.ident).collect(Collectors.joining(","))
    202                 + "&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}";
     213                + "&STYLES=&" + ("1.3.0".equals(version) ? "CRS" : "SRS") + "={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}";
    203214    }
    204215
     
    238249    }
    239250
     251    /**
     252     * Attempts WMS GetCapabilities with version 1.1.1 first, then 1.3.0 in case of specific errors.
     253     * @param serviceUrlStr WMS service URL
     254     * @param getCapabilitiesUrl GetCapabilities URL
     255     * @throws IOException if any I/O error occurs
     256     * @throws WMSGetCapabilitiesException if any HTTP or parsing error occurs
     257     */
    240258    private void doAttemptGetCapabilities(String serviceUrlStr, URL getCapabilitiesUrl)
    241259            throws IOException, WMSGetCapabilitiesException {
     260        final String url = getCapabilitiesUrl.toExternalForm();
    242261        final Response response = HttpClient.create(getCapabilitiesUrl).connect();
    243262
     263        // Is the HTTP connection successul ?
    244264        if (response.getResponseCode() >= 400) {
    245             throw new WMSGetCapabilitiesException(response.getResponseMessage(), response.fetchContent());
     265            // HTTP error for servers handling only WMS 1.3.0 ?
     266            String errorMessage = response.getResponseMessage();
     267            String errorContent = response.fetchContent();
     268            Matcher tomcat = HttpClient.getTomcatErrorMatcher(errorContent);
     269            boolean messageAbout130 = errorMessage != null && errorMessage.contains("1.3.0");
     270            boolean contentAbout130 = errorContent != null && tomcat != null && tomcat.matches() && tomcat.group(1).contains("1.3.0");
     271            if (url.contains("VERSION=1.1.1") && (messageAbout130 || contentAbout130)) {
     272                doAttemptGetCapabilities130(serviceUrlStr, url);
     273                return;
     274            }
     275            throw new WMSGetCapabilitiesException(errorMessage, errorContent);
    246276        }
    247277
    248278        try {
     279            // Parse XML capabilities sent by the server
    249280            parseCapabilities(serviceUrlStr, response.getContent());
    250281        } catch (WMSGetCapabilitiesException e) {
    251             String url = getCapabilitiesUrl.toExternalForm();
    252282            // ServiceException for servers handling only WMS 1.3.0 ?
    253283            if (e.getCause() == null && url.contains("VERSION=1.1.1")) {
    254                 doAttemptGetCapabilities(serviceUrlStr, new URL(url.replace("VERSION=1.1.1", "VERSION=1.3.0")));
    255                 if (serviceUrl.toExternalForm().contains("VERSION=1.1.1")) {
    256                     serviceUrl = new URL(serviceUrl.toExternalForm().replace("VERSION=1.1.1", "VERSION=1.3.0"));
    257                 }
     284                doAttemptGetCapabilities130(serviceUrlStr, url);
    258285            } else {
    259286                throw e;
    260287            }
    261288        }
     289    }
     290
     291    /**
     292     * Attempts WMS GetCapabilities with version 1.3.0.
     293     * @param serviceUrlStr WMS service URL
     294     * @param url GetCapabilities URL
     295     * @throws IOException if any I/O error occurs
     296     * @throws WMSGetCapabilitiesException if any HTTP or parsing error occurs
     297     * @throws MalformedURLException in case of invalid URL
     298     */
     299    private void doAttemptGetCapabilities130(String serviceUrlStr, final String url)
     300            throws IOException, WMSGetCapabilitiesException, MalformedURLException {
     301        doAttemptGetCapabilities(serviceUrlStr, new URL(url.replace("VERSION=1.1.1", "VERSION=1.3.0")));
     302        if (serviceUrl.toExternalForm().contains("VERSION=1.1.1")) {
     303            serviceUrl = new URL(serviceUrl.toExternalForm().replace("VERSION=1.1.1", "VERSION=1.3.0"));
     304        }
     305        version = "1.3.0";
    262306    }
    263307
Note: See TracChangeset for help on using the changeset viewer.