use of org.polymap.core.data.pipeline.ProcessorResponse in project polymap4-core by Polymap4.
the class PipelineFeatureSource method getCountInternal.
@Override
@SuppressWarnings("hiding")
protected int getCountInternal(Query query) throws IOException {
GetFeaturesSizeRequest request = new GetFeaturesSizeRequest(query);
try {
final int[] result = new int[1];
newExecutor().execute(pipeline, request, (ProcessorResponse r) -> {
GetFeaturesSizeResponse response = (GetFeaturesSizeResponse) r;
result[0] = response.getSize();
});
return result[0];
} catch (Exception e) {
Throwables.propagateIfInstanceOf(e, IOException.class);
throw Throwables.propagate(e);
}
}
use of org.polymap.core.data.pipeline.ProcessorResponse in project polymap4-core by Polymap4.
the class PipelineFeatureSource method fetchFeatures.
/**
* Called by {@link SyncPipelineFeatureCollection} to fetch feature chunks.
*/
@SuppressWarnings("hiding")
protected void fetchFeatures(Query query, final FeatureResponseHandler handler) throws Exception {
try {
log.debug("fetchFeatures(): maxFeatures= " + query.getMaxFeatures());
GetFeaturesRequest request = new GetFeaturesRequest(query);
newExecutor().execute(pipeline, request, new ResponseHandler() {
public void handle(ProcessorResponse r) throws Exception {
GetFeaturesResponse response = (GetFeaturesResponse) r;
handler.handle(response.getFeatures());
}
});
} finally {
handler.endOfResponse();
}
}
use of org.polymap.core.data.pipeline.ProcessorResponse 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.data.pipeline.ProcessorResponse in project polymap4-core by Polymap4.
the class PipelineFeatureSource method buildFeatureType.
@Override
protected SimpleFeatureType buildFeatureType() throws IOException {
// FIXME caching schema is not allowed since the pipeline and/or processors
// may change; maybe we could add a listener API to the pipeline
// avoid synchronize; doing this in parallel is ok
GetFeatureTypeRequest request = new GetFeatureTypeRequest();
try {
final FeatureType[] type = new FeatureType[1];
newExecutor().execute(pipeline, request, (ProcessorResponse r) -> {
GetFeatureTypeResponse response = (GetFeatureTypeResponse) r;
type[0] = response.getFeatureType();
});
return (SimpleFeatureType) type[0];
} catch (Exception e) {
Throwables.propagateIfInstanceOf(e, IOException.class);
throw Throwables.propagate(e);
}
}
Aggregations