/**
* 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.config;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.geowebcache.grid.BoundingBox;
import org.geowebcache.grid.Grid;
import org.geowebcache.grid.GridSet;
import org.geowebcache.grid.GridSetFactory;
import org.geowebcache.grid.SRS;
/**
* GridSet model for XStream persistence
*/
public class XMLGridSet implements Serializable {
private static final long serialVersionUID = 2684804068163933728L;
private String name;
private String description;
private SRS srs;
private BoundingBox extent;
private Boolean alignTopLeft;
private double[] resolutions;
private double[] scaleDenominators;
private Integer levels;
private Double metersPerUnit;
private Double pixelSize;
private String[] scaleNames;
private Integer tileHeight;
private Integer tileWidth;
private Boolean yCoordinateFirst;
/**
* Default constructor for XStream
*/
public XMLGridSet() {
// do nothing
}
/**
* Copy constructor
*/
public XMLGridSet(XMLGridSet orig) {
setAlignTopLeft(orig.getAlignTopLeft());
setExtent(orig.getExtent() == null ? null : new BoundingBox(orig.getExtent()));
setResolutions(orig.getResolutions() == null ? null : orig.getResolutions().clone());
setLevels(orig.getLevels());
setScaleDenominators(orig.getScaleDenominators() == null ? null : orig
.getScaleDenominators().clone());
setMetersPerUnit(orig.getMetersPerUnit());
setName(orig.getName());
setDescription(orig.getDescription());
setPixelSize(orig.getPixelSize());
setScaleNames(orig.getScaleNames() == null ? null : orig.getScaleNames().clone());
setSrs(orig.getSrs());
setTileWidth(orig.getTileWidth());
setTileHeight(orig.getTileHeight());
}
/**
* Builds an XMLGridSet from a GridSet
*/
public XMLGridSet(GridSet gset) {
setAlignTopLeft(gset.isTopLeftAligned());
setYCoordinateFirst(gset.isyCoordinateFirst());
setExtent(gset.getOriginalExtent());
setLevels(null);
if (gset.isResolutionsPreserved()) {
setResolutions(resolutions(gset.getGridLevels()));
setScaleDenominators(null);
} else {
setResolutions(null);
setScaleDenominators(scaleDenominators(gset.getGridLevels()));
}
setMetersPerUnit(gset.getMetersPerUnit());
setName(gset.getName());
setDescription(gset.getDescription());
setPixelSize(gset.getPixelSize());
setScaleNames(scaleNames(gset.getGridLevels()));
setSrs(gset.getSrs());
setTileWidth(gset.getTileWidth());
setTileHeight(gset.getTileHeight());
}
private static double[] resolutions(Grid[] grids) {
double[] resolutions = new double[grids.length];
for (int i = 0; i < resolutions.length; i++) {
resolutions[i] = grids[i].getResolution();
}
return resolutions;
}
private static double[] scaleDenominators(Grid[] grids) {
double[] scales = new double[grids.length];
for (int i = 0; i < scales.length; i++) {
scales[i] = grids[i].getScaleDenominator();
}
return scales;
}
private static String[] scaleNames(Grid[] grids) {
String[] scaleNames = new String[grids.length];
for (int i = 0; i < scaleNames.length; i++) {
scaleNames[i] = grids[i].getName();
}
return scaleNames;
}
public String getName() {
return name;
}
/**
* @return the description
*/
public String getDescription() {
return description;
}
/**
* @param description
* the description to set
*/
public void setDescription(String description) {
this.description = description;
}
/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
public GridSet makeGridSet() {
if (getTileWidth() == null) {
setTileWidth(256);
}
if (getTileHeight() == null) {
setTileHeight(256);
}
if (getAlignTopLeft() == null) {
setAlignTopLeft(false);
}
if (getPixelSize() == null) {
setPixelSize(GridSetFactory.DEFAULT_PIXEL_SIZE_METER);
}
if (getYCoordinateFirst() == null) {
setYCoordinateFirst(false);
}
GridSet gridSet;
String name = getName();
SRS srs = getSrs();
BoundingBox extent = getExtent();
Boolean alignTopLeft = getAlignTopLeft();
double[] resolutions = getResolutions();
double[] scaleDenominators = getScaleDenominators();
Double metersPerUnit = getMetersPerUnit();
Double pixelSize = getPixelSize();
String[] scaleNames = getScaleNames();
Integer tileWidth = getTileWidth();
Integer tileHeight = getTileHeight();
Boolean yCoordinateFirst = getYCoordinateFirst();
if (getResolutions() != null || getScaleDenominators() != null) {
gridSet = GridSetFactory.createGridSet(name, srs, extent, alignTopLeft, resolutions,
scaleDenominators, metersPerUnit, pixelSize, scaleNames, tileWidth, tileHeight,
yCoordinateFirst);
} else {
if (getLevels() == null) {
setLevels(18);
}
Integer levels = getLevels();
gridSet = GridSetFactory.createGridSet(name, srs, extent, alignTopLeft, levels,
metersPerUnit, pixelSize, tileWidth, tileHeight, yCoordinateFirst);
}
gridSet.setDescription(getDescription());
return gridSet;
}
/**
* @return the srs
*/
SRS getSrs() {
return srs;
}
/**
* @param srs
* the srs to set
*/
void setSrs(SRS srs) {
this.srs = srs;
}
/**
* @return the extent
*/
public BoundingBox getExtent() {
return extent;
}
/**
* @param extent
* the extent to set
*/
public void setExtent(BoundingBox extent) {
this.extent = extent;
}
/**
* @return the alignTopLeft
*/
public Boolean getAlignTopLeft() {
return alignTopLeft;
}
/**
* @param alignTopLeft
* the alignTopLeft to set
*/
public void setAlignTopLeft(Boolean alignTopLeft) {
this.alignTopLeft = alignTopLeft;
}
/**
* @return the resolutions
*/
public double[] getResolutions() {
return resolutions;
}
/**
* @param resolutions
* the resolutions to set
*/
public void setResolutions(double[] resolutions) {
this.resolutions = resolutions;
}
/**
* @return the scaleDenominators
*/
public double[] getScaleDenominators() {
return scaleDenominators;
}
/**
* @param scaleDenominators
* the scaleDenominators to set
*/
public void setScaleDenominators(double[] scaleDenominators) {
this.scaleDenominators = scaleDenominators;
}
/**
* @return the levels
*/
public Integer getLevels() {
return levels;
}
/**
* @param levels
* the levels to set
*/
public void setLevels(Integer levels) {
this.levels = levels;
}
/**
* @return the metersPerUnit
*/
public Double getMetersPerUnit() {
return metersPerUnit;
}
/**
* @param metersPerUnit
* the metersPerUnit to set
*/
public void setMetersPerUnit(Double metersPerUnit) {
this.metersPerUnit = metersPerUnit;
}
/**
* @return the pixelSize
*/
public Double getPixelSize() {
return pixelSize;
}
/**
* @param pixelSize
* the pixelSize to set
*/
public void setPixelSize(Double pixelSize) {
this.pixelSize = pixelSize;
}
/**
* @return the scaleNames
*/
public String[] getScaleNames() {
return scaleNames;
}
/**
* @param scaleNames
* the scaleNames to set
*/
public void setScaleNames(String[] scaleNames) {
this.scaleNames = scaleNames;
}
/**
* @return the tileHeight
*/
public Integer getTileHeight() {
return tileHeight;
}
/**
* @param tileHeight
* the tileHeight to set
*/
public void setTileHeight(Integer tileHeight) {
this.tileHeight = tileHeight;
}
/**
* @return the tileWidth
*/
public Integer getTileWidth() {
return tileWidth;
}
/**
* @param tileWidth
* the tileWidth to set
*/
public void setTileWidth(Integer tileWidth) {
this.tileWidth = tileWidth;
}
/**
* @return the yCoordinateFirst
*/
public Boolean getYCoordinateFirst() {
return yCoordinateFirst;
}
/**
* @param yCoordinateFirst
* the yCoordinateFirst to set
*/
public void setYCoordinateFirst(Boolean yCoordinateFirst) {
this.yCoordinateFirst = yCoordinateFirst;
}
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}
}