Ignore:
Timestamp:
28.12.2009 00:16:04 (2 years ago)
Author:
Gubaer
Message:

new: Changeset Cache Manager for querying, downloading, browsing, and managing changesets within JOSM. See also Changeset Manager and Changeset Query Dialog

File:
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetHeaderDownloadTask.java

    r2672 r2689  
    44import static org.openstreetmap.josm.tools.I18n.tr; 
    55 
     6import java.awt.Component; 
    67import java.io.IOException; 
     8import java.lang.reflect.InvocationTargetException; 
    79import java.util.Collection; 
     10import java.util.Collections; 
    811import java.util.HashSet; 
    9 import java.util.List; 
    1012import java.util.Set; 
    1113 
    1214import javax.swing.SwingUtilities; 
    1315 
     16import org.openstreetmap.josm.Main; 
    1417import org.openstreetmap.josm.data.osm.Changeset; 
    1518import org.openstreetmap.josm.data.osm.ChangesetCache; 
     
    1821import org.openstreetmap.josm.io.OsmServerChangesetReader; 
    1922import org.openstreetmap.josm.io.OsmTransferException; 
     23import org.openstreetmap.josm.tools.BugReportExceptionHandler; 
     24import org.openstreetmap.josm.tools.CheckParameterUtil; 
     25import org.openstreetmap.josm.tools.ExceptionUtil; 
    2026import org.xml.sax.SAXException; 
    2127 
    22 public class DownloadChangesetsTask extends PleaseWaitRunnable{ 
     28/** 
     29 * This is an asynchronous task for downloading a collection of changests from the OSM 
     30 * server. 
     31 *  
     32 * The  task only downloads the changeset properties without the changeset content. It 
     33 * updates the global {@see ChangesetCache}. 
     34 *  
     35 */ 
     36public class ChangesetHeaderDownloadTask extends PleaseWaitRunnable implements ChangesetDownloadTask{ 
     37 
     38    /** 
     39     * Builds a download task from for a collection of changesets. 
     40     *  
     41     * Ignores null values and changesets with {@see Changeset#isNew()} == true. 
     42     *  
     43     * @param changesets the collection of changesets. Assumes an empty collection if null. 
     44     * @return the download task 
     45     */ 
     46    static public ChangesetHeaderDownloadTask buildTaskForChangesets(Collection<Changeset> changesets) { 
     47        return buildTaskForChangesets(Main.parent, changesets); 
     48    } 
     49 
     50    /** 
     51     * Builds a download task from for a collection of changesets. 
     52     *  
     53     * Ignores null values and changesets with {@see Changeset#isNew()} == true. 
     54     *  
     55     * @param parent the parent component relative to which the {@see PleaseWaitDialog} is displayed. 
     56     * Must not be null. 
     57     * @param changesets the collection of changesets. Assumes an empty collection if null. 
     58     * @return the download task 
     59     * @throws IllegalArgumentException thrown if parent is null 
     60     */ 
     61    static public ChangesetHeaderDownloadTask buildTaskForChangesets(Component parent, Collection<Changeset> changesets) { 
     62        CheckParameterUtil.ensureParameterNotNull(parent, "parent"); 
     63        if (changesets == null) { 
     64            changesets = Collections.emptyList(); 
     65        } 
     66 
     67        HashSet<Integer> ids = new HashSet<Integer>(); 
     68        for (Changeset cs: changesets) { 
     69            if (cs == null || cs.isNew()) { 
     70                continue; 
     71            } 
     72            ids.add(cs.getId()); 
     73        } 
     74        if (parent == null) 
     75            return new ChangesetHeaderDownloadTask(ids); 
     76        else 
     77            return new ChangesetHeaderDownloadTask(parent, ids); 
     78 
     79    } 
     80 
    2381 
    2482    private Set<Integer> idsToDownload; 
    2583    private OsmServerChangesetReader reader; 
    26     private boolean cancelled; 
     84    private boolean canceled; 
    2785    private Exception lastException; 
    28     private List<Changeset> downloadedChangesets; 
    29  
    30     public DownloadChangesetsTask(Collection<Integer> ids) { 
    31         super(tr("Download changesets")); 
     86    private Set<Changeset> downloadedChangesets; 
     87 
     88    protected void init(Collection<Integer> ids) { 
     89        if (ids == null) { 
     90            ids = Collections.emptyList(); 
     91        } 
    3292        idsToDownload = new HashSet<Integer>(); 
    3393        if (ids == null ||  ids.isEmpty()) 
     
    41101    } 
    42102 
     103    /** 
     104     * Creates the download task for a collection of changeset ids. Uses a {@see PleaseWaitDialog} 
     105     * whose parent is {@see Main#parent}. 
     106     *  
     107     * Null ids or or ids <= 0 in the id collection are ignored. 
     108     *  
     109     * @param ids the collection of ids. Empty collection assumed if null. 
     110     */ 
     111    public ChangesetHeaderDownloadTask(Collection<Integer> ids) { 
     112        // parent for dialog is Main.parent 
     113        super(tr("Download changesets"), false /* don't ignore exceptions */); 
     114        init(ids); 
     115    } 
     116 
     117    /** 
     118     * Creates the download task for a collection of changeset ids. Uses a {@see PleaseWaitDialog} 
     119     * whose parent is the parent window of <code>dialogParent</code>. 
     120     *  
     121     * Null ids or or ids <= 0 in the id collection are ignored. 
     122     *  
     123     * @param dialogParent the parent reference component for the {@see PleaseWaitDialog}. Must not be null. 
     124     * @param ids the collection of ids. Empty collection assumed if null. 
     125     * @throws IllegalArgumentException thrown if dialogParent is null 
     126     */ 
     127    public ChangesetHeaderDownloadTask(Component dialogParent, Collection<Integer> ids) throws IllegalArgumentException{ 
     128        super(dialogParent,tr("Download changesets"), false /* don't ignore exceptions */); 
     129        init(ids); 
     130    } 
     131 
    43132    @Override 
    44133    protected void cancel() { 
    45         cancelled = true; 
     134        canceled = true; 
    46135        synchronized (this) { 
    47136            if (reader != null) { 
     
    53142    @Override 
    54143    protected void finish() { 
    55         if (cancelled) 
     144        if (canceled) 
    56145            return; 
    57146        if (lastException != null) { 
     
    67156            r.run(); 
    68157        } else { 
    69             SwingUtilities.invokeLater(r); 
     158            try { 
     159                SwingUtilities.invokeAndWait(r); 
     160            } catch(InterruptedException e) { 
     161                e.printStackTrace(); 
     162            } catch(InvocationTargetException e) { 
     163                Throwable t = e.getTargetException(); 
     164                if (t instanceof RuntimeException) { 
     165                    BugReportExceptionHandler.handleException(t); 
     166                } else if (t instanceof Exception){ 
     167                    ExceptionUtil.explainException(e); 
     168                } else { 
     169                    BugReportExceptionHandler.handleException(t); 
     170                } 
     171            } 
    70172        } 
    71173    } 
     
    77179                reader = new OsmServerChangesetReader(); 
    78180            } 
    79             downloadedChangesets = reader.readChangesets(idsToDownload, getProgressMonitor().createSubTaskMonitor(0, false)); 
    80         } catch(Exception e) { 
    81             if (cancelled) 
     181            downloadedChangesets = new HashSet<Changeset>(); 
     182            downloadedChangesets.addAll(reader.readChangesets(idsToDownload, getProgressMonitor().createSubTaskMonitor(0, false))); 
     183        } catch(OsmTransferException e) { 
     184            if (canceled) 
    82185                // ignore exception if cancelled 
    83186                return; 
    84             if (e instanceof RuntimeException) 
    85                 throw (RuntimeException)e; 
     187            // remember other exceptions 
    86188            lastException = e; 
    87189        } 
    88190    } 
     191 
     192    /* ------------------------------------------------------------------------------- */ 
     193    /* interface ChangesetDownloadTask                                                 */ 
     194    /* ------------------------------------------------------------------------------- */ 
     195    public Set<Changeset> getDownloadedChangesets() { 
     196        return downloadedChangesets; 
     197    } 
     198 
     199    public boolean isCanceled() { 
     200        return canceled; 
     201    } 
     202 
     203    public boolean isFailed() { 
     204        return lastException != null; 
     205    } 
    89206} 
Note: See TracChangeset for help on using the changeset viewer.