package net.bible.service.download;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.bible.service.common.Logger;
import org.crosswire.common.util.Version;
import org.crosswire.jsword.book.Book;
/**
* Some repos contain the same books. Get the latest version of duplicates.
*/
public class RepoBookDeduplicator {
private Map<BookKey, Book> bookSet = new HashMap<>();
private Logger logger = new Logger(this.getClass().getName());
public List<Book> getBooks() {
return new ArrayList<>(bookSet.values());
}
/**
* Add books if not already added or are a later version than previously added version
*/
public void addAll(List<Book> books) {
for (Book book : books) {
try {
BookKey bookKey = new BookKey(book);
Book existing = bookSet.get(bookKey);
Book latest = getLatest(existing, book);
bookSet.put(bookKey, latest);
} catch (Exception e) {
logger.error("Error comparing download book versions", e);
}
}
}
/**
* Add books if not already added.
* Used for beta repo - beta should never override live books.
*/
public void addIfNotExists(List<Book> books) {
for (Book book : books) {
try {
BookKey bookKey = new BookKey(book);
if (!bookSet.containsKey(bookKey)) {
bookSet.put(bookKey, book);
}
} catch (Exception e) {
logger.error("Error comparing download book versions", e);
}
}
}
private Book getLatest(Book previous, Book current) {
if (previous==null) {
return current;
}
// SBMD defaults t0 1.0.0 if version does not exist
Version previousVersion = new Version(previous.getBookMetaData().getProperty("Version"));
Version currentVersion = new Version(current.getBookMetaData().getProperty("Version"));
if (previousVersion.compareTo(currentVersion)<0) {
return current;
} else {
return previous;
}
}
private class BookKey {
private Book book;
BookKey(Book book) {
this.book = book;
book.hashCode();
}
@Override
public boolean equals(Object obj) {
// The real bit ...
Book thatBook = ((BookKey)obj).book;
return book.getBookCategory().equals(thatBook.getBookCategory())
&& book.getAbbreviation().equals(thatBook.getAbbreviation())
&& book.getLanguage().equals(thatBook.getLanguage());
}
@Override
public int hashCode() {
return book.getAbbreviation().hashCode();
}
}
}