svn - r34277 - in trunk/modules/plugin/arcsde/datastore/src: main/java/org/geotools/arcsde/gce test/java/org/geotools/arcsde/gce

1 message Options
Embed this post
Permalink
svn_geotools

svn - r34277 - in trunk/modules/plugin/arcsde/datastore/src: main/java/org/geotools/arcsde/gce test/java/org/geotools/arcsde/gce

Reply Threaded More More options
Print post
Permalink
Author: groldan
Date: 2009-10-29 10:10:52 -0400 (Thu, 29 Oct 2009)
New Revision: 34277

Added:
   trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java
Modified:
   trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java
   trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java
   trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDETiledImageInputStream.java
   trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java
   trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java
   trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAILegacyOnlineTest.java
Log:
GEOT-2616 general cleanup and postpone image mosaic location set to last processing step

Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java
===================================================================
--- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java 2009-10-28 17:58:46 UTC (rev 34276)
+++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java 2009-10-29 14:10:52 UTC (rev 34277)
@@ -17,9 +17,9 @@
  */
 package org.geotools.arcsde.gce;
 
-import java.awt.Dimension;
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.DataBuffer;
@@ -45,6 +45,8 @@
 import javax.media.jai.InterpolationNearest;
 import javax.media.jai.JAI;
 import javax.media.jai.ParameterBlockJAI;
+import javax.media.jai.RenderedOp;
+import javax.media.jai.operator.AffineDescriptor;
 import javax.media.jai.operator.FormatDescriptor;
 import javax.media.jai.operator.MosaicDescriptor;
 
@@ -56,6 +58,7 @@
 import org.geotools.coverage.grid.GridEnvelope2D;
 import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
 import org.geotools.coverage.grid.io.OverviewPolicy;
+import org.geotools.data.DataSourceException;
 import org.geotools.data.DefaultServiceInfo;
 import org.geotools.data.ServiceInfo;
 import org.geotools.factory.Hints;
@@ -311,12 +314,12 @@
                                     + ", expected: " + tiledImageSize.width + "x"
                                     + tiledImageSize.height);
                 }
-                if (tiledImageSize.x != rasterImage.getMinX()
-                        || tiledImageSize.y != rasterImage.getMinY()) {
-                    throw new IllegalStateException("Read image is not at the expected location "
-                            + tiledImageSize.x + "," + tiledImageSize.y + ": "
-                            + rasterImage.getMinX() + "," + rasterImage.getMinY());
-                }
+                // if (tiledImageSize.x != rasterImage.getMinX()
+                // || tiledImageSize.y != rasterImage.getMinY()) {
+                // throw new IllegalStateException("Read image is not at the expected location "
+                // + tiledImageSize.x + "," + tiledImageSize.y + ": "
+                // + rasterImage.getMinX() + "," + rasterImage.getMinY());
+                // }
             }
         }
     }
@@ -400,56 +403,81 @@
                     + " colormapped rasters. The mosaic tiles will be expanded to "
                     + "\nRGB space and the resulting mosaic reduced to a new IndexColorModel");
         }
