Changeset 6440 in josm


Ignore:
Timestamp:
2013-12-05T22:20:57+01:00 (6 years ago)
Author:
simon04
Message:

Load and display changeset comment in history dialog

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java

    r6336 r6440  
    44import java.text.MessageFormat;
    55import java.util.ArrayList;
     6import java.util.Collection;
    67import java.util.HashMap;
     8import java.util.HashSet;
    79import java.util.List;
    810import java.util.Map;
     
    1012
    1113import org.openstreetmap.josm.Main;
     14import org.openstreetmap.josm.data.osm.Changeset;
    1215import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1316import org.openstreetmap.josm.data.osm.PrimitiveId;
     
    1720import org.openstreetmap.josm.gui.layer.Layer;
    1821import org.openstreetmap.josm.tools.CheckParameterUtil;
     22import org.openstreetmap.josm.tools.Utils;
    1923
    2024/**
     
    4347    private Map<PrimitiveId, ArrayList<HistoryOsmPrimitive>> data;
    4448    private CopyOnWriteArrayList<HistoryDataSetListener> listeners;
     49    private Map<Long, Changeset> changesets;
    4550
    4651    /**
     
    5055        data = new HashMap<PrimitiveId, ArrayList<HistoryOsmPrimitive>>();
    5156        listeners = new CopyOnWriteArrayList<HistoryDataSetListener>();
     57        changesets = new HashMap<Long, Changeset>();
    5258    }
    5359
     
    117123
    118124    /**
     125     * Adds a changeset to the data set
     126     *
     127     * @param changeset the changeset to add
     128     */
     129    public void putChangeset(Changeset changeset) {
     130        changesets.put((long) changeset.getId(), changeset);
     131        fireHistoryUpdated(null);
     132    }
     133
     134    /**
    119135     * Replies the history for a given primitive with id <code>id</code>
    120136     * and type <code>type</code>.
     
    149165        if (versions == null)
    150166            return null;
     167        for (HistoryOsmPrimitive i : versions) {
     168            i.setChangeset(changesets.get(i.getChangesetId()));
     169        }
    151170        return new History(pid.getUniqueId(), pid.getType(), versions);
    152171    }
     
    160179        if (other == null)
    161180            return;
    162         for (PrimitiveId id : other.data.keySet()) {
    163             this.data.put(id, other.data.get(id));
    164         }
     181        this.data.putAll(other.data);
     182        this.changesets.putAll(other.changesets);
    165183        fireHistoryUpdated(null);
     184    }
     185
     186    public Collection<Long> getChangesetIds() {
     187        final HashSet<Long> ids = new HashSet<Long>();
     188        for (Collection<HistoryOsmPrimitive> i : data.values()) {
     189            for (HistoryOsmPrimitive j : i) {
     190                ids.add(j.getChangesetId());
     191            }
     192        }
     193        return ids;
    166194    }
    167195
  • trunk/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java

    r6317 r6440  
    1111import java.util.Map;
    1212
     13import org.openstreetmap.josm.data.osm.Changeset;
    1314import org.openstreetmap.josm.data.osm.Node;
    1415import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    3233    private User user;
    3334    private long changesetId;
     35    private Changeset changeset;
    3436    private Date timestamp;
    3537    private long version;
     
    171173    public Map<String,String> getTags() {
    172174        return Collections.unmodifiableMap(tags);
     175    }
     176
     177    public Changeset getChangeset() {
     178        return changeset;
     179    }
     180
     181    public void setChangeset(Changeset changeset) {
     182        this.changeset = changeset;
    173183    }
    174184
  • trunk/src/org/openstreetmap/josm/gui/history/HistoryLoadTask.java

    r6316 r6440  
    1010import java.util.Collection;
    1111import java.util.HashSet;
     12import java.util.List;
    1213import java.util.Set;
    1314
     15import org.openstreetmap.josm.data.osm.Changeset;
    1416import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1517import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     
    2123import org.openstreetmap.josm.gui.ExceptionDialogUtil;
    2224import org.openstreetmap.josm.gui.PleaseWaitRunnable;
     25import org.openstreetmap.josm.io.ChangesetQuery;
     26import org.openstreetmap.josm.io.OsmServerChangesetReader;
    2327import org.openstreetmap.josm.io.OsmServerHistoryReader;
    2428import org.openstreetmap.josm.io.OsmTransferException;
     
    201205                    reader = new OsmServerHistoryReader(pid.getType(), pid.getUniqueId());
    202206                    ds = reader.parseHistory(progressMonitor.createSubTaskMonitor(1, false));
     207                    // load corresponding changesets (mostly for changeset comment)
     208                    for (final Changeset i : new OsmServerChangesetReader().queryChangesets(
     209                            new ChangesetQuery().forChangesetIds(ds.getChangesetIds()), progressMonitor.createSubTaskMonitor(1, false))) {
     210                        ds.putChangeset(i);
     211                    }
    203212                } catch(OsmTransferException e) {
    204213                    if (canceled)
  • trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java

    r6340 r6440  
    55
    66import java.awt.BorderLayout;
     7import java.awt.Color;
    78import java.awt.GridBagConstraints;
    89import java.awt.GridBagLayout;
     
    1617import javax.swing.JLabel;
    1718import javax.swing.JPanel;
     19import javax.swing.JTextArea;
    1820
    1921import org.openstreetmap.josm.Main;
     
    3941    private UrlLabel lblUser;
    4042    private UrlLabel lblChangeset;
     43    private JTextArea lblChangesetComment;
    4144
    4245    protected void build() {
     
    5558        pnlUserAndChangeset.add(lblChangeset);
    5659
     60        lblChangesetComment = new JTextArea();
     61        lblChangesetComment.setLineWrap(true);
     62        lblChangesetComment.setEditable(false);
     63        lblChangesetComment.setBackground(new Color(0, 0, 0, 0));
     64
    5765        setLayout(new GridBagLayout());
    5866        GridBagConstraints gc = new GridBagConstraints();
     
    6573        gc.weighty = 0.0;
    6674        add(pnlUserAndChangeset, gc);
     75        gc.gridy = 2;
     76        add(lblChangesetComment, gc);
    6777    }
    6878
     
    132142            lblChangeset.setUrl(url);
    133143            lblChangeset.setDescription(Long.toString(getPrimitive().getChangesetId()));
     144            final String comment = getPrimitive().getChangeset() != null ? getPrimitive().getChangeset().get("comment") : null;
     145            lblChangesetComment.setText(comment);
     146            lblChangesetComment.setToolTipText(tr("Changeset comment"));
    134147
    135148            try {
  • trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java

    r6258 r6440  
    1010import java.text.ParseException;
    1111import java.text.SimpleDateFormat;
     12import java.util.Arrays;
     13import java.util.Collection;
     14import java.util.Collections;
    1215import java.util.Date;
    1316import java.util.HashMap;
     17import java.util.HashSet;
    1418import java.util.Map;
    1519import java.util.Map.Entry;
     
    1822import org.openstreetmap.josm.data.coor.LatLon;
    1923import org.openstreetmap.josm.tools.CheckParameterUtil;
     24import org.openstreetmap.josm.tools.Utils;
    2025
    2126public class ChangesetQuery {
     
    4752    /** indicates whether only closed changesets are queried. null, if no restrictions regarding open changesets apply */
    4853    private Boolean closed = null;
     54    /** a collection of changeset ids to query for */
     55    private Collection<Long> changesetIds = null;
    4956
    5057    public ChangesetQuery() {}
     
    227234
    228235    /**
     236     * Restricts the query to the given changeset ids (which are added to previously added ones).
     237     *
     238     * @param changesetIds the changeset ids
     239     * @return the query object with the applied restriction
     240     * @throws IllegalArgumentException thrown if changesetIds is null.
     241     */
     242    public ChangesetQuery forChangesetIds(Collection<Long> changesetIds) {
     243        CheckParameterUtil.ensureParameterNotNull(changesetIds, "changesetIds");
     244        this.changesetIds = changesetIds;
     245        return this;
     246    }
     247
     248    /**
    229249     * Replies the query string to be used in a query URL for the OSM API.
    230250     *
     
    273293            }
    274294            sb.append("closed=").append(Boolean.toString(closed));
     295        } else if (changesetIds != null) {
     296            // since 2013-12-05, see https://github.com/openstreetmap/openstreetmap-website/commit/1d1f194d598e54a5d6fb4f38fb569d4138af0dc8
     297            if (sb.length() > 0) {
     298                sb.append("&");
     299            }
     300            sb.append("changesets=").append(Utils.join(",", changesetIds));
    275301        }
    276302        return sb.toString();
     
    366392        }
    367393
    368         protected ChangesetQuery crateFromMap(Map<String,String> queryParams) throws ChangesetQueryUrlException {
     394        protected Collection<Long> parseLongs(String value) {
     395            return value == null || value.isEmpty()
     396                    ? Collections.<Long>emptySet() :
     397                    new HashSet<Long>(Utils.transform(Arrays.asList(value.split(",")), new Utils.Function<String, Long>() {
     398                        @Override
     399                        public Long apply(String x) {
     400                            return Long.valueOf(x);
     401                        }
     402                    }));
     403        }
     404
     405        protected ChangesetQuery createFromMap(Map<String, String> queryParams) throws ChangesetQueryUrlException {
    369406            ChangesetQuery csQuery = new ChangesetQuery();
    370407
     
    401438                        throw new ChangesetQueryUrlException(e);
    402439                    }
     440                } else if (k.equals("changesets")) {
     441                    try {
     442                        csQuery.forChangesetIds(parseLongs(entry.getValue()));
     443                    } catch (NumberFormatException e) {
     444                        throw new ChangesetQueryUrlException(e);
     445                    }
    403446                } else
    404447                    throw new ChangesetQueryUrlException(tr("Unsupported parameter ''{0}'' in changeset query string", k));
     
    412455            for (String keyValuePair: keyValuePairs) {
    413456                String[] kv = keyValuePair.split("=");
    414                 queryParams.put(kv[0], kv[1]);
     457                queryParams.put(kv[0], kv.length > 1 ? kv[1] : "");
    415458            }
    416459            return queryParams;
     
    441484                return new ChangesetQuery();
    442485            Map<String,String> queryParams  = createMapFromQueryString(query);
    443             return crateFromMap(queryParams);
     486            return createFromMap(queryParams);
    444487        }
    445488    }
  • trunk/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy

    r2915 r6440  
    189189                } 
    190190        }
     191
     192    @Test
     193    public void test_changeset_ids() {
     194        ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
     195        def ChangesetQuery q
     196
     197        // OK
     198        q = parser.parse("changesets=1,2,3")
     199        assert q != null
     200        assert q.@changesetIds.containsAll(Arrays.asList(1L, 2L, 3L))
     201        assert q.@changesetIds.size() == 3
     202
     203        // OK
     204        q = parser.parse("changesets=1,2,3,4,1")
     205        assert q != null
     206        assert q.@changesetIds.containsAll(Arrays.asList(1L, 2L, 3L, 4L))
     207        assert q.@changesetIds.size() == 4
     208
     209        // OK
     210        q = parser.parse("changesets=")
     211        assert q != null
     212        assert q.@changesetIds.size() == 0
     213
     214        // should fail
     215        shouldFail(ChangesetQueryUrlException) {
     216            q = parser.parse("changesets=foo")
     217        }
     218    }
    191219}
Note: See TracChangeset for help on using the changeset viewer.