/** * Step 2 of the bootstrapping process. * * <p>Calculating the the extent for each image level (original + pyramids). This calculation is * only done if the extent info in the master table is SQL NULL. After calculation the meta table * is updated with the result to avoid this operation in the future. * * @param coverageName The coverage name in the sql meta table * @param con JDBC connection * @throws SQLException * @throws IOException */ void calculateExtentsFromDB(String coverageName, Connection con) throws SQLException, IOException { PreparedStatement stmt = con.prepareStatement(config.getSqlUpdateMosaicStatement()); List<ImageLevelInfo> toBeRemoved = new ArrayList<ImageLevelInfo>(); for (ImageLevelInfo li : levelInfos) { if (li.getCoverageName().equals(coverageName) == false) { continue; } if (li.calculateExtentsNeeded() == false) { continue; } Date start = new Date(); if (LOGGER.isLoggable(Level.INFO)) LOGGER.info("Calculate extent for " + li.toString()); Envelope env = getExtent(li, con); if (env == null) { if (LOGGER.isLoggable(Level.WARNING)) LOGGER.log(Level.WARNING, "No extent, removing this level"); toBeRemoved.add(li); continue; } li.setExtentMaxX(new Double(env.getMaxX())); li.setExtentMaxY(new Double(env.getMaxY())); li.setExtentMinX(new Double(env.getMinX())); li.setExtentMinY(new Double(env.getMinY())); stmt.setDouble(1, li.getExtentMaxX().doubleValue()); stmt.setDouble(2, li.getExtentMaxY().doubleValue()); stmt.setDouble(3, li.getExtentMinX().doubleValue()); stmt.setDouble(4, li.getExtentMinY().doubleValue()); stmt.setString(5, li.getCoverageName()); stmt.setString(6, li.getTileTableName()); stmt.setString(7, li.getSpatialTableName()); stmt.execute(); long msecs = (new Date()).getTime() - start.getTime(); if (LOGGER.isLoggable(Level.INFO)) LOGGER.info("Calculate extent for " + li.toString() + " finished in " + msecs + " ms "); } levelInfos.removeAll(toBeRemoved); if (stmt != null) { stmt.close(); } }
/** * Step 1 of the bootstrapping process. Read meta table and build the ImageLevelInfo objects * * @param coverageName the coverage name stored in the sql meta table * @param con jdbc connection * @throws SQLException * @throws IOException */ protected void initFromDB(String coverageName, Connection con) throws SQLException, IOException { PreparedStatement s = null; ResultSet res = null; try { String stmt = config.getSqlSelectCoverageStatement(); // TODO, investigate, setString for oracle does not work stmt = stmt.replace("?", "'" + coverageName + "'"); s = con.prepareStatement(stmt); // s.setString(1,coverageName); res = s.executeQuery(); while (res.next()) { ImageLevelInfo imageLevelInfo = new ImageLevelInfo(); imageLevelInfo.setCoverageName(coverageName); imageLevelInfo.setSpatialTableName(res.getString(config.getSpatialTableNameAtribute())); imageLevelInfo.setTileTableName((res.getString(config.getTileTableNameAtribute()))); // check cardinalities if (config.getVerifyCardinality().booleanValue()) { imageLevelInfo.setCountFeature( new Integer(getRowCount(imageLevelInfo.getSpatialTableName(), con))); if (imageLevelInfo.getSpatialTableName().equals(imageLevelInfo.getTileTableName())) { imageLevelInfo.setCountTiles(imageLevelInfo.getCountFeature()); } else { imageLevelInfo.setCountTiles( new Integer(getRowCount(imageLevelInfo.getTileTableName(), con))); } if (imageLevelInfo.getCountFeature().intValue() == 0) { LOGGER.severe("Table " + imageLevelInfo.getSpatialTableName() + " has no entries"); } else if (imageLevelInfo.getCountTiles().intValue() == 0) { LOGGER.severe("Table " + imageLevelInfo.getTileTableName() + " has no entries"); } else if (imageLevelInfo.getCountFeature().intValue() != imageLevelInfo.getCountTiles().intValue()) { if (LOGGER.isLoggable(Level.WARNING)) LOGGER.log( Level.WARNING, "Consistency warning: number of features: " + imageLevelInfo.getCountFeature() + " number tiles: " + imageLevelInfo.getCountTiles()); } else { if (LOGGER.isLoggable(Level.FINE)) LOGGER.fine( "Number of features: " + imageLevelInfo.getCountFeature() + " number tiles: " + imageLevelInfo.getCountTiles()); } } imageLevelInfo.setExtentMaxX(new Double(res.getDouble(config.getMaxXAttribute()))); if (res.wasNull()) { imageLevelInfo.setExtentMaxX(null); } imageLevelInfo.setExtentMaxY(new Double(res.getDouble(config.getMaxYAttribute()))); if (res.wasNull()) { imageLevelInfo.setExtentMaxY(null); } imageLevelInfo.setExtentMinX(new Double(res.getDouble(config.getMinXAttribute()))); if (res.wasNull()) { imageLevelInfo.setExtentMinX(null); } imageLevelInfo.setExtentMinY(new Double(res.getDouble(config.getMinYAttribute()))); if (res.wasNull()) { imageLevelInfo.setExtentMinY(null); } imageLevelInfo.setResX(new Double(res.getDouble(config.getResXAttribute()))); if (res.wasNull()) { imageLevelInfo.setResX(null); } imageLevelInfo.setResY(new Double(res.getDouble(config.getResYAttribute()))); if (res.wasNull()) { imageLevelInfo.setResY(null); } if (config.getVerifyCardinality().booleanValue()) { if ((imageLevelInfo.getCountFeature().intValue() > 0) && (imageLevelInfo.getCountTiles().intValue() > 0)) { levelInfos.add(imageLevelInfo); } } else { levelInfos.add(imageLevelInfo); } imageLevelInfo.setSrsId(getSRSID(imageLevelInfo, con)); imageLevelInfo.setCrs(getCRS(imageLevelInfo, con)); } } catch (SQLException e) { throw (e); } catch (IOException e1) { throw (e1); } finally { if (res != null) { res.close(); } if (s != null) { s.close(); } } }