Changeset 5566 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2012-11-04T13:28:58+01:00 (11 years ago)
Author:
Don-vip
Message:

fix #5288 - multiple JOSM instances: Bogus crash recovery attempt

Location:
trunk/src/org/openstreetmap/josm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java

    r5459 r5566  
    2222 * @since 32
    2323 */
    24 public class ExtensionFileFilter extends FileFilter {
     24public class ExtensionFileFilter extends FileFilter implements java.io.FileFilter {
    2525
    2626    /**
  • trunk/src/org/openstreetmap/josm/data/AutosaveTask.java

    r5512 r5566  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.io.BufferedReader;
    67import java.io.File;
     8import java.io.FileFilter;
     9import java.io.FileInputStream;
    710import java.io.IOException;
     11import java.io.InputStreamReader;
     12import java.io.PrintStream;
     13import java.lang.management.ManagementFactory;
    814import java.util.ArrayList;
    915import java.util.Date;
     
    3137import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    3238import org.openstreetmap.josm.io.OsmExporter;
     39import org.openstreetmap.josm.io.OsmImporter;
    3340
    3441/**
     
    141148        Date now = new Date();
    142149        while (true) {
    143             File result = new File(autosaveDir, String.format("%1$s_%2$tY%2$tm%2$td_%2$tH%2$tM%3$s.osm", layer.layerFileName, now, index == 0?"":"_" + index));
     150            String filename = String.format("%1$s_%2$tY%2$tm%2$td_%2$tH%2$tM%3$s", layer.layerFileName, now, index == 0?"":"_" + index);
     151            File result = new File(autosaveDir, filename+".osm");
    144152            try {
    145                 if (result.createNewFile())
     153                if (result.createNewFile()) {
     154                    try {
     155                        File pidFile = new File(autosaveDir, filename+".pid");
     156                        PrintStream ps = new PrintStream(pidFile);
     157                        ps.println(ManagementFactory.getRuntimeMXBean().getName());
     158                        ps.close();
     159                    } catch (Throwable t) {
     160                        System.err.println(t.getMessage());
     161                    }
    146162                    return result;
    147                 else {
     163                } else {
    148164                    System.out.println(tr("Unable to create file {0}, other filename will be used", result.getAbsolutePath()));
    149165                    if (index > PROP_INDEX_LIMIT.get())
     
    174190            if (!oldFile.delete()) {
    175191                System.out.println(tr("Unable to delete old backup file {0}", oldFile.getAbsolutePath()));
     192            } else {
     193                getPidFile(oldFile).delete();
    176194            }
    177195        }
     
    233251                            }
    234252                            for (File file: info.backupFiles) {
    235                                 file.delete();
     253                                if (file.delete()) {
     254                                    getPidFile(file).delete();
     255                                }
    236256                            }
    237257                        } catch (IOException e) {
     
    251271    }
    252272
     273    private final File getPidFile(File osmFile) {
     274        return new File(autosaveDir, osmFile.getName().replaceFirst("[.][^.]+$", ".pid"));
     275    }
     276   
     277    /**
     278     * Replies the list of .osm files still present in autosave dir, that are not currently managed by another instance of JOSM.
     279     * These files are hence unsaved layers from an old instance of JOSM that crashed and may be recovered by this instance.
     280     * @return The list of .osm files still present in autosave dir, that are not currently managed by another instance of JOSM
     281     */
    253282    public List<File> getUnsavedLayersFiles() {
    254283        List<File> result = new ArrayList<File>();
    255         File[] files = autosaveDir.listFiles();
     284        File[] files = autosaveDir.listFiles(OsmImporter.FILE_FILTER);
    256285        if (files == null)
    257286            return result;
    258287        for (File file: files) {
    259288            if (file.isFile()) {
    260                 result.add(file);
     289                boolean skipFile = false;
     290                File pidFile = getPidFile(file);
     291                if (pidFile.exists()) {
     292                    try {
     293                        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(pidFile)));
     294                        try {
     295                            String jvmId = reader.readLine();
     296                            String pid = jvmId.split("@")[0];
     297                            skipFile = jvmPerfDataFileExists(pid);
     298                        } catch (Throwable t) {
     299                            System.err.println(t.getClass()+":"+t.getMessage());
     300                        } finally {
     301                            reader.close();
     302                        }
     303                    } catch (Throwable t) {
     304                        System.err.println(t.getClass()+":"+t.getMessage());
     305                    }
     306                }
     307                if (!skipFile) {
     308                    result.add(file);
     309                }
    261310            }
    262311        }
    263312        return result;
     313    }
     314   
     315    private boolean jvmPerfDataFileExists(final String jvmId) {
     316        File jvmDir = new File(System.getProperty("java.io.tmpdir") + File.separator + "hsperfdata_" + System.getProperty("user.name"));
     317        if (jvmDir.exists() && jvmDir.canRead()) {
     318            File[] files = jvmDir.listFiles(new FileFilter() {
     319                @Override
     320                public boolean accept(File file) {
     321                    return file.getName().equals(jvmId) && file.isFile();
     322                }
     323            });
     324            return files != null && files.length == 1;
     325        }
     326        return false;
    264327    }
    265328
     
    287350    private void moveToDeletedLayersFolder(File f) {
    288351        File backupFile = new File(deletedLayersDir, f.getName());
    289 
     352        File pidFile = getPidFile(f);
     353       
    290354        if (backupFile.exists()) {
    291355            deletedLayers.remove(backupFile);
     
    296360        if (f.renameTo(backupFile)) {
    297361            deletedLayers.add(backupFile);
     362            pidFile.delete();
    298363        } else {
    299364            System.err.println(String.format("Warning: Could not move autosaved file %s to %s folder", f.getName(), deletedLayersDir.getName()));
     
    301366            if (!f.delete()) {
    302367                System.err.println(String.format("Warning: Could not delete backup file %s", f));
     368            } else {
     369                pidFile.delete();
    303370            }
    304371        }
Note: See TracChangeset for help on using the changeset viewer.