+
         for (RasterQueryInfo query : queries) {
             RenderedImage image = query.getResultImage();
             log.log(image, query.getRasterId(), "01_original");
 
-            image = cropToRequiredDimension(image, query.getResultDimensionInsideTiledImage());
+            image = cropToRequiredDimension(image, query.getTiledImageSize(), query
+                    .getResultDimensionInsideTiledImage());
             log.log(image, query.getRasterId(), "02_crop");
 
+            // final Rectangle mosaicLocation = query.getMosaicLocation();
+            // double sx = (float)mosaicLocation.getWidth() / image.getWidth();
+            // double sy = (float)mosaicLocation.getHeight() / image.getHeight();
+            // double tx = mosaicLocation.x - image.getMinX();
+            // double ty = mosaicLocation.y - image.getMinY();
+            //            
+            // AffineTransform sc = AffineTransform.getScaleInstance(sx, sy);
+            // AffineTransform tr = AffineTransform.getTranslateInstance(tx, ty);
+            // sc.concatenate(tr);
+            //
+            // double[] bgvalues = null;//{255,255,255,255};
+            // image = AffineDescriptor.create(image, sc, new InterpolationNearest(), bgvalues,
+            // hints);
+
             final Rectangle mosaicLocation = query.getMosaicLocation();
             // scale
             Float scaleX = Float.valueOf((float) (mosaicLocation.getWidth() / image.getWidth()));
             Float scaleY = Float.valueOf((float) (mosaicLocation.getHeight() / image.getHeight()));
-            Float translateX = null;
-            Float translateY = null;
+            Float translateX = Float.valueOf(0);
+            Float translateY = Float.valueOf(0);
 
-            ParameterBlock pb = new ParameterBlock();
-            pb.addSource(image);
-            pb.add(scaleX);
-            pb.add(scaleY);
-            pb.add(translateX);
-            pb.add(translateY);
-            pb.add(new InterpolationNearest());
+            if (!(Float.valueOf(1.0F).equals(scaleX) && Float.valueOf(1.0F).equals(scaleY))) {
+                ParameterBlock pb = new ParameterBlock();
+                pb.addSource(image);
+                pb.add(scaleX);
+                pb.add(scaleY);
+                pb.add(translateX);
+                pb.add(translateY);
+                pb.add(new InterpolationNearest());
 
-            image = JAI.create("scale", pb);
-            log.log(image, query.getRasterId(), "03_scale");
+                try {
+                    LOGGER.info("Forcing loading data for mosaic as per GEOT-");
+                    image.getData();
+                } catch (RuntimeException e) {
+                    throw new DataSourceException("Error fetching arcsde raster", e);
+                }
 
-            int width = image.getWidth();
-            int height = image.getHeight();
+                image = JAI.create("scale", pb);
+                log.log(image, query.getRasterId(), "03_scale");
 
-            assert mosaicLocation.width == width;
-            assert mosaicLocation.height == height;
+                int width = image.getWidth();
+                int height = image.getHeight();
 
-            // translate
-            pb = new ParameterBlock();
-            pb.addSource(image);
-            pb.add(Float.valueOf(mosaicLocation.x - image.getMinX()));
-            pb.add(Float.valueOf(mosaicLocation.y - image.getMinY()));
-            pb.add(null);
+                assert mosaicLocation.width == width;
+                assert mosaicLocation.height == height;
+            }
+            if (image.getMinX() != mosaicLocation.x || image.getMinY() != mosaicLocation.y) {
+                // translate
+                ParameterBlock pb = new ParameterBlock();
+                pb.addSource(image);
+                pb.add(Float.valueOf(mosaicLocation.x - image.getMinX()));
+                pb.add(Float.valueOf(mosaicLocation.y - image.getMinY()));
+                pb.add(null);
 
-            image = JAI.create("translate", pb);
-            log.log(image, query.getRasterId(), "04_translate");
+                image = JAI.create("translate", pb);
+                log.log(image, query.getRasterId(), "04_translate");
 
-            assert image.getMinX() == mosaicLocation.x : image.getMinX() + " != "
-                    + mosaicLocation.x;
-            assert image.getMinY() == mosaicLocation.y : image.getMinY() + " != "
-                    + mosaicLocation.y;
-            assert image.getWidth() == mosaicLocation.width : image.getWidth() + " != "
-                    + mosaicLocation.width;
-            assert image.getHeight() == mosaicLocation.height : image.getHeight() + " != "
-                    + mosaicLocation.height;
-
+                assert image.getMinX() == mosaicLocation.x : image.getMinX() + " != "
+                        + mosaicLocation.x;
+                assert image.getMinY() == mosaicLocation.y : image.getMinY() + " != "
+                        + mosaicLocation.y;
+                assert image.getWidth() == mosaicLocation.width : image.getWidth() + " != "
+                        + mosaicLocation.width;
+                assert image.getHeight() == mosaicLocation.height : image.getHeight() + " != "
+                        + mosaicLocation.height;
+            }
             if (expandThenContractCM) {
                 if (LOGGER.isLoggable(Level.FINER)) {
                     LOGGER.finer("Creating color expanded version of tile for raster #"
@@ -477,23 +505,6 @@
              */
             mosaic = transformed.get(0);
         } else {
-            // ParameterBlock mosaicParams = new ParameterBlock();
-            //
-            // for (RenderedImage img : transformed) {
-            // mosaicParams.addSource(img);
-            // log.appendLoggingGeometries(LoggingHelper.MOSAIC_RESULT, img);
-            // }
-            // log.log(LoggingHelper.MOSAIC_RESULT);
-            //
-            // mosaicParams.add(MosaicDescriptor.MOSAIC_TYPE_OVERLAY); // mosaic type
-            // mosaicParams.add(null); // alpha mask
-            // mosaicParams.add(null); // source ROI mask
-            // mosaicParams.add(null); // source threshold
-            // mosaicParams.add(null); // destination background value
-            //
-            // LOGGER.fine("Creating mosaic out of " + queries.size() + " raster tiles");
-            // mosaic = JAI.create("Mosaic", mosaicParams);
-            // log.log(mosaic, 0L, "05_mosaic_result");
             /*
              * adapted from RasterLayerResponse.java in the imagemosaic module
              */
@@ -507,11 +518,12 @@
             final ImageLayout layout = new ImageLayout(mosaicGeometry.x, mosaicGeometry.y,
                     mosaicGeometry.width, mosaicGeometry.height);
             // tiling
-//            final Dimension tileDimensions = request.getTileDimensions();
-//            if (tileDimensions != null) {
-//                layout.setTileHeight(tileDimensions.width).setTileWidth(tileDimensions.height);
-//            }
+            // final Dimension tileDimensions = request.getTileDimensions();
+            // if (tileDimensions != null) {
+            // layout.setTileHeight(tileDimensions.width).setTileWidth(tileDimensions.height);
+            // }
             final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout);
+            hints.put(JAI.KEY_SERIALIZE_DEEP_COPY, Boolean.TRUE);
 
             for (RenderedImage img : transformed) {
                 mosaicParams.addSource(img);
@@ -521,19 +533,25 @@
 
             LOGGER.fine("Creating mosaic out of " + queries.size() + " raster tiles");
             mosaic = JAI.create("Mosaic", mosaicParams, hints);
+
             log.log(mosaic, 0L, "05_mosaic_result");
         }
         return mosaic;
     }
 
     private RenderedImage cropToRequiredDimension(final RenderedImage fullTilesRaster,
-            final Rectangle cropTo) {
+            final Rectangle tiledImageGridRagne, final Rectangle cropTo) {
 
-        int minX = fullTilesRaster.getMinX();
-        int minY = fullTilesRaster.getMinY();
-        int width = fullTilesRaster.getWidth();
-        int height = fullTilesRaster.getHeight();
+        // int minX = fullTilesRaster.getMinX();
+        // int minY = fullTilesRaster.getMinY();
+        // int width = fullTilesRaster.getWidth();
+        // int height = fullTilesRaster.getHeight();
 
+        int minX = tiledImageGridRagne.x;
+        int minY = tiledImageGridRagne.y;
+        int width = tiledImageGridRagne.width;
+        int height = tiledImageGridRagne.height;
+
         Rectangle origDim = new Rectangle(minX, minY, width, height);
         if (!origDim.contains(cropTo)) {
             throw new IllegalArgumentException("Original image (" + origDim
@@ -550,18 +568,23 @@
         ParameterBlock cropParams = new ParameterBlock();
 
         cropParams.addSource(fullTilesRaster);// Source
-        cropParams.add(Float.valueOf(cropTo.x)); // x origin for each band
-        cropParams.add(Float.valueOf(cropTo.y)); // y origin for each band
+        cropParams.add(Float.valueOf(cropTo.x - tiledImageGridRagne.x)); // x origin for each band
+        cropParams.add(Float.valueOf(cropTo.y - tiledImageGridRagne.y)); // y origin for each band
         cropParams.add(Float.valueOf(cropTo.width));// width for each band
         cropParams.add(Float.valueOf(cropTo.height));// height for each band
 
         final RenderingHints hints = null;
         RenderedImage image = JAI.create("Crop", cropParams, hints);
 
-        assert cropTo.x == image.getMinX();
-        assert cropTo.y == image.getMinY();
+        assert cropTo.x - tiledImageGridRagne.x == image.getMinX();
+        assert cropTo.y - tiledImageGridRagne.y == image.getMinY();
         assert cropTo.width == image.getWidth();
         assert cropTo.height == image.getHeight();
+
+        // assert cropTo.x == image.getMinX();
+        // assert cropTo.y == image.getMinY();
+        // assert cropTo.width == image.getWidth();
+        // assert cropTo.height == image.getHeight();
         return image;
     }
 

Added: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java
===================================================================
--- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java                        (rev 0)
+++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java 2009-10-29 14:10:52 UTC (rev 34277)
@@ -0,0 +1,73 @@
+package org.geotools.arcsde.gce;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageTypeSpecifier;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.spi.ImageReaderSpi;
+
+import com.sun.media.imageioimpl.plugins.raw.RawImageReader;
+
+public class ArcSDEImageReader extends RawImageReader {
+
+    protected ArcSDEImageReader(final ImageReaderSpi originatingProvider) {
+        super(originatingProvider);
+    }
+
+    @Override
+    public int getHeight(int imageIndex) throws IOException {
+        int height = super.getHeight(imageIndex);
+        return height;
+    }
+
+    @Override
+    public IIOMetadata getImageMetadata(int imageIndex) throws IOException {
+        IIOMetadata imageMetadata = super.getImageMetadata(imageIndex);
+        return imageMetadata;
+    }
+
+    @Override
+    public Iterator<ImageTypeSpecifier> getImageTypes(int imageIndex) throws IOException {
+        Iterator imageTypes = super.getImageTypes(imageIndex);
+        return imageTypes;
+    }
+
+    @Override
+    public int getNumImages(boolean allowSearch) throws IOException {
+        int numImages = super.getNumImages(allowSearch);
+        return numImages;
+    }
+
+    @Override
+    public IIOMetadata getStreamMetadata() throws IOException {
+        IIOMetadata streamMetadata = super.getStreamMetadata();
+        return streamMetadata;
+    }
+
+    @Override
+    public int getWidth(int imageIndex) throws IOException {
+        int width = super.getWidth(imageIndex);
+        return width;
+    }
+
+    @Override
+    public BufferedImage read(int imageIndex, ImageReadParam param) throws IOException {
+        BufferedImage read = super.read(imageIndex, param);
+        return read;
+    }
+
+    @Override
+    public void setInput(Object input, boolean seekForwardOnly, boolean ignoreMetadata) {
+        seekForwardOnly = true;
+        super.setInput(input, seekForwardOnly, ignoreMetadata);
+    }
+
+    @Override
+    public boolean isSeekForwardOnly() {
+        boolean seekForwardOnly = super.isSeekForwardOnly();
+        return seekForwardOnly ? seekForwardOnly : true;
+    }
+}


Property changes on: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Id URL
Added: svn:eol-style
   + native

Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java
===================================================================
--- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java 2009-10-28 17:58:46 UTC (rev 34276)
+++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java 2009-10-29 14:10:52 UTC (rev 34277)
@@ -418,7 +418,7 @@
         params.put(ArcSDEConnectionConfig.USER_NAME_PARAM_NAME, sdeUser);
         params.put(ArcSDEConnectionConfig.PASSWORD_PARAM_NAME, sdePass);
         params.put(ArcSDEConnectionConfig.MIN_CONNECTIONS_PARAM_NAME, "1");
-        params.put(ArcSDEConnectionConfig.MAX_CONNECTIONS_PARAM_NAME, "10");
+        params.put(ArcSDEConnectionConfig.MAX_CONNECTIONS_PARAM_NAME, "20");
         params.put(ArcSDEConnectionConfig.CONNECTION_TIMEOUT_PARAM_NAME, "-1");// do not wait
 
         ArcSDEConnectionConfig config = ArcSDEConnectionConfig.fromMap(params);

Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDETiledImageInputStream.java
===================================================================
--- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDETiledImageInputStream.java 2009-10-28 17:58:46 UTC (rev 34276)
+++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDETiledImageInputStream.java 2009-10-29 14:10:52 UTC (rev 34277)
@@ -28,7 +28,9 @@
  * @author Gabriel Roldan (OpenGeo)
  * @since 2.5.4
  * @version $Id$
- * @source $URL$
+ * @source $URL:
+ *         http://svn.osgeo.org/geotools/trunk/modules/plugin/arcsde/datastore/src/main/java/org
+ *         /geotools/arcsde/gce/ArcSDETiledImageInputStream.java $
  */
 final class ArcSDETiledImageInputStream extends ImageInputStreamImpl implements ImageInputStream {
 
@@ -40,6 +42,10 @@
 
     private int currTileDataIndex;
 
+    private int currTileIndex = -1;
+
+    private final int length;
+
     public ArcSDETiledImageInputStream(final TileReader tileReader) {
         super();
         this.tileReader = tileReader;
@@ -48,6 +54,12 @@
         this.currTileData = new byte[bytesPerTile];
         // force load at the first read invocation
         this.currTileDataIndex = tileDataLength;
+
+        final int tilesWide = tileReader.getTilesWide();
+        final int tilesHigh = tileReader.getTilesHigh();
+        final int numberOfBands = tileReader.getNumberOfBands();
+
+        length = bytesPerTile * tilesWide * tilesHigh * numberOfBands;
     }
 
     /**
@@ -56,14 +68,6 @@
      */
     @Override
     public long length() {
-        final int bytesPerTile = tileReader.getBytesPerTile();
-        final int tilesWide = tileReader.getTilesWide();
-        final int tilesHigh = tileReader.getTilesHigh();
-        final int numberOfBands = tileReader.getNumberOfBands();
-        // final int bitsPerSample = tileReader.getBitsPerSample();
-
-        int length = bytesPerTile * tilesWide * tilesHigh * numberOfBands;
-
         return length;
     }
 
@@ -74,7 +78,8 @@
             return -1;
         }
         byte b = data[currTileDataIndex];
-        currTileDataIndex++;
+        ++currTileDataIndex;
+        ++streamPos;
         return b;
     }
 
@@ -88,6 +93,7 @@
         final int count = Math.min(available, len);
         System.arraycopy(data, currTileDataIndex, buff, off, count);
         currTileDataIndex += count;
+        streamPos += count;
         return count;
     }
 
@@ -110,6 +116,7 @@
             }
 
             currTileDataIndex = 0;
+            ++currTileIndex;
             tileReader.next(currTileData);
         }
         return currTileData;
@@ -120,4 +127,50 @@
         tileReader.dispose();
         super.close();
     }
+
+    // @Override
+    public void _seek(final long newPos) throws IOException {
+        if (newPos == streamPos) {
+            //System.err.println("seek to currPos " + newPos + ". currPos = " + streamPos);
+            return;
+        }
+//        if (newPos < streamPos) {
+//            System.err.println("back seek to " + newPos + ". currPos = " + streamPos);
+//        }else{
+//            System.err.println("Forward seek to " + newPos + ". currPos = " + streamPos);
+//        }
+        super.seek(newPos);
+//        if (newPos >= length) {
+//            //System.err.println("---> seek to " + newPos + " > length: " + length);
+//            return;
+//        }
+//
+//        // force tile for newPos to be loaded
+//        //this.currTileDataIndex = tileDataLength;
+//        
+//        
+//        final long actualPos = ((long)tileDataLength * currTileIndex) + currTileDataIndex;
+//        if(newPos > actualPos){
+//            System.err.println("---> seek to " + newPos + " > actualPos: " + actualPos);
+//            int delta = (int) (newPos - actualPos);
+//            int newDataIndex = currTileDataIndex + delta;
+//            while(newDataIndex > tileDataLength){
+//                // force tile for newPos to be loaded
+//                this.currTileDataIndex = tileDataLength;
+//                getTileData();
+//                newDataIndex -= tileDataLength;
+//            }
+//            this.currTileDataIndex = newDataIndex;
+//        }
+    }
+
+    @Override
+    public boolean isCached() {
+        return true;
+    }
+
+    @Override
+    public boolean isCachedMemory() {
+        return true;
+    }
 }
