diff --git a/control-base/src/main/java/org/oskari/control/layer/DescribeLayerHandler.java b/control-base/src/main/java/org/oskari/control/layer/DescribeLayerHandler.java index dfd187126..bbc431616 100644 --- a/control-base/src/main/java/org/oskari/control/layer/DescribeLayerHandler.java +++ b/control-base/src/main/java/org/oskari/control/layer/DescribeLayerHandler.java @@ -30,10 +30,10 @@ import org.oskari.permissions.PermissionService; import java.util.*; +import java.util.stream.Collectors; import static fi.nls.oskari.control.ActionConstants.PARAM_ID; import static fi.nls.oskari.control.ActionConstants.PARAM_SRS; -import static fi.nls.oskari.domain.map.OskariLayer.TYPE_WFS; /** * An action route that returns metadata for layers @@ -43,6 +43,7 @@ public class DescribeLayerHandler extends RestActionHandler { private PermissionHelper permissionHelper; private final ObjectMapper MAPPER = new ObjectMapper(); + private Set preferredSRS; private static final Logger LOG = LogFactory.getLogger(DescribeLayerHandler.class); @Override @@ -233,10 +234,7 @@ private Map getCapabilitiesJSON(OskariLayer layer, String crs) t try { String capsJSON = layer.getCapabilities().toString(); LayerCapabilitiesWMTS caps = CapabilitiesService.fromJSON(layer.getCapabilities().toString(), OskariLayer.TYPE_WMTS); - TileMatrixLink link = caps.getTileMatrixLinks().stream() - .filter(l -> crs.equals(l.getTileMatrixSet().getShortCrs())) - .findFirst() - .orElseThrow(() -> new ActionParamsException("No tilematrix matching srs: " + crs)); + TileMatrixLink link = determineTileMatrix(caps, crs); // Make a copy so we don't mutate layer in cache JSONObject modifiedCapabilities = new JSONObject(capsJSON); @@ -248,4 +246,42 @@ private Map getCapabilitiesJSON(OskariLayer layer, String crs) t throw new ActionParamsException("Unable to parse JSON", e); } } + + private TileMatrixLink determineTileMatrix(LayerCapabilitiesWMTS caps, String crs) throws ActionException { + TileMatrixLink link = caps.getTileMatrixLinks().stream() + .filter(l -> crs.equals(l.getTileMatrixSet().getShortCrs())) + .findFirst() + .orElse(null); + if (link != null) { + // happy case, we found a matching tilematrix for projection + return link; + } + // set of srs that layer supports + Set supportedSRS = caps.getTileMatrixLinks().stream() + .map(l -> l.getTileMatrixSet().getShortCrs()) + .collect(Collectors.toSet()); + // first of preferred srs that layer supports + Set prefSRS = getPreferredSRS(); + String matchedSRS = prefSRS.stream() + .filter(srs -> supportedSRS.contains(srs)) + .findFirst() + .orElseThrow(() -> new ActionParamsException("None of preferred SRS (" + LOG.getAsString(prefSRS) + ") supported by layer: " + LOG.getAsString(supportedSRS))); + + return caps.getTileMatrixLinks().stream() + .filter(l -> matchedSRS.equals(l.getTileMatrixSet().getShortCrs())) + .findFirst() + .orElseThrow(() -> new ActionParamsException("No tilematrix matching srs: " + matchedSRS)); + } + + private Set getPreferredSRS() { + if (preferredSRS == null) { + preferredSRS = new HashSet<>(5); + String nativeCRS = PropertyUtil.get("oskari.native.srs", "EPSG:3857"); + preferredSRS.add(nativeCRS); + preferredSRS.add("EPSG:3857"); + preferredSRS.add("EPSG:4326"); + preferredSRS.add("EPSG:900913"); + } + return preferredSRS; + } }