/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.catalog.impl; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TimeZone; import java.util.TreeSet; import org.geoserver.catalog.util.ReaderDimensionsAccessor; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader; import org.geotools.coverage.grid.io.GridCoverage2DReader; import org.geotools.util.DateRange; import org.geotools.util.NumberRange; import org.junit.Test; import org.opengis.coverage.grid.Format; import org.opengis.parameter.GeneralParameterValue; public class ReaderDimensionAccessorTest { static class MockDimensionReader extends AbstractGridCoverage2DReader { Map<String, String> metadata = new HashMap<>(); @Override public Format getFormat() { return null; } @Override public GridCoverage2D read(GeneralParameterValue[] parameters) throws IllegalArgumentException, IOException { return null; } @Override public String[] getMetadataNames() { Set<String> keys = metadata.keySet(); return (String[]) keys.toArray(new String[keys.size()]); } @Override public String getMetadataValue(String coverageName, String name) { return super.getMetadataValue(name); } @Override public String getMetadataValue(String name) { return metadata.get(name); } }; @Test public void testMixedTimeExtraction() throws IOException, ParseException { MockDimensionReader reader = new MockDimensionReader(); reader.metadata.put(GridCoverage2DReader.HAS_TIME_DOMAIN, "true"); reader.metadata.put(GridCoverage2DReader.TIME_DOMAIN, "2016-02-23T03:00:00.000Z/2016-02-23T03:00:00.000Z/PT1S,2016-02-23T06:00:00.000Z,2016-02-23T09:00:00.000Z/2016-02-23T12:00:00.000Z/PT1S"); ReaderDimensionsAccessor accessor = new ReaderDimensionsAccessor(reader); TreeSet<Object> domain = accessor.getTimeDomain(); assertEquals(3, domain.size()); Iterator<Object> it = domain.iterator(); Date firstEntry = (Date) it.next(); assertEquals(accessor.getTimeFormat().parse("2016-02-23T03:00:00.000Z"), firstEntry); Date secondEntry = (Date) it.next(); assertEquals(accessor.getTimeFormat().parse("2016-02-23T06:00:00.000Z"), secondEntry); DateRange thirdEntry = (DateRange) it.next(); assertEquals(accessor.getTimeFormat().parse("2016-02-23T09:00:00.000Z"), thirdEntry.getMinValue()); assertEquals(accessor.getTimeFormat().parse("2016-02-23T12:00:00.000Z"), thirdEntry.getMaxValue()); } @Test public void testMixedElevationExtraction() throws IOException { MockDimensionReader reader = new MockDimensionReader(); reader.metadata.put(GridCoverage2DReader.HAS_ELEVATION_DOMAIN, "true"); reader.metadata.put(GridCoverage2DReader.ELEVATION_DOMAIN, "0/0/0,10,15/20/1"); ReaderDimensionsAccessor accessor = new ReaderDimensionsAccessor(reader); TreeSet<Object> domain = accessor.getElevationDomain(); assertEquals(3, domain.size()); Iterator<Object> it = domain.iterator(); Number firstEntry = (Number) it.next(); assertEquals(0, firstEntry.doubleValue(), 0d); Number secondEntry = (Number) it.next(); assertEquals(10, secondEntry.doubleValue(), 0d); NumberRange thirdEntry = (NumberRange) it.next(); assertEquals(15, thirdEntry.getMinimum(), 0d); assertEquals(20, thirdEntry.getMaximum(), 0d); } private static SimpleDateFormat DF = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); static { DF.setTimeZone(TimeZone.getTimeZone("UTC")); } @Test public void testCustomDimensionConvertion() throws IOException, ParseException { MockDimensionReader reader = new MockDimensionReader(); reader.metadata.put("HAS_MYDIM_DOMAIN", "true"); reader.metadata.put("MYDIM_DOMAIN_DATATYPE", "java.util.Date"); ReaderDimensionsAccessor accessor = new ReaderDimensionsAccessor(reader); List<Object> converted = accessor.convertDimensionValue("MYDIM", Arrays.asList("2001-05-01T00:00:00.000Z","2001-05-02T00:00:00.000Z","2001-05-03T00:00:00.000Z")); assertEquals(3, converted.size()); assertEquals(DF.parse("2001-05-01 00:00:00"), converted.get(0)); assertEquals(DF.parse("2001-05-02 00:00:00"), converted.get(1)); assertEquals(DF.parse("2001-05-03 00:00:00"), converted.get(2)); } }