package org.geowebcache.arcgis.config; import java.io.Reader; import java.util.ArrayList; import org.geowebcache.grid.BoundingBox; import org.geowebcache.io.GeoWebCacheXStream; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.security.NoTypePermission; import com.thoughtworks.xstream.security.PrimitiveTypePermission; /** * Loads {@link CacheInfo} objects from ArcGIS Server tile cache's {@code conf.xml} files. * * @author Gabriel Roldan * */ public class CacheInfoPersister { public CacheInfo load(final Reader reader) { XStream xs = getConfiguredXStream(); CacheInfo ci = (CacheInfo) xs.fromXML(reader); return ci; } XStream getConfiguredXStream() { XStream xs = new GeoWebCacheXStream(); // Allow anything that's part of GWC // TODO: replace this with a more narrow whitelist xs.allowTypesByWildcard(new String[]{"org.geowebcache.**"}); xs.setMode(XStream.NO_REFERENCES); xs.alias("SpatialReference", SpatialReference.class); xs.alias("TileOrigin", TileOrigin.class); xs.alias("TileCacheInfo", TileCacheInfo.class); xs.aliasField("SpatialReference", TileCacheInfo.class, "spatialReference"); xs.aliasField("TileOrigin", TileCacheInfo.class, "tileOrigin"); xs.aliasField("TileCols", TileCacheInfo.class, "tileCols"); xs.aliasField("TileRows", TileCacheInfo.class, "tileRows"); xs.aliasField("LODInfos", TileCacheInfo.class, "lodInfos"); xs.alias("LODInfos", new ArrayList<LODInfo>().getClass()); xs.alias("LODInfo", LODInfo.class); xs.aliasField("LevelID", LODInfo.class, "levelID"); xs.aliasField("Scale", LODInfo.class, "scale"); xs.aliasField("Resolution", LODInfo.class, "resolution"); xs.alias("TileImageInfo", TileImageInfo.class); xs.aliasField("CacheTileFormat", TileImageInfo.class, "cacheTileFormat"); xs.aliasField("CompressionQuality", TileImageInfo.class, "compressionQuality"); xs.aliasField("Antialiasing", TileImageInfo.class, "antialiasing"); xs.alias("CacheStorageInfo", CacheStorageInfo.class); xs.aliasField("StorageFormat", CacheStorageInfo.class, "storageFormat"); xs.aliasField("PacketSize", CacheStorageInfo.class, "packetSize"); xs.alias("CacheInfo", CacheInfo.class); xs.aliasField("TileCacheInfo", CacheInfo.class, "tileCacheInfo"); xs.aliasField("TileImageInfo", CacheInfo.class, "tileImageInfo"); xs.aliasField("CacheStorageInfo", CacheInfo.class, "cacheStorageInfo"); xs.alias("EnvelopeN", EnvelopeN.class); xs.aliasField("XMin", EnvelopeN.class, "xmin"); xs.aliasField("YMin", EnvelopeN.class, "ymin"); xs.aliasField("XMax", EnvelopeN.class, "xmax"); xs.aliasField("YMax", EnvelopeN.class, "ymax"); xs.aliasField("SpatialReference", EnvelopeN.class, "spatialReference"); return xs; } public BoundingBox parseLayerBounds(final Reader layerBoundsFile) { EnvelopeN envN = (EnvelopeN) getConfiguredXStream().fromXML(layerBoundsFile); BoundingBox bbox = new BoundingBox(envN.getXmin(), envN.getYmin(), envN.getXmax(), envN.getYmax()); return bbox; } }