Changeset 17845 in josm


Ignore:
Timestamp:
2021-05-01T14:00:25+02:00 (3 years ago)
Author:
simon04
Message:

see #14176 - Introduce class Interval

Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java

    r17748 r17845  
    3333import org.openstreetmap.josm.tools.ListenerList;
    3434import org.openstreetmap.josm.tools.ListeningCollection;
     35import org.openstreetmap.josm.tools.date.Interval;
    3536
    3637/**
     
    718719     * returns minimum and maximum timestamps in the track
    719720     * @param trk track to analyze
    720      * @return  minimum and maximum dates in array of 2 elements
    721      */
    722     public static Instant[] getMinMaxTimeForTrack(IGpxTrack trk) {
     721     * @return minimum and maximum as interval
     722     */
     723    public static Optional<Interval> getMinMaxTimeForTrack(IGpxTrack trk) {
    723724        final LongSummaryStatistics statistics = trk.getSegments().stream()
    724725                .flatMap(seg -> seg.getWayPoints().stream())
     
    726727                .summaryStatistics();
    727728        return statistics.getCount() == 0 || (statistics.getMin() == 0 && statistics.getMax() == 0)
    728                 ? null
    729                 : new Instant[]{Instant.ofEpochMilli(statistics.getMin()), Instant.ofEpochMilli(statistics.getMax())};
     729                ? Optional.empty()
     730                : Optional.of(new Interval(Instant.ofEpochMilli(statistics.getMin()), Instant.ofEpochMilli(statistics.getMax())));
    730731    }
    731732
     
    734735    * Warning: there are lot of track with broken timestamps,
    735736    * so we just ignore points from future and from year before 1970 in this method
    736     * @return minimum and maximum dates in array of 2 elements
     737    * @return minimum and maximum as interval
    737738    * @since 7319
    738739    */
    739     public synchronized Instant[] getMinMaxTimeForAllTracks() {
     740    public synchronized Optional<Interval> getMinMaxTimeForAllTracks() {
    740741        long now = System.currentTimeMillis();
    741742        final LongSummaryStatistics statistics = tracks.stream()
     
    746747                .summaryStatistics();
    747748        return statistics.getCount() == 0
    748                 ? new Instant[0]
    749                 : new Instant[]{Instant.ofEpochMilli(statistics.getMin()), Instant.ofEpochMilli(statistics.getMax())};
     749                ? Optional.empty()
     750                : Optional.of(new Interval(Instant.ofEpochMilli(statistics.getMin()), Instant.ofEpochMilli(statistics.getMax())));
    750751    }
    751752
  • trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    r17842 r17845  
    4040import org.openstreetmap.josm.tools.Logging;
    4141import org.openstreetmap.josm.tools.Utils;
    42 import org.openstreetmap.josm.tools.date.DateUtils;
     42import org.openstreetmap.josm.tools.date.Interval;
    4343
    4444import javax.swing.AbstractAction;
     
    5353import java.io.File;
    5454import java.time.Instant;
    55 import java.time.format.DateTimeFormatter;
    56 import java.time.format.FormatStyle;
    5755import java.util.ArrayList;
    5856import java.util.Arrays;
     
    157155     */
    158156    public static String getTimespanForTrack(IGpxTrack trk) {
    159         Instant[] bounds = GpxData.getMinMaxTimeForTrack(trk);
    160         return bounds != null ? formatTimespan(bounds) : "";
    161     }
    162 
    163     /**
    164      * Formats the timespan of the given track as a human readable string
    165      * @param bounds The bounds to format, i.e., an array containing the min/max date
    166      * @return The timespan as a string
    167      */
    168     public static String formatTimespan(Instant[] bounds) {
    169         String ts = "";
    170         DateTimeFormatter df = DateUtils.getDateFormatter(FormatStyle.SHORT);
    171         String earliestDate = df.format(bounds[0]);
    172         String latestDate = df.format(bounds[1]);
    173 
    174         if (earliestDate.equals(latestDate)) {
    175             DateTimeFormatter tf = DateUtils.getTimeFormatter(FormatStyle.SHORT);
    176             ts += earliestDate + ' ';
    177             ts += tf.format(bounds[0]) + " \u2013 " + tf.format(bounds[1]);
    178         } else {
    179             DateTimeFormatter dtf = DateUtils.getDateTimeFormatter(FormatStyle.SHORT, FormatStyle.MEDIUM);
    180             ts += dtf.format(bounds[0]) + " \u2013 " + dtf.format(bounds[1]);
    181         }
    182 
    183         ts += String.format(" (%s)", Utils.getDurationString(bounds[1].toEpochMilli() - bounds[0].toEpochMilli()));
    184         return ts;
     157        return GpxData.getMinMaxTimeForTrack(trk).map(Interval::format).orElse("");
    185158    }
    186159
     
    354327        long to = toDate.toEpochMilli();
    355328        for (IGpxTrack trk : data.getTracks()) {
    356             Instant[] t = GpxData.getMinMaxTimeForTrack(trk);
     329            Interval t = GpxData.getMinMaxTimeForTrack(trk).orElse(null);
    357330
    358331            if (t == null) continue;
    359             long tm = t[1].toEpochMilli();
     332            long tm = t.getEnd().toEpochMilli();
    360333            trackVisibility[i] = (tm == 0 && showWithoutDate) || (from <= tm && tm <= to);
    361334            i++;
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java

    r17841 r17845  
    5454import org.openstreetmap.josm.tools.ImageProvider;
    5555import org.openstreetmap.josm.tools.OpenBrowser;
     56import org.openstreetmap.josm.tools.date.Interval;
    5657
    5758/**
     
    8889            String name = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_NAME)).orElse("");
    8990            String desc = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_DESC)).orElse("");
    90             Instant[] time = GpxData.getMinMaxTimeForTrack(trk);
     91            Interval time = GpxData.getMinMaxTimeForTrack(trk).orElse(null);
    9192            String url = (String) Optional.ofNullable(attr.get("url")).orElse("");
    9293            tracks[i] = new Object[]{name, desc, time, trk.length(), url, trk};
     
    140141        t.setRowSorter(rowSorter);
    141142        rowSorter.setModel(model);
    142         rowSorter.setComparator(2, Comparator.comparing((Instant[] d) -> d == null ? Instant.MIN : d[0]));
     143        rowSorter.setComparator(2, Comparator.comparing((Interval d) -> d == null ? Instant.MIN : d.getStart()));
    143144        rowSorter.setComparator(3, Comparator.comparingDouble(length -> (double) length));
    144145        // default column widths
     
    150151            public Component getTableCellRendererComponent(
    151152                    JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    152                 if (value instanceof Instant[]) {
    153                     value = GpxLayer.formatTimespan(((Instant[]) value));
     153                if (value instanceof Interval) {
     154                    value = ((Interval) value).format();
    154155                }
    155156                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
    327328                JComponent jc = (JComponent) c;
    328329                Object value = getValueAt(row, col);
    329                 jc.setToolTipText(col == 2 ? Arrays.toString((Instant[]) value) : String.valueOf(value));
     330                jc.setToolTipText(String.valueOf(value));
    330331                if (content.length > row
    331332                        && content[row].length > 5
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java

    r17842 r17845  
    2020import org.openstreetmap.josm.spi.preferences.Config;
    2121import org.openstreetmap.josm.tools.GBC;
     22import org.openstreetmap.josm.tools.date.Interval;
    2223
    2324/**
     
    5152        this.layer = layer;
    5253
    53         final Instant startTime, endTime;
    54         Instant[] bounds = layer.data.getMinMaxTimeForAllTracks();
    55         if (bounds.length == 0) {
    56             startTime = ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneId.systemDefault()).toInstant();
    57             endTime = Instant.now();
    58         } else {
    59             startTime = bounds[0];
    60             endTime = bounds[1];
    61         }
    62 
    63         dateFrom.setDate(startTime);
    64         dateTo.setDate(endTime);
    65         dateFrom.setRange(startTime, endTime);
    66         dateTo.setRange(startTime, endTime);
     54        Interval interval = layer.data.getMinMaxTimeForAllTracks()
     55                .orElseGet(() -> new Interval(ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneId.systemDefault()).toInstant(), Instant.now()));
     56        dateFrom.setDate(interval.getStart());
     57        dateTo.setDate(interval.getEnd());
     58        dateFrom.setRange(interval.getStart(), interval.getEnd());
     59        dateTo.setRange(interval.getStart(), interval.getEnd());
    6760
    6861        add(noTimestampCb, GBC.std().grid(1, 1).insets(0, 0, 5, 0));
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java

    r17715 r17845  
    6060import org.openstreetmap.josm.tools.Stopwatch;
    6161import org.openstreetmap.josm.tools.Utils;
     62import org.openstreetmap.josm.tools.date.Interval;
    6263
    6364/**
     
    565566        double now = System.currentTimeMillis()/1000.0;
    566567        if (colored == ColorMode.TIME) {
    567             Instant[] bounds = data.getMinMaxTimeForAllTracks();
    568             if (bounds.length >= 2) {
    569                 minval = bounds[0].getEpochSecond();
    570                 maxval = bounds[1].getEpochSecond();
    571             } else {
    572                 minval = 0;
    573                 maxval = now;
    574             }
     568            Interval interval = data.getMinMaxTimeForAllTracks().orElse(new Interval(Instant.EPOCH, Instant.now()));
     569            minval = interval.getStart().getEpochSecond();
     570            maxval = interval.getEnd().getEpochSecond();
    575571            dateScale.setRange(minval, maxval);
    576572        }
  • trunk/test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java

    r17841 r17845  
    3333import org.openstreetmap.josm.testutils.JOSMTestRules;
    3434import org.openstreetmap.josm.tools.ListenerList;
     35import org.openstreetmap.josm.tools.date.Interval;
    3536import org.xml.sax.SAXException;
    3637
     
    330331    @Test
    331332    void testGetMinMaxTimeForAllTracks() {
    332         assertEquals(0, data.getMinMaxTimeForAllTracks().length);
     333        assertFalse(data.getMinMaxTimeForAllTracks().isPresent());
    333334
    334335        WayPoint p1 = new WayPoint(LatLon.NORTH_POLE);
     
    343344        data.addTrack(new GpxTrack(Arrays.asList(Arrays.asList(p3, p4, p5)), Collections.emptyMap()));
    344345
    345         Instant[] times = data.getMinMaxTimeForAllTracks();
    346         assertEquals(times.length, 2);
    347         assertEquals(Instant.ofEpochMilli(100020), times[0]);
    348         assertEquals(Instant.ofEpochMilli(500020), times[1]);
     346        Interval times = data.getMinMaxTimeForAllTracks().orElse(null);
     347        assertEquals("1970-01-01T00:01:40.020Z/1970-01-01T00:08:20.020Z", times.toString());
     348        assertEquals(Instant.ofEpochMilli(100020), times.getStart());
     349        assertEquals(Instant.ofEpochMilli(500020), times.getEnd());
    349350    }
    350351
  • trunk/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java

    r17844 r17845  
    1010import java.awt.Color;
    1111import java.io.IOException;
    12 import java.time.Instant;
    1312import java.util.ArrayList;
    1413import java.util.Collection;
     
    217216
    218217    /**
    219      * Unit test of {@link GpxLayer#formatTimespan}.
    220      */
    221     @Test
    222     void testFormatTimespan() {
    223         Instant[] timespan = {Instant.parse("2021-03-01T17:53:16Z"), Instant.parse("2021-04-03T08:19:19Z")};
    224         assertEquals("2021-03-01 17:53:16 \u2013 2021-04-03 08:19:19 (32 days 14 h)", GpxLayer.formatTimespan(timespan));
    225     }
    226 
    227     /**
    228218     * Unit test of {@link GpxLayer#mergeFrom}.
    229219     * @throws Exception if any error occurs
Note: See TracChangeset for help on using the changeset viewer.