package org.mapfish.print.map.style; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.io.ByteStreams; import com.google.common.io.Closer; import org.geotools.styling.Style; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpResponse; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; /** * Utilities for creating parser plugins. */ public final class ParserPluginUtils { private ParserPluginUtils() { // utility class } /** * Load data using {@link org.mapfish.print.config.Configuration#loadFile(String)} and using http. If data is able to be loaded * it will be passed to the loadFunction to be turned into a style. * * @param clientHttpRequestFactory the factory to use for http requests * @param styleRef the uri/file/else for attempting to load a style * @param loadFunction the function to call when data has been loaded. */ public static Optional<Style> loadStyleAsURI( final ClientHttpRequestFactory clientHttpRequestFactory, final String styleRef, final Function<byte[], Optional<Style>> loadFunction) throws IOException { HttpStatus statusCode; final byte[] input; Closer closer = Closer.create(); try { URI uri; try { uri = new URI(styleRef); } catch (URISyntaxException e) { uri = new File(styleRef).toURI(); } final ClientHttpRequest request = clientHttpRequestFactory.createRequest(uri, HttpMethod.GET); final ClientHttpResponse response = closer.register(request.execute()); statusCode = response.getStatusCode(); input = ByteStreams.toByteArray(response.getBody()); } catch (Exception e) { return Optional.absent(); } finally { closer.close(); } if (statusCode == HttpStatus.OK) { return loadFunction.apply(input); } else { return Optional.absent(); } } }