package org.rr.jeborker.gui;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import javax.swing.SwingUtilities;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.commons.utils.ListUtils;
import org.rr.jeborker.app.FileRefreshBackground;
import org.rr.jeborker.db.DefaultDBManager;
import org.rr.jeborker.db.item.EbookPropertyItem;
import org.rr.jeborker.db.item.EbookPropertyItemUtils;
import org.rr.jeborker.gui.model.EbookSheetPropertyModel;
import org.rr.jeborker.metadata.IMetadataWriter;
import org.rr.jeborker.metadata.MetadataHandlerFactory;
import org.rr.jeborker.metadata.MetadataProperty;
import com.l2fprod.common.propertysheet.Property;
class MainControllerUtils {
/**
* Writes the given l2fprod sheet properties as metadata to the ebook.
* @param properties The properties to be written.
*/
static void writeProperties(final List<MetadataProperty> properties, List<IResourceHandler> ebookResources) {
if(properties==null || properties.isEmpty()) {
return; //nothing to do.
}
if(ebookResources != null && !ebookResources.isEmpty()) {
final IMetadataWriter writer = MetadataHandlerFactory.getWriter(ebookResources);
if(writer != null) {
try {
FileRefreshBackground.setDisabled(true);
writer.writeMetadata(properties);
//now the data was written, it's time to refresh the database entry
final List<EbookPropertyItem> selectedEbookPropertyItems = MainController.getController().getSelectedEbookPropertyItems();
final List<IResourceHandler> selectedEbookResources = new ArrayList<>();
for(EbookPropertyItem selectedEbookPropertyItem : selectedEbookPropertyItems) {
selectedEbookResources.add(selectedEbookPropertyItem.getResourceHandler());
}
final List<IResourceHandler> notSelectedEbookResources = ListUtils.difference(selectedEbookResources, ebookResources);
for (IResourceHandler notSelectedEbookResource : notSelectedEbookResources) {
List<EbookPropertyItem> items = EbookPropertyItemUtils.getEbookPropertyItemByResource(notSelectedEbookResource);
selectedEbookPropertyItems.addAll(items);
}
for (EbookPropertyItem item : selectedEbookPropertyItems) {
EbookPropertyItemUtils.refreshEbookPropertyItem(item, item.getResourceHandler(), false);
DefaultDBManager.getInstance().updateObject(item);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MainController.getController().refreshTableSelectedItem(true);
}
});
} catch(Exception e) {
LoggerFactory.getLogger().log(Level.WARNING, "Could not write multiple Metadata", e);
} finally {
FileRefreshBackground.setDisabled(false);
}
}
}
}
/**
* Unwraps the {@link MetadataProperty} from the given {@link Property} list.
* @param properties The properties to be unwrapped.
* @return The desired {@link MetadataProperty}
*/
static ArrayList<MetadataProperty> createMetadataProperties(final List<Property> properties) {
final ArrayList<MetadataProperty> target = new ArrayList<>();
for (Property property : properties) {
final EbookSheetPropertyModel model = MainController.getController().getPropertySheetHandler().getModel();
List<MetadataProperty> metadataProperties = model.getMetadataProperties(property);
for (MetadataProperty metadataProperty : metadataProperties) {
target.add(metadataProperty);
}
}
return target;
}
}