package org.eclipse.dltk.internal.core; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Hashtable; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.internal.core.util.Util; public class PersistentTimeStampMap { private Hashtable<IPath, Long> timestamps = null; private File file; public PersistentTimeStampMap(File timestampsFile) { this.file = timestampsFile; } public void save() throws CoreException { if (timestamps != null) { saveTimeStamps(timestamps, file); } } public Map<IPath, Long> getTimestamps() { if (timestamps == null) { timestamps = readTimeStamps(this.file); } return timestamps; } private Hashtable<IPath, Long> readTimeStamps(File timestampsFile) { Hashtable<IPath, Long> timeStamps = new Hashtable<>(); DataInputStream in = null; try { in = new DataInputStream(new BufferedInputStream( new FileInputStream(timestampsFile))); int size = in.readInt(); while (size-- > 0) { String key = in.readUTF(); long timestamp = in.readLong(); timeStamps.put(Path.fromPortableString(key), timestamp); } } catch (IOException e) { if (timestampsFile.exists()) Util.log(e, "Unable to read external time stamps"); //$NON-NLS-1$ } finally { if (in != null) { try { in.close(); } catch (IOException e) { // nothing we can do: ignore } } } return timeStamps; } private void saveTimeStamps(Hashtable<IPath, Long> stamps, File timestamps) throws CoreException { if (stamps == null) return; DataOutputStream out = null; try { out = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(timestamps))); out.writeInt(stamps.size()); for (Map.Entry<IPath, Long> entry : stamps.entrySet()) { out.writeUTF(entry.getKey().toPortableString()); out.writeLong(entry.getValue().longValue()); } } catch (IOException e) { IStatus status = new Status(IStatus.ERROR, DLTKCore.PLUGIN_ID, IStatus.ERROR, "Problems while saving timestamps", e); //$NON-NLS-1$ throw new CoreException(status); } finally { if (out != null) { try { out.close(); } catch (IOException e) { // nothing we can do: ignore } } } } }