Skip to content

Instantly share code, notes, and snippets.

@fvanderbiest
Last active December 18, 2015 19:09
Show Gist options
  • Save fvanderbiest/5831034 to your computer and use it in GitHub Desktop.
Save fvanderbiest/5831034 to your computer and use it in GitHub Desktop.
GeoServer WMS opaque layer property support
diff --git a/src/main/src/main/java/org/geoserver/catalog/LayerInfo.java b/src/main/src/main/java/org/geoserver/catalog/LayerInfo.java
index 995810c..4852912 100644
--- a/src/main/src/main/java/org/geoserver/catalog/LayerInfo.java
+++ b/src/main/src/main/java/org/geoserver/catalog/LayerInfo.java
@@ -161,7 +161,7 @@ public interface LayerInfo extends PublishedInfo {
/**
* Sets the queryable status
- *
+ *
* @param {@code true} to set this Layer as queryable and subject of GetFeatureInfo requests,
* {@code false} to make the layer not queryable.
*/
@@ -176,6 +176,22 @@ public interface LayerInfo extends PublishedInfo {
boolean isQueryable();
/**
+ * Sets the opaque status
+ *
+ * @param {@code true} to set this Layer as opaque,
+ * {@code false} to make the layer not opaque.
+ */
+ void setOpaque(boolean opaque);
+
+ /**
+ * Whether the layer is opaque
+ * <p>
+ * Defaults to {@code false}
+ * </p>
+ */
+ boolean isOpaque();
+
+ /**
* Gets the attribution information for this layer.
*
* @return an AttributionInfo instance with the layer's attribution information.
diff --git a/src/main/src/main/java/org/geoserver/catalog/impl/LayerInfoImpl.java b/src/main/src/main/java/org/geoserver/catalog/impl/LayerInfoImpl.java
index 5eab4a9..07e7ee0 100644
--- a/src/main/src/main/java/org/geoserver/catalog/impl/LayerInfoImpl.java
+++ b/src/main/src/main/java/org/geoserver/catalog/impl/LayerInfoImpl.java
@@ -58,6 +58,8 @@ public class LayerInfoImpl implements LayerInfo {
protected Boolean queryable;
+ protected Boolean opaque;
+
protected MetadataMap metadata = new MetadataMap();
protected AttributionInfo attribution;
@@ -334,6 +336,16 @@ public class LayerInfoImpl implements LayerInfo {
}
@Override
+ public void setOpaque(boolean opaque) {
+ this.opaque = opaque;
+ }
+
+ @Override
+ public boolean isOpaque() {
+ return this.opaque == null? false : this.opaque.booleanValue();
+ }
+
+ @Override
public boolean isAdvertised() {
if(this.advertised != null) {
return advertised;
diff --git a/src/main/src/main/java/org/geoserver/security/decorators/DecoratingLayerInfo.java b/src/main/src/main/java/org/geoserver/security/decorators/DecoratingLayerInfo.java
index ef41593..96eb04e 100644
--- a/src/main/src/main/java/org/geoserver/security/decorators/DecoratingLayerInfo.java
+++ b/src/main/src/main/java/org/geoserver/security/decorators/DecoratingLayerInfo.java
@@ -127,13 +127,20 @@ public class DecoratingLayerInfo extends AbstractDecorator<LayerInfo> implements
public void setQueryable(boolean _queryableEnabled) {
delegate.setQueryable(_queryableEnabled);
-
}
public boolean isQueryable() {
return delegate.isQueryable();
}
+ public void setOpaque(boolean _opaqueEnabled) {
+ delegate.setOpaque(_opaqueEnabled);
+ }
+
+ public boolean isOpaque() {
+ return delegate.isOpaque();
+ }
+
@Override
public boolean isAdvertised() {
return delegate.isAdvertised();
diff --git a/src/web/wms/src/main/java/org/geoserver/wms/web/publish/WMSLayerConfig.html b/src/web/wms/src/main/java/org/geoserver/wms/web/publish/WMSLayerConfig.html
index cde4cb9..30bd32d 100644
--- a/src/web/wms/src/main/java/org/geoserver/wms/web/publish/WMSLayerConfig.html
+++ b/src/web/wms/src/main/java/org/geoserver/wms/web/publish/WMSLayerConfig.html
@@ -13,6 +13,12 @@
<label for="queryableEnabled" class="choice"><wicket:message key="queryable">Queryable</wicket:message></label>
</li>
</ul>
+ <ul>
+ <li>
+ <input id="opaqueEnabled" class="field checkbox" type="checkbox" wicket:id="opaqueEnabled"></input>
+ <label for="opaqueEnabled" class="choice"><wicket:message key="opaque">Opaque</wicket:message></label>
+ </li>
+ </ul>
<ul wicket:id="styles">
<li>
<label for="defaultStyle"><wicket:message key="defaultStyle">Default Style</wicket:message></label>
diff --git a/src/web/wms/src/main/java/org/geoserver/wms/web/publish/WMSLayerConfig.java b/src/web/wms/src/main/java/org/geoserver/wms/web/publish/WMSLayerConfig.java
index 1582543..c04599a 100644
--- a/src/web/wms/src/main/java/org/geoserver/wms/web/publish/WMSLayerConfig.java
+++ b/src/web/wms/src/main/java/org/geoserver/wms/web/publish/WMSLayerConfig.java
@@ -37,6 +37,7 @@ public class WMSLayerConfig extends LayerConfigurationPanel {
super(id, layerModel);
add(new CheckBox("queryableEnabled", new PropertyModel(layerModel,"queryable")));
+ add(new CheckBox("opaqueEnabled", new PropertyModel(layerModel,"opaque")));
// styles block container
WebMarkupContainer styleContainer = new WebMarkupContainer("styles");
diff --git a/src/web/wms/src/main/resources/GeoServerApplication.properties b/src/web/wms/src/main/resources/GeoServerApplication.properties
index d0e7f94..c594dce 100644
--- a/src/web/wms/src/main/resources/GeoServerApplication.properties
+++ b/src/web/wms/src/main/resources/GeoServerApplication.properties
@@ -102,6 +102,7 @@ WMSLayerConfig.defaultTitle = WMS Settings
WMSLayerConfig.defaultWmsPath = Default WMS Path
WMSLayerConfig.defaultRenderingBuffer = Default Rendering Buffer
WMSLayerConfig.queryable = Queryable
+WMSLayerConfig.opaque = Opaque
WMSLayerConfig.layerIdentifier = Layer Identifier
LayerAuthoritiesAndIdentifiersPanel.authorityURLs = Authority URLs for this WMS Layer
diff --git a/src/wms/src/main/java/org/geoserver/wms/WMS.java b/src/wms/src/main/java/org/geoserver/wms/WMS.java
index 1b66275..8ffc364 100644
--- a/src/wms/src/main/java/org/geoserver/wms/WMS.java
+++ b/src/wms/src/main/java/org/geoserver/wms/WMS.java
@@ -756,6 +756,13 @@ public class WMS implements ApplicationContextAware {
}
}
+ /**
+ * Returns true if the layer is opaque
+ */
+ public boolean isOpaque(LayerInfo layer) {
+ return layer.isOpaque();
+ }
+
public Integer getCascadedHopCount(LayerInfo layer) {
if (!(layer.getResource() instanceof WMSLayerInfo)) {
return null;
diff --git a/src/wms/src/main/java/org/geoserver/wms/capabilities/Capabilities_1_3_0_Transformer.java b/src/wms/src/main/java/org/geoserver/wms/capabilities/Capabilities_1_3_0_Transformer.java
index 90e6c9a..6c9eb07 100644
--- a/src/wms/src/main/java/org/geoserver/wms/capabilities/Capabilities_1_3_0_Transformer.java
+++ b/src/wms/src/main/java/org/geoserver/wms/capabilities/Capabilities_1_3_0_Transformer.java
@@ -881,6 +881,8 @@ public class Capabilities_1_3_0_Transformer extends TransformerBase {
protected void handleLayer(final LayerInfo layer) {
boolean queryable = wmsConfig.isQueryable(layer);
AttributesImpl qatts = attributes("queryable", queryable ? "1" : "0");
+ boolean opaque = wmsConfig.isOpaque(layer);
+ qatts.addAttribute("", "opaque", "opaque", "", opaque ? "1" : "0");
Integer cascadedHopCount = wmsConfig.getCascadedHopCount(layer);
if (cascadedHopCount != null) {
qatts.addAttribute("", "cascaded", "cascaded", "", String.valueOf(cascadedHopCount));
diff --git a/src/wms/src/main/java/org/geoserver/wms/capabilities/GetCapabilitiesTransformer.java b/src/wms/src/main/java/org/geoserver/wms/capabilities/GetCapabilitiesTransformer.java
index 71cc584..1592a8f 100644
--- a/src/wms/src/main/java/org/geoserver/wms/capabilities/GetCapabilitiesTransformer.java
+++ b/src/wms/src/main/java/org/geoserver/wms/capabilities/GetCapabilitiesTransformer.java
@@ -836,6 +836,8 @@ public class GetCapabilitiesTransformer extends TransformerBase {
AttributesImpl qatts = new AttributesImpl();
boolean queryable = wmsConfig.isQueryable(layer);
qatts.addAttribute("", "queryable", "queryable", "", queryable ? "1" : "0");
+ boolean opaque = wmsConfig.isOpaque(layer);
+ qatts.addAttribute("", "opaque", "opaque", "", opaque ? "1" : "0");
Integer cascaded = wmsConfig.getCascadedHopCount(layer);
if (cascaded != null) {
qatts.addAttribute("", "cascaded", "cascaded", "", String.valueOf(cascaded));
diff --git a/src/wms/src/test/java/org/geoserver/wms/wms_1_1_1/CapabilitiesTest.java b/src/wms/src/test/java/org/geoserver/wms/wms_1_1_1/CapabilitiesTest.java
index 82329f8..666b90d 100644
--- a/src/wms/src/test/java/org/geoserver/wms/wms_1_1_1/CapabilitiesTest.java
+++ b/src/wms/src/test/java/org/geoserver/wms/wms_1_1_1/CapabilitiesTest.java
@@ -313,7 +313,7 @@ public class CapabilitiesTest extends WMSTestSupport {
assertXpathEvaluatesTo("__fax", cinfo + "ContactFacsimileTelephone", doc);
assertXpathEvaluatesTo("e@mail", cinfo + "ContactElectronicMailAddress", doc);
}
-
+
@Test
public void testQueryable() throws Exception{
LayerInfo lines = getCatalog().getLayerByName(MockData.LINES.getLocalPart());
@@ -325,7 +325,7 @@ public class CapabilitiesTest extends WMSTestSupport {
String linesName = MockData.LINES.getPrefix() + ":" + MockData.LINES.getLocalPart();
String pointsName = MockData.POINTS.getPrefix() + ":" + MockData.POINTS.getLocalPart();
-
+
Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.1.1", true);
// print(doc);
@@ -333,4 +333,21 @@ public class CapabilitiesTest extends WMSTestSupport {
assertXpathEvaluatesTo("0", "//Layer[Name='" + pointsName + "']/@queryable", doc);
}
+ @Test
+ public void testOpaque() throws Exception{
+ LayerInfo lines = getCatalog().getLayerByName(MockData.LINES.getLocalPart());
+ lines.setOpaque(true);
+ getCatalog().save(lines);
+ LayerInfo points = getCatalog().getLayerByName(MockData.POINTS.getLocalPart());
+ points.setOpaque(false);
+ getCatalog().save(points);
+
+ String linesName = MockData.LINES.getPrefix() + ":" + MockData.LINES.getLocalPart();
+ String pointsName = MockData.POINTS.getPrefix() + ":" + MockData.POINTS.getLocalPart();
+
+ Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.1.1", true);
+
+ assertXpathEvaluatesTo("1", "//Layer[Name='" + linesName + "']/@opaque", doc);
+ assertXpathEvaluatesTo("0", "//Layer[Name='" + pointsName + "']/@opaque", doc);
+ }
}
diff --git a/src/wms/src/test/java/org/geoserver/wms/wms_1_3/CapabilitiesIntegrationTest.java b/src/wms/src/test/java/org/geoserver/wms/wms_1_3/CapabilitiesIntegrationTest.java
index 5d881fd..96cfcc5 100644
--- a/src/wms/src/test/java/org/geoserver/wms/wms_1_3/CapabilitiesIntegrationTest.java
+++ b/src/wms/src/test/java/org/geoserver/wms/wms_1_3/CapabilitiesIntegrationTest.java
@@ -344,6 +344,24 @@ public class CapabilitiesIntegrationTest extends WMSTestSupport {
assertXpathEvaluatesTo("1", "//wms:Layer[wms:Name='" + linesName + "']/@queryable", doc);
assertXpathEvaluatesTo("0", "//wms:Layer[wms:Name='" + pointsName + "']/@queryable", doc);
}
+
+ @org.junit.Test
+ public void testOpaque() throws Exception {
+ LayerInfo lines = getCatalog().getLayerByName(MockData.LINES.getLocalPart());
+ lines.setOpaque(true);
+ getCatalog().save(lines);
+ LayerInfo points = getCatalog().getLayerByName(MockData.POINTS.getLocalPart());
+ points.setOpaque(false);
+ getCatalog().save(points);
+
+ String linesName = MockData.LINES.getPrefix() + ":" + MockData.LINES.getLocalPart();
+ String pointsName = MockData.POINTS.getPrefix() + ":" + MockData.POINTS.getLocalPart();
+
+ Document doc = getAsDOM("wms?service=WMS&request=getCapabilities&version=1.3.0", true);
+
+ assertXpathEvaluatesTo("1", "//wms:Layer[wms:Name='" + linesName + "']/@opaque", doc);
+ assertXpathEvaluatesTo("0", "//wms:Layer[wms:Name='" + pointsName + "']/@opaque", doc);
+ }
@org.junit.Test
public void testKeywordVocab() throws Exception {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment