diff --git a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACCollectionParser.java b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACCollectionParser.java index 136877e8d..e243998a5 100644 --- a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACCollectionParser.java +++ b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACCollectionParser.java @@ -1,5 +1,9 @@ package org.integratedmodelling.klab.stac; +import org.integratedmodelling.klab.exceptions.KlabResourceAccessException; + +import kong.unirest.HttpResponse; +import kong.unirest.JsonNode; import kong.unirest.Unirest; import kong.unirest.json.JSONObject; @@ -21,8 +25,9 @@ private static JSONObject readAssets(JSONObject items) { * @param catalogUrl endpoint of the catalog * @param collectionId id of the collection * @return The asset list as a JSON + * @throws KlabResourceAccessException */ - public static JSONObject readAssets(String catalogUrl, String collectionId) { + public static JSONObject readAssets(String catalogUrl, String collectionId) throws KlabResourceAccessException { JSONObject assets; JSONObject collectionData = Unirest.get(catalogUrl + "/collections/" + collectionId) .asJson().getBody().getObject(); @@ -32,8 +37,11 @@ public static JSONObject readAssets(String catalogUrl, String collectionId) { if (collectionData.has("item_assets")) { assets = STACCollectionParser.readItemAssets(collectionData); } else { - JSONObject itemsData = Unirest.get(catalogUrl + "/collections/" + collectionId + "/items") - .asJson().getBody().getObject(); + HttpResponse response = Unirest.get(catalogUrl + "/collections/" + collectionId + "/items").asJson(); + if (!response.isSuccess()) { + throw new KlabResourceAccessException("Cannot read items at " + catalogUrl + "/collections/" + collectionId + "/items"); + } + JSONObject itemsData = response.getBody().getObject(); assets = STACCollectionParser.readAssets(itemsData); } return assets; diff --git a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java index 9195b826f..4f2da62ee 100644 --- a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java +++ b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACEncoder.java @@ -36,6 +36,7 @@ import org.integratedmodelling.klab.components.time.extents.TimeInstant; import org.integratedmodelling.klab.exceptions.KlabContextualizationException; import org.integratedmodelling.klab.exceptions.KlabIllegalStateException; +import org.integratedmodelling.klab.exceptions.KlabInternalErrorException; import org.integratedmodelling.klab.ogc.STACAdapter; import org.integratedmodelling.klab.raster.files.RasterEncoder; import org.integratedmodelling.klab.scale.Scale; @@ -98,26 +99,36 @@ private Time refitTime(Time contextTime, Time resourceTime) { throw new KlabContextualizationException("Current observation is outside the bounds of the STAC resource and cannot be reffitted."); } - private HMRaster.MergeMode chooseMergeMode(IObservable targetSemantics) { + private HMRaster.MergeMode chooseMergeMode(IObservable targetSemantics, IMonitor monitor) { if (targetSemantics == null) { + monitor.debug("Using average as merge mode"); return HMRaster.MergeMode.AVG; } switch(targetSemantics.getArtifactType()) { case CONCEPT: case BOOLEAN: + monitor.debug("Using substitute as merge mode"); return HMRaster.MergeMode.SUBSTITUTE; case NUMBER: - return Observables.INSTANCE.isExtensive(targetSemantics) ? HMRaster.MergeMode.SUM : HMRaster.MergeMode.SUBSTITUTE; + if (Observables.INSTANCE.isExtensive(targetSemantics)) { + monitor.debug("Using sum as merge mode"); + return HMRaster.MergeMode.SUM; + } + monitor.debug("Using substitute as merge mode"); + return HMRaster.MergeMode.SUBSTITUTE; default: + monitor.debug("Defaulting to average as merge mode"); return HMRaster.MergeMode.AVG; } } - private void sortByDate(List items) { + private void sortByDate(List items, IMonitor monitor) { if (items.stream().anyMatch(i -> i.getTimestamp() == null)) { throw new KlabIllegalStateException("STAC items are lacking a timestamp and could not be sorted by date."); } items.sort((i1, i2) -> i1.getTimestamp().compareTo(i2.getTimestamp())); + monitor.debug( + "Ordered STAC items. First: [" + items.get(0).getTimestamp() + "]; Last [" + items.get(items.size() - 1).getTimestamp() + "]"); } @Override @@ -126,7 +137,7 @@ public void getEncodedData(IResource resource, Map urnParameters IObservable targetSemantics = scope.getTargetArtifact() instanceof Observation ? ((Observation) scope.getTargetArtifact()).getObservable() : null; - HMRaster.MergeMode mergeMode = chooseMergeMode(targetSemantics); + HMRaster.MergeMode mergeMode = chooseMergeMode(targetSemantics, scope.getMonitor()); String catalogUrl = resource.getParameters().get("catalogUrl", String.class); String collectionId = resource.getParameters().get("collectionId", String.class); @@ -168,14 +179,14 @@ public void getEncodedData(IResource resource, Map urnParameters List items = collection.setGeometryFilter(poly) .setTimestampFilter(new Date(start.getMilliseconds()), new Date(end.getMilliseconds())) .searchItems(); - - if (mergeMode == HMRaster.MergeMode.SUBSTITUTE) { - sortByDate(items); - } - if (items.isEmpty()) { throw new KlabIllegalStateException("No STAC items found for this context."); } + scope.getMonitor().debug("Found " + items.size() + " STAC items."); + + if (mergeMode == HMRaster.MergeMode.SUBSTITUTE) { + sortByDate(items, scope.getMonitor()); + } LogProgressMonitor lpm = new LogProgressMonitor(); IGrid grid = space.getGrid(); @@ -199,9 +210,8 @@ public void getEncodedData(IResource resource, Map urnParameters String assetId = resource.getParameters().get("asset", String.class); HMRaster outRaster = HMStacCollection.readRasterBandOnRegion(regionTransformed, assetId, items, allowTransform, mergeMode, lpm); coverage = outRaster.buildCoverage(); - scope.getMonitor().info("Coverage: " + coverage); } catch (Exception e) { - scope.getMonitor().error("Cannot create STAC file. " + e.getMessage()); + throw new KlabInternalErrorException("Cannot build STAC raster output. Reason " + e.getMessage()); } encoder.encodeFromCoverage(resource, urnParameters, coverage, geometry, builder, scope); diff --git a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACImporter.java b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACImporter.java index 73352d389..0de503ec8 100644 --- a/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACImporter.java +++ b/adapters/klab.ogc/src/main/java/org/integratedmodelling/klab/stac/STACImporter.java @@ -22,7 +22,7 @@ import org.integratedmodelling.klab.api.observations.IObservation; import org.integratedmodelling.klab.api.runtime.monitoring.IMonitor; import org.integratedmodelling.klab.exceptions.KlabIOException; -import org.integratedmodelling.klab.exceptions.KlabUnsupportedFeatureException; +import org.integratedmodelling.klab.exceptions.KlabIllegalArgumentException; import org.integratedmodelling.klab.utils.Parameters; import org.integratedmodelling.klab.utils.Triple; @@ -92,7 +92,9 @@ public Collection importResources(String importLocation, IProject proje String[] locationElements = STACUtils.extractCatalogAndCollection(importLocation); if (locationElements.length != 2) { - throw new KlabUnsupportedFeatureException("Bulk import from a catalog is not supported."); + monitor.error("It is not possible to bulk import form the URL " + importLocation + "." + + "Check if the resource is a proper STAC collection."); + throw new KlabIllegalArgumentException("Unexpected STAC import location."); } try { monitor.info("Beginning STAC collection import from " + importLocation); diff --git a/adapters/klab.ogc/src/test/java/org/integratedmodelling/klab/ogc/stac/test/STACImporterTest.java b/adapters/klab.ogc/src/test/java/org/integratedmodelling/klab/ogc/stac/test/STACImporterTest.java index 6219fa3b6..fc80aac7c 100644 --- a/adapters/klab.ogc/src/test/java/org/integratedmodelling/klab/ogc/stac/test/STACImporterTest.java +++ b/adapters/klab.ogc/src/test/java/org/integratedmodelling/klab/ogc/stac/test/STACImporterTest.java @@ -14,6 +14,7 @@ import org.integratedmodelling.klab.api.knowledge.IProject; import org.integratedmodelling.klab.api.runtime.monitoring.IMonitor; import org.integratedmodelling.klab.exceptions.KlabIOException; +import org.integratedmodelling.klab.exceptions.KlabIllegalArgumentException; import org.integratedmodelling.klab.exceptions.KlabUnsupportedFeatureException; import org.integratedmodelling.klab.stac.STACImporter; import org.junit.jupiter.api.Assertions; @@ -55,7 +56,7 @@ public void importResource_failCannotImportCatalog() { Mockito.when(identity.getId()).thenReturn("hares"); Authentication.INSTANCE.registerIdentity(identity); - Assertions.assertThrows(KlabUnsupportedFeatureException.class, () -> { + Assertions.assertThrows(KlabIllegalArgumentException.class, () -> { Collection ret = importer.importResources(importLocation, project, params, monitor); }); }