/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.wicket.ResourceReference;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.LayerInfo.Type;
import org.geoserver.web.CatalogIconFactory;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.wms.DefaultWebMapService;
import org.geoserver.wms.MapLayerInfo;
import org.geoserver.wms.WMS;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.gml2.bindings.GML2EncodingUtils;
import org.geotools.util.logging.Logging;
import org.vfny.geoserver.wms.requests.GetMapRequest;
import com.vividsolutions.jts.geom.Envelope;
/**
* A model class for the UI, hides the difference between simple layers and
* groups, centralizes the computation of a valid preview request
*/
public class PreviewLayer {
static final Logger LOGGER = Logging.getLogger(PreviewLayer.class);
public enum PreviewLayerType {
Raster, Vector, Remote, Group
};
LayerInfo layerInfo;
LayerGroupInfo groupInfo;
transient GetMapRequest request;
public PreviewLayer(LayerInfo layerInfo) {
this.layerInfo = layerInfo;
}
public PreviewLayer(LayerGroupInfo groupInfo) {
this.groupInfo = groupInfo;
}
public String getName() {
if (layerInfo != null) {
return layerInfo.getResource().getPrefixedName();
} else {
return groupInfo.getName();
}
}
public ResourceReference getIcon() {
if(layerInfo != null)
return CatalogIconFactory.get().getSpecificLayerIcon(layerInfo);
else
return CatalogIconFactory.GROUP_ICON;
}
public ResourceReference getTypeSpecificIcon() {
if(layerInfo != null)
return CatalogIconFactory.get().getSpecificLayerIcon(layerInfo);
else
return CatalogIconFactory.GROUP_ICON;
}
public String getTitle() {
if(layerInfo != null)
return layerInfo.getResource().getTitle();
else
return "";
}
public String getAbstract() {
if(layerInfo != null)
return layerInfo.getResource().getAbstract();
else
return "";
}
public String getKeywords() {
if(layerInfo != null)
return layerInfo.getResource().getKeywords().toString();
else
return "";
}
public PreviewLayer.PreviewLayerType getType() {
if (layerInfo != null) {
if (layerInfo.getType() == Type.RASTER)
return PreviewLayerType.Raster;
else if (layerInfo.getType() == Type.VECTOR)
return PreviewLayerType.Vector;
else
return PreviewLayerType.Remote;
} else {
return PreviewLayerType.Group;
}
}
/**
* Builds a fake GetMap request
*
* @param prefixedName
* @return
*/
GetMapRequest getRequest() {
if (request == null) {
GeoServerApplication app = GeoServerApplication.get();
request = new GetMapRequest(new WMS(app.getGeoServer()));
Catalog catalog = app.getCatalog();
List<MapLayerInfo> layers = expandLayers(catalog);
request.setLayers(layers.toArray(new MapLayerInfo[layers.size()]));
request.setFormat("application/openlayers");
// in the case of groups we already know about the envelope and the target SRS
if(groupInfo != null) {
ReferencedEnvelope bounds = groupInfo.getBounds();
request.setBbox(bounds);
String epsgCode = GML2EncodingUtils.epsgCode(bounds.getCoordinateReferenceSystem());
if(epsgCode != null)
request.setSRS("EPSG:" + epsgCode);
}
try {
DefaultWebMapService.autoSetBoundsAndSize(request);
} catch (Exception e) {
LOGGER.log(Level.INFO,
"Could not set figure out automatically a good preview link for "
+ getName(), e);
}
}
return request;
}
/**
* Expands the specified name into a list of layer info names
*
* @param name
* @param catalog
* @return
*/
private List<MapLayerInfo> expandLayers(Catalog catalog) {
List<MapLayerInfo> layers = new ArrayList<MapLayerInfo>();
if (layerInfo != null) {
layers.add(new MapLayerInfo(layerInfo));
} else {
for (LayerInfo l : groupInfo.getLayers()) {
layers.add(new MapLayerInfo(l));
}
}
return layers;
}
/**
* Given a request and a target format, builds the WMS request
*
* @param request
* @param string
* @return
*/
public String getWmsLink() {
GetMapRequest request = getRequest();
final Envelope bbox = request.getBbox();
if (bbox == null)
return null;
return "../wms?service=WMS&version=1.1.0&request=GetMap" //
+ "&layers=" + getName() //
+ "&styles=" //
+ "&bbox=" + bbox.getMinX() + "," + bbox.getMinY() //
+ "," + bbox.getMaxX() + "," + bbox.getMaxY() //
+ "&width=" + request.getWidth() //
+ "&height=" + request.getHeight() + "&srs=" + request.getSRS();
}
}