Revision: 6626
          http://sourceforge.net/p/jump-pilot/code/6626
Author:   michaudm
Date:     2020-11-21 19:24:09 +0000 (Sat, 21 Nov 2020)
Log Message:
-----------
Free/close resources to avoid memory leaks and/or filelocks

Modified Paths:
--------------
    core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java

Modified: core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java       
2020-11-19 08:02:57 UTC (rev 6625)
+++ core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java       
2020-11-21 19:24:09 UTC (rev 6626)
@@ -12,6 +12,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.WeakHashMap;
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReadParam;
@@ -37,9 +38,11 @@
 import com.vividsolutions.jump.workbench.imagery.geoimg.GeoReferencedRaster;
 
 public class TiffUtilsV2 {
+
   // a File -> RenderedOp cache mapping to prevent recreating inputs for the 
same file
-  private static HashMap<File,GeoReferencedRaster> geoRasterCache = new 
HashMap<File,GeoReferencedRaster>();
+  private static WeakHashMap<File,GeoReferencedRaster> geoRasterCache = new 
WeakHashMap<File,GeoReferencedRaster>();
 
+
   public static RenderedOp getRenderedOp(File tiffFile) throws IOException {
     GeoReferencedRaster geoRaster = getGeoReferencedRaster(tiffFile);
     RenderedOp rop;
@@ -87,7 +90,7 @@
     parameterBlock.addSource(renderedOp);
     parameterBlock.add(xScale);
     parameterBlock.add(yScale);
-    renderedOp = JAI.create("scale", parameterBlock);
+    //renderedOp = JAI.create("scale", parameterBlock);
     return JAI.create("scale", parameterBlock);
   }
   
@@ -177,7 +180,6 @@
                actualImageWidth = bufferedImage.getWidth();
                actualImageHeight = bufferedImage.getHeight();
              }
-
              Metadata metadata = new Metadata(wholeImageEnvelope, 
imagePartEnvelope,
                  new Point(originalImageWidth, originalImageHeight), new 
Point(actualImageWidth, actualImageHeight),
                  (cellSize.getX() + cellSize.getY()) / 2, 
(subsetResolution.getX() + subsetResolution.getY()) / 2, noData,
@@ -225,8 +227,7 @@
    * @throws Exception
    */
   public static ImageAndMetadata readImageAndMetadata(File tiffFile, Envelope 
viewportEnvelope, Resolution requestedRes,
-            Stats stats) throws NoninvertibleTransformException, IOException, 
FileNotFoundException,
-             TiffTags.TiffReadingException, Exception {
+            Stats stats) throws NoninvertibleTransformException, IOException, 
FileNotFoundException, Exception {
          RenderedOp renderedOp1 = getRenderedOp(tiffFile);
          Envelope wholeImageEnvelope = getEnvelope(tiffFile);
          
@@ -359,12 +360,9 @@
                  (cellSizeX + cellSizeY) / 2, (subsetResolution.getX() + 
subsetResolution.getY()) / 2, noData,
                  stats);
              return new ImageAndMetadata(bufferedImage, metadata);
- 
 
-          
+  }
 
-         }
-
   /**
    * Method to read overviews of a TIF from the file metadata or from an 
external .ovr file
    * @param tiffFile
@@ -380,36 +378,36 @@
    * @throws IOException
    * @throws NoninvertibleTransformException
    */
