/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.wms.capabilities.deegree;
import java.util.ArrayList;
import java.util.List;
import de.cismet.cismap.commons.wms.capabilities.Envelope;
import de.cismet.cismap.commons.wms.capabilities.Layer;
import de.cismet.cismap.commons.wms.capabilities.LayerBoundingBox;
import de.cismet.cismap.commons.wms.capabilities.Style;
import de.cismet.cismap.commons.wms.capabilities.WMSCapabilities;
/**
* DOCUMENT ME!
*
* @author therter
* @version $Revision$, $Date$
*/
public class DeegreeLayer implements Layer {
//~ Instance fields --------------------------------------------------------
private org.deegree.ogcwebservices.wms.capabilities.Layer layer;
private WMSCapabilities capabilities;
private String filterString;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new DeegreeLayer object.
*
* @param layer DOCUMENT ME!
* @param capabilities DOCUMENT ME!
*/
public DeegreeLayer(final org.deegree.ogcwebservices.wms.capabilities.Layer layer,
final WMSCapabilities capabilities) {
this.layer = layer;
this.capabilities = capabilities;
}
//~ Methods ----------------------------------------------------------------
@Override
public String getTitle() {
return layer.getTitle();
}
@Override
public String getName() {
return layer.getName();
}
@Override
public String getAbstract() {
return layer.getAbstract();
}
@Override
public String[] getKeywords() {
return layer.getKeywordList();
}
@Override
public boolean isQueryable() {
return layer.isQueryable();
}
@Override
public boolean isSrsSupported(final String srs) {
return layer.isSrsSupported(srs);
}
@Override
public String[] getSrs() {
return layer.getSrs();
}
/**
* DOCUMENT ME!
*
* @return the scale hint not the scale denominator regardless of the service version
*/
@Override
public double getScaleDenominationMax() {
if (layer.getScaleHint() != null) {
final double maxScaleHint = layer.getScaleHint().getMax();
if (capabilities != null) {
final String version = capabilities.getVersion();
if (((version != null) && version.trim().equals("1.3")) || version.trim().equals("1.3.0")) {
// version 1.3 uses a scaleDenominator instead of a scaleHint
// See http://wiki.deegree.org/deegreeWiki/HowToUseScaleHintAndScaleDenominator
final double pixelwidth = maxScaleHint * 0.00028;
return Math.sqrt(pixelwidth * pixelwidth * 2);
}
}
return maxScaleHint;
} else {
return 0;
}
}
/**
* DOCUMENT ME!
*
* @return the scale hint not the scale denominator regardless of the service version
*/
@Override
public double getScaleDenominationMin() {
if (layer.getScaleHint() != null) {
final double minScaleHint = layer.getScaleHint().getMin();
if (capabilities != null) {
final String version = capabilities.getVersion();
if (((version != null) && version.trim().equals("1.3")) || version.trim().equals("1.3.0")) {
// version 1.3 uses a scaleDenominator instead of a scaleHint.
// See http://wiki.deegree.org/deegreeWiki/HowToUseScaleHintAndScaleDenominator
final double pixelwidth = minScaleHint * 0.00028;
return Math.sqrt(pixelwidth * pixelwidth * 2);
}
}
return minScaleHint;
} else {
return 0;
}
}
@Override
public Style getStyleResource(final String name) {
return new DeegreeStyle(layer.getStyleResource(name));
}
@Override
public Style[] getStyles() {
if (layer.getStyles() == null) {
return null;
}
final org.deegree.ogcwebservices.wms.capabilities.Style[] deegreeStyles = layer.getStyles();
final Style[] result = new Style[deegreeStyles.length];
for (int i = 0; i < deegreeStyles.length; ++i) {
result[i] = new DeegreeStyle(deegreeStyles[i]);
}
return result;
}
@Override
public Layer[] getChildren() {
if (layer.getLayer() == null) {
return null;
}
final org.deegree.ogcwebservices.wms.capabilities.Layer[] deegreeLayer = layer.getLayer();
final List<Layer> result = new ArrayList<Layer>();
for (int i = 0; i < deegreeLayer.length; ++i) {
if ((filterString == null) || fulfilFilterRequirements(deegreeLayer[i])) {
final Layer l = new DeegreeLayer(deegreeLayer[i], capabilities);
l.setFilterString(filterString);
result.add(l);
}
}
return result.toArray(new Layer[result.size()]);
}
/**
* DOCUMENT ME!
*
* @param l DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private boolean fulfilFilterRequirements(final org.deegree.ogcwebservices.wms.capabilities.Layer l) {
if (((l.getTitle().toLowerCase().indexOf(filterString.toLowerCase()) != -1)
|| containsFilterString(l.getKeywordList()))
&& (l.getLayer().length == 0)) {
return true;
} else {
final org.deegree.ogcwebservices.wms.capabilities.Layer[] children = l.getLayer();
for (int i = 0; i < children.length; ++i) {
if (fulfilFilterRequirements(children[i])) {
return true;
}
}
}
return false;
}
/**
* DOCUMENT ME!
*
* @param keywords DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private boolean containsFilterString(final String[] keywords) {
if (keywords != null) {
for (final String tmp : keywords) {
if ((tmp != null) && (tmp.toLowerCase().indexOf(filterString.toLowerCase()) != -1)) {
return true;
}
}
}
return false;
}
@Override
public LayerBoundingBox[] getBoundingBoxes() {
if (this.layer.getBoundingBoxes() == null) {
return null;
}
final org.deegree.ogcwebservices.wms.capabilities.LayerBoundingBox[] origBoxes = layer.getBoundingBoxes();
final LayerBoundingBox[] boxes = new LayerBoundingBox[origBoxes.length];
for (int i = 0; i < origBoxes.length; ++i) {
boxes[i] = new DeegreeLayerBoundingBox(origBoxes[i]);
}
return boxes;
}
@Override
public Envelope getLatLonBoundingBoxes() {
if (this.layer.getLatLonBoundingBox() == null) {
return null;
}
return new DeegreeEnvelope(this.layer.getLatLonBoundingBox());
}
@Override
public void setFilterString(final String filterString) {
this.filterString = filterString;
}
@Override
public WMSCapabilities getCapabilities() {
return capabilities;
}
@Override
public void setCapabilities(final WMSCapabilities capabilities) {
this.capabilities = capabilities;
}
}