Mercurial > dive4elements > gnv-client
diff gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java @ 481:20dde2b6f1b5
Added end of life support for artifact states. Implemented ZIP download
for "Horizontalschnitte". Laid some tracks for WMS (un-)publishing.
gnv-artifacts/trunk@554 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 17 Jan 2010 16:34:11 +0000 |
parents | 211cad2fb5ba |
children | 64e65daa65e9 |
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java Sun Jan 17 12:22:56 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java Sun Jan 17 16:34:11 2010 +0000 @@ -1,6 +1,3 @@ -/** - * - */ package de.intevation.gnv.state.profile.horizontalcrosssection; import com.vividsolutions.jts.geom.Coordinate; @@ -36,6 +33,7 @@ import de.intevation.gnv.state.timeseries.TimeSeriesOutputState; +import de.intevation.gnv.utils.FileUtils; import de.intevation.gnv.utils.StringUtils; import de.intevation.gnv.utils.WKTUtils; @@ -48,6 +46,7 @@ import org.apache.log4j.Logger; import org.w3c.dom.Document; +import org.w3c.dom.Element; import org.w3c.dom.Node; /** @@ -65,7 +64,11 @@ */ private static final long serialVersionUID = 3233620652465061860L; - private String ijkQueryID = null; + private String ijkQueryID; + + private Boolean shapeFileLock = new Boolean(true); + + private String shapeFilePath; /** * Constructor @@ -73,6 +76,57 @@ public HorizontalCrossSectionMeshOutputState() { } + public String getShapeFilePath() { + synchronized (shapeFileLock) { + return shapeFilePath; + } + } + + public void setShapeFilePath(String shapeFilePath) { + synchronized (shapeFileLock) { + this.shapeFilePath = shapeFilePath; + } + } + + public String resetShapeFilePath() { + synchronized (shapeFileLock) { + String path = shapeFilePath; + shapeFilePath = null; + return path; + } + } + + public void endOfLife(Object globalContext) { + super.endOfLife(globalContext); + + // do it in background + new Thread() { + public void run() { + // TODO: Do the un-publishing WMS stuff. + String path = resetShapeFilePath(); + + if (path == null) { + return; + } + + File dir = new File(path); + + for (int i = 0; i < 10; ++i) { + if (!dir.exists() || FileUtils.deleteRecursive(dir)) { + return; + } + try { + Thread.sleep(10000L); + } + catch (InterruptedException ie) { + } + } + + log.error("failed to remove directory '" + path + "'"); + } // run + }.start(); + } + public void out( Document format, Collection<InputData> inputData, @@ -97,23 +151,105 @@ log.debug("---- asking for: " + outputMode); if ("zip".equals(outputMode)) { + writeZip(uuid, callContext, outputStream); } else if ("wms".equals(outputMode)) { + XMLUtils.toStream( + getWMS(uuid, callContext), + outputStream); } else if ("statistics".equals(outputMode)) { // TODO: REMOVE THIS! - try { - outputStream.write("<fake/>\n".getBytes()); - } - catch (IOException ioe) { - } + try { outputStream.write("<fake/>\n".getBytes()); } + catch (IOException ioe) {} } else { throw new StateException("unsupported output mode"); } } - protected Object getResult(String uuid, CallContext callContext) + protected void writeZip( + String uuid, + CallContext callContext, + OutputStream output + ) + throws StateException + { + try { + String p = getShapeFilePath(); + if (p != null) { + File dir = new File(p); + if (dir.isDirectory()) { + FileUtils.createZipArchive(dir, output); + } + } + AttributedPoint2ds result = getResult(uuid, callContext); + if (result != null + && (p = writeToShapeFile(uuid, result, callContext)) != null) { + FileUtils.createZipArchive(new File(p), output); + } + } + catch (IOException ioe) { + log.error(ioe.getLocalizedMessage(), ioe); + } + } + + protected Document getWMS(String uuid, CallContext callContext) + throws StateException + { + // TODO: Do the real WMS publishing here! + Document document = XMLUtils.newDocument(); + + Element pathElement = document.createElement("path"); + document.appendChild(pathElement); + + String path = getShapeFilePath(); + + if (path != null && new File(path).isDirectory()) { + pathElement.setTextContent(path); + } + else { + AttributedPoint2ds result = getResult(uuid, callContext); + if (result != null + && (path = writeToShapeFile(uuid, result, callContext)) != null) { + pathElement.setTextContent(path); + } + } + + return document; + } + + protected String writeToShapeFile( + String uuid, + AttributedPoint2ds result, + CallContext callContext + ) { + File baseDir = shapefileDirectory(callContext); + + File shapeDir = new File(baseDir, uuid); + + int count = 0; + + synchronized (shapeFileLock) { + while (shapeDir.exists()) { + shapeDir = new File(baseDir, uuid + "-" + count); + ++count; + } + + if (!shapeDir.mkdirs()) { + log.error("cannot create directory '" + + shapeDir.getAbsolutePath() + "'"); + return null; + } + shapeFilePath = shapeDir.getAbsolutePath(); + } + + // TODO: Do the writing + + return shapeFilePath; + } + + protected AttributedPoint2ds getResult(String uuid, CallContext callContext) throws StateException { CacheFactory cf = CacheFactory.getInstance(); @@ -122,11 +258,11 @@ if (cf.isInitialized()) { net.sf.ehcache.Element value = cf.getCache().get(key); if (value != null) { - return value.getObjectValue(); + return (AttributedPoint2ds)value.getObjectValue(); } } - Object result = produceResult(callContext); + AttributedPoint2ds result = produceResult(callContext); if (result != null && cf.isInitialized()) { cf.getCache().put(new net.sf.ehcache.Element(key, result)); @@ -135,7 +271,7 @@ return result; } - protected Object produceResult(CallContext callContext) + protected AttributedPoint2ds produceResult(CallContext callContext) throws StateException { InputData meshPolygon = inputData.get("mesh_polygon"); @@ -218,10 +354,12 @@ } } + // TODO: do the interpolation + return ap2ds; } - public Object process( + public AttributedPoint2ds process( Envelope env, Polygon polygon, int numSamples,