package org.rr.jeborker.gui.model; import java.util.Collections; import java.util.List; import javax.swing.table.AbstractTableModel; import org.rr.commons.utils.ThreadUtils; import org.rr.commons.utils.ThreadUtils.RunnableImpl; import org.rr.jeborker.db.item.EbookPropertyItem; import org.rr.jeborker.metadata.download.MetadataDownloadEntry; import org.rr.jeborker.metadata.download.MetadataDownloader; public class MetadataDownloadModel extends AbstractTableModel { private static final long serialVersionUID = -8746789528889474186L; private MetadataDownloader downloader; private String searchPhrase; private List<MetadataDownloadEntry> searchEntries; public MetadataDownloadModel(MetadataDownloader downloader, String searchPhrase) { this.downloader = downloader; this.searchPhrase = searchPhrase; } /** * Invokes the {@link MetadataDownloader} and provide it's entries with this {@link MetadataDownloadModel} * instance. This method blocks as long as all data for the model is loaded. * * This Method isn't be invoked automatically by the {@link MetadataDownloadModel} instance. */ public void loadSearchResult() { searchEntries = Collections.synchronizedList(this.downloader.search(this.searchPhrase)); ThreadUtils.loopAndWait(searchEntries, new RunnableImpl<MetadataDownloadEntry, Void>() { @Override public Void run(MetadataDownloadEntry searchEntry) { searchEntry.getThumbnailImageBytes(); //lazy loading searchEntry.getDescription(); //lazy loading return null; }}, 10); } @Override public int getRowCount() { if(searchEntries != null) { return searchEntries.size(); } return 0; } @Override public int getColumnCount() { return 1; } @Override public String getColumnName(int columnIndex) { return MetadataDownloadEntry.class.getName(); } @Override public Class<?> getColumnClass(int columnIndex) { return MetadataDownloadEntry.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return searchEntries.get(rowIndex); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { searchEntries.set(rowIndex, (MetadataDownloadEntry) aValue); } }