Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stroage: Add backupAddressBook(ReadOnlyAddressBook) #2

Merged
merged 1 commit into from
Feb 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/main/java/seedu/address/storage/AddressBookStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ public interface AddressBookStorage {
*/
Path getAddressBookFilePath();

/**
* Returns the file path of the backup data file.
*/
Path getAddressBookBackupFilePath();

/**
* Returns AddressBook data as a {@link ReadOnlyAddressBook}.
* Returns {@code Optional.empty()} if storage file is not found.
Expand All @@ -42,4 +47,10 @@ public interface AddressBookStorage {
*/
void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException;

/**
* Backup the given {@link ReadOnlyAddressBook} to the storage.
* @param addressBook
* @throws IOException
*/
void backupAddressBook(ReadOnlyAddressBook addressBook) throws IOException;
}
16 changes: 16 additions & 0 deletions src/main/java/seedu/address/storage/JsonAddressBookStorage.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package seedu.address.storage;

import static java.util.Objects.isNull;
import static java.util.Objects.requireNonNull;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.logging.Logger;

Expand All @@ -22,15 +24,25 @@ public class JsonAddressBookStorage implements AddressBookStorage {
private static final Logger logger = LogsCenter.getLogger(JsonAddressBookStorage.class);

private Path filePath;
private Path backupFilePath;

public JsonAddressBookStorage(Path filePath) {
this.filePath = filePath;
if (isNull(filePath.getParent())) {
this.backupFilePath = Paths.get("backup.json");
} else {
this.backupFilePath = filePath.getParent().resolve("backup.json");
}
}

public Path getAddressBookFilePath() {
return filePath;
}

public Path getAddressBookBackupFilePath() {
return backupFilePath;
}

@Override
public Optional<ReadOnlyAddressBook> readAddressBook() throws DataConversionException {
return readAddressBook(filePath);
Expand Down Expand Up @@ -77,4 +89,8 @@ public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) thro
JsonUtil.saveJsonFile(new JsonSerializableAddressBook(addressBook), filePath);
}

@Override
public void backupAddressBook(ReadOnlyAddressBook addressBook) throws IOException {
saveAddressBook(addressBook, backupFilePath);
}
}
6 changes: 6 additions & 0 deletions src/main/java/seedu/address/storage/Storage.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,16 @@ public interface Storage extends AddressBookStorage, UserPrefsStorage {
@Override
Path getAddressBookFilePath();

@Override
Path getAddressBookBackupFilePath();

@Override
Optional<ReadOnlyAddressBook> readAddressBook() throws DataConversionException, IOException;

@Override
void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException;

@Override
void backupAddressBook(ReadOnlyAddressBook addressBook) throws IOException;

}
11 changes: 11 additions & 0 deletions src/main/java/seedu/address/storage/StorageManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ public Path getAddressBookFilePath() {
return addressBookStorage.getAddressBookFilePath();
}

@Override
public Path getAddressBookBackupFilePath() {
return addressBookStorage.getAddressBookBackupFilePath();
}

@Override
public Optional<ReadOnlyAddressBook> readAddressBook() throws DataConversionException, IOException {
return readAddressBook(addressBookStorage.getAddressBookFilePath());
Expand All @@ -74,4 +79,10 @@ public void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) thro
addressBookStorage.saveAddressBook(addressBook, filePath);
}

@Override
public void backupAddressBook(ReadOnlyAddressBook addressBook) throws IOException {
logger.fine("Attempting to write to backup data file: " + addressBookStorage.getAddressBookBackupFilePath());
addressBookStorage.backupAddressBook(addressBook);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,27 @@ public void readAndSaveAddressBook_allInOrder_success() throws Exception {

}

@Test
public void readAndBackupAddressBook_allInOrder_success() throws Exception {
Path filePath = testFolder.getRoot().toPath().resolve("TempAddressBook.json");
AddressBook original = getTypicalAddressBook();
JsonAddressBookStorage jsonAddressBookStorage = new JsonAddressBookStorage(filePath);

// Backup in new file and read back
jsonAddressBookStorage.backupAddressBook(original);
ReadOnlyAddressBook readBack = jsonAddressBookStorage.readAddressBook(
jsonAddressBookStorage.getAddressBookBackupFilePath()).get();
assertEquals(original, new AddressBook(readBack));

// Modify data, overwrite backup file, and read back
original.addPerson(HOON);
original.removePerson(ALICE);
jsonAddressBookStorage.backupAddressBook(original);
readBack = jsonAddressBookStorage.readAddressBook(
jsonAddressBookStorage.getAddressBookBackupFilePath()).get();
assertEquals(original, new AddressBook(readBack));
}

@Test
public void saveAddressBook_nullAddressBook_throwsNullPointerException() {
thrown.expect(NullPointerException.class);
Expand Down
19 changes: 19 additions & 0 deletions src/test/java/seedu/address/storage/StorageManagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,28 @@ public void addressBookReadSave() throws Exception {
assertEquals(original, new AddressBook(retrieved));
}

@Test
public void addressBookReadBackup() throws Exception {
/*
* Note: This is an integration test that verifies the StorageManager is properly wired to the
* {@link JsonAddressBookStorage} class.
* More extensive testing of UserPref saving/reading is done in {@link JsonAddressBookStorageTest} class.
*/
AddressBook original = getTypicalAddressBook();
storageManager.backupAddressBook(original);
ReadOnlyAddressBook retrieved = storageManager.readAddressBook(
storageManager.getAddressBookBackupFilePath()).get();
assertEquals(original, new AddressBook(retrieved));
}

@Test
public void getAddressBookFilePath() {
assertNotNull(storageManager.getAddressBookFilePath());
}

@Test
public void getAddressBookBackupFilePath() {
assertNotNull(storageManager.getAddressBookBackupFilePath());
}

}