diff gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java @ 775:eedad2ddad14

Removed race-condition while shapefile creation (issue164). gnv-artifacts/trunk@841 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 26 Mar 2010 15:20:32 +0000
parents 93489a0c1328
children 9a828e5a2390
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java	Fri Mar 26 10:06:36 2010 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/profile/horizontalcrosssection/HorizontalCrossSectionMeshOutputState.java	Fri Mar 26 15:20:32 2010 +0000
@@ -45,6 +45,7 @@
 
 import de.intevation.gnv.state.exception.StateException;
 
+import de.intevation.gnv.utils.ExclusiveExec;
 import de.intevation.gnv.utils.FileUtils;
 import de.intevation.gnv.utils.MapfileGenerator;
 import de.intevation.gnv.utils.MetaWriter;
@@ -222,9 +223,11 @@
             }
             else {
                 AttributedPoint2ds result = getResult(uuid, callContext);
+                ExclusiveExec.UniqueKey k = ExclusiveExec.INSTANCE.acquire(uuid);
                 if (result != null
                 && (p = writeToShapeFile(uuid, result, callContext)) != null) {
                     FileUtils.createZipArchive(new File(p), output);
+                    ExclusiveExec.INSTANCE.release(k);
                 }
             }
         }
@@ -274,8 +277,10 @@
         }
         else {
             AttributedPoint2ds result = getResult(uuid, callContext);
+            ExclusiveExec.UniqueKey key = ExclusiveExec.INSTANCE.acquire(uuid);
             if (result != null
             && (path = writeToShapeFile(uuid, result, callContext)) != null) {
+                ExclusiveExec.INSTANCE.release(key);
 
                 String paramType = findParameterType(callContext);
 
@@ -294,6 +299,7 @@
 
                 Document meta = MetaWriter.writeHorizontalcrosssectionMeta(
                     callContext, uuid, path, paramType);
+
                 if (meta != null) {
                     MapfileGenerator.getInstance().update();
                     return meta;
@@ -349,13 +355,10 @@
 
         try {
             synchronized (shapeFileLock) {
-                int count = 0;
-                while (shapeDir.exists()) {
-                    shapeDir = new File(baseDir, uuid + "-" + count);
-                    ++count;
+                if (shapeDir.exists()) {
+                    FileUtils.deleteContent(shapeDir);
                 }
-
-                if (!shapeDir.mkdirs()) {
+                else if (!shapeDir.mkdirs()) {
                     log.error("cannot create directory '" 
                         + shapeDir.getAbsolutePath() + "'");
                     return null;

http://dive4elements.wald.intevation.org