1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 19:42:17 +02:00

background library loading (in progress)

This commit is contained in:
Nikolay Pultsin 2011-07-17 16:59:56 +01:00
parent 35ef743d40
commit 4646edc4b5

View file

@ -261,27 +261,9 @@ public final class Library {
} }
} }
private void build() { private void addBookToLibrary(Book book, boolean doGroupTitlesByFirstLetter) {
final FileInfoSet fileInfos = new FileInfoSet(); myBooks.add(book);
final Map<Long,Book> savedBooks = BooksDatabase.Instance().loadBooks(fileInfos, true);
boolean doGroupTitlesByFirstLetter = false;
if (savedBooks.size() > 10) {
final HashSet<String> letterSet = new HashSet<String>();
for (Book book : savedBooks.values()) {
final String letter = TitleTree.firstTitleLetter(book);
if (letter != null) {
letterSet.add(letter);
}
}
doGroupTitlesByFirstLetter = savedBooks.values().size() > letterSet.size() * 5 / 4;
}
collectBooks(fileInfos, savedBooks);
final Map<Long,Book> bookById = new HashMap<Long,Book>();
for (Book book : myBooks) {
bookById.put(book.getId(), book);
List<Author> authors = book.authors(); List<Author> authors = book.authors();
if (authors.isEmpty()) { if (authors.isEmpty()) {
authors = (List<Author>)myNullList; authors = (List<Author>)myNullList;
@ -319,21 +301,73 @@ public final class Library {
} }
} }
private void fireModelChangedEvent() {
System.err.println("model changed event");
}
private void build() {
// Step 0: get list of books from database marked as "existing"
final FileInfoSet fileInfos = new FileInfoSet();
final Map<Long,Book> savedBooksByFileId = BooksDatabase.Instance().loadBooks(fileInfos, true);
final Map<Long,Book> savedBooksByBookId = new HashMap<Long,Book>();
for (Book b : savedBooksByFileId.values()) {
savedBooksByBookId.put(b.getId(), b);
}
// Step 1: add "existing" books recent and favorites lists
final BooksDatabase db = BooksDatabase.Instance(); final BooksDatabase db = BooksDatabase.Instance();
for (long id : db.loadRecentBookIds()) { for (long id : db.loadRecentBookIds()) {
Book book = bookById.get(id); final Book book = savedBooksByBookId.get(id);
if (book != null) { if (book != null) {
new BookTree(getFirstLevelTree(ROOT_RECENT), book, true); new BookTree(getFirstLevelTree(ROOT_RECENT), book, true);
} }
} }
for (long id : db.loadFavoritesIds()) { for (long id : db.loadFavoritesIds()) {
Book book = bookById.get(id); final Book book = savedBooksByBookId.get(id);
if (book != null) { if (book != null) {
getFirstLevelTree(ROOT_FAVORITES).getBookSubTree(book, true); getFirstLevelTree(ROOT_FAVORITES).getBookSubTree(book, true);
} }
} }
fireModelChangedEvent();
// Step 2: check if files corresptonding to "existing" books really exists; add books
// to library if yes, remove from recent/favorites list if no;
// collect newly "orphaned" books
boolean doGroupTitlesByFirstLetter = false;
if (savedBooksByFileId.size() > 10) {
final HashSet<String> letterSet = new HashSet<String>();
for (Book book : savedBooksByFileId.values()) {
final String letter = TitleTree.firstTitleLetter(book);
if (letter != null) {
letterSet.add(letter);
}
}
doGroupTitlesByFirstLetter = savedBooksByFileId.values().size() > letterSet.size() * 5 / 4;
}
final Set<Book> orphanedBooks = new HashSet<Book>();
for (Book book : savedBooksByFileId.values()) {
if (book.File.exists()) {
addBookToLibrary(book, doGroupTitlesByFirstLetter);
} else {
myRootTree.removeBook(book);
orphanedBooks.add(book);
}
fireModelChangedEvent();
}
BooksDatabase.Instance().setExistingFlag(orphanedBooks, false);
// Step 3: collect books from physical files; add new, update already added,
// unmark orphaned as existing again, collect newly added
final Map<Long,Book> orphanedBooksByFileId = BooksDatabase.Instance().loadBooks(fileInfos, true);
final Set<Book> existingBooks = new HashSet<Book>();
final Set<Book> newBooks = new HashSet<Book>();
/*
collectBooks(fileInfos, savedBooksByFileId);
db.executeAsATransaction(new Runnable() { db.executeAsATransaction(new Runnable() {
public void run() { public void run() {
for (Book book : myBooks) { for (Book book : myBooks) {
@ -341,6 +375,7 @@ public final class Library {
} }
} }
}); });
*/
myState = STATE_FULLY_INITIALIZED; myState = STATE_FULLY_INITIALIZED;
} }