use of org.polymap.core.runtime.PlainLazyInit in project polymap4-core by Polymap4.
the class SimpleWmsServer method doGet.
@Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
log.debug("Request: " + request.getQueryString());
try {
final Map<String, String> kvp = parseKvpSet(request.getQueryString());
sessionContext.execute(() -> {
// LAYERS
final String layer = kvp.get("LAYERS");
assert !layer.contains(INNER_DELIMETER);
final String style = kvp.get("STYLES");
assert style == null || !style.contains(INNER_DELIMETER);
log.info("layers=" + layer + ", style=" + style);
// WIDTH/HEIGHT
int width = Integer.parseInt(kvp.get("WIDTH"));
int height = Integer.parseInt(kvp.get("HEIGHT"));
// BBOX
ReferencedEnvelope bbox = parseBBox(kvp.get("BBOX"));
String srsCode = kvp.get("SRS");
CoordinateReferenceSystem crs = CRS.decode(srsCode);
bbox = new ReferencedEnvelope(bbox, crs);
// FORMAT
String format = kvp.get("FORMAT");
format = format != null ? format : "image/png";
log.debug(" --layers= " + layer);
log.debug(" --imageSize= " + width + "x" + height);
log.debug(" --bbox= " + bbox);
crs = bbox.getCoordinateReferenceSystem();
log.debug(" --CRS= " + bbox.getCoordinateReferenceSystem().getName());
// find/create pipeline
final Pipeline pipeline = pipelines.get(layer, key -> createPipeline(key));
long modifiedSince = request.getDateHeader("If-Modified-Since");
final ProcessorRequest pr = new GetMapRequest(Collections.singletonList(layer), Collections.singletonList(style), srsCode, bbox, format, width, height, modifiedSince);
// process
Lazy<ServletOutputStream> out = new PlainLazyInit(() -> {
try {
return response.getOutputStream();
} catch (Exception e) {
log.warn("Pipeline exception: " + e, e);
response.setStatus(502);
return null;
}
});
try {
createPipelineExecutor().execute(pipeline, pr, new ResponseHandler() {
@Override
public void handle(ProcessorResponse pipeResponse) throws Exception {
if (pipeResponse == EncodedImageResponse.NOT_MODIFIED) {
response.setStatus(304);
} else {
long lastModified = ((EncodedImageResponse) pipeResponse).getLastModified();
// allow the browser to use a cached tile for max-age without a request
if (lastModified > 0) {
long maxAge = ((EncodedImageResponse) pipeResponse).getExpires() - System.currentTimeMillis() / 1000;
response.setDateHeader("Last-Modified", lastModified);
response.setHeader("Cache-Control", "public,must-revalidate");
} else // disable browser cache if there is no internal Cache for this layer
{
response.setHeader("Cache-Control", "no-cache,no-store,must-revalidate");
response.setDateHeader("Expires", 0);
response.setHeader("Pragma", "no-cache");
}
byte[] chunk = ((EncodedImageResponse) pipeResponse).getChunk();
int len = ((EncodedImageResponse) pipeResponse).getChunkSize();
out.get().write(chunk, 0, len);
}
}
});
} catch (Throwable e) {
log.warn("Pipeline exception: " + e, e);
response.setStatus(502);
}
return null;
});
} catch (IOException e) {
// assuming that this is an EOF exception
log.info("Exception: " + e);
} catch (Exception e) {
log.warn(e.toString(), e);
} finally {
// XXX do I have to close out?
// out.close();
}
}
use of org.polymap.core.runtime.PlainLazyInit in project polymap4-core by Polymap4.
the class PredefinedColorMap method fillModel.
public void fillModel(ConstantRasterColorMap newColorMap, GridCoverage2D grid, IProgressMonitor monitor) {
assert !entries.isEmpty();
monitor.beginTask("Color map", 10);
Lazy<double[]> minmax = new PlainLazyInit(() -> {
double[] result = minMax3(grid, SubMonitor.on(monitor, 9));
// assert result[0] < result[1] : "Min/max: " + result[0] + " / " + result[1];
return result;
});
monitor.subTask("creating entries");
if (novalue != null) {
newColorMap.entries.createElement(proto -> {
proto.r.set(novalue.getRed());
proto.g.set(novalue.getGreen());
proto.b.set(novalue.getBlue());
proto.opacity.set(((double) novalue.getAlpha()) / 255);
proto.value.set(minmax.get()[2]);
return proto;
});
}
AtomicDouble breakpoint = new AtomicDouble(-1);
for (Entry entry : entries) {
newColorMap.entries.createElement(proto -> {
// log.info( "Breakpoint: " + finalBreakpoint + " -> " + entry.color );
proto.r.set(entry.color.getRed());
proto.g.set(entry.color.getGreen());
proto.b.set(entry.color.getBlue());
proto.opacity.set(((double) entry.color.getAlpha()) / 255);
if (entry.value != UNDEFINED) {
proto.value.set(entry.value);
} else {
if (breakpoint.get() == -1) {
breakpoint.set(minmax.get()[0]);
}
proto.value.set(breakpoint.get());
double range = minmax.get()[1] - minmax.get()[0];
double step = range / entries.size();
breakpoint.addAndGet(step);
}
return proto;
});
}
monitor.done();
}
Aggregations