annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/VegetationWmsResource.java @ 9537:bf6b63208f34

Work on uinfo inundation duration calculation. Using proxy-wms to induce additional style information (work in progress).
author gernotbelger
date Wed, 17 Oct 2018 11:23:17 +0200
parents
children 3264c2df4f18
rev   line source
9537
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
2 * Software engineering by
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
5 *
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
9 */
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
10 package org.dive4elements.river.artifacts.uinfo.inundationduration;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
11
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
12 import java.awt.image.BufferedImage;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
13 import java.awt.image.WritableRaster;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
14 import java.io.IOException;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
15 import java.io.OutputStream;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
16 import java.io.UnsupportedEncodingException;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
17 import java.net.URLDecoder;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
18 import java.util.Arrays;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
19 import java.util.List;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
20 import java.util.Map;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
21
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
22 import javax.imageio.ImageIO;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
23
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
24 import org.dive4elements.artifactdatabase.rest.BaseResource;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
25 import org.restlet.Client;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
26 import org.restlet.Context;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
27 import org.restlet.Request;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
28 import org.restlet.Response;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
29 import org.restlet.data.Form;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
30 import org.restlet.data.MediaType;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
31 import org.restlet.data.Method;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
32 import org.restlet.data.Protocol;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
33 import org.restlet.data.Reference;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
34 import org.restlet.data.Status;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
35 import org.restlet.representation.OutputRepresentation;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
36 import org.restlet.representation.Representation;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
37 import org.restlet.resource.ResourceException;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
38
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
39 /**
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
40 * Proof of context wms proxy.
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
41 *
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
42 * @author Gernot Belger
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
43 */
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
44 public class VegetationWmsResource extends BaseResource {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
45
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
46 public static final String BASE_PATH = "vegetationWms";
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
47
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
48 private static final String ATTRIBUTE_VEGETATION_ARTIFACT_UUID = "vegetation-artifact-uuid";
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
49
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
50 private static final String ATTRIBUTE_WMS_URL = "wmsUrl";
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
51
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
52 private static final ThreadLocal<Client> CLIENT = new ThreadLocal<Client>() {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
53 @Override
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
54 protected Client initialValue() {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
55
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
56 final List<Protocol> protocols = Arrays.asList(Protocol.HTTPS, Protocol.HTTP);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
57 final Client client = new Client(new Context(), protocols);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
58 // FIXME
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
59 client.getContext().getParameters().add("proxyHost", "proxy.bce01.de");
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
60 client.getContext().getParameters().add("proxyPort", "8080");
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
61 return client;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
62 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
63 };
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
64
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
65 @Override
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
66 protected Representation innerGet() throws ResourceException {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
67
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
68 try {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
69 final Request request = getRequest();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
70
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
71 final Map<String, Object> attributes = request.getAttributes();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
72 final String vegArtifactUuid = (String) attributes.get(ATTRIBUTE_VEGETATION_ARTIFACT_UUID);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
73 final String baseUrl = (String) attributes.get(ATTRIBUTE_WMS_URL);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
74
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
75 final Reference originalRef = request.getOriginalRef();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
76 final String query = originalRef.getQuery();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
77
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
78 final Form queryAsForm = originalRef.getQueryAsForm();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
79 final boolean isGetMap = "GetMap".equalsIgnoreCase(queryAsForm.getFirstValue("REQUEST", true));
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
80
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
81 final String decodedBaseUrl = URLDecoder.decode(baseUrl, "UTF-8");
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
82
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
83 final Reference proxyReference = new Reference(decodedBaseUrl);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
84 proxyReference.setQuery(query);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
85
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
86 final Client client = CLIENT.get();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
87
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
88 final Request proxyRequest = new Request(Method.GET, proxyReference);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
89 final Response response = client.handle(proxyRequest);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
90
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
91 final Status status = response.getStatus();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
92
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
93 if (!Status.SUCCESS_OK.equals(status))
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
94 throw new ResourceException(status);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
95
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
96 final Representation entity = response.getEntity();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
97
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
98 /* simply redirect everything that is not an png image */
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
99 if (!isGetMap)
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
100 return entity;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
101
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
102 final MediaType mediaType = entity.getMediaType();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
103 if (!MediaType.IMAGE_ALL.getMainType().equals(mediaType.getMainType()))
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
104 return entity;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
105
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
106 try {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
107 final BufferedImage image = ImageIO.read(entity.getStream());
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
108
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
109 // FIXME: tweak image...
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
110 final WritableRaster raster = image.getRaster();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
111 final int width = raster.getWidth();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
112 final int height = raster.getHeight();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
113 final int numBands = raster.getNumBands();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
114 for (int x = 0; x < width; x++) {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
115 for (int y = 0; y < height; y++) {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
116
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
117 // final double sampleDouble = raster.getSampleDouble(x, y, 0);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
118
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
119 final int red = raster.getSample(x, y, 0);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
120 final int green = raster.getSample(x, y, 1);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
121 final int blue = raster.getSample(x, y, 2);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
122 final int alpha = raster.getSample(x, y, 3);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
123
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
124 raster.setSample(x, y, 0, green);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
125 raster.setSample(x, y, 1, red);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
126 raster.setSample(x, y, 2, blue);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
127 raster.setSample(x, y, 3, alpha);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
128 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
129 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
130
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
131
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
132 final Representation newResponse = new OutputRepresentation(mediaType) {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
133
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
134 @Override
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
135 public void write(final OutputStream outputStream) throws IOException {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
136
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
137 // REMARK: in most cases the media-subtype can be used as image-format name.
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
138 final String subType = mediaType.getSubType();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
139 ImageIO.write(image, subType, outputStream);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
140
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
141 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
142 };
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
143
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
144 return newResponse;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
145 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
146 catch (final IOException e) {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
147 e.printStackTrace();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
148 throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
149 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
150
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
151 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
152 catch (final UnsupportedEncodingException e) {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
153 e.printStackTrace();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
154 throw new ResourceException(Status.CLIENT_ERROR_BAD_REQUEST, e);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
155 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
156 }
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
157 }

http://dive4elements.wald.intevation.org