Ticket #5288: 5288.patch

File 5288.patch, 7.5 KB (added by Don-vip, 13 years ago)
  • core/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java

     
    2121 * filters used in JOSM.
    2222 * @since 32
    2323 */
    24 public class ExtensionFileFilter extends FileFilter {
     24public class ExtensionFileFilter extends FileFilter implements java.io.FileFilter {
    2525
    2626    /**
    2727     * List of supported formats for import.
  • core/src/org/openstreetmap/josm/data/AutosaveTask.java

     
    33
    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;
    1016import java.util.Deque;
     
    3036import org.openstreetmap.josm.gui.layer.Layer;
    3137import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    3238import org.openstreetmap.josm.io.OsmExporter;
     39import org.openstreetmap.josm.io.OsmImporter;
    3340
    3441/**
    3542 * Saves data layers periodically so they can be recovered in case of a crash.
     
    140147        int index = 0;
    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())
    150166                        throw new IOException("index limit exceeded");
     
    173189            File oldFile = info.backupFiles.remove();
    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        }
    178196    }
     
    232250                                moveToDeletedLayersFolder(lastFile);
    233251                            }
    234252                            for (File file: info.backupFiles) {
    235                                 file.delete();
     253                                if (file.delete()) {
     254                                    getPidFile(file).delete();
     255                                }
    236256                            }
    237257                        } catch (IOException e) {
    238258                            System.err.println(tr("Error while creating backup of removed layer: {0}", e.getMessage()));
     
    250270        changedDatasets.add(event.getDataset());
    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;
    264313    }
     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;
     327    }
    265328
    266329    public void recoverUnsavedLayers() {
    267330        List<File> files = getUnsavedLayersFiles();
     
    286349     */
    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);
    292356            if (!backupFile.delete()) {
     
    295359        }
    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()));
    300365            // we cannot move to deleted folder, so just try to delete it directly
    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        }
    305372        while (deletedLayers.size() > PROP_DELETED_LAYERS.get()) {