annotate artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/VegetationWmsResource.java @ 9543:3264c2df4f18

WMS-Config
author gernotbelger
date Wed, 17 Oct 2018 17:10:52 +0200
parents bf6b63208f34
children f51e23eb036a
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
9543
3264c2df4f18 WMS-Config
gernotbelger
parents: 9537
diff changeset
59 /* Nachfolgende 2 Zeilen sind nur für die BCE-Entwicklungsumgebung bestimmt */
3264c2df4f18 WMS-Config
gernotbelger
parents: 9537
diff changeset
60 // client.getContext().getParameters().add("proxyHost", "proxy.bce01.de");
3264c2df4f18 WMS-Config
gernotbelger
parents: 9537
diff changeset
61 // client.getContext().getParameters().add("proxyPort", "8080");
9537
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
62 return client;
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
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
66 @Override
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
67 protected Representation innerGet() throws ResourceException {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
68
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
69 try {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
70 final Request request = getRequest();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
71
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
72 final Map<String, Object> attributes = request.getAttributes();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
73 final String vegArtifactUuid = (String) attributes.get(ATTRIBUTE_VEGETATION_ARTIFACT_UUID);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
74 final String baseUrl = (String) attributes.get(ATTRIBUTE_WMS_URL);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
75
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
76 final Reference originalRef = request.getOriginalRef();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
77 final String query = originalRef.getQuery();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
78
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
79 final Form queryAsForm = originalRef.getQueryAsForm();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
80 final boolean isGetMap = "GetMap".equalsIgnoreCase(queryAsForm.getFirstValue("REQUEST", true));
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
81
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
82 final String decodedBaseUrl = URLDecoder.decode(baseUrl, "UTF-8");
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
83
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
84 final Reference proxyReference = new Reference(decodedBaseUrl);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
85 proxyReference.setQuery(query);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
86
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
87 final Client client = CLIENT.get();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
88
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
89 final Request proxyRequest = new Request(Method.GET, proxyReference);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
90 final Response response = client.handle(proxyRequest);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
91
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
92 final Status status = response.getStatus();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
93
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
94 if (!Status.SUCCESS_OK.equals(status))
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
95 throw new ResourceException(status);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
96
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
97 final Representation entity = response.getEntity();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
98
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
99 /* simply redirect everything that is not an png image */
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
100 if (!isGetMap)
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
101 return entity;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
102
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
103 final MediaType mediaType = entity.getMediaType();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
104 if (!MediaType.IMAGE_ALL.getMainType().equals(mediaType.getMainType()))
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
105 return entity;
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
106
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
107 try {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
108 final BufferedImage image = ImageIO.read(entity.getStream());
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
109
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
110 // FIXME: tweak image...
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
111 final WritableRaster raster = image.getRaster();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
112 final int width = raster.getWidth();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
113 final int height = raster.getHeight();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
114 final int numBands = raster.getNumBands();
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
115 for (int x = 0; x < width; x++) {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
116 for (int y = 0; y < height; y++) {
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
117
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
118 // final double sampleDouble = raster.getSampleDouble(x, y, 0);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
119
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
120 final int red = raster.getSample(x, y, 0);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
121 final int green = raster.getSample(x, y, 1);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
122 final int blue = raster.getSample(x, y, 2);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
123 final int alpha = raster.getSample(x, y, 3);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
124
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
125 raster.setSample(x, y, 0, green);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
126 raster.setSample(x, y, 1, red);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
127 raster.setSample(x, y, 2, blue);
bf6b63208f34 Work on uinfo inundation duration calculation.
gernotbelger
parents:
diff changeset
128 raster.setSample(x, y, 3, alpha);
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