\ No newline at end of file

Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java
===================================================================
--- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java 2009-10-28 17:58:46 UTC (rev 34276)
+++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java 2009-10-29 14:10:52 UTC (rev 34277)
@@ -32,20 +32,12 @@
 import javax.imageio.stream.ImageInputStream;
 import javax.media.jai.ImageLayout;
 import javax.media.jai.JAI;
-import javax.media.jai.RenderedOp;
 
-import org.geotools.arcsde.session.Command;
-import org.geotools.arcsde.session.ISession;
 import org.geotools.arcsde.session.ISessionPool;
 import org.geotools.data.DataSourceException;
 import org.geotools.util.logging.Logging;
 
-import com.esri.sde.sdk.client.SeConnection;
-import com.esri.sde.sdk.client.SeException;
 import com.esri.sde.sdk.client.SeQuery;
-import com.esri.sde.sdk.client.SeRasterAttr;
-import com.esri.sde.sdk.client.SeRow;
-import com.esri.sde.sdk.client.SeSqlConstruct;
 import com.sun.media.imageio.stream.RawImageInputStream;
 import com.sun.media.imageioimpl.plugins.raw.RawImageReaderSpi;
 
@@ -66,52 +58,9 @@
 
     private RasterDatasetInfo rasterInfo;
 
-    // private final SeQuery preparedQuery;
-
-    // private final FetchRasterCommand fetchCommand;
-
     private final ISessionPool sessionPool;
 
     /**
-     * @see DefaultTiledRasterReader#nextRaster()
-     */
-    private static class FetchRasterCommand extends Command<Long> {
-
-        private SeQuery preparedQuery;
-
-        private SeRow row;
-
-        private SeRasterAttr rAttr;
-
-        public FetchRasterCommand(final SeQuery preparedQuery) {
-            this.preparedQuery = preparedQuery;
-        }
-
-        @Override
-        public Long execute(ISession session, SeConnection connection) throws SeException,
-                IOException {
-            this.row = preparedQuery.fetch();
-            if (row == null) {
-                return null;
-            }
-
-            // we don't work with datasets with more than one raster column
-            final int rasterColumnIndex = 0;
-            this.rAttr = row.getRaster(rasterColumnIndex);
-            Long rasterId = Long.valueOf(rAttr.getRasterId().longValue());
-            return rasterId;
-        }
-
-        public SeRasterAttr getRasterAttribute() {
-            return rAttr;
-        }
-
-        public SeRow getSeRow() {
-            return row;
-        }
-    }
-
-    /**
      * Creates an {@link DefaultTiledRasterReader} that uses the given connection to fetch raster
      * data for the given {@link RasterDatasetInfo rasterInfo}.
      * <p>
@@ -126,99 +75,20 @@
             final RasterDatasetInfo rasterInfo) throws IOException {
         this.sessionPool = sessionPool;
         this.rasterInfo = rasterInfo;
-        //
-        // try {
-        // preparedQuery = createAndExecuteSeQuery(conn);
-        // } catch (IOException e) {
-        // dispose();
-        // throw e;
-        // } catch (RuntimeException e) {
-        // dispose();
-        // throw e;
-        // } catch (Exception e) {
-        // dispose();
-        // throw new DataSourceException(e);
-        // }
-
-        // this.fetchCommand = new FetchRasterCommand(preparedQuery);
     }
 
     /**
-     * @see org.geotools.arcsde.gce.TiledRasterReader#nextRaster()
-     */
-    // public Long nextRaster() throws IOException {
-    // this.rasterId = session.issue(fetchCommand);
-    // // if (this.rasterId == null) {
-    // // dispose();
-    // // }
-    // return this.rasterId;
-    // }
-
-    /**
-     * Disposes in case of an error
-     *
-     * @see org.geotools.arcsde.gce.TiledRasterReader#dispose()
-     */
-    // private void dispose() {
-    // if (session != null) {
-    // try {
-    // session.close(preparedQuery);
-    // } catch (Exception e) {
-    // e.printStackTrace();
-    // }
-    // session.dispose();
-    // session = null;
-    // }
-    // }
-
-    /**
      * @see org.geotools.arcsde.gce.TiledRasterReader#read
      */
     public RenderedImage read(final long rasterId, final int pyramidLevel, final Rectangle tileRange)
             throws IOException {
         final RenderedImage rasterImage;
 
-        // final Point imageLocation = rasterQueryInfo.getTiledImageSize().getLocation();
-
-        // try {
         rasterImage = getRasterMatchingTileRange(rasterId, pyramidLevel, tileRange);
-        // } catch (IOException e) {
-        // dispose();
-        // throw e;
-        // } catch (RuntimeException e) {
-        // dispose();
-        // throw e;
-        // }
+
         return rasterImage;
     }
 
