/*
* MapTileSet.java Jan 2, 2012 10:57:59 PM
*/
package com.bbn.openmap.maptileservlet;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import com.bbn.openmap.dataAccess.mapTile.StandardMapTileFactory;
import com.bbn.openmap.image.PNGImageIOFormatter;
import com.bbn.openmap.io.BinaryBufferedFile;
import com.bbn.openmap.io.FormatException;
import com.bbn.openmap.util.PropUtils;
/**
* The StandardMapTileSet contains all the information for handling a specific
* set of tiles. It contains a description, key to use in the request, the
* location of the data directory or jar, and how to handle empty tiles. The
* StandardMapTileSet properties file would look like this:
*
* <pre>
* name=the-name-of-dataset
* # default, don't really need to specify the class property
* #class=com.bbn.openmap.maptileservlet.StandardMapTileSet
* rootDir=the path to the root of the tile directory, the parent of the z-level directory.
* </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 StandardMapTileSet extends StandardMapTileFactory implements MapTileSet {
public final static String NAME_ATTRIBUTE = "name";
public final static String DESCRIPTION_ATTRIBUTE = "description";
protected String name;
protected String description = null;
// To allow the component factory to create it.
public StandardMapTileSet() {
}
public boolean allGood() {
return name != null && rootDir != null;
}
public void setProperties(String prefix, Properties props) {
super.setProperties(prefix, props);
prefix = PropUtils.getScopedPropertyPrefix(prefix);
name = props.getProperty(prefix + NAME_ATTRIBUTE, name);
description = props.getProperty(prefix + DESCRIPTION_ATTRIBUTE, description);
}
public Properties getProperties(Properties props) {
props = super.getProperties(props);
String prefix = PropUtils.getScopedPropertyPrefix(this);
props.put(prefix + NAME_ATTRIBUTE, PropUtils.unnull(name));
props.put(prefix + DESCRIPTION_ATTRIBUTE, PropUtils.unnull(description));
return props;
}
public byte[] getImageData(String pathInfo) throws IOException, FormatException {
byte[] imageData = null;
// We're assuming that all queries are coming in with the name in front,
// along with a slash
if (name != null) {
int index = pathInfo.indexOf(name, 1);
pathInfo = pathInfo.substring(index + name.length());
}
String filePath = rootDir + pathInfo;
if (logger.isLoggable(Level.FINE)) {
logger.fine("looking for " + filePath);
}
try {
BinaryBufferedFile file = new BinaryBufferedFile(filePath);
imageData = file.readBytes(100000, true);
file.close();
} catch (IOException ioe) {
logger.fine("Problem fetching the file");
// The file wasn't found.
if (emptyTileHandler != null) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Creating " + filePath + " since it wasn't found from the server.");
}
TileInfo ti = new TileInfo(filePath);// FPBT: used to be
// pathInfo
ti.setMtcTransform(getMtcTransform());
BufferedImage bufferedImage = ti.getBufferedImage(emptyTileHandler);
if (bufferedImage != null) {
imageData = new PNGImageIOFormatter().formatImage(bufferedImage);
logger.fine("buffered image created, writing file to disk too");
File newFile = new File(filePath);
newFile.getParentFile().mkdirs();
// Write the image data to the local cache location
FileOutputStream fos = new FileOutputStream(newFile);
fos.write(imageData);
fos.flush();
fos.close();
} else {
logger.fine("null buffered image back from EmptyTileHandler");
}
} else {
logger.fine("no empty file handler");
}
}
return imageData;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}