-         private static ImageAndMetadata readImage(File tiffFile, int 
overviewIndex, int indexStart, Point originalSize,
+  private static ImageAndMetadata readImage(File tiffFile, int overviewIndex, 
int indexStart, Point originalSize,
              Resolution originalCellSize, Envelope wholeImageEnvelope, 
Envelope viewportEnvelope, double noDataValue,
              Stats stats) throws IOException, NoninvertibleTransformException {
 
-           ImageInputStream imageInputStream = 
ImageIO.createImageInputStream(tiffFile);
-           Iterator<ImageReader> iterator = 
ImageIO.getImageReaders(imageInputStream);
+       ImageInputStream imageInputStream = 
ImageIO.createImageInputStream(tiffFile);
+       Iterator<ImageReader> iterator = 
ImageIO.getImageReaders(imageInputStream);
 
-           if (iterator != null && iterator.hasNext()) {
+       if (iterator != null && iterator.hasNext()) {
 
-             ImageReader imageReader = iterator.next();
-             imageReader.setInput(imageInputStream);
-             for (int i = 0; i < imageReader.getNumImages(true); i++) {
-               if (i + indexStart == overviewIndex) {
+               ImageReader imageReader = iterator.next();
+               imageReader.setInput(imageInputStream);
+               for (int i = 0; i < imageReader.getNumImages(true); i++) {
+                       if (i + indexStart == overviewIndex) {
 
-                 Resolution subsetResolution = new 
Resolution(wholeImageEnvelope.getWidth() / imageReader.getWidth(i),
+                               Resolution subsetResolution = new 
Resolution(wholeImageEnvelope.getWidth() / imageReader.getWidth(i),
                      wholeImageEnvelope.getHeight() / 
imageReader.getHeight(i));
 
-                 Rectangle imageSubset = 
RasterImageIO.getDrawingRectangle(imageReader.getWidth(i), 
imageReader.getHeight(i),
+                               Rectangle imageSubset = 
RasterImageIO.getDrawingRectangle(imageReader.getWidth(i), 
imageReader.getHeight(i),
                      wholeImageEnvelope, viewportEnvelope, subsetResolution);
 
-                 BufferedImage bufferedImage;
-                 Envelope imagePartEnvelope;
-                 int imageWidth;
-                 int imageHeight;
-                 if (imageSubset == null) {
+                               BufferedImage bufferedImage;
+                               Envelope imagePartEnvelope;
+                               int imageWidth;
+                               int imageHeight;
+                               if (imageSubset == null) {
                    bufferedImage = null;
                    imagePartEnvelope = null;
                    imageWidth = 0;
                    imageHeight = 0;
-                 } else {
+                               } else {
                    ImageReadParam imageReadParam = new ImageReadParam();
                    imageReadParam.setSourceRegion(imageSubset);
                    bufferedImage = imageReader.read(i, imageReadParam);
@@ -416,7 +414,7 @@
                    imagePartEnvelope =  
getImageSubsetEnvelope(wholeImageEnvelope, imageSubset, subsetResolution);
                    imageWidth = bufferedImage.getWidth();
                    imageHeight = bufferedImage.getHeight();
-                 }
+                               }
 
 //                         double originalCellSize = subsetResolution.getX();
 //                         int cellsCount = imageReader.getWidth(i) * 
imageReader.getHeight(i);
@@ -428,21 +426,24 @@
 //                             stats = calculateStats(statsBufferedImage, 
noDataValue);
 //                         }
 
-                 Metadata metadata = new Metadata(wholeImageEnvelope, 
imagePartEnvelope, originalSize,
+                                       Metadata metadata = new 
Metadata(wholeImageEnvelope, imagePartEnvelope, originalSize,
                      new Point(imageWidth, imageHeight), 
(originalCellSize.getX() + originalCellSize.getY()) / 2,
                      (subsetResolution.getX() + subsetResolution.getY()) / 2, 
noDataValue, stats);
+                               if (imageReader != null) {
+                                       imageReader.dispose();
+                               }
+                               if (imageInputStream != null) {
+                                       imageInputStream.close();
+                               }
+                               return new ImageAndMetadata(bufferedImage, 
metadata);
+                       }
+               }
 
-                 return new ImageAndMetadata(bufferedImage, metadata);
+       }
+       return null;
 
-               }
-             }
+  }
 
-           }
-
-           return null;
-
-         }
-
          /**
           * Method to read Statistics of TIF file (if available) from  file 
metadata or
           * from an external aux.xml file
@@ -496,6 +497,7 @@
            return createStatsXml(tiffFile, noDataValue, auxXmlFile);
 
          }
+
       /**
        * Method to compute statistic of a TIF file and write as aux.xml file
        * @param tiffFile



_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to