/** Sets the value at {@code index} to {@code value}. */ public void set(int index, String value) throws IOException { Writer writer = null; try { OutputStream os = new FileOutputStream(getFile(index)); writer = new OutputStreamWriter(os, Util.UTF_8); writer.write(value); } finally { Util.closeQuietly(writer); } }
File file = editor.getFile(0); if (writer.write(file)) { editor.commit(); editor.abortUnlessCommitted();
entry.setLengths(parts); } else if (secondSpace == -1 && firstSpace == DIRTY.length() && line.startsWith(DIRTY)) { entry.currentEditor = new Editor(entry); } else if (secondSpace == -1 && firstSpace == READ.length() && line.startsWith(READ)) {
File file = editor.getFile(0); if (writer.write(file)) { editor.commit(); editor.abortUnlessCommitted();
entry.setLengths(parts); } else if (secondSpace == -1 && firstSpace == DIRTY.length() && line.startsWith(DIRTY)) { entry.currentEditor = new Editor(entry); } else if (secondSpace == -1 && firstSpace == READ.length() && line.startsWith(READ)) {
editor.set(TITLE_INDEX, metadata.getAudioTitle()); editor.set(ALBUM_INDEX, metadata.getAudioAlbum()); editor.set(ARTIST_INDEX, metadata.getAudioArtist()); editor.set(DURATION_INDEX, String.valueOf(metadata.getDuration())); mDiskLruCache.flush(); editor.commit(); if (BuildConfig.DEBUG) { Log.d("cache_test_DISK_", "metadata put on disk cache " + key); editor.abort(); if (BuildConfig.DEBUG) { Log.d("cache_test_DISK_", "ERROR on: metadata put on disk cache " + key); editor.abort();
@Test public void journalFileIsPreferredOverBackupFile() throws Exception { DiskLruCache.Editor creator = cache.edit("k1"); creator.set(0, "ABC"); creator.set(1, "DE"); creator.commit(); cache.flush(); FileUtils.copyFile(journalFile, journalBkpFile); creator = cache.edit("k2"); creator.set(0, "F"); creator.set(1, "GH"); creator.commit(); cache.close(); assertThat(journalFile.exists()).isTrue(); assertThat(journalBkpFile.exists()).isTrue(); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); DiskLruCache.Value valueA = cache.get("k1"); assertThat(valueA.getString(0)).isEqualTo("ABC"); assertThat(valueA.getLength(0)).isEqualTo(3); assertThat(valueA.getString(1)).isEqualTo("DE"); assertThat(valueA.getLength(1)).isEqualTo(2); DiskLruCache.Value valueB = cache.get("k2"); assertThat(valueB.getString(0)).isEqualTo("F"); assertThat(valueB.getLength(0)).isEqualTo(1); assertThat(valueB.getString(1)).isEqualTo("GH"); assertThat(valueB.getLength(1)).isEqualTo(2); assertThat(journalBkpFile.exists()).isFalse(); assertThat(journalFile.exists()).isTrue(); }
private static void assertInoperable(DiskLruCache.Editor editor) throws Exception { try { editor.getString(0); Assert.fail(); } catch (IllegalStateException expected) { } try { editor.set(0, "A"); Assert.fail(); } catch (IllegalStateException expected) { } try { editor.getFile(0); Assert.fail(); } catch (IllegalStateException expected) { } try { editor.commit(); Assert.fail(); } catch (IllegalStateException expected) { } try { editor.abort(); Assert.fail(); } catch (IllegalStateException expected) { } }
private synchronized Editor edit(String key, long expectedSequenceNumber) throws IOException { checkNotClosed(); Entry entry = lruEntries.get(key); if (expectedSequenceNumber != ANY_SEQUENCE_NUMBER && (entry == null || entry.sequenceNumber != expectedSequenceNumber)) { return null; // Value is stale. } if (entry == null) { entry = new Entry(key); lruEntries.put(key, entry); } else if (entry.currentEditor != null) { return null; // Another edit is in progress. } Editor editor = new Editor(entry); entry.currentEditor = editor; // Flush the journal before creating files to prevent file leaks. journalWriter.append(DIRTY); journalWriter.append(' '); journalWriter.append(key); journalWriter.append('\n'); journalWriter.flush(); return editor; }
private synchronized Editor edit(String key, long expectedSequenceNumber) throws IOException { checkNotClosed(); Entry entry = lruEntries.get(key); if (expectedSequenceNumber != ANY_SEQUENCE_NUMBER && (entry == null || entry.sequenceNumber != expectedSequenceNumber)) { return null; // Value is stale. } if (entry == null) { entry = new Entry(key); lruEntries.put(key, entry); } else if (entry.currentEditor != null) { return null; // Another edit is in progress. } Editor editor = new Editor(entry); entry.currentEditor = editor; // Flush the journal before creating files to prevent file leaks. journalWriter.append(DIRTY); journalWriter.append(' '); journalWriter.append(key); journalWriter.append('\n'); journalWriter.flush(); return editor; }
@Test public void createNewEntryWithTooFewValuesFails() throws Exception { DiskLruCache.Editor creator = cache.edit("k1"); creator.set(1, "A"); try { creator.commit(); Assert.fail(); } catch (IllegalStateException expected) { } assertThat(getCleanFile("k1", 0).exists()).isFalse(); assertThat(getCleanFile("k1", 1).exists()).isFalse(); assertThat(getDirtyFile("k1", 0).exists()).isFalse(); assertThat(getDirtyFile("k1", 1).exists()).isFalse(); assertThat(cache.get("k1")).isNull(); DiskLruCache.Editor creator2 = cache.edit("k1"); creator2.set(0, "B"); creator2.set(1, "C"); creator2.commit(); }
@Test public void restoreBackupFile() throws Exception { DiskLruCache.Editor creator = cache.edit("k1"); creator.set(0, "ABC"); creator.set(1, "DE"); creator.commit(); cache.close(); assertThat(journalFile.renameTo(journalBkpFile)).isTrue(); assertThat(journalFile.exists()).isFalse(); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); DiskLruCache.Value value = cache.get("k1"); assertThat(value.getString(0)).isEqualTo("ABC"); assertThat(value.getLength(0)).isEqualTo(3); assertThat(value.getString(1)).isEqualTo("DE"); assertThat(value.getLength(1)).isEqualTo(2); assertThat(journalBkpFile.exists()).isFalse(); assertThat(journalFile.exists()).isTrue(); }
@Test public void readAndWriteEntryWithoutProperClose() throws Exception { DiskLruCache.Editor creator = cache.edit("k1"); creator.set(0, "A"); creator.set(1, "B"); creator.commit(); // Simulate a dirty close of 'cache' by opening the cache directory again. DiskLruCache cache2 = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); DiskLruCache.Value value = cache2.get("k1"); assertThat(value.getString(0)).isEqualTo("A"); assertThat(value.getLength(0)).isEqualTo(1); assertThat(value.getString(1)).isEqualTo("B"); assertThat(value.getLength(1)).isEqualTo(1); cache2.close(); }
/** Closes this cache. Stored values will remain on the filesystem. */ public synchronized void close() throws IOException { if (journalWriter == null) { return; // Already closed. } for (Entry entry : new ArrayList<Entry>(lruEntries.values())) { if (entry.currentEditor != null) { entry.currentEditor.abort(); } } trimToSize(); journalWriter.close(); journalWriter = null; }
/** Closes this cache. Stored values will remain on the filesystem. */ public synchronized void close() throws IOException { if (journalWriter == null) { return; // Already closed. } for (Entry entry : new ArrayList<Entry>(lruEntries.values())) { if (entry.currentEditor != null) { entry.currentEditor.abort(); } } trimToSize(); journalWriter.close(); journalWriter = null; }
@Test public void updateExistingEntryWithTooFewValuesReusesPreviousValues() throws Exception { DiskLruCache.Editor creator = cache.edit("k1"); creator.set(0, "A"); creator.set(1, "B"); creator.commit(); DiskLruCache.Editor updater = cache.edit("k1"); updater.set(0, "C"); updater.commit(); DiskLruCache.Value value = cache.get("k1"); assertThat(value.getString(0)).isEqualTo("C"); assertThat(value.getLength(0)).isEqualTo(1); assertThat(value.getString(1)).isEqualTo("B"); assertThat(value.getLength(1)).isEqualTo(1); }
@Test public void readAndWriteEntryAcrossCacheOpenAndClose() throws Exception { DiskLruCache.Editor creator = cache.edit("k1"); creator.set(0, "A"); creator.set(1, "B"); creator.commit(); cache.close(); cache = DiskLruCache.open(cacheDir, appVersion, 2, Integer.MAX_VALUE); DiskLruCache.Value value = cache.get("k1"); assertThat(value.getString(0)).isEqualTo("A"); assertThat(value.getLength(0)).isEqualTo(1); assertThat(value.getString(1)).isEqualTo("B"); assertThat(value.getLength(1)).isEqualTo(1); }