package org.geowebcache.service.wmts;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.channels.Channels;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.geowebcache.GeoWebCacheException;
import org.geowebcache.conveyor.Conveyor.CacheResult;
import org.geowebcache.conveyor.ConveyorTile;
import org.geowebcache.grid.BoundingBox;
import org.geowebcache.grid.GridSet;
import org.geowebcache.io.Resource;
import org.geowebcache.layer.TileLayer;
import org.geowebcache.service.OWSException;
import org.geowebcache.stats.RuntimeStats;
import org.geowebcache.util.ServletUtils;
public class WMTSGetFeatureInfo {
private static Log log = LogFactory.getLog(org.geowebcache.service.wmts.WMTSService.class);
private ConveyorTile convTile;
int i;
int j;
protected WMTSGetFeatureInfo(ConveyorTile convTile) throws OWSException {
String[] keys = { "i", "j" };
Map<String, String> values;
values = ServletUtils.selectedStringsFromMap(convTile.servletReq.getParameterMap(),
convTile.servletReq.getCharacterEncoding(), keys);
try {
i = Integer.parseInt(values.get("i"));
} catch (NumberFormatException nfe) {
throw new OWSException(400, "MissingParameterValue", "I", "I was not specified");
}
try {
j = Integer.parseInt(values.get("j"));
} catch (NumberFormatException nfe) {
throw new OWSException(400, "MissingParameterValue", "J", "J was not specified");
}
this.convTile = convTile;
}
protected void writeResponse(RuntimeStats stats) throws OWSException {
TileLayer layer = convTile.getLayer();
GridSet gridSet = convTile.getGridSubset().getGridSet();
if (gridSet.getTileHeight() < j || j < 0) {
throw new OWSException(400, "PointIJOutOfRange", "J", "J was " + j
+ ", must be between 0 and " + gridSet.getTileHeight());
}
if (gridSet.getTileWidth() < i || i < 0) {
throw new OWSException(400, "PointIJOutOfRange", "I", "I was " + i
+ ", must be between 0 and " + gridSet.getTileWidth());
}
Resource data = null;
try {
BoundingBox bbox = convTile.getGridSubset().boundsFromIndex(convTile.getTileIndex());
data = layer.getFeatureInfo(convTile, bbox, convTile.getGridSubset().getTileHeight(),
convTile.getGridSubset().getTileWidth(), i, j);
} catch (GeoWebCacheException e) {
throw new OWSException(500, "NoApplicableCode", "", e.getMessage());
}
convTile.servletResp.setStatus(HttpServletResponse.SC_OK);
convTile.servletResp.setContentType(convTile.getMimeType().getMimeType());
int size = (int) data.getSize();
convTile.servletResp.setContentLength(size);
stats.log(size, CacheResult.OTHER);
try {
OutputStream os = convTile.servletResp.getOutputStream();
data.transferTo(Channels.newChannel(os));
os.flush();
} catch (IOException ioe) {
log.debug("Caught IOException" + ioe.getMessage());
}
}
}