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,

http://dive4elements.wald.intevation.org