|
|
|
svn_geotools
|
Author: groldan
Date: 2009-10-23 13:40:52 -0400 (Fri, 23 Oct 2009) New Revision: 34203 Added: trunk/modules/plugin/arcsde/datastore/src/main/resources/org/ trunk/modules/plugin/arcsde/datastore/src/main/resources/org/geotools/ trunk/modules/plugin/arcsde/datastore/src/main/resources/org/geotools/arcsde/ trunk/modules/plugin/arcsde/datastore/src/main/resources/org/geotools/arcsde/gce/ trunk/modules/plugin/arcsde/datastore/src/main/resources/org/geotools/arcsde/gce/org.geotools.arcsde.gce.ucls 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/BitmaskToNoDataConverter.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/main/java/org/geotools/arcsde/gce/PromotingTileReader.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterDatasetInfo.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterQueryInfo.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterReaderFactory.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/TileReaderFactory.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/TiledRasterReader.java trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAILegacyOnlineTest.java Log: GEOT-2616 deferred loading 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-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -17,6 +17,7 @@ */ package org.geotools.arcsde.gce; +import java.awt.Dimension; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.image.BufferedImage; @@ -40,8 +41,10 @@ import javax.imageio.ImageIO; import javax.imageio.ImageTypeSpecifier; +import javax.media.jai.ImageLayout; import javax.media.jai.InterpolationNearest; import javax.media.jai.JAI; +import javax.media.jai.ParameterBlockJAI; import javax.media.jai.operator.FormatDescriptor; import javax.media.jai.operator.MosaicDescriptor; @@ -68,7 +71,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/ArcSDEGridCoverage2DReaderJAI.java $ */ @SuppressWarnings( { "deprecation", "nls" }) final class ArcSDEGridCoverage2DReaderJAI extends AbstractGridCoverage2DReader { @@ -211,17 +216,12 @@ /* * Gather the rendered images for each of the rasters that match the requested envelope */ - final Map<Long, RasterQueryInfo> byRasterIdQueries = new HashMap<Long, RasterQueryInfo>(); - for (RasterQueryInfo queryInfo : queries) { - byRasterIdQueries.put(queryInfo.getRasterId(), queryInfo); - } - final TiledRasterReader rasterReader = rasterReaderFactory.create(rasterInfo); try { - readAllTiledRasters(byRasterIdQueries, rasterReader, log); + readAllTiledRasters(queries, rasterReader, log); } finally { - //rasterReader.dispose(); + // rasterReader.dispose(); } log.log(LoggingHelper.REQ_ENV); @@ -229,7 +229,7 @@ log.log(LoggingHelper.MOSAIC_ENV); log.log(LoggingHelper.MOSAIC_EXPECTED); - final RenderedImage coverageRaster = createMosaic(queries, log); + final RenderedImage coverageRaster = createMosaic(queries, mosaicGeometry, log); assert mosaicGeometry.getWidth() == coverageRaster.getWidth(); assert mosaicGeometry.getHeight() == coverageRaster.getHeight(); @@ -273,23 +273,20 @@ return bands; } - private void readAllTiledRasters(final Map<Long, RasterQueryInfo> byRasterIdQueries, + private void readAllTiledRasters(final List<RasterQueryInfo> queries, final TiledRasterReader rasterReader, final LoggingHelper log) throws IOException { - Long currentRasterId; + for (RasterQueryInfo queryInfo : queries) { - while ((currentRasterId = rasterReader.nextRaster()) != null) { - if (!byRasterIdQueries.containsKey(currentRasterId)) { - continue; - } - final RasterQueryInfo queryInfo = byRasterIdQueries.get(currentRasterId); + final Long rasterId = queryInfo.getRasterId(); + final RenderedImage rasterImage; try { final int pyramidLevel = queryInfo.getPyramidLevel(); final Rectangle matchingTiles = queryInfo.getMatchingTiles(); // final Point imageLocation = queryInfo.getTiledImageSize().getLocation(); - rasterImage = rasterReader.read(pyramidLevel, matchingTiles); + rasterImage = rasterReader.read(rasterId, pyramidLevel, matchingTiles); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Fetching data for " + queryInfo.toString(), e); throw e; @@ -384,11 +381,13 @@ * For each raster: crop->scale->translate->add to mosaic * * @param queries + * @param mosaicGeometry * @return * @throws IOException */ - private RenderedImage createMosaic(final List<RasterQueryInfo> queries, final LoggingHelper log) - throws IOException { + private RenderedImage createMosaic(final List<RasterQueryInfo> queries, + final Rectangle mosaicGeometry, final LoggingHelper log) throws IOException { + List<RenderedImage> transformed = new ArrayList<RenderedImage>(queries.size()); /* @@ -478,22 +477,50 @@ */ mosaic = transformed.get(0); } else { - ParameterBlock mosaicParams = new ParameterBlock(); + // 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 + */ + ParameterBlockJAI mosaicParams = new ParameterBlockJAI("Mosaic"); + // TODO: set background values to raster's no-data + // mosaicParams.setParameter("backgroundValues",backgroundValues); + + mosaicParams.setParameter("mosaicType", MosaicDescriptor.MOSAIC_TYPE_OVERLAY); + + 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 RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout); + 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); + mosaic = JAI.create("Mosaic", mosaicParams, hints); log.log(mosaic, 0L, "05_mosaic_result"); } return mosaic; 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-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -129,11 +129,11 @@ final ArcSDEConnectionConfig connectionConfig = getConnectionConfig(coverageUrl); - ISessionPool sessionPool = setupConnectionPool(connectionConfig); + final ISessionPool sessionPool = setupConnectionPool(connectionConfig); - RasterDatasetInfo rasterInfo = getRasterInfo(coverageUrl, sessionPool); + final RasterDatasetInfo rasterInfo = getRasterInfo(coverageUrl, sessionPool); - RasterReaderFactory rasterReaderFactory = new RasterReaderFactory(sessionPool); + final RasterReaderFactory rasterReaderFactory = new RasterReaderFactory(sessionPool); return new ArcSDEGridCoverage2DReaderJAI(this, rasterReaderFactory, rasterInfo, hints); } catch (IOException dse) { Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java 2009-10-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -87,8 +87,9 @@ * @return */ public static BitmaskToNoDataConverter getInstance(final RasterDatasetInfo rasterInfo, - final int rasterIndex) { + final long rasterId) { + final int rasterIndex = rasterInfo.getRasterIndex(rasterId); final int numBands = rasterInfo.getNumBands(); final RasterCellType targetType = rasterInfo.getTargetCellType(rasterIndex); 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-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -24,7 +24,6 @@ import java.awt.image.SampleModel; import java.awt.image.renderable.ParameterBlock; import java.io.IOException; -import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageReadParam; @@ -35,18 +34,16 @@ import javax.media.jai.JAI; import javax.media.jai.RenderedOp; -import org.geotools.arcsde.ArcSdeException; 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.SeRaster; import com.esri.sde.sdk.client.SeRasterAttr; -import com.esri.sde.sdk.client.SeRasterConstraint; import com.esri.sde.sdk.client.SeRow; import com.esri.sde.sdk.client.SeSqlConstruct; import com.sun.media.imageio.stream.RawImageInputStream; @@ -67,15 +64,13 @@ private static final Logger LOGGER = Logging.getLogger("org.geotools.arcsde.gce"); - private ISession session; - private RasterDatasetInfo rasterInfo; - private final SeQuery preparedQuery; + // private final SeQuery preparedQuery; - private Long rasterId; + // private final FetchRasterCommand fetchCommand; - private final FetchRasterCommand fetchCommand; + private final ISessionPool sessionPool; /** * @see DefaultTiledRasterReader#nextRaster() @@ -122,98 +117,114 @@ * <p> * </p> * - * @param conn + * @param sessionPool + * where to grab sessions from to query the rasters described by {@code rasterInfo} * @param rasterInfo * @throws IOException */ - public DefaultTiledRasterReader(final ISession conn, final RasterDatasetInfo rasterInfo) - throws IOException { - this.session = conn; + public DefaultTiledRasterReader(final ISessionPool sessionPool, + 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); + // } - 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); + // 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; - } + // 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; - } - } + // 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(int, java.awt.Rectangle) + * @see org.geotools.arcsde.gce.TiledRasterReader#read */ - public RenderedImage read(final int pyramidLevel, final Rectangle tileRange) throws IOException { + 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(pyramidLevel, tileRange); - } catch (IOException e) { - dispose(); - throw e; - } catch (RuntimeException e) { - dispose(); - throw e; - } + // 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 ISession session) throws IOException { + private SeQuery createAndExecuteSeQuery(final long rasterId, final ISession session) + throws IOException { final SeQuery seQuery; final String[] rasterColumns = rasterInfo.getRasterColumns(); final String tableName = rasterInfo.getRasterTable(); - seQuery = session.createAndExecuteQuery(rasterColumns, new SeSqlConstruct(tableName)); + 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(int pyramidLevel, final Rectangle matchingTiles) - throws IOException { + private RenderedImage getRasterMatchingTileRange(final long rasterId, int pyramidLevel, + final Rectangle matchingTiles) throws IOException { - /* - * Create the prepared query (not executed) stream to fetch the tiles from - */ + final TileReader tileReader; + tileReader = TileReaderFactory.getInstance(sessionPool, rasterInfo, rasterId, pyramidLevel, + matchingTiles); // covers an area of full tiles final RenderedImage fullTilesRaster; @@ -222,7 +233,7 @@ * Create the tiled raster covering the full area of the matching tiles */ - fullTilesRaster = createTiledRaster(pyramidLevel, matchingTiles); + 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 @@ -240,79 +251,14 @@ } /** - * - * @param pyramidLevel + * @param tileReader * @param matchingTiles + * @param rasterId * @return * @throws IOException */ - private RenderedOp createTiledRaster(final int pyramidLevel, final Rectangle matchingTiles) - throws IOException { - - final int rasterIndex = rasterInfo.getRasterIndex(rasterId); - final SeRasterAttr rAttr = fetchCommand.getRasterAttribute(); - - final int tileWidth; - final int tileHeight; - final SeRasterConstraint rConstraint; - try { - final int numberOfBands; - numberOfBands = rAttr.getNumBands(); - tileWidth = rAttr.getTileWidth(); - tileHeight = rAttr.getTileHeight(); - - int[] bandsToQuery = new int[numberOfBands]; - for (int bandN = 1; bandN <= numberOfBands; bandN++) { - bandsToQuery[bandN - 1] = bandN; - } - - int minTileX = matchingTiles.x; - int minTileY = matchingTiles.y; - int maxTileX = minTileX + matchingTiles.width - 1; - int maxTileY = minTileY + matchingTiles.height - 1; - if (LOGGER.isLoggable(Level.FINE)) { - LOGGER.fine("Requesting tiles [x=" + minTileX + "-" + maxTileX + ", y=" + minTileY - + "-" + maxTileY + "] from tile range [x=0-" - + (rAttr.getTilesPerRowByLevel(pyramidLevel) - 1) + ", y=0-" - + (rAttr.getTilesPerColByLevel(pyramidLevel) - 1) + "]"); - } - // SDEPoint tileOrigin = rAttr.getTileOrigin(); - - if (LOGGER.isLoggable(Level.FINE)) { - Rectangle tiledImageSize = new Rectangle(0, 0, tileWidth * matchingTiles.width, - tileHeight * matchingTiles.height); - - LOGGER.fine("Tiled image size: " + tiledImageSize); - } - - final int interleaveType = SeRaster.SE_RASTER_INTERLEAVE_BIP; - - rConstraint = new SeRasterConstraint(); - rConstraint.setBands(bandsToQuery); - rConstraint.setLevel(pyramidLevel); - rConstraint.setEnvelope(minTileX, minTileY, maxTileX, maxTileY); - rConstraint.setInterleave(interleaveType); - } catch (SeException se) { - throw new ArcSdeException(se); - } - - session.issue(new Command<Void>() { - @Override - public Void execute(ISession session, SeConnection connection) throws SeException, - IOException { - preparedQuery.queryRasterTile(rConstraint); - return null; - } - }); - - final TileReader tileReader; - { - final Dimension tileSize = new Dimension(tileWidth, tileHeight); - final SeRow row = fetchCommand.getSeRow(); - tileReader = TileReaderFactory.getInstance(session, preparedQuery, row, rasterInfo, rasterIndex, - matchingTiles, tileSize); - } - + private RenderedOp 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; final Dimension tiledImageSize; @@ -323,7 +269,7 @@ final int tiledImageHeight = tileReader.getTilesHigh() * tileReader.getTileHeight(); tiledImageSize = new Dimension(tiledImageWidth, tiledImageHeight); - final ImageTypeSpecifier fullImageSpec = rasterInfo.getRenderedImageSpec(rasterIndex); + final ImageTypeSpecifier fullImageSpec = rasterInfo.getRenderedImageSpec(rasterId); colorModel = fullImageSpec.getColorModel(); sampleModel = fullImageSpec.getSampleModel(tiledImageWidth, tiledImageHeight); } @@ -342,6 +288,9 @@ raw = new RawImageInputStream(tiledImageInputStream, its, imageOffsets, imageDimensions); } + final int tileWidth = tileReader.getTileWidth(); + final int tileHeight = tileReader.getTileHeight(); + // building the final image layout final ImageLayout imageLayout; { 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-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -24,15 +24,22 @@ import java.util.logging.Level; import java.util.logging.Logger; +import org.geotools.arcsde.ArcSdeException; import org.geotools.arcsde.session.Command; import org.geotools.arcsde.session.ISession; +import org.geotools.arcsde.session.ISessionPool; +import org.geotools.arcsde.session.UnavailableConnectionException; 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.SeRaster; +import com.esri.sde.sdk.client.SeRasterConstraint; import com.esri.sde.sdk.client.SeRasterTile; import com.esri.sde.sdk.client.SeRow; +import com.esri.sde.sdk.client.SeSqlConstruct; +import com.esri.sde.sdk.client.SeStreamOp; /** * Offers an iterator like interface to fetch ArcSDE raster tiles. @@ -49,17 +56,26 @@ private static final Logger LOGGER = Logging.getLogger("org.geotools.arcsde.gce"); - private final int bitsPerSample; + private final RasterDatasetInfo rasterInfo; + private final long rasterId; + + private final int pyramidLevel; + private final Rectangle requestedTiles; - private final Dimension tileSize; + private final ISessionPool sessionPool; - private final int tileDataLength; + private ISession session; - private final int pixelsPerTile; + private TileFetchCommand tileFetchCommand; - private final int numberOfBands; + /** + * {@link SeStreamOp} held to be closed at {@link #dispose()} + * + * @see #execute() + */ + private SeQuery preparedQuery; private SeRasterTile nextTile; @@ -69,12 +85,15 @@ private final BitmaskToNoDataConverter noData; - private ISession session; + private final int pixelsPerTile; - private final TileFetchCommand tileFetchCommand; + private final int tileDataLength; - private final SeQuery preparedQuery; + private int bitsPerSample; + /** + * Command to fetch an {@link SeRasterTile tile} + */ private static class TileFetchCommand extends Command<SeRasterTile> { private final SeRow row; @@ -92,6 +111,85 @@ } /** + * @see DefaultTiledRasterReader#nextRaster() + */ + private static class QueryRasterCommand extends Command<Void> { + + private SeQuery preparedQuery; + + private SeRow row; + + private final SeRasterConstraint rasterConstraint; + + private final String rasterColumn; + + private final String rasterTable; + + private final long rasterId; + + /** + * + * @param rConstraint + * indicates which bands, pyramid level and grid envelope to query + * @param rasterTable + * indicates which raster table to query + * @param rasterColumn + * indicates what raster column in the raster table to query + * @param rasterId + * indicates which raster in the raster catalog to query + */ + public QueryRasterCommand(final SeRasterConstraint rConstraint, final String rasterTable, + final String rasterColumn, final long rasterId) { + this.rasterConstraint = rConstraint; + this.rasterTable = rasterTable; + this.rasterColumn = rasterColumn; + this.rasterId = rasterId; + } + + @Override + public Void execute(ISession session, SeConnection connection) throws SeException, + IOException { + + final SeSqlConstruct sqlConstruct = new SeSqlConstruct(rasterTable); + /* + * Filter by the given raster id + */ + final String rasterIdFilter = rasterColumn + " = " + rasterId; + sqlConstruct.setWhere(rasterIdFilter); + + final String[] rasterColumns = { rasterColumn }; + preparedQuery = new SeQuery(connection, rasterColumns, sqlConstruct); + preparedQuery.prepareQuery(); + preparedQuery.execute(); + + this.row = preparedQuery.fetch(); + if (row == null) { + return null; + } + + preparedQuery.queryRasterTile(rasterConstraint); + + return null; + } + + public SeQuery getPreparedQuery() { + return preparedQuery; + } + + public SeRow getSeRow() { + return row; + } + } + + /** + * Creates a {@link TileReader} that reads tiles out of ArcSDE for the given {@code + * preparedQuery} and {@code SeRow} using the given {@code session}, in the native raster + * format. + * <p> + * As for any object that receives a {@link ISession session}, the same rule applies: this class + * is not responsible of {@link ISession#dispose() disposing} the session, but the calling code + * is. + * </p> * * @param preparedQuery * the query stream to close when done @@ -104,21 +202,25 @@ * @param numberOfBands2 * @param requestedTiles */ - NativeTileReader(final ISession session, final SeQuery preparedQuery, final SeRow row, - final int bitsPerSample, int numberOfBands, final Rectangle requestedTiles, - Dimension tileSize, final BitmaskToNoDataConverter noData) { - this.session = session; - this.preparedQuery = preparedQuery; - this.tileFetchCommand = new TileFetchCommand(row); - this.bitsPerSample = bitsPerSample; - this.numberOfBands = numberOfBands; + NativeTileReader(final ISessionPool sessionPool, final RasterDatasetInfo rasterInfo, + final long rasterId, final int pyramidLevel, final Rectangle requestedTiles, + final BitmaskToNoDataConverter noData) { + this.sessionPool = sessionPool; + this.rasterInfo = rasterInfo; + this.rasterId = rasterId; + this.pyramidLevel = pyramidLevel; this.requestedTiles = requestedTiles; - this.tileSize = tileSize; + this.noData = noData; + + final Dimension tileSize = rasterInfo.getTileDimension(rasterId); + this.pixelsPerTile = tileSize.width * tileSize.height; + + final RasterCellType nativeCellType = rasterInfo.getNativeCellType(); + this.bitsPerSample = nativeCellType.getBitsPerSample(); this.tileDataLength = (int) Math .ceil(((double) pixelsPerTile * (double) bitsPerSample) / 8D); this.bitmaskDataLength = (int) Math.ceil(pixelsPerTile / 8D); - this.noData = noData; } /** @@ -139,21 +241,21 @@ * @see org.geotools.arcsde.gce.TileReader#getNumberOfBands() */ public int getNumberOfBands() { - return numberOfBands; + return rasterInfo.getNumBands(); } /** * @see org.geotools.arcsde.gce.TileReader#getTileWidth() */ public int getTileWidth() { - return tileSize.width; + return rasterInfo.getTileWidth(rasterId); } /** * @see org.geotools.arcsde.gce.TileReader#getTileHeight() */ public int getTileHeight() { - return tileSize.height; + return rasterInfo.getTileHeight(rasterId); } /** @@ -182,6 +284,7 @@ */ public boolean hasNext() throws IOException { if (!started) { + execute(); try { nextTile = session.issue(tileFetchCommand); } catch (IOException e) { @@ -201,6 +304,92 @@ } /** + * Creates and executes the {@link SeQuery} that's used to fetch the required tiles from the + * specified raster, and stores (as member variables) the {@link SeRow} to fetch the tiles from + * and the {@link SeQuery} to be closed at the TileReader's disposal + * + * @throws IOException + */ + private void execute() throws IOException { + + final int rasterIndex = rasterInfo.getRasterIndex(rasterId); + final int tileWidth = rasterInfo.getTileWidth(rasterId); + final int tileHeight = rasterInfo.getTileHeight(rasterId); + + /* + * Create the raster constraint to query the needed tiles out of the specified raster at the + * given pyramid level + */ + final SeRasterConstraint rConstraint; + try { + final int numberOfBands; + numberOfBands = rasterInfo.getNumBands(); + + int[] bandsToQuery = new int[numberOfBands]; + for (int bandN = 1; bandN <= numberOfBands; bandN++) { + bandsToQuery[bandN - 1] = bandN; + } + + int minTileX = requestedTiles.x; + int minTileY = requestedTiles.y; + int maxTileX = minTileX + requestedTiles.width - 1; + int maxTileY = minTileY + requestedTiles.height - 1; + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.fine("Requesting tiles [x=" + minTileX + "-" + maxTileX + ", y=" + minTileY + + "-" + maxTileY + "] from tile range [x=0-" + + (rasterInfo.getNumTilesWide(rasterIndex, pyramidLevel) - 1) + ", y=0-" + + (rasterInfo.getNumTilesHigh(rasterIndex, pyramidLevel) - 1) + "]"); + } + // SDEPoint tileOrigin = rAttr.getTileOrigin(); + + if (LOGGER.isLoggable(Level.FINE)) { + Rectangle tiledImageSize = new Rectangle(0, 0, tileWidth * requestedTiles.width, + tileHeight * requestedTiles.height); + + LOGGER.fine("Tiled image size: " + tiledImageSize); + } + + final int interleaveType = SeRaster.SE_RASTER_INTERLEAVE_BIP; + + rConstraint = new SeRasterConstraint(); + rConstraint.setBands(bandsToQuery); + rConstraint.setLevel(pyramidLevel); + rConstraint.setEnvelope(minTileX, minTileY, maxTileX, maxTileY); + rConstraint.setInterleave(interleaveType); + } catch (SeException se) { + throw new ArcSdeException(se); + } + + /* + * Obtain the ISession this tile reader will work with until exhausted + */ + + final boolean transactional = false; + try { + this.session = sessionPool.getSession(transactional); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.finer("Using " + session + " to read raster #" + rasterId + " on Thread " + + Thread.currentThread().getName() + ". Tile set: " + requestedTiles); + } + } catch (UnavailableConnectionException e) { + // really bad luck.. + throw new RuntimeException(e); + } + + final String rasterTable = rasterInfo.getRasterTable(); + final String rasterColumn = rasterInfo.getRasterColumns()[0]; + final QueryRasterCommand queryCommand = new QueryRasterCommand(rConstraint, rasterTable, + rasterColumn, rasterId); + + session.issue(queryCommand); + + final SeRow row = queryCommand.getSeRow(); + + this.tileFetchCommand = new TileFetchCommand(row); + this.preparedQuery = queryCommand.getPreparedQuery(); + } + + /** * @see org.geotools.arcsde.gce.TileReader#next(byte[]) */ public TileInfo next(byte[] tileData) throws IOException { @@ -210,53 +399,58 @@ } final SeRasterTile tile; - - if (hasNext()) { + final boolean hasNext = hasNext(); + if (hasNext) { tile = nextTile(); } else { throw new IllegalStateException("There're no more tiles to fetch"); } - final byte[] bitMaskData = tile.getBitMaskData(); + try { + final byte[] bitMaskData = tile.getBitMaskData(); - if (LOGGER.isLoggable(Level.FINEST)) { - LOGGER.finest(" >> Fetching " + tile + " - bitmask: " + bitMaskData.length - + " has more: " + hasNext()); - } + if (LOGGER.isLoggable(Level.FINEST)) { + LOGGER.finest(" >> Fetching " + tile + " - bitmask: " + bitMaskData.length); + } - assert bitMaskData.length == 0 ? true : bitmaskDataLength == bitMaskData.length; + assert bitMaskData.length == 0 ? true : bitmaskDataLength == bitMaskData.length; - final int numPixels = tile.getNumPixels(); + final int numPixels = tile.getNumPixels(); - final Long bandId = Long.valueOf(tile.getBandId().longValue()); + final Long bandId = Long.valueOf(tile.getBandId().longValue()); - if (0 == numPixels) { - if (LOGGER.isLoggable(Level.FINER)) { - LOGGER.finer("tile contains no pixel data, skipping: " + tile); - } - noData.setAll(bandId, tileData); - } else if (pixelsPerTile == numPixels) { + if (0 == numPixels) { + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.finer("tile contains no pixel data, skipping: " + tile); + } + noData.setAll(bandId, tileData); + } else if (pixelsPerTile == numPixels) { - final byte[] rawTileData = tile.getPixelData(); + final byte[] rawTileData = tile.getPixelData(); + //System.out.println("got raw tile data " + rawTileData); + + System.arraycopy(rawTileData, 0, tileData, 0, tileDataLength); - System.arraycopy(rawTileData, 0, tileData, 0, tileDataLength); + if (bitMaskData.length > 0) { + noData.setNoData(bandId, tileData, bitMaskData); + } - if (bitMaskData.length > 0) { - noData.setNoData(bandId, tileData, bitMaskData); + if (LOGGER.isLoggable(Level.FINEST)) { + LOGGER.finest("returning " + numPixels + " pixels data packaged into " + + tileDataLength + " bytes for tile [" + tile.getColumnIndex() + "," + + tile.getRowIndex() + "]"); + } + } else { + throw new IllegalStateException("Expected pixels per tile == " + pixelsPerTile + + " but got " + numPixels + ": " + tile); } - if (LOGGER.isLoggable(Level.FINEST)) { - LOGGER.finest("returning " + numPixels + " pixels data packaged into " - + tileDataLength + " bytes for tile [" + tile.getColumnIndex() + "," - + tile.getRowIndex() + "]"); - } - } else { + return new TileInfo(bandId, bitMaskData, numPixels); + + } catch (RuntimeException e) { dispose(); - throw new IllegalStateException("Expected pixels per tile == " + pixelsPerTile - + " but got " + numPixels + ": " + tile); + throw e; } - - return new TileInfo(bandId, bitMaskData, numPixels); } private SeRasterTile nextTile() throws IOException { @@ -288,9 +482,13 @@ */ public void dispose() { if (session != null) { + 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/main/java/org/geotools/arcsde/gce/PromotingTileReader.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java 2009-10-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -103,26 +103,31 @@ public TileInfo next(byte[] tileData) throws IOException { final TileInfo tileInfo = nativeReader.next(nativeTileData); - final byte[] bitmaskData = tileInfo.getBitmaskData(); - final boolean hasNoDataPixels = bitmaskData.length > 0; - final Long bandId = tileInfo.getBandId(); + try { + final byte[] bitmaskData = tileInfo.getBitmaskData(); + final boolean hasNoDataPixels = bitmaskData.length > 0; + final Long bandId = tileInfo.getBandId(); - final int numPixelsRead = tileInfo.getNumPixelsRead(); - if (numPixelsRead == 0) { - noData.setAll(bandId, tileData); - } else { - final int numSamples = getPixelsPerTile(); - assert numPixelsRead == numSamples; + final int numPixelsRead = tileInfo.getNumPixelsRead(); + if (numPixelsRead == 0) { + noData.setAll(bandId, tileData); + } else { + final int numSamples = getPixelsPerTile(); + assert numPixelsRead == numSamples; - for (int sampleN = 0; sampleN < numSamples; sampleN++) { - if (hasNoDataPixels && noData.isNoData(sampleN, bitmaskData)) { - noData.setNoData(bandId, sampleN, tileData); - } else { - promoter.promote(sampleN, nativeTileData, tileData); + for (int sampleN = 0; sampleN < numSamples; sampleN++) { + if (hasNoDataPixels && noData.isNoData(sampleN, bitmaskData)) { + noData.setNoData(bandId, sampleN, tileData); + } else { + promoter.promote(sampleN, nativeTileData, tileData); + } } } + + } catch (RuntimeException e) { + dispose(); + throw e; } - return tileInfo; } Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterDatasetInfo.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterDatasetInfo.java 2009-10-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterDatasetInfo.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -59,7 +59,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/RasterDatasetInfo.java $ */ @SuppressWarnings( { "nls" }) final class RasterDatasetInfo { @@ -196,7 +198,7 @@ * Category[] { valuesCat, nodataCat, catMin, catMax, catMean, catStdDev }; } else { * categories = new Category[] { valuesCat, nodataCat }; } */ - + // .geophysics(false) because our sample model always corresponds to the packed view // (whether it matches the underlying sample depth or we're promoting in order to make // room for the nodata value). @@ -368,6 +370,20 @@ return level.getNumTilesHigh(); } + public int getTileWidth(final long rasterId) { + return getTileDimension(rasterId).width; + } + + public int getTileHeight(final long rasterId) { + return getTileDimension(rasterId).height; + } + + public Dimension getTileDimension(final long rasterId) { + final int rasterIndex = getRasterIndex(rasterId); + final RasterInfo rasterInfo = getRasterInfo(rasterIndex); + return rasterInfo.getTileDimension(); + } + public Dimension getTileDimension(int rasterIndex) { RasterInfo rasterInfo = getRasterInfo(rasterIndex); return rasterInfo.getTileDimension(); @@ -384,6 +400,11 @@ return rasterInfo; } + public ImageTypeSpecifier getRenderedImageSpec(final long rasterId) { + final int rasterIndex = getRasterIndex(rasterId); + return getRenderedImageSpec(rasterIndex); + } + public ImageTypeSpecifier getRenderedImageSpec(final int rasterIndex) { if (!this.renderedImageSpec.containsKey(Integer.valueOf(rasterIndex))) { synchronized (this) { @@ -418,6 +439,11 @@ return rasterInfo.getTargetCellType(); } + public RasterCellType getTargetCellType(final long rasterId) { + final int rasterIndex = getRasterIndex(rasterId); + return getTargetCellType(rasterIndex); + } + public Long getRasterId(final int rasterIndex) { final RasterInfo rasterInfo = getRasterInfo(rasterIndex); return rasterInfo.getRasterId(); Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterQueryInfo.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterQueryInfo.java 2009-10-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterQueryInfo.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -87,8 +87,8 @@ s.append("\n\tRequested dimension : ").append(getRequestedDim()); Rectangle mt = getMatchingTiles(); Rectangle ltr = getLevelTileRange(); - String matching = "x=" + mt.x + "-" + (mt.width - 1) + ", y=" + mt.y + "-" - + (mt.height - 1); + String matching = "x=" + mt.x + "-" + (mt.x + mt.width - 1) + ", y=" + mt.y + "-" + + (mt.y + mt.height - 1); String level = "x=" + ltr.x + "-" + (ltr.width - 1) + ", y=" + ltr.y + "-" + (ltr.height - 1); s.append("\n\tMatching tiles : ").append(matching).append(" out of ").append(level); Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterReaderFactory.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterReaderFactory.java 2009-10-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterReaderFactory.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -18,9 +18,7 @@ import java.io.IOException; -import org.geotools.arcsde.session.ISession; import org.geotools.arcsde.session.ISessionPool; -import org.geotools.arcsde.session.UnavailableConnectionException; /** * @@ -40,17 +38,18 @@ this.sessionPool = connectionPool; } + /** + * Creates a {@link TiledRasterReader} that's able to read one or more raster for the given + * {@link RasterDatasetInfo}, depending on if {@code rasterInfo} represents a single raster or a + * raster catalog. + * + * @param rasterInfo + * @return + * @throws IOException + */ public TiledRasterReader create(final RasterDatasetInfo rasterInfo) throws IOException { + TiledRasterReader rasterReader = new DefaultTiledRasterReader(sessionPool, rasterInfo); - ISession conn; - try { - conn = sessionPool.getSession(false); - } catch (UnavailableConnectionException e) { - throw new RuntimeException(e); - } - - TiledRasterReader rasterReader = new DefaultTiledRasterReader(conn, rasterInfo); - return rasterReader; } Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/TileReaderFactory.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/TileReaderFactory.java 2009-10-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/TileReaderFactory.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -1,13 +1,9 @@ package org.geotools.arcsde.gce; -import java.awt.Dimension; import java.awt.Rectangle; -import org.geotools.arcsde.session.ISession; +import org.geotools.arcsde.session.ISessionPool; -import com.esri.sde.sdk.client.SeQuery; -import com.esri.sde.sdk.client.SeRow; - public class TileReaderFactory { /** @@ -22,34 +18,30 @@ * @param tileSize * @return */ - public static TileReader getInstance(final ISession session, final SeQuery preparedQuery, - final SeRow row, final RasterDatasetInfo rasterInfo, final int rasterIndex, - final Rectangle requestedTiles, Dimension tileSize) { + public static TileReader getInstance(final ISessionPool sessionPool, + final RasterDatasetInfo rasterInfo, final long rasterId, final int pyramidLevel, + final Rectangle requestedTiles) { final TileReader tileReader; final RasterCellType nativeType = rasterInfo.getNativeCellType(); - final RasterCellType targetType = rasterInfo.getTargetCellType(rasterIndex); - final int numberOfBands = rasterInfo.getNumBands(); + final RasterCellType targetType = rasterInfo.getTargetCellType(rasterId); final BitmaskToNoDataConverter noData; - noData = BitmaskToNoDataConverter.getInstance(rasterInfo, rasterIndex); + noData = BitmaskToNoDataConverter.getInstance(rasterInfo, rasterId); - final int nativeBitsPerPixel = nativeType.getBitsPerSample(); - if (targetType == nativeType) { - TileReader nativeTileReader = new NativeTileReader(session, preparedQuery, row, nativeBitsPerPixel, - numberOfBands, requestedTiles, tileSize, noData); + TileReader nativeTileReader = new NativeTileReader(sessionPool, rasterInfo, rasterId, + pyramidLevel, requestedTiles, noData); tileReader = nativeTileReader; } else { // need to promote native to target sample depth TileReader nativeTileReader; - nativeTileReader = new NativeTileReader(session, preparedQuery, row, nativeBitsPerPixel, - numberOfBands, requestedTiles, tileSize, - BitmaskToNoDataConverter.NO_ACTION_CONVERTER); + nativeTileReader = new NativeTileReader(sessionPool, rasterInfo, rasterId, + pyramidLevel, requestedTiles, BitmaskToNoDataConverter.NO_ACTION_CONVERTER); TileReader promotingTileReader = new PromotingTileReader(nativeTileReader, nativeType, targetType, noData); Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/TiledRasterReader.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/TiledRasterReader.java 2009-10-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/TiledRasterReader.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -20,8 +20,6 @@ import java.awt.image.RenderedImage; import java.io.IOException; -import com.esri.sde.sdk.client.SeRasterAttr; - /** * An Iterator like interface to read ArcSDE rasters for a given ArcSDE raster dataset (whether it * is a single raster or a raster catalog). @@ -63,7 +61,7 @@ * Disposes any resource being held by this reader, whether it's a connection to the ArcSDE * server, opened streams, etc. */ - //void dispose(); + // void dispose(); /** * Advances to the next available raster in the raster dataset this reader works upon and @@ -74,7 +72,7 @@ * @throws IOException * for any problem occurred retrieving the next {@link SeRasterAttr} in the request */ - Long nextRaster() throws IOException; + // Long nextRaster() throws IOException; /** * Reads the image subset determined by the given pyramid level and tile range for the currently @@ -89,6 +87,7 @@ * @throws IOException * for any exception occurred while reading the image */ - RenderedImage read(final int pyramidLevel, final Rectangle tileRange) throws IOException; + RenderedImage read(final long rasterId, final int pyramidLevel, final Rectangle tileRange) + throws IOException; } \ No newline at end of file Added: trunk/modules/plugin/arcsde/datastore/src/main/resources/org/geotools/arcsde/gce/org.geotools.arcsde.gce.ucls =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/resources/org/geotools/arcsde/gce/org.geotools.arcsde.gce.ucls (rev 0) +++ trunk/modules/plugin/arcsde/datastore/src/main/resources/org/geotools/arcsde/gce/org.geotools.arcsde.gce.ucls 2009-10-23 17:40:52 UTC (rev 34203) @@ -0,0 +1,390 @@ +<class-diagram version="0.9.86" icons="true" always-add-relationships="false" generalizations="true" realizations="true" + associations="true" dependencies="false" nesting-relationships="true"> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.ArcSDERasterFormat" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java" binary="false"> + <position x="428" y="37" width="258" height="235"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="false" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.ArcSDEGridCoverage2DReaderJAI" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java" + binary="false"> + <position x="428" y="322" width="386" height="110"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <interface corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.TiledRasterReader" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TiledRasterReader.java" binary="false"> + <position x="335" y="584" width="146" height="78"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </interface> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.TileReaderFactory" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReaderFactory.java" binary="false"> + <position x="43" y="37" width="345" height="62"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.RasterReaderFactory" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/RasterReaderFactory.java" binary="false"> + <position x="521" y="584" width="180" height="78"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.ArcSDETiledImageInputStream" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDETiledImageInputStream.java" + binary="false"> + <position x="854" y="37" width="174" height="126"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" + name="org.geotools.arcsde.gce.BitmaskToNoDataConverter.Unsigned8bitConverter" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false"> + <position x="1472" y="584" width="188" height="94"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" + binary="false"> + <position x="1359" y="322" width="239" height="126"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" + name="org.geotools.arcsde.gce.DefaultTiledRasterReader.FetchRasterCommand" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java" binary="false"> + <position x="142" y="584" width="153" height="110"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.DefaultTiledRasterReader" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java" + binary="false"> + <position x="142" y="322" width="225" height="94"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.PromotingTileReader" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"> + <position x="1068" y="37" width="178" height="40"/> + <display autosize="false" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="false" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.PromotingTileReader.SampleDepthPromoter" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"> + <position x="1023" y="322" width="254" height="78"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.PromotingTileReader.OneBitToUchar" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"> + <position x="1146" y="584" width="123" height="62"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.PromotingTileReader.ShortToInt" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"> + <position x="983" y="584" width="123" height="62"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.PromotingTileReader.UcharToUshort" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"> + <position x="1309" y="584" width="123" height="62"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.NativeTileReader" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java" binary="false"> + <position x="1377" y="37" width="96" height="40"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="false" package="false" protected="false" private="false"/> + <operations public="false" package="false" protected="false" private="false"/> + </display> + </class> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.NativeTileReader.TileFetchCommand" + project="gt-arcsde" file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java" binary="false"> + <position x="1648" y="322" width="182" height="78"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <interface corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.TileReader" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReader.java" binary="false"> + <position x="854" y="322" width="108" height="222"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </interface> + <class corner="BOTTOM_RIGHT" language="java" name="org.geotools.arcsde.gce.TileReader.TileInfo" project="gt-arcsde" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReader.java" binary="false"> + <position x="836" y="584" width="107" height="110"/> + <display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </display> + </class> + <nesting> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.TileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.TileReader.TileInfo" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReader.java" binary="false"/> + </nesting> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false" navigable="false"> + <attribute name="noData"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false" + navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false" navigable="false"> + <attribute name="nativeReader"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.TileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReader.java" binary="false" navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <realization> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.TileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReader.java" binary="false"/> + </realization> + <realization> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.NativeTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.TileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReader.java" binary="false"/> + </realization> + <nesting> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.SampleDepthPromoter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + </nesting> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false" navigable="false"> + <attribute name="promoter"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.SampleDepthPromoter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false" navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <nesting> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.DefaultTiledRasterReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.DefaultTiledRasterReader.FetchRasterCommand" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java" binary="false"/> + </nesting> + <generalization> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.UcharToUshort" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.SampleDepthPromoter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + </generalization> + <nesting> + <bendpoint x="1307" y="322"/> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.OneBitToUchar" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + </nesting> + <nesting> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter.Unsigned8bitConverter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false"/> + </nesting> + <nesting> + <bendpoint x="992" y="322"/> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.ShortToInt" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + </nesting> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.NativeTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java" binary="false" navigable="false"> + <attribute name="noData"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false" + navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDETiledImageInputStream" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDETiledImageInputStream.java" binary="false" + navigable="false"> + <attribute name="tileReader"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.TileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TileReader.java" binary="false" navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <dependency> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDEGridCoverage2DReaderJAI" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.TiledRasterReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TiledRasterReader.java" binary="false"/> + </dependency> + <generalization> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.OneBitToUchar" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.SampleDepthPromoter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + </generalization> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.NativeTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java" binary="false" navigable="false"> + <attribute name="tileFetchCommand"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.NativeTileReader.TileFetchCommand" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java" binary="false" navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <generalization> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.ShortToInt" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.SampleDepthPromoter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + </generalization> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDERasterFormat" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java" binary="false" navigable="false"> + <attribute name="instance"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDERasterFormat" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java" binary="false" navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <realization> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.DefaultTiledRasterReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.TiledRasterReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/TiledRasterReader.java" binary="false"/> + </realization> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDEGridCoverage2DReaderJAI" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java" binary="false" + navigable="false"> + <attribute name="rasterReaderFactory"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.RasterReaderFactory" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/RasterReaderFactory.java" binary="false" navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <nesting> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.NativeTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.NativeTileReader.TileFetchCommand" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/NativeTileReader.java" binary="false"/> + </nesting> + <generalization> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter.Unsigned8bitConverter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false"/> + </generalization> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDEGridCoverage2DReaderJAI" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java" binary="false" + navigable="false"> + <attribute name="parent"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDERasterFormat" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java" binary="false" navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <dependency> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDERasterFormat" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDERasterFormat.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.ArcSDEGridCoverage2DReaderJAI" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java" binary="false"/> + </dependency> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false" + navigable="false"> + <attribute name="NO_ACTION_CONVERTER"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.BitmaskToNoDataConverter" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/BitmaskToNoDataConverter.java" binary="false" + navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <association> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.DefaultTiledRasterReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java" binary="false" + navigable="false"> + <attribute name="fetchCommand"/> + <multiplicity minimum="0" maximum="1"/> + </source> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.DefaultTiledRasterReader.FetchRasterCommand" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java" binary="false" + navigable="true"/> + <display labels="true" multiplicity="true"/> + </association> + <nesting> + <bendpoint x="1328" y="322"/> + <source project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + <target project="gt-arcsde" name="org.geotools.arcsde.gce.PromotingTileReader.UcharToUshort" + file="/gt-arcsde/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java" binary="false"/> + </nesting> + <classifier-display autosize="true" package="true" initial-value="false" signature="true" visibility="true"> + <attributes public="true" package="false" protected="false" private="false"/> + <operations public="true" package="false" protected="false" private="false"/> + </classifier-display> + <association-display labels="true" multiplicity="true"/> +</class-diagram> \ No newline at end of file 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-23 07:12:55 UTC (rev 34202) +++ trunk/modules/plugin/arcsde/datastore/src/test/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAILegacyOnlineTest.java 2009-10-23 17:40:52 UTC (rev 34203) @@ -141,7 +141,7 @@ assertNotNull("read coverage returned null", coverage); RenderedImage image = coverage.getRenderedImage(); - // writeToDisk(coverage, "testRead_" + tableName); + writeToDisk(coverage, "testRead_" + tableName); } @Test @@ -223,7 +223,7 @@ //writeToDisk(coverage, "testRead_" + tableName); RenderedImage image = coverage.view(ViewType.RENDERED).getRenderedImage(); - // writeToDisk(image, tableName); + writeToDisk(image, tableName); writeBand(image, new int[] { 0 }, "red"); writeBand(image, new int[] { 1 }, "green"); ------------------------------------------------------------------------------ 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 |
||||||||||||||||
| Free Embeddable Forum Powered by Nabble | Help |