-    /**
-     * Creates a prepared query for the coverage's table, does not set any constraint nor executes
-     * it.
-     *
-     * @param the
-     *            id of the raster in the raster catalog to retrieve
-     * @param session
-     *            the session to use in querying the ArcSDE server
-     */
-    private SeQuery createAndExecuteSeQuery(final long rasterId, final ISession session)
-            throws IOException {
-        final SeQuery seQuery;
-        final String[] rasterColumns = rasterInfo.getRasterColumns();
-        final String tableName = rasterInfo.getRasterTable();
-
-        final SeSqlConstruct sqlConstruct = new SeSqlConstruct(tableName);
-        /*
-         * Filter by the given raster id
-         */
-        final String rasterIdFilter = rasterColumns[0] + " = " + rasterId;
-        sqlConstruct.setWhere(rasterIdFilter);
-
-        seQuery = session.createAndExecuteQuery(rasterColumns, sqlConstruct);
-
-        return seQuery;
-    }
-
     private RenderedImage getRasterMatchingTileRange(final long rasterId, int pyramidLevel,
             final Rectangle matchingTiles) throws IOException {
 
@@ -234,19 +104,7 @@
          */
 
         fullTilesRaster = createTiledRaster(tileReader, matchingTiles, rasterId);
-
-        /*
-         * REVISIT: This is odd, we need to force the data to be loaded so we're free to release the
-         * stream, which gives away the streamed, tiled nature of this rasters, but I don't see the
-         * GCE api having a very clear usage workflow that ensures close() is always being called to
-         * the underlying ImageInputStream so we could let it close the SeQuery when done.
-         */
-        // try {
-        // LOGGER.info("Forcing loading data for " + rasterInfo.getRasterTable() + "#" + rasterId);
-        // fullTilesRaster.getData();
-        // } catch (RuntimeException e) {
-        // throw new DataSourceException("Error fetching arcsde raster", e);
-        // }
+        
         return fullTilesRaster;
     }
 
@@ -257,7 +115,7 @@
      * @return
      * @throws IOException
      */
-    private RenderedOp createTiledRaster(final TileReader tileReader,
+    private RenderedImage createTiledRaster(final TileReader tileReader,
             final Rectangle matchingTiles, final long rasterId) throws IOException {
         // Prepare temporary colorModel and sample model, needed to build the final
         // ArcSDEPyramidLevel level;
@@ -275,7 +133,7 @@
         }
 
         // Finally, build the image input stream
-        final RawImageInputStream raw;
+        final ImageInputStream raw;
         {
             final long[] imageOffsets = new long[] { 0 };
             final Dimension[] imageDimensions = new Dimension[] { tiledImageSize };
@@ -305,32 +163,47 @@
             int tileGridXOffset = minX;
             int tileGridYOffset = minY;
 
-            imageLayout = new ImageLayout(minX, minY, width, height, tileGridXOffset,
-                    tileGridYOffset, tileWidth, tileHeight, sampleModel, colorModel);
+            // imageLayout = new ImageLayout(minX, minY, width, height, tileGridXOffset,
+            // tileGridYOffset, tileWidth, tileHeight, sampleModel, colorModel);
+            imageLayout = new ImageLayout(0, 0, width, height, 0, 0, tileWidth, tileHeight,
+                    sampleModel, colorModel);
         }
 
         // First operator: read the image
         final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, imageLayout);
-
+        hints.put(JAI.KEY_SERIALIZE_DEEP_COPY, Boolean.TRUE);
+        
         ParameterBlock pb = new ParameterBlock();
         pb.add(raw);// Input
         /*
          * image index, always 0 since we're already fetching the required pyramid level
          */
         pb.add(Integer.valueOf(0)); // Image index
-        pb.add(Boolean.TRUE); // Read metadata
-        pb.add(Boolean.TRUE);// Read thumbnails
-        pb.add(Boolean.TRUE);// Verify input
+        pb.add(Boolean.FALSE); // Read metadata
+        pb.add(Boolean.FALSE);// Read thumbnails
+        pb.add(Boolean.FALSE);// Verify input
         pb.add(null);// Listeners
         pb.add(null);// Locale
         final ImageReadParam rParam = new ImageReadParam();
         pb.add(rParam);// ReadParam
         RawImageReaderSpi imageIOSPI = new RawImageReaderSpi();
         ImageReader readerInstance = imageIOSPI.createReaderInstance();
+        //readerInstance = new ArcSDEImageReader(imageIOSPI);
         pb.add(readerInstance);// Reader
 
-        RenderedOp image = JAI.create("ImageRead", pb, hints);
+        RenderedImage image = JAI.create("ImageRead", pb, hints);
 
+//        // translate
+//        int minX = (matchingTiles.x * tileWidth);
+//        int minY = (matchingTiles.y * tileHeight);
+//        pb = new ParameterBlock();
+//        pb.addSource(image);
+//        pb.add(Float.valueOf(minX));
+//        pb.add(Float.valueOf(minY));
+//        pb.add(null);
+//
+//        image = JAI.create("translate", pb);
+
         return image;
     }
 

Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java
===================================================================
--- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java 2009-10-28 17:58:46 UTC (rev 34276)
+++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java 2009-10-29 14:10:52 UTC (rev 34277)
@@ -363,10 +363,13 @@
         /*
          * Obtain the ISession this tile reader will work with until exhausted
          */
-
-        final boolean transactional = false;
         try {
+            // lets share connections as we're going to do read only operations
+            final boolean transactional = false;
             this.session = sessionPool.getSession(transactional);
+            System.err.println("----> Using " + session + " to read raster #" + rasterId
+                    + " on Thread " + Thread.currentThread().getName() + ". Tile set: "
+                    + requestedTiles);
             if (LOGGER.isLoggable(Level.FINER)) {
                 LOGGER.finer("Using " + session + " to read raster #" + rasterId + " on Thread "
                         + Thread.currentThread().getName() + ". Tile set: " + requestedTiles);
@@ -426,9 +429,15 @@
                 noData.setAll(bandId, tileData);
             } else if (pixelsPerTile == numPixels) {
 
+                // try {
+                // tile.getPixels(tileData);
+                // } catch (Exception e) {
+                // e.printStackTrace();
+                // throw new RuntimeException(e);
+                // }
+
                 final byte[] rawTileData = tile.getPixelData();
-                //System.out.println("got raw tile data " + rawTileData);
-                
+
                 System.arraycopy(rawTileData, 0, tileData, 0, tileDataLength);
 
                 if (bitMaskData.length > 0) {
@@ -482,13 +491,15 @@
      */
     public void dispose() {
         if (session != null) {
+            System.err.println("TileReader disposing " + session + " on Thread "
+                    + Thread.currentThread().getName());
             if (LOGGER.isLoggable(Level.FINER)) {
                 LOGGER.finer("TileReader disposing " + session + " on Thread "
                         + Thread.currentThread().getName());
             }
             try {
                 session.close(this.preparedQuery);
-            } catch (Exception e) {
+            } catch (Exception e) {
                 LOGGER.log(Level.WARNING, "Closing tile reader's prepared Query", e);
             }
             session.dispose();

Modified: trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAILegacyOnlineTest.java
===================================================================
--- trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAILegacyOnlineTest.java 2009-10-28 17:58:46 UTC (rev 34276)
+++ trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAILegacyOnlineTest.java 2009-10-29 14:10:52 UTC (rev 34277)
@@ -7,7 +7,11 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.awt.Graphics;
+import java.awt.Graphics2D;
 import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.IndexColorModel;
 import java.awt.image.RenderedImage;
@@ -30,7 +34,6 @@
 import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
 import org.geotools.coverage.grid.io.AbstractGridFormat;
 import org.geotools.coverage.grid.io.OverviewPolicy;
-import org.geotools.data.DataSourceException;
 import org.geotools.gce.geotiff.GeoTiffWriter;
 import org.geotools.geometry.Envelope2D;
 import org.geotools.geometry.GeneralEnvelope;
@@ -118,30 +121,51 @@
         final AbstractGridCoverage2DReader reader = getReader();
         assertNotNull("Couldn't obtain a reader for " + tableName, reader);
 
+        // http://localhost:8080/geoserver/wms?WIDTH=256&LAYERS=sde%3AIMG_USGSQUAD_SGBASE&STYLES=&SRS=EPSG%3A26986&HEIGHT=256&FORMAT=image%2Fjpeg&TILED=true&TILESORIGIN=169118.35%2C874964.388&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=239038.74625,916916.62575,253022.8255,930900.705
+
         final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
-        final GridEnvelope originalGridRange = reader.getOriginalGridRange();
 
-        final int reqWidth = originalGridRange.getSpan(0) / 50;
-        final int reqHeight = originalGridRange.getSpan(1) / 50;
+        final int reqWidth = 256;
+        final int reqHeight = 256;
 
-        GeneralEnvelope reqEnvelope = new GeneralEnvelope(originalEnvelope
-                .getCoordinateReferenceSystem());
-        double deltaX = originalEnvelope.getSpan(0) / 1;
-        double deltaY = originalEnvelope.getSpan(1) / 1;
+        GeneralEnvelope reqEnvelope = new GeneralEnvelope(originalEnvelope);
+        reqEnvelope.setEnvelope(239038.74625, 916916.62575, 253022.8255, 930900.705);
 
-        double minx = originalEnvelope.getMedian(0) - deltaX;
-        double miny = originalEnvelope.getMedian(1) - deltaY;
-        double maxx = minx + 2 * deltaX;
-        double maxy = miny + 2 * deltaY;
-        reqEnvelope.setEnvelope(minx, miny, maxx, maxy);
+        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
+        assertNotNull("read coverage returned null", coverage);
 
-        assertTrue(originalEnvelope.intersects(reqEnvelope, true));
+        RenderedImage image = coverage.getRenderedImage();
+        writeToDisk(image, "testRead_" + tableName);
 
-        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, reqEnvelope);
+        BufferedImage bi = new BufferedImage(256, 256, BufferedImage.TYPE_4BYTE_ABGR);
+        Graphics2D g = bi.createGraphics();
+        double sx = image.getWidth() / bi.getWidth();
+        double sy = image.getHeight() / bi.getHeight();
+        AffineTransform xform = AffineTransform.getScaleInstance(sx, sy);
+        g.drawRenderedImage(image, xform);
+        
+        writeToDisk(bi, "testRead_" + tableName + "_renderedToBI");
+    }
+
+    @Test
+    public void testIMG_USGSQUAD_SGBASE2() throws Exception {
+        tableName = "SDE.RASTER.IMG_USGSQUAD_SGBASE";
+        final AbstractGridCoverage2DReader reader = getReader();
+        assertNotNull("Couldn't obtain a reader for " + tableName, reader);
+
+        // http://localhost:8080/geoserver/wms?WIDTH=256&LAYERS=sde%3AIMG_USGSQUAD_SGBASE&STYLES=&SRS=EPSG%3A26986&HEIGHT=256&FORMAT=image%2Fjpeg&TILED=true&TILESORIGIN=169118.35%2C874964.388&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&BBOX=239038.74625,916916.62575,253022.8255,930900.705
+
+        final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
+        final GridEnvelope originalGridRange = reader.getOriginalGridRange();
+
+        final int reqWidth = originalGridRange.getSpan(0) / 30;
+        final int reqHeight = originalGridRange.getSpan(1) / 30;
+
+        final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, originalEnvelope);
         assertNotNull("read coverage returned null", coverage);
 
         RenderedImage image = coverage.getRenderedImage();
-        writeToDisk(coverage, "testRead_" + tableName);
+        writeToDisk(image, "testRead_" + tableName);
     }
 
     @Test
@@ -168,7 +192,7 @@
         writeToDisk(coverage, "testRead_" + tableName);
 
         RenderedImage image = coverage.view(ViewType.RENDERED).getRenderedImage();
-        //writeToDisk(image, tableName);
+        // writeToDisk(image, tableName);
     }
 
     @Test
@@ -186,8 +210,8 @@
         final GridCoverage2D coverage = readCoverage(reader, reqWidth, reqHeight, originalEnvelope);
         assertNotNull("read coverage returned null", coverage);
 
-        // RenderedImage image = coverage.getRenderedImage();
-        //writeToDisk(coverage, "testRead_" + tableName);
+        RenderedImage image = coverage.getRenderedImage();
+        writeToDisk(image, "testRead_" + tableName);
     }
 
     @Test
@@ -220,7 +244,7 @@
         System.out.println("result envelope   : " + envelope2D);
 
         // RenderedImage image = coverage.getRenderedImage();
-        //writeToDisk(coverage, "testRead_" + tableName);
+        // writeToDisk(coverage, "testRead_" + tableName);
 
         RenderedImage image = coverage.view(ViewType.RENDERED).getRenderedImage();
         writeToDisk(image, tableName);
@@ -263,7 +287,7 @@
 
         System.out.println("result envelope   : " + envelope2D);
 
-       // writeToDisk(coverage, "testRead_" + tableName);
+        // writeToDisk(coverage, "testRead_" + tableName);
     }
 
     @Test
@@ -276,8 +300,8 @@
         final GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope();
         GridEnvelope originalGridRange = reader.getOriginalGridRange();
 
-        final int reqWidth = 800;// originalGridRange.getSpan(0) / 8;
-        final int reqHeight = 595;// originalGridRange.getSpan(1) / 8;
+        final int reqWidth = 100;// 800;// originalGridRange.getSpan(0) / 8;
+        final int reqHeight = 75;// 595;// originalGridRange.getSpan(1) / 8;
 
         GeneralEnvelope reqEnvelope = new GeneralEnvelope(new double[] { 274059, 837434 },
                 new double[] { 355782, 898216 });
@@ -374,7 +398,7 @@
         System.out.println("result envelope   : " + envelope2D);
 
         // RenderedImage image = coverage.getRenderedImage();
-       // writeToDisk(coverage, "testRead_" + tableName);
+        // writeToDisk(coverage, "testRead_" + tableName);
     }
 
     private void writeToDisk(GridCoverage2D coverage, String fileName) throws Exception {
@@ -484,10 +508,10 @@
         System.out.println("result envelope   : " + envelope2D);
 
         // RenderedImage image = coverage.getRenderedImage();
-       // writeToDisk(coverage, "testRead_" + tableName);
+        // writeToDisk(coverage, "testRead_" + tableName);
 
         RenderedImage image = coverage.view(ViewType.RENDERED).getRenderedImage();
-       // writeToDisk(image, tableName);
+        // writeToDisk(image, tableName);
 
         // writeBand(image, new int[] { 0 }, "band1");
     }


------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
GeoTools-commits mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/geotools-commits