Есть ли способ навсегда удалить плитку «программно» (Java) из кэширования в GeoServer? - PullRequest
0 голосов
/ 30 ноября 2018

Я работаю с GeoServer и бэкэндом Java.Я могу сбросить кэш тайла с помощью API Rest и предотвратить дальнейшее кэширование, удалив плитку из GUI GeoServer навсегда (Кэширование плиток -> Слои плиток -> Проверить плитку -> Нажмите «Удалить выбранные кэшированные слои»).

Я хотел бы автоматизировать процесс и сделать это с внутренней стороны.Я пытался обрезать операции, копал в остальные API, а также объекты Java, но не смог понять, как.

Возможно ли навсегда удалить плитку из кэширования с помощью Java?Если да, то как?

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

В качестве дополнения к ответу Яна (работает как очарование, спасибо, Ян), вот фрагмент кода Java (который требует некоторой любви, констант и т. Д.):

private void removeLayerGroupFromCache() throws IOException {
    URL url = new URL("http://localhost:8080/geoserver/gwc/rest/layers/layer group name.xml");
    String rawLayer = getXMLContent(url);
    String updatedLayer = formatXMLContent(rawLayer);
    updateLayerInGIS(url, updatedLayer);
}

private String getXMLContent(URL url) throws IOException {
    URLConnection urlConnection = setUsernamePassword(url);
    InputStreamReader inputStreamReader = new InputStreamReader(urlConnection.getInputStream());
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    StringBuilder result = new StringBuilder();
    String line;

    while ((line = bufferedReader.readLine()) != null) {
        result.append(line);
    }

    bufferedReader.close();
    inputStreamReader.close();

    return result.toString();
}

// TODO: This feels akward and should be improved. (Why extra spaces are being added with the urlConnection.getInputStream() call?)
private String formatXMLContent(String originalContent) {
    originalContent = originalContent.replaceAll("\\s+", ""); // Removes undesired spaces.
    originalContent = originalContent.replaceAll("layergroupname".replaceAll("\\s+", ""), "layer group name"); // Makes sure the name is matching if it contains white spaces.
    originalContent = originalContent.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>".replaceAll("\\s+", ""), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); // Re-append required spaces to XML declaration.
    originalContent = originalContent.replace("<enabled>true</enabled>", "<enabled>false</enabled>"); // Finally, disable the caching for the group.

    return originalContent;
}

private URLConnection setUsernamePassword(URL url) throws IOException {
    String authStringEncoded = new String(Base64.encodeBase64("username:userpassword".getBytes()));
    URLConnection urlConnection = url.openConnection();
    urlConnection.setRequestProperty("Authorization", "Basic " + authStringEncoded);

    return urlConnection;
}

private void updateLayerInGIS(URL url, String updatedLayer) throws IOException {
    Authentication auth = authenticationResolver.retrieve();
    String encodedCredentials = java.util.Base64.getEncoder().encodeToString("username:userpassword".getBytes());
    URL directUrl = new URL("http", url.getHost(), url.getPort(), url.getFile());

    HttpURLConnection httpCon = (HttpURLConnection) directUrl.openConnection();
    httpCon.setRequestProperty("Authorization", "Basic " + encodedCredentials);
    httpCon.setDoOutput(true);
    httpCon.setRequestMethod("POST");
    OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream());
    out.write(updatedLayer);
    out.close();

    int statusCode = httpCon.getResponseCode();

    if(statusCode >= 200 && statusCode < 400) {
        httpCon.getInputStream();
    } else {
        // Gets a more verbose message on why a non valid code has been returned.
        String errorMessage = readStream(httpCon.getErrorStream());

        throw new IOException(errorMessage);
    }
}

private String readStream(InputStream stream) throws IOException {
    StringBuilder builder = new StringBuilder();

    try (BufferedReader in = new BufferedReader(new InputStreamReader(stream))) {
        String line;

        while ((line = in.readLine()) != null) {
            builder.append(line);
        }
    }

    return builder.toString();
}
0 голосов
/ 10 декабря 2018

Если вы пытаетесь вообще избежать кэширования слоя (а не обрезать кеш слоя), вам нужно посетить его конечную точку GWC REST:

http://localhost:8080/geoserver/gwc/rest/layers/zoomstack:airports.xml

, которая даст вам файл типа:

<GeoServerLayer>
  <id>LayerInfoImpl-36bac688:1666e6c28d4:-7ffd</id>
  <enabled>true</enabled>
  <inMemoryCached>true</inMemoryCached>
  <name>zoomstack:airports</name>
  <mimeFormats>
    <string>image/png</string>
    <string>image/jpeg</string>
  </mimeFormats>
  <gridSubsets>
    <gridSubset>
      <gridSetName>osgb</gridSetName>
    </gridSubset>
    <gridSubset>
      <gridSetName>EPSG:900913</gridSetName>
    </gridSubset>
    <gridSubset>
      <gridSetName>EPSG:4326</gridSetName>
    </gridSubset>
  </gridSubsets>
  <metaWidthHeight>
    <int>4</int>
    <int>4</int>
  </metaWidthHeight>
  <expireCache>0</expireCache>
  <expireClients>0</expireClients>
  <parameterFilters>
    <styleParameterFilter>
      <key>STYLES</key>
      <defaultValue/>
    </styleParameterFilter>
  </parameterFilters>
  <gutter>0</gutter>
</GeoServerLayer>

Затем вы можете изменить <enabled>true</enabled> на <enabled>false</enabled> и вернуть его обратно на сервер.

...