/*
*/
package com.bbn.openmap.maptileservlet;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import com.bbn.openmap.dataAccess.mapTile.TileMillMapTileFactory;
import com.bbn.openmap.image.BufferedImageHelper;
import com.bbn.openmap.image.PNGImageIOFormatter;
import com.bbn.openmap.io.FormatException;
import com.bbn.openmap.util.PropUtils;
/**
* MapTileSet that reads TileMill files.
*
* <pre>
* name=the-name-of-dataset
* class=com.bbn.openmap.maptileservlet.TileMillMapTileSet
* rootDir=the path to the mbtiles file.
* * </pre>
*
* As an example, a url for accessing a tile from this server would be:
*
* <pre>
* http://your.machine/ommaptile/the-name-of-dataset/z/x/y.png
* </pre>
*
* where ommaptile is the name of the servlet. You can change that in the
* web.xml and in glassfish/tomcat.
*
* @author dietrick
*/
public class TileMillMapTileSet extends StandardMapTileSet {
public TileMillMapTileSet() {
}
public TileMillMapTileSet(Properties props) {
setProperties(props);
}
public Properties getProperties(Properties props) {
props = super.getProperties(props);
String prefix = PropUtils.getScopedPropertyPrefix(this);
props.put(prefix + CLASS_ATTRIBUTE, this.getClass().getName());
return props;
}
public byte[] getImageData(String pathInfo) throws IOException, FormatException {
byte[] imageData = null;
try {
Class.forName(TileMillMapTileFactory.DEFAULT_TEST_CLASS);
} catch (Exception e) {
getLogger().warning("can't locate sqlite JDBC components");
return null;
}
try {
TileInfo ti = new TileInfo(pathInfo);
Connection conn = DriverManager.getConnection(rootDir);
Statement stat = conn.createStatement();
// "select zoom_level, tile_column, tile_row, tile_data from map, images where map.tile_id = images.tile_id";
StringBuilder statement = new StringBuilder("select tile_data from map, images where");
statement.append(" zoom_level = ").append(ti.zoomLevel);
statement.append(" and tile_column = ").append(ti.x);
statement.append(" and tile_row = ").append((int) (Math.pow(2, ti.zoomLevel)) - ti.y
- 1);
statement.append(" and map.tile_id = images.tile_id;");
ResultSet rs = stat.executeQuery(statement.toString());
while (rs.next()) {
byte[] imageBytes = rs.getBytes("tile_data");
ImageIcon ii = new ImageIcon(imageBytes);
BufferedImage bi = BufferedImageHelper.getBufferedImage(ii.getImage(), 0, 0, -1, -1);
// TODO: Still have to incorporate properties or something to
// all
// specification of map image format.
imageData = new PNGImageIOFormatter().formatImage(bi);
}
rs.close();
conn.close();
} catch (Exception e) {
getLogger().warning("something went wrong fetching image from database: "
+ e.getMessage());
e.printStackTrace();
}
return imageData;
}
/**
* Holder for this class's Logger. This allows for lazy initialization of
* the logger.
*/
private static final class LoggerHolder {
/**
* The logger for this class
*/
private static final Logger LOGGER = Logger.getLogger(MapTileSet.class.getName());
/**
* Prevent instantiation
*/
private LoggerHolder() {
throw new AssertionError("This should never be instantiated");
}
}
/**
* Get the logger for this class.
*
* @return logger for this class
*/
private static Logger getLogger() {
return LoggerHolder.LOGGER;
}
}