package org.rr.jeborker.gui.action;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.logging.Level;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JOptionPane;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.commons.mufs.ResourceHandlerFactory;
import org.rr.commons.swing.SwingUtils;
import org.rr.commons.utils.StringUtil;
import org.rr.jeborker.app.BasePathList;
import org.rr.jeborker.app.FileRefreshBackground;
import org.rr.jeborker.app.preferences.PreferenceStoreFactory;
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.MainController;
import org.rr.jeborker.gui.RenameFileController;
class RenameFileAction extends AbstractAction {
private String file;
private RenameFileController renameFileController = MainController.getController().getRenameFileController();
RenameFileAction(String text) {
this.file = text;
String name = Bundle.getString("RenameFileAction.name");
putValue(Action.NAME, SwingUtils.removeMnemonicMarker(name));
putValue(MNEMONIC_KEY, SwingUtils.getMnemonicKeyCode(name));
}
@Override
public void actionPerformed(ActionEvent e) {
MainController controller = MainController.getController();
List<Entry<EbookPropertyItem, IResourceHandler>> renameFiles = Collections.emptyList();
if (StringUtil.isEmpty(file)) {
List<EbookPropertyItem> selectedEbookPropertyItems = controller.getSelectedEbookPropertyItems();
if (!selectedEbookPropertyItems.isEmpty()) {
renameFiles = openRenameFileDialogWithEbookPropertyItems(selectedEbookPropertyItems);
} else {
List<IResourceHandler> selectedEbookPropertyResources = controller.getMainTreeHandler().getSelectedTreeItems();
renameFiles = openRenameFileDialogWithIResources(selectedEbookPropertyResources);
}
} else {
List<IResourceHandler> selectedEbookPropertyResources = Arrays.asList(ResourceHandlerFactory.getResourceHandler(file));
renameFiles = openRenameFileDialogWithIResources(selectedEbookPropertyResources);
}
doRenameFiles(renameFiles);
}
private void doRenameFiles(final List<Entry<EbookPropertyItem, IResourceHandler>> renameFiles) {
FileRefreshBackground.runWithDisabledRefresh(new Runnable() {
@Override
public void run() {
BasePathList basePathList = PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.DB_STORE).getBasePath();
LinkedList<IResourceHandler> toRefreshInFileSystemTree = new LinkedList<>();
for (Entry<EbookPropertyItem, IResourceHandler> toRename : renameFiles) {
EbookPropertyItem source = toRename.getKey();
IResourceHandler sourceResourceHandler = source.getResourceHandler();
IResourceHandler targetResourceHandler = toRename.getValue();
try {
if(sourceResourceHandler.equals(targetResourceHandler)) {
continue;
}
if (targetResourceHandler.exists() && !renameFileController.isOverwriteExistingFiles()) {
String message = Bundle.getFormattedString("RenameFileAction.overwrite.message", source.getFileName(), targetResourceHandler.getName());
String title = Bundle.getString("RenameFileAction.overwrite.title");
int value = MainController.getController().showMessageBox(message, title, JOptionPane.YES_NO_OPTION, "RenameFileActionKey",
JOptionPane.YES_OPTION, true);
if (value != 0) {
continue;
}
}
sourceResourceHandler.moveTo(targetResourceHandler, true);
if(basePathList.containsBasePathFor(source.getBasePath())) {
EbookPropertyItemUtils.renameCoverThumbnail(sourceResourceHandler, targetResourceHandler);
DefaultDBManager.getInstance().deleteObject(source);
source.setFile(targetResourceHandler.getResourceString());
DefaultDBManager.getInstance().storeObject(source);
} else {
toRefreshInFileSystemTree.add(sourceResourceHandler.getParentResource());
toRefreshInFileSystemTree.add(targetResourceHandler.getParentResource());
}
} catch (IOException e) {
LoggerFactory.getLogger().log(Level.SEVERE, "Rename of file " + source + " to " + targetResourceHandler + " has failed.", e);
}
}
MainController.getController().refreshTableSelectedItem(true);
for(IResourceHandler toRefresh : toRefreshInFileSystemTree) {
MainController.getController().getMainTreeHandler().refreshFileSystemTreeEntry(toRefresh);
}
}
});
}
private List<Entry<EbookPropertyItem, IResourceHandler>> openRenameFileDialogWithEbookPropertyItems(List<EbookPropertyItem> toRename) {
renameFileController.showDialog(toRename);
if (renameFileController.isConfirmed()) {
return renameFileController.getValues();
}
return Collections.emptyList();
}
private List<Entry<EbookPropertyItem, IResourceHandler>> openRenameFileDialogWithIResources(List<IResourceHandler> toRename) {
List<EbookPropertyItem> ebookPropertyItems = getEbookPropertyItems(toRename);
return openRenameFileDialogWithEbookPropertyItems(ebookPropertyItems);
}
private List<EbookPropertyItem> getEbookPropertyItems(final List<IResourceHandler> toRename) {
MainController.getController().getProgressMonitor().monitorProgressStart(Bundle.getString("RenameFileAction.readingMetadata"));
try {
return new ArrayList<EbookPropertyItem>() {{
for(IResourceHandler resourceLoader : toRename) {
List<EbookPropertyItem> ebookPropertyItemByResource = EbookPropertyItemUtils.getEbookPropertyItemByResource(resourceLoader);
if (ebookPropertyItemByResource.isEmpty()) {
MainController.getController().getProgressMonitor().setMessage(Bundle.getFormattedString("RenameFileAction.readingMetadataEntry", resourceLoader.getName()));
add(EbookPropertyItemUtils.createEbookPropertyItem(resourceLoader, null));
} else {
add(ebookPropertyItemByResource.get(0));
}
}
}};
} finally {
MainController.getController().getProgressMonitor().monitorProgressStop();
}
}
}