Search in sources :

Example 1 with PlainLazyInit

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();
    }
}
Also used : ProcessorResponse(org.polymap.core.data.pipeline.ProcessorResponse) ResponseHandler(org.polymap.core.data.pipeline.ResponseHandler) ServletOutputStream(javax.servlet.ServletOutputStream) IOException(java.io.IOException) PlainLazyInit(org.polymap.core.runtime.PlainLazyInit) FactoryException(org.opengis.referencing.FactoryException) ServletException(javax.servlet.ServletException) NoSuchAuthorityCodeException(org.opengis.referencing.NoSuchAuthorityCodeException) ServiceException(org.osgi.framework.ServiceException) IOException(java.io.IOException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) Pipeline(org.polymap.core.data.pipeline.Pipeline) ReferencedEnvelope(org.geotools.geometry.jts.ReferencedEnvelope) EncodedImageResponse(org.polymap.core.data.image.EncodedImageResponse) ProcessorRequest(org.polymap.core.data.pipeline.ProcessorRequest) GetMapRequest(org.polymap.core.data.image.GetMapRequest) CoordinateReferenceSystem(org.opengis.referencing.crs.CoordinateReferenceSystem)

Example 2 with PlainLazyInit

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();
}
Also used : AtomicDouble(com.google.common.util.concurrent.AtomicDouble) PlainLazyInit(org.polymap.core.runtime.PlainLazyInit)

Aggregations

PlainLazyInit (org.polymap.core.runtime.PlainLazyInit)2 AtomicDouble (com.google.common.util.concurrent.AtomicDouble)1 IOException (java.io.IOException)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 ServletException (javax.servlet.ServletException)1 ServletOutputStream (javax.servlet.ServletOutputStream)1 ReferencedEnvelope (org.geotools.geometry.jts.ReferencedEnvelope)1 FactoryException (org.opengis.referencing.FactoryException)1 NoSuchAuthorityCodeException (org.opengis.referencing.NoSuchAuthorityCodeException)1 CoordinateReferenceSystem (org.opengis.referencing.crs.CoordinateReferenceSystem)1 ServiceException (org.osgi.framework.ServiceException)1 EncodedImageResponse (org.polymap.core.data.image.EncodedImageResponse)1 GetMapRequest (org.polymap.core.data.image.GetMapRequest)1 Pipeline (org.polymap.core.data.pipeline.Pipeline)1 ProcessorRequest (org.polymap.core.data.pipeline.ProcessorRequest)1 ProcessorResponse (org.polymap.core.data.pipeline.ProcessorResponse)1 ResponseHandler (org.polymap.core.data.pipeline.ResponseHandler)1