/** * 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, OpenGeo, Copyright 2009 * */ package org.geowebcache.storage; import java.util.Map; import java.util.TreeMap; import org.geowebcache.filter.parameters.ParametersUtils; import org.geowebcache.mime.MimeType; import org.geowebcache.util.ServletUtils; /** * A 3 dimensional tile range inside a grid set, specified by a range of zooms for fast filtering * and a set of (zoom level,xy bounds) specifications */ public class TileRange { private final String layerName; private final String gridSetId; private final int zoomStart; private final int zoomStop; // {zoom}{minx,miny,maxx,maxy} private final Map<Integer, long[]> rangeBounds; private final MimeType mimeType; private final Map<String, String> parameters; private String parametersId; /** * @deprecated use {@link #TileRange(String, String, int, int, long[][], MimeType, Map)} */ public TileRange(String layerName, String gridSetId, int zoomStart, int zoomStop, long[][] rangeBounds, MimeType mimeType, String parameters) { this(layerName, gridSetId, zoomStart, zoomStop, rangeBounds, mimeType, ServletUtils .queryStringToMap(parameters)); } public TileRange(String layerName, String gridSetId, int zoomStart, int zoomStop, long[][] rangeBounds, MimeType mimeType, Map<String, String> parameters) { this(layerName, gridSetId, zoomStart, zoomStop, rangeBounds, mimeType, parameters, ParametersUtils.getId(parameters)); } public TileRange(String layerName, String gridSetId, int zoomStart, int zoomStop, long[][] rangeBounds, MimeType mimeType, Map<String, String> parameters, String parametersId) { this.layerName = layerName; this.gridSetId = gridSetId; if (rangeBounds == null) { this.rangeBounds = null; } else { this.rangeBounds = new TreeMap<Integer, long[]>(); for (long[] bounds : rangeBounds) { if (bounds != null) { // could be null in case calling code is only interested in a subset of zoom // levels this.rangeBounds.put(Integer.valueOf((int) bounds[4]), bounds); } } } this.zoomStart = zoomStart; this.zoomStop = zoomStop; this.mimeType = mimeType; this.parameters = parameters; this.parametersId = parametersId; } public boolean contains(long[] idx) { return contains(idx[0], idx[1], (int) idx[2]); } public boolean contains(long x, long y, int z) { if (null == rangeBounds) { return true; } if (z >= getZoomStart() && z <= getZoomStop()) { long[] rB = rangeBounds((int) z); if (rB[0] <= x && rB[2] >= x && rB[1] <= y && rB[3] >= y) { return true; } } return false; } public void setParametersId(String parametersId) { this.parametersId = parametersId; } /** * @return the parameters id, or {@code null} if unset */ public String getParametersId() { return parametersId; } /** * @return the zoomStart */ public int getZoomStart() { return zoomStart; } /** * @return the zoomStop */ public int getZoomStop() { return zoomStop; } /** * @return the layerName */ public String getLayerName() { return layerName; } /** * @return the gridSetId */ public String getGridSetId() { return gridSetId; } /** * @return the mimeType */ public MimeType getMimeType() { return mimeType; } /** * @return the parameters */ public Map<String, String> getParameters() { return parameters; } public long[] rangeBounds(final int zoomLevel) { if (zoomLevel < zoomStart) { throw new IllegalArgumentException(zoomLevel + " < zoomStart (" + zoomStart + ")"); } if (zoomLevel > zoomStop) { throw new IllegalArgumentException(zoomLevel + " > zoomStop (" + zoomStop + ")"); } long[] zlevelBounds = rangeBounds.get(Integer.valueOf(zoomLevel)); if (zlevelBounds == null) { throw new IllegalStateException("Found no range bounds for z level " + zoomLevel + ": " + rangeBounds); } return zlevelBounds; } }