Ignore:
Timestamp:
2009-12-19T10:47:49+01:00 (14 years ago)
Author:
jttt
Message:

Fixed #4161 Major slowdown in recent versions, used correct pattern for listeners realized using CopyOnWriteArrayList

Location:
trunk/src/org/openstreetmap/josm/data
Files:
1 added
9 edited

Legend:

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

    r2645 r2655  
    2626import java.util.Map.Entry;
    2727import java.util.concurrent.CopyOnWriteArrayList;
    28 import java.util.logging.Logger;
    2928import java.util.regex.Matcher;
    3029import java.util.regex.Pattern;
     
    4443 */
    4544public class Preferences {
    46     static private final Logger logger = Logger.getLogger(Preferences.class.getName());
     45    //static private final Logger logger = Logger.getLogger(Preferences.class.getName());
    4746
    4847    /**
     
    131130
    132131    public void addPreferenceChangeListener(PreferenceChangedListener listener) {
    133         if (listener != null && ! listeners.contains(listener)) {
    134             listeners.add(listener);
     132        if (listener != null) {
     133            listeners.addIfAbsent(listener);
    135134        }
    136135    }
    137136
    138137    public void removePreferenceChangeListener(PreferenceChangedListener listener) {
    139         if (listener != null && listeners.contains(listener)) {
    140             listeners.remove(listener);
    141         }
     138        listeners.remove(listener);
    142139    }
    143140
  • trunk/src/org/openstreetmap/josm/data/conflict/ConflictCollection.java

    r2512 r2655  
    4242
    4343    public void addConflictListener(IConflictListener listener) {
    44         if (listener != null && ! listeners.contains(listener)) {
    45             listeners.add(listener);
     44        if (listener != null) {
     45            listeners.addIfAbsent(listener);
    4646        }
    4747    }
    4848
    4949    public void removeConflictListener(IConflictListener listener) {
    50         if (listener != null) {
    51             listeners.remove(listener);
    52         }
     50        listeners.remove(listener);
    5351    }
    5452
  • trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java

    r2618 r2655  
    88import java.util.Map;
    99import java.util.concurrent.CopyOnWriteArrayList;
    10 import java.util.logging.Logger;
    1110
    1211import org.openstreetmap.josm.Main;
     
    1514
    1615public class ChangesetCache implements PreferenceChangedListener{
    17     static private final Logger logger = Logger.getLogger(ChangesetCache.class.getName());
     16    //static private final Logger logger = Logger.getLogger(ChangesetCache.class.getName());
    1817    static private final ChangesetCache instance = new ChangesetCache();
    1918
     
    3231
    3332    public void addChangesetCacheListener(ChangesetCacheListener listener) {
    34         synchronized(listeners) {
    35             if (listener != null && ! listeners.contains(listener)) {
    36                 listeners.add(listener);
    37             }
     33        if (listener != null) {
     34            listeners.addIfAbsent(listener);
    3835        }
    3936    }
    4037
    4138    public void removeChangesetCacheListener(ChangesetCacheListener listener) {
    42         synchronized(listeners) {
    43             if (listener != null && listeners.contains(listener)) {
    44                 listeners.remove(listener);
    45             }
    46         }
     39        listeners.remove(listener);
    4740    }
    4841
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r2623 r2655  
    2121import org.openstreetmap.josm.data.SelectionChangedListener;
    2222import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
     23import org.openstreetmap.josm.data.osm.event.ChangesetIdChangedEvent;
    2324import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
    2425import org.openstreetmap.josm.data.osm.event.DataSetListener;
     
    863864    }
    864865
     866    void fireChangesetIdChanged(OsmPrimitive primitive, int oldChangesetId, int newChangesetId) {
     867        fireEvent(new ChangesetIdChangedEvent(this, Collections.singletonList(primitive), oldChangesetId, newChangesetId));
     868    }
     869
    865870    public void clenupDeletedPrimitives() {
    866871        if (cleanupDeleted(nodes.iterator())
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r2651 r2655  
    649649     */
    650650    public void setChangesetId(int changesetId) throws IllegalStateException, IllegalArgumentException {
     651        if (this.changesetId == changesetId)
     652            return;
    651653        if (changesetId < 0)
    652654            throw new IllegalArgumentException(tr("Parameter ''{0}'' >= 0 expected, got {1}", "changesetId", changesetId));
    653655        if (isNew() && changesetId > 0)
    654656            throw new IllegalStateException(tr("Can''t assign a changesetId > 0 to a new primitive. Value of changesetId is {0}", changesetId));
     657        int old = this.changesetId;
    655658        this.changesetId = changesetId;
     659        if (dataSet != null) {
     660            dataSet.fireChangesetIdChanged(this, old, changesetId);
     661        }
    656662    }
    657663
     
    10031009        flags = other.flags;
    10041010        user= other.user;
    1005         changesetId = other.changesetId;
     1011        setChangesetId(other.changesetId);
    10061012        clearCached();
    10071013    }
     
    10311037        flags = other.flags;
    10321038        user= other.user;
    1033         changesetId = other.changesetId;
     1039        setChangesetId(other.changesetId);
    10341040    }
    10351041
     
    11781184        timestamp = data.getTimestamp();
    11791185        user = data.getUser();
    1180         changesetId = data.getChangesetId();
     1186        setChangesetId(data.getChangesetId());
    11811187        setDeleted(data.isDeleted());
    11821188        setModified(data.isModified());
  • trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java

    r2645 r2655  
    1111
    1212    public enum DatasetEventType {DATA_CHANGED, NODE_MOVED, PRIMITIVES_ADDED, PRIMITIVES_REMOVED,
    13         RELATION_MEMBERS_CHANGED, TAGS_CHANGED, WAY_NODES_CHANGED}
     13        RELATION_MEMBERS_CHANGED, TAGS_CHANGED, WAY_NODES_CHANGED, CHANGESET_ID_CHANGED}
    1414
    1515    protected final DataSet dataSet;
  • trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListener.java

    r2622 r2655  
    7373
    7474    /**
     75     * Minor dataset change, currently only changeset id changed is supported, but can
     76     * be extended in future.
     77     * @param event
     78     */
     79    void otherDatasetChange(AbstractDatasetChangedEvent event);
     80
     81    /**
    7582     * Called after big changes in dataset. Usually other events are stopped using Dataset.beginUpdate() and
    7683     * after operation is completed (Dataset.endUpdate()), {@link #dataChanged()} is called.
    7784     */
    7885    void dataChanged(DataChangedEvent event);
    79 
    8086}
  • trunk/src/org/openstreetmap/josm/data/osm/event/DataSetListenerAdapter.java

    r2645 r2655  
    4848    }
    4949
     50    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
     51        listener.processDatasetEvent(event);
     52    }
     53
    5054}
  • trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java

    r2512 r2655  
    77import java.util.HashMap;
    88import java.util.concurrent.CopyOnWriteArrayList;
    9 import java.util.logging.Logger;
    109
    1110import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     
    1918 */
    2019public class HistoryDataSet {
    21     private final static Logger logger = Logger.getLogger(HistoryDataSet.class.getName());
     20    //private final static Logger logger = Logger.getLogger(HistoryDataSet.class.getName());
    2221
    2322    /** the unique instance */
     
    4645
    4746    public void addHistoryDataSetListener(HistoryDataSetListener listener) {
    48         synchronized(listeners) {
    49             if (!listeners.contains(listener)) {
    50                 listeners.add(listener);
    51             }
     47        if (listener != null) {
     48            listeners.addIfAbsent(listener);
    5249        }
    5350    }
    5451
    5552    public void removeHistoryDataSetListener(HistoryDataSetListener listener) {
    56         synchronized(listeners) {
    57             if (listeners.contains(listener)) {
    58                 listeners.remove(listener);
    59             }
    60         }
     53        listeners.remove(listener);
    6154    }
    6255
Note: See TracChangeset for help on using the changeset viewer.