From 2e29f07e09382f5af8b57989b2091baacd0e824a Mon Sep 17 00:00:00 2001 From: Lyn Elisa Goltz Date: Thu, 6 Aug 2026 06:42:56 +0200 Subject: [PATCH] X-5140 - added possibility to retrieve sld values with a SldProvider --- .../deegree/protocol/wms/ops/RequestBase.java | 45 +--------- .../protocol/wms/ops/SldParamRetriever.java | 90 +++++++++++++++++++ .../deegree/protocol/wms/ops/SldProvider.java | 22 +++++ 3 files changed, 115 insertions(+), 42 deletions(-) create mode 100644 deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/SldParamRetriever.java create mode 100644 deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/SldProvider.java diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/RequestBase.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/RequestBase.java index 4b577255199..74f4637611f 100644 --- a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/RequestBase.java +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/RequestBase.java @@ -37,12 +37,8 @@ import static org.deegree.commons.utils.CollectionUtils.unzip; import static org.deegree.commons.utils.MapUtils.DEFAULT_PIXEL_SIZE; import static org.deegree.commons.utils.StringUtils.splitEscaped; -import static org.deegree.protocol.wms.ops.SLDParser.parse; import static org.slf4j.LoggerFactory.getLogger; -import java.io.StringReader; -import java.net.URL; -import java.text.ParseException; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; @@ -50,8 +46,6 @@ import java.util.ListIterator; import java.util.Map; -import javax.xml.stream.XMLInputFactory; - import org.deegree.commons.ows.exception.OWSException; import org.deegree.commons.utils.StringUtils; import org.deegree.commons.utils.Triple; @@ -87,41 +81,8 @@ public List getFilters() { } protected void handleSLD(String sld, String sldBody) throws OWSException { - - XMLInputFactory xmlfac = XMLInputFactory.newInstance(); - Triple, LinkedList, LinkedList> triple = null; - if (sld != null) { - try { - triple = parse(xmlfac.createXMLStreamReader(sld, new URL(sld).openStream()), this); - } - catch (ParseException e) { - LOG.trace("Stack trace:", e); - throw new OWSException( - "The embedded dimension value in the SLD parameter value was invalid: " + e.getMessage(), - "InvalidDimensionValue", "sld"); - } - catch (Throwable e) { - LOG.trace("Stack trace:", e); - throw new OWSException("Error when parsing the SLD parameter: " + e.getMessage(), - "InvalidParameterValue", "sld"); - } - } - if (sldBody != null) { - try { - triple = parse(xmlfac.createXMLStreamReader(new StringReader(sldBody)), this); - } - catch (ParseException e) { - LOG.trace("Stack trace:", e); - throw new OWSException( - "The embedded dimension value in the SLD_BODY parameter value was invalid: " + e.getMessage(), - "InvalidDimensionValue", "sld_body"); - } - catch (Throwable e) { - LOG.trace("Stack trace:", e); - throw new OWSException("Error when parsing the SLD_BODY parameter: " + e.getMessage(), - "InvalidParameterValue", "sld_body"); - } - } + Triple, LinkedList, LinkedList> triple = new SldParamRetriever() + .handleSldParam(sld, sldBody, this); // if layers are referenced, clear the other layers out, else leave all in if (triple != null && !layers.isEmpty()) { @@ -158,7 +119,7 @@ protected void handleSLD(String sld, String sldBody) throws OWSException { } this.styles.clear(); - this.filters = new LinkedList(); + this.filters = new LinkedList<>(); LinkedList tmpLayers = new LinkedList(); diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/SldParamRetriever.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/SldParamRetriever.java new file mode 100644 index 00000000000..865c05ce453 --- /dev/null +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/SldParamRetriever.java @@ -0,0 +1,90 @@ +package org.deegree.protocol.wms.ops; + +import static org.deegree.protocol.wms.ops.SLDParser.parse; +import static org.slf4j.LoggerFactory.getLogger; + +import javax.xml.stream.XMLInputFactory; +import java.io.StringReader; +import java.net.URL; +import java.text.ParseException; +import java.util.LinkedList; +import java.util.ServiceLoader; + +import org.deegree.commons.ows.exception.OWSException; +import org.deegree.commons.utils.Triple; +import org.deegree.filter.OperatorFilter; +import org.deegree.layer.LayerRef; +import org.deegree.style.StyleRef; +import org.slf4j.Logger; + +/** + * @author Lyn Goltz + */ +public class SldParamRetriever { + + private static final Logger LOG = getLogger(SldParamRetriever.class); + + private static final ServiceLoader sldProviderLoader; + + static { + sldProviderLoader = ServiceLoader.load(SldProvider.class); + for (SldProvider sldProvider : sldProviderLoader) { + sldProvider.init(); + } + } + + /** + * @param sld the value of the SLD param, may be null + * @param sldBody the value of the SLD_BODY param, may be null, + * overwrites the sld param value if sld and sldBody are not null + * @param gm the {@link RequestBase} instance, never null + * @return the parsed sld, if sld or sldBody not null, null + * if sld and sldBody are null + * @throws OWSException if sld or sldBody could not be parsed + */ + Triple, LinkedList, LinkedList> handleSldParam(String sld, + String sldBody, RequestBase gm) throws OWSException { + XMLInputFactory xmlfac = XMLInputFactory.newInstance(); + Triple, LinkedList, LinkedList> triple = null; + if (sld != null) { + try { + for (SldProvider sldProvider : sldProviderLoader) { + String sldBodyFromProvider = sldProvider.retrieveSldBody(sld); + if (sldBodyFromProvider != null) + triple = parse(xmlfac.createXMLStreamReader(new StringReader(sldBodyFromProvider)), gm); + } + if (triple == null) + return parse(xmlfac.createXMLStreamReader(sld, new URL(sld).openStream()), gm); + } + catch (ParseException e) { + LOG.trace("Stack trace:", e); + throw new OWSException( + "The embedded dimension value in the SLD parameter value was invalid: " + e.getMessage(), + "InvalidDimensionValue", "sld"); + } + catch (Throwable e) { + LOG.trace("Stack trace:", e); + throw new OWSException("Error when parsing the SLD parameter: " + e.getMessage(), + "InvalidParameterValue", "sld"); + } + } + if (sldBody != null) { + try { + triple = parse(xmlfac.createXMLStreamReader(new StringReader(sldBody)), gm); + } + catch (ParseException e) { + LOG.trace("Stack trace:", e); + throw new OWSException( + "The embedded dimension value in the SLD_BODY parameter value was invalid: " + e.getMessage(), + "InvalidDimensionValue", "sld_body"); + } + catch (Throwable e) { + LOG.trace("Stack trace:", e); + throw new OWSException("Error when parsing the SLD_BODY parameter: " + e.getMessage(), + "InvalidParameterValue", "sld_body"); + } + } + return triple; + } + +} diff --git a/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/SldProvider.java b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/SldProvider.java new file mode 100644 index 00000000000..014f4bec1b5 --- /dev/null +++ b/deegree-core/deegree-core-protocol/deegree-protocol-wms/src/main/java/org/deegree/protocol/wms/ops/SldProvider.java @@ -0,0 +1,22 @@ +package org.deegree.protocol.wms.ops; + +/** + * Implementations of this class provides slds from a passed query sld param. + * + * @author Lyn Goltz + */ +public interface SldProvider { + + /** + * Called once to initialize the SldProvider + */ + void init(); + + /** + * @param sld the value of the sld query param, never null + * @return the content associated to the sld query param, may be null if + * not retrievable or parseable + */ + String retrieveSldBody(String sld); + +}