/**
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @author Arne Kepp, The Open Planning Project, Copyright 2008
*/
package org.geowebcache.service.kml;
import java.io.IOException;
import java.util.Hashtable;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.geowebcache.GeoWebCacheException;
import org.geowebcache.conveyor.ConveyorTile;
import org.geowebcache.grid.BoundingBox;
import org.geowebcache.grid.GridSetBroker;
import org.geowebcache.grid.GridSubset;
import org.geowebcache.grid.GridSubsetFactory;
import org.geowebcache.grid.SRS;
import org.geowebcache.io.ByteArrayResource;
import org.geowebcache.layer.AbstractTileLayer;
import org.geowebcache.layer.BadTileException;
import org.geowebcache.layer.TileLayer;
import org.geowebcache.mime.MimeType;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
/**
*
* Creates a grid of tiles and puts the grid index on each of them
*
*/
public class KMLDebugGridLayer extends AbstractTileLayer {
public static final String LAYERNAME = "debugGrid";
public static final int IS_KMZ = 100;
// private static Log log =
// LogFactory.getLog(org.geowebcache.service.kml.KMLDebugGridLayer.class);
// This is completely isolated anyway
private static GridSetBroker gridSetBroker = new GridSetBroker(false, false);
private static KMLDebugGridLayer instance;
private KMLDebugGridLayer() {
super.subSets = new Hashtable<String, GridSubset>();
subSets.put(gridSetBroker.WORLD_EPSG4326.getName(), GridSubsetFactory.createGridSubSet(
gridSetBroker.WORLD_EPSG4326, BoundingBox.WORLD4326, 0, 3));
}
synchronized static public KMLDebugGridLayer getInstance() {
if (instance == null) {
instance = new KMLDebugGridLayer();
}
return instance;
}
public void acquireLayerLock() {
}
public ConveyorTile doNonMetatilingRequest(ConveyorTile tile) throws GeoWebCacheException {
return null;
}
public BoundingBox getBounds(SRS srs) {
return new BoundingBox(-180.0, -90.0, 180.0, 90.0);
}
public MimeType getDefaultMimeType() {
return null;
}
public int[] getMetaTilingFactors() {
return null;
}
public List<MimeType> getMimeTypes() {
return null;
}
public String getName() {
return "Debug grid";
}
public SRS[] getProjections() {
SRS[] srsList = { SRS.getEPSG4326() };
return srsList;
}
public double[] getResolutions(int srsIdx) {
return null;
}
public ConveyorTile getTile(ConveyorTile tile) throws GeoWebCacheException, IOException {
long[] gridLoc = tile.getTileIndex();
BoundingBox bbox = tile.getGridSubset().boundsFromIndex(gridLoc);
String data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<kml xmlns=\"http://earth.google.com/kml/2.1\">\n" + "<Document>\n"
// +"<!-- Name>DocumentName</Name --->"
+ "<Placemark id=\"PlaceMarkId\">\n"
// +"<styleUrl>#square</styleUrl>\n"
+ "<name>"
+ gridLoc[0]
+ ","
+ gridLoc[1]
+ ","
+ gridLoc[2]
+ "</name>"
+ "<Style id=\"square\">\n"
+ "<PolyStyle><color>7fffffff</color><colorMode>random</colorMode>\n"
+ "</PolyStyle>\n"
+ "<IconStyle><Icon><href>http://icons.opengeo.org/dynamic/circle/aaffaa_aaffaa_2.png</href></Icon></IconStyle>\n"
+ "<LabelStyle id=\"name\"><color>ffffffff</color><colorMode>normal</colorMode><scale>1.0</scale></LabelStyle>\n"
+ "</Style>\n"
+ "<MultiGeometry>\n"
+ "<Point><coordinates>"
+ ((bbox.getMinX() + bbox.getMaxX()) / 2)
+ ","
+ ((bbox.getMinY() + bbox.getMaxY()) / 2)
+ ",0</coordinates></Point>\n"
+ "<Polygon><outerBoundaryIs><LinearRing>\n"
+ "<coordinates decimal=\".\" cs=\",\" ts=\" \">\n"
+ bbox.getMinX()
+ ","
+ bbox.getMinY()
+ " "
+ bbox.getMaxX()
+ ","
+ bbox.getMinY()
+ " "
+ bbox.getMaxX()
+ ","
+ bbox.getMaxY()
+ " "
+ bbox.getMinX()
+ ","
+ bbox.getMaxY()
+ "</coordinates>\n"
+ "</LinearRing></outerBoundaryIs></Polygon>\n"
+ "</MultiGeometry>\n"
+ "</Placemark>\n" + "</Document>\n" + "</kml>";
tile.setBlob(new ByteArrayResource(data.getBytes()));
tile.setStatus(200);
return tile;
}
public String getStyles() {
return null;
}
public int[][] getZoomInGridLoc(SRS srs, int[] gridLoc) {
// log.warn("done - getZoomInGridLoc(srsIdx, gridLoc)");
int[][] retVal = new int[4][3];
int x = gridLoc[0] * 2;
int y = gridLoc[1] * 2;
int z = gridLoc[2] + 1;
// Don't link to tiles past the last zoomLevel
if (z > 25) {
z = -1;
}
// Now adjust where appropriate
retVal[0][0] = retVal[2][0] = x;
retVal[1][0] = retVal[3][0] = x + 1;
retVal[0][1] = retVal[1][1] = y;
retVal[2][1] = retVal[3][1] = y + 1;
retVal[0][2] = retVal[1][2] = retVal[2][2] = retVal[3][2] = z;
return retVal;
}
public int getZoomStart() {
return 0;
}
public int getZoomStop() {
return 25;
}
public boolean initializeInternal(GridSetBroker gridSetBroker) {
return true;
}
public void releaseLayerLock() {
}
public void setExpirationHeader(HttpServletResponse response, int zoomLevel) {
}
public String supportsBbox(SRS srs, BoundingBox bounds) throws GeoWebCacheException {
return null;
}
public boolean supportsFormat(String formatStr) throws GeoWebCacheException {
return false;
}
public boolean supportsSRS(SRS srs) throws GeoWebCacheException {
return false;
}
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
}
//
// public Object createKey(Tile tile) {
// Vector<Integer> lst = new Vector<Integer>();
// if(tile.getMimeType() == XMLMime.kmz) {
// lst.add(KMLDebugGridLayer.IS_KMZ);
// } else {
// lst.add(0);
// }
// int[] tileIndex = tile.getTileIndex();
// lst.add(tileIndex[0]);
// lst.add(tileIndex[1]);
// lst.add(tileIndex[2]);
//
// return (Object) lst;
// }
public int getType() {
return 0;
}
public void init() {
}
public BoundingBox getBboxForGridLoc(SRS srs, int[] gridLoc) {
double tileWidth = 180.0 / Math.pow(2, gridLoc[2]);
BoundingBox bbox = new BoundingBox(-180.0 + tileWidth * gridLoc[0], -90.0 + tileWidth
* gridLoc[1], -180.0 + tileWidth * (gridLoc[0] + 1), -90.0 + tileWidth
* (gridLoc[1] + 1));
return bbox;
}
public int[][] getCoveredGridLevels(SRS srs, BoundingBox bounds) {
return null;
}
public int[] getGridLocForBounds(SRS srs, BoundingBox bounds) throws BadTileException {
return null;
}
public int[] getZoomedOutGridLoc(SRS srs) {
// log.warn("done - getZoomedOutGridLoc");
int[] zoomedOutGridLoc = new int[3];
zoomedOutGridLoc[0] = -1;
zoomedOutGridLoc[1] = -1;
zoomedOutGridLoc[2] = -1;
return zoomedOutGridLoc;
}
@Override
public Integer getBackendTimeout() {
// TODO Auto-generated method stub
return null;
}
@Override
public ConveyorTile getNoncachedTile(ConveyorTile tile) throws GeoWebCacheException {
// TODO Auto-generated method stub
return null;
}
@Override
public Boolean isCacheBypassAllowed() {
// TODO Auto-generated method stub
return null;
}
@Override
public void seedTile(ConveyorTile tile, boolean tryCache) throws GeoWebCacheException,
IOException {
// TODO Auto-generated method stub
}
@Override
public void setBackendTimeout(int seconds) {
// TODO Auto-generated method stub
}
@Override
public void setCacheBypassAllowed(boolean allowed) {
// TODO Auto-generated method stub
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public void setEnabled(boolean enabled) {
// TODO Auto-generated method stub
}
}