gernotbelger@9537: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9537: * Software engineering by gernotbelger@9537: * Björnsen Beratende Ingenieure GmbH gernotbelger@9537: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9537: * gernotbelger@9537: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9537: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9537: * documentation coming with Dive4Elements River for details. gernotbelger@9537: */ gernotbelger@9537: package org.dive4elements.river.artifacts.uinfo.inundationduration; gernotbelger@9537: gernotbelger@9537: import java.awt.image.BufferedImage; gernotbelger@9537: import java.awt.image.WritableRaster; gernotbelger@9537: import java.io.IOException; gernotbelger@9537: import java.io.OutputStream; gernotbelger@9537: import java.io.UnsupportedEncodingException; gernotbelger@9537: import java.net.URLDecoder; gernotbelger@9537: import java.util.Arrays; gernotbelger@9537: import java.util.List; gernotbelger@9537: import java.util.Map; gernotbelger@9537: gernotbelger@9537: import javax.imageio.ImageIO; gernotbelger@9537: gernotbelger@9537: import org.dive4elements.artifactdatabase.rest.BaseResource; gernotbelger@9537: import org.restlet.Client; gernotbelger@9537: import org.restlet.Context; gernotbelger@9537: import org.restlet.Request; gernotbelger@9537: import org.restlet.Response; gernotbelger@9537: import org.restlet.data.Form; gernotbelger@9537: import org.restlet.data.MediaType; gernotbelger@9537: import org.restlet.data.Method; gernotbelger@9537: import org.restlet.data.Protocol; gernotbelger@9537: import org.restlet.data.Reference; gernotbelger@9537: import org.restlet.data.Status; gernotbelger@9537: import org.restlet.representation.OutputRepresentation; gernotbelger@9537: import org.restlet.representation.Representation; gernotbelger@9537: import org.restlet.resource.ResourceException; gernotbelger@9537: gernotbelger@9537: /** gernotbelger@9537: * Proof of context wms proxy. gernotbelger@9537: * gernotbelger@9537: * @author Gernot Belger gernotbelger@9537: */ gernotbelger@9537: public class VegetationWmsResource extends BaseResource { gernotbelger@9537: gernotbelger@9537: public static final String BASE_PATH = "vegetationWms"; gernotbelger@9537: gernotbelger@9537: private static final String ATTRIBUTE_VEGETATION_ARTIFACT_UUID = "vegetation-artifact-uuid"; gernotbelger@9537: gernotbelger@9537: private static final String ATTRIBUTE_WMS_URL = "wmsUrl"; gernotbelger@9537: gernotbelger@9537: private static final ThreadLocal CLIENT = new ThreadLocal() { gernotbelger@9537: @Override gernotbelger@9537: protected Client initialValue() { gernotbelger@9537: gernotbelger@9537: final List protocols = Arrays.asList(Protocol.HTTPS, Protocol.HTTP); gernotbelger@9537: final Client client = new Client(new Context(), protocols); gernotbelger@9537: // FIXME gernotbelger@9543: /* Nachfolgende 2 Zeilen sind nur für die BCE-Entwicklungsumgebung bestimmt */ gernotbelger@9543: // client.getContext().getParameters().add("proxyHost", "proxy.bce01.de"); gernotbelger@9543: // client.getContext().getParameters().add("proxyPort", "8080"); gernotbelger@9537: return client; gernotbelger@9537: } gernotbelger@9537: }; gernotbelger@9537: gernotbelger@9537: @Override gernotbelger@9537: protected Representation innerGet() throws ResourceException { gernotbelger@9537: gernotbelger@9537: try { gernotbelger@9537: final Request request = getRequest(); gernotbelger@9537: gernotbelger@9537: final Map attributes = request.getAttributes(); gernotbelger@9537: final String vegArtifactUuid = (String) attributes.get(ATTRIBUTE_VEGETATION_ARTIFACT_UUID); gernotbelger@9537: final String baseUrl = (String) attributes.get(ATTRIBUTE_WMS_URL); gernotbelger@9537: gernotbelger@9537: final Reference originalRef = request.getOriginalRef(); gernotbelger@9537: final String query = originalRef.getQuery(); gernotbelger@9537: gernotbelger@9537: final Form queryAsForm = originalRef.getQueryAsForm(); gernotbelger@9537: final boolean isGetMap = "GetMap".equalsIgnoreCase(queryAsForm.getFirstValue("REQUEST", true)); gernotbelger@9537: gernotbelger@9537: final String decodedBaseUrl = URLDecoder.decode(baseUrl, "UTF-8"); gernotbelger@9537: gernotbelger@9537: final Reference proxyReference = new Reference(decodedBaseUrl); gernotbelger@9537: proxyReference.setQuery(query); gernotbelger@9537: gernotbelger@9537: final Client client = CLIENT.get(); gernotbelger@9537: gernotbelger@9537: final Request proxyRequest = new Request(Method.GET, proxyReference); gernotbelger@9537: final Response response = client.handle(proxyRequest); gernotbelger@9537: gernotbelger@9537: final Status status = response.getStatus(); gernotbelger@9537: gernotbelger@9537: if (!Status.SUCCESS_OK.equals(status)) gernotbelger@9537: throw new ResourceException(status); gernotbelger@9537: gernotbelger@9537: final Representation entity = response.getEntity(); gernotbelger@9537: gernotbelger@9537: /* simply redirect everything that is not an png image */ gernotbelger@9537: if (!isGetMap) gernotbelger@9537: return entity; gernotbelger@9537: gernotbelger@9537: final MediaType mediaType = entity.getMediaType(); gernotbelger@9537: if (!MediaType.IMAGE_ALL.getMainType().equals(mediaType.getMainType())) gernotbelger@9537: return entity; gernotbelger@9537: gernotbelger@9537: try { gernotbelger@9537: final BufferedImage image = ImageIO.read(entity.getStream()); gernotbelger@9537: gernotbelger@9537: // FIXME: tweak image... gernotbelger@9537: final WritableRaster raster = image.getRaster(); gernotbelger@9537: final int width = raster.getWidth(); gernotbelger@9537: final int height = raster.getHeight(); gernotbelger@9537: final int numBands = raster.getNumBands(); gernotbelger@9537: for (int x = 0; x < width; x++) { gernotbelger@9537: for (int y = 0; y < height; y++) { gernotbelger@9537: gernotbelger@9537: // final double sampleDouble = raster.getSampleDouble(x, y, 0); gernotbelger@9537: gernotbelger@9537: final int red = raster.getSample(x, y, 0); gernotbelger@9537: final int green = raster.getSample(x, y, 1); gernotbelger@9537: final int blue = raster.getSample(x, y, 2); gernotbelger@9537: final int alpha = raster.getSample(x, y, 3); gernotbelger@9537: gernotbelger@9537: raster.setSample(x, y, 0, green); gernotbelger@9537: raster.setSample(x, y, 1, red); gernotbelger@9537: raster.setSample(x, y, 2, blue); gernotbelger@9537: raster.setSample(x, y, 3, alpha); gernotbelger@9537: } gernotbelger@9537: } gernotbelger@9537: gernotbelger@9537: final Representation newResponse = new OutputRepresentation(mediaType) { gernotbelger@9537: gernotbelger@9537: @Override gernotbelger@9537: public void write(final OutputStream outputStream) throws IOException { gernotbelger@9537: gernotbelger@9537: // REMARK: in most cases the media-subtype can be used as image-format name. gernotbelger@9537: final String subType = mediaType.getSubType(); gernotbelger@9537: ImageIO.write(image, subType, outputStream); gernotbelger@9537: gernotbelger@9537: } gernotbelger@9537: }; gernotbelger@9537: gernotbelger@9537: return newResponse; gernotbelger@9537: } gernotbelger@9537: catch (final IOException e) { gernotbelger@9537: e.printStackTrace(); gernotbelger@9537: throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e); gernotbelger@9537: } gernotbelger@9537: gernotbelger@9537: } gernotbelger@9537: catch (final UnsupportedEncodingException e) { gernotbelger@9537: e.printStackTrace(); gernotbelger@9537: throw new ResourceException(Status.CLIENT_ERROR_BAD_REQUEST, e); gernotbelger@9537: } gernotbelger@9537: } gernotbelger@9537: }