/* Copyright (c) 2011 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.wms;
import java.util.List;
import com.vividsolutions.jts.geom.Geometry;
import org.geoserver.catalog.AttributeTypeInfo;
import org.geoserver.catalog.CoverageInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.LayerInfo;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.impl.AbstractCatalogValidator;
import org.geotools.factory.GeoTools;
/**
* Configuration validator for Web Map Service.
*
* @author David Winslow, OpenGeo
*/
public class WMSValidator extends AbstractCatalogValidator {
public void validate(LayerInfo lyr, boolean isNew) {
if (lyr.isEnabled() == false) {
// short-circuit - for disabled layers we don't need to validate
// anything because it won't cause service exceptions for anyone
return;
}
if (
lyr.getResource() == null ||
(hasGeometry(lyr) &&
(lyr.getResource().getSRS() == null ||
lyr.getResource().getLatLonBoundingBox() == null))
) throw new RuntimeException( "Layer's resource is not fully configured");
// Resource-dependent checks
if (lyr.getType() == LayerInfo.Type.RASTER) {
if (!(lyr.getResource() instanceof CoverageInfo))
throw new RuntimeException("Layer with type RASTER doesn't have a coverage associated");
CoverageInfo cvinfo = (CoverageInfo) lyr.getResource();
try {
cvinfo.getCatalog().getResourcePool().getGridCoverageReader(
cvinfo.getStore(),
GeoTools.getDefaultHints()
);
} catch (Throwable t) {
throw new RuntimeException("Couldn't connect to raster layer's resource");
}
} else if (lyr.getType() == LayerInfo.Type.VECTOR) {
if (!(lyr.getResource() instanceof FeatureTypeInfo))
throw new RuntimeException("Layer with type VECTOR doesn't have a featuretype associated");
FeatureTypeInfo ftinfo = (FeatureTypeInfo) lyr.getResource();
} else throw new RuntimeException("Layer is neither RASTER nor VECTOR type");
// Style-dependent checks
if (hasGeometry(lyr) &&
(lyr.getDefaultStyle() == null || lyr.getStyles().contains(null))
) throw new RuntimeException("Layer has null styles!");
}
private static boolean hasGeometry(LayerInfo lyr) {
if (lyr.getResource() instanceof CoverageInfo) return true;
if (lyr.getResource() instanceof FeatureTypeInfo) {
for (AttributeTypeInfo att : ((FeatureTypeInfo)lyr.getResource()).getAttributes()) {
if (Geometry.class.isAssignableFrom(att.getBinding())) {
return true;
}
}
}
return false;
}
}