From 857d73bdc0d49f501516bba92e9e75898ee9b192 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Thu, 9 Jul 2009 20:04:47 +0000 Subject: [PATCH] * refactoring --- .../rename/NamesListTransferablePolicy.java | 5 +- .../filebot/ui/panel/subtitle/Language.java | 2 +- .../subtitle/SubtitleDownloadComponent.java | 11 +++- .../ui/panel/subtitle/SubtitlePackage.java | 2 +- .../ui/panel/subtitle/SubtitleUtilities.java | 26 +++++++- .../ui/panel/subtitle/SubtitleViewer.java | 2 +- .../BackgroundFileTransferablePolicy.java | 11 ++-- .../filebot/ui/transfer/FileTransferable.java | 54 ++++++++++++++++ .../ui/transfer/FileTransferablePolicy.java | 64 +++---------------- .../filebot/web/EpisodeListUtilities.java | 2 +- .../tuned/ByteBufferOutputStream.java | 11 ++++ 11 files changed, 120 insertions(+), 70 deletions(-) diff --git a/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java b/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java index c9ec4621..26df6520 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java @@ -4,6 +4,7 @@ package net.sourceforge.filebot.ui.panel.rename; import static java.awt.datatransfer.DataFlavor.*; import static net.sourceforge.filebot.FileBotUtilities.*; +import static net.sourceforge.filebot.ui.transfer.FileTransferable.*; import static net.sourceforge.tuned.FileUtilities.*; import java.awt.datatransfer.DataFlavor; @@ -46,7 +47,7 @@ class NamesListTransferablePolicy extends FileTransferablePolicy { @Override public boolean accept(Transferable tr) throws Exception { - return tr.isDataFlavorSupported(stringFlavor) || super.accept(tr); + return tr.isDataFlavorSupported(stringFlavor) || hasFileListFlavor(tr); } @@ -65,7 +66,7 @@ class NamesListTransferablePolicy extends FileTransferablePolicy { if (tr.isDataFlavorSupported(episodeArrayFlavor)) { // episode array transferable model.addAll(Arrays.asList((Episode[]) tr.getTransferData((episodeArrayFlavor)))); - } else if (super.accept(tr)) { + } else if (hasFileListFlavor(tr)) { // file transferable load(getFilesFromTransferable(tr)); } else if (tr.isDataFlavorSupported(stringFlavor)) { diff --git a/source/net/sourceforge/filebot/ui/panel/subtitle/Language.java b/source/net/sourceforge/filebot/ui/panel/subtitle/Language.java index 74fbecc5..a426917c 100644 --- a/source/net/sourceforge/filebot/ui/panel/subtitle/Language.java +++ b/source/net/sourceforge/filebot/ui/panel/subtitle/Language.java @@ -8,7 +8,7 @@ import java.util.ResourceBundle; import java.util.Set; -class Language { +public class Language { private final String code; private final String name; diff --git a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleDownloadComponent.java b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleDownloadComponent.java index f69d2f89..67449d0f 100644 --- a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleDownloadComponent.java +++ b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleDownloadComponent.java @@ -85,6 +85,13 @@ class SubtitleDownloadComponent extends JComponent { // file list view final JList fileList = new ListView(createFileListModel()) { + @Override + protected String convertValueToText(Object value) { + MemoryFile file = (MemoryFile) value; + return file.getName(); + } + + @Override protected Icon convertValueToIcon(Object value) { if (SUBTITLE_FILES.accept(value.toString())) @@ -280,7 +287,7 @@ class SubtitleDownloadComponent extends JComponent { fileChooser.setSelectedFile(new File(validateFileName(file.getName()))); if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { - write(file, fileChooser.getSelectedFile()); + write(file.getData(), fileChooser.getSelectedFile()); } } else { // multiple files @@ -292,7 +299,7 @@ class SubtitleDownloadComponent extends JComponent { for (Object object : selection) { MemoryFile file = (MemoryFile) object; - write(file, new File(folder, validateFileName(file.getName()))); + write(file.getData(), new File(folder, validateFileName(file.getName()))); } } } diff --git a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePackage.java b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePackage.java index 124429dd..c8c2a5a5 100644 --- a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePackage.java +++ b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePackage.java @@ -24,7 +24,7 @@ import net.sourceforge.filebot.web.SubtitleDescriptor; import net.sourceforge.tuned.FileUtilities; -class SubtitlePackage { +public class SubtitlePackage { private final SubtitleDescriptor subtitle; diff --git a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleUtilities.java b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleUtilities.java index 024f90d8..bf7b97c8 100644 --- a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleUtilities.java +++ b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleUtilities.java @@ -3,10 +3,12 @@ package net.sourceforge.filebot.ui.panel.subtitle; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.ArrayDeque; import java.util.ArrayList; @@ -60,11 +62,31 @@ final class SubtitleUtilities { } - public static void write(MemoryFile source, File destination) throws IOException { + public static byte[] read(File source) throws IOException { + InputStream in = new FileInputStream(source); + + try { + byte[] data = new byte[(int) source.length()]; + + int position = 0; + int read = 0; + + while (position < data.length && (read = in.read(data, position, data.length - position)) >= 0) { + position += read; + } + + return data; + } finally { + in.close(); + } + } + + + public static void write(ByteBuffer data, File destination) throws IOException { FileChannel fileChannel = new FileOutputStream(destination).getChannel(); try { - fileChannel.write(source.getData()); + fileChannel.write(data); } finally { fileChannel.close(); } diff --git a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleViewer.java b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleViewer.java index 914a939c..ba12c7f0 100644 --- a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleViewer.java +++ b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitleViewer.java @@ -46,7 +46,7 @@ import net.sourceforge.tuned.ui.notification.SeparatorBorder; import net.sourceforge.tuned.ui.notification.SeparatorBorder.Position; -class SubtitleViewer extends JFrame { +public class SubtitleViewer extends JFrame { private final JLabel titleLabel = new JLabel(); diff --git a/source/net/sourceforge/filebot/ui/transfer/BackgroundFileTransferablePolicy.java b/source/net/sourceforge/filebot/ui/transfer/BackgroundFileTransferablePolicy.java index 99e0379b..4e469fe3 100644 --- a/source/net/sourceforge/filebot/ui/transfer/BackgroundFileTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/transfer/BackgroundFileTransferablePolicy.java @@ -2,6 +2,8 @@ package net.sourceforge.filebot.ui.transfer; +import static net.sourceforge.filebot.ui.transfer.FileTransferable.*; + import java.awt.datatransfer.Transferable; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; @@ -22,7 +24,7 @@ public abstract class BackgroundFileTransferablePolicy extends FileTransferab private final List workers = new ArrayList(2); - + @Override public void handleTransferable(Transferable tr, TransferAction action) throws Exception { List files = getFilesFromTransferable(tr); @@ -98,12 +100,12 @@ public abstract class BackgroundFileTransferablePolicy extends FileTransferab }); } - + protected class BackgroundWorker extends SwingWorker { private final List files; - + public BackgroundWorker(List files) { this.files = files; @@ -166,9 +168,10 @@ public abstract class BackgroundFileTransferablePolicy extends FileTransferab } } + protected final PropertyChangeSupport swingPropertyChangeSupport = new SwingPropertyChangeSupport(this, true); - + public void addPropertyChangeListener(PropertyChangeListener listener) { swingPropertyChangeSupport.addPropertyChangeListener(listener); } diff --git a/source/net/sourceforge/filebot/ui/transfer/FileTransferable.java b/source/net/sourceforge/filebot/ui/transfer/FileTransferable.java index 28b72f13..a45cfbf8 100644 --- a/source/net/sourceforge/filebot/ui/transfer/FileTransferable.java +++ b/source/net/sourceforge/filebot/ui/transfer/FileTransferable.java @@ -6,9 +6,17 @@ import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; import java.nio.CharBuffer; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; +import java.util.Scanner; +import java.util.logging.Level; +import java.util.logging.Logger; public class FileTransferable implements Transferable { @@ -82,4 +90,50 @@ public class FileTransferable implements Transferable { return flavor.isFlavorJavaFileListType() || flavor.equals(uriListFlavor); } + + public static boolean hasFileListFlavor(Transferable tr) { + return tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor) || tr.isDataFlavorSupported(FileTransferable.uriListFlavor); + } + + + @SuppressWarnings("unchecked") + public static List getFilesFromTransferable(Transferable tr) throws IOException, UnsupportedFlavorException { + if (tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + // file list flavor + return (List) tr.getTransferData(DataFlavor.javaFileListFlavor); + } else if (tr.isDataFlavorSupported(FileTransferable.uriListFlavor)) { + // file URI list flavor + Readable transferData = (Readable) tr.getTransferData(FileTransferable.uriListFlavor); + + Scanner scanner = new Scanner(transferData); + + List files = new ArrayList(); + + while (scanner.hasNextLine()) { + String uri = scanner.nextLine(); + + if (uri.startsWith("#")) { + // the line is a comment (as per RFC 2483) + continue; + } + + try { + File file = new File(new URI(uri)); + + if (!file.exists()) + throw new FileNotFoundException(file.toString()); + + files.add(file); + } catch (Exception e) { + // URISyntaxException, IllegalArgumentException, FileNotFoundException + Logger.getLogger(FileTransferable.class.getName()).log(Level.WARNING, "Invalid file uri: " + uri); + } + } + + return files; + } + + // cannot get files from transferable + throw new UnsupportedFlavorException(DataFlavor.javaFileListFlavor); + } } diff --git a/source/net/sourceforge/filebot/ui/transfer/FileTransferablePolicy.java b/source/net/sourceforge/filebot/ui/transfer/FileTransferablePolicy.java index 64c82f47..2dcbc50b 100644 --- a/source/net/sourceforge/filebot/ui/transfer/FileTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/transfer/FileTransferablePolicy.java @@ -2,71 +2,25 @@ package net.sourceforge.filebot.ui.transfer; -import java.awt.datatransfer.DataFlavor; +import static net.sourceforge.filebot.ui.transfer.FileTransferable.*; + import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.Scanner; -import java.util.logging.Level; -import java.util.logging.Logger; public abstract class FileTransferablePolicy extends TransferablePolicy { @Override public boolean accept(Transferable tr) throws Exception { - List files = getFilesFromTransferable(tr); - - if (files.isEmpty()) + try { + return accept(getFilesFromTransferable(tr)); + } catch (UnsupportedFlavorException e) { + // no file list flavor return false; - - return accept(files); - } - - - @SuppressWarnings("unchecked") - protected List getFilesFromTransferable(Transferable tr) throws Exception { - if (tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { - // file list flavor - return (List) tr.getTransferData(DataFlavor.javaFileListFlavor); - } else if (tr.isDataFlavorSupported(FileTransferable.uriListFlavor)) { - // file URI list flavor - Readable transferData = (Readable) tr.getTransferData(FileTransferable.uriListFlavor); - - Scanner scanner = new Scanner(transferData); - - List files = new ArrayList(); - - while (scanner.hasNextLine()) { - String uri = scanner.nextLine(); - - if (uri.startsWith("#")) { - // the line is a comment (as per RFC 2483) - continue; - } - - try { - File file = new File(new URI(uri)); - - if (!file.exists()) - throw new FileNotFoundException(file.toString()); - - files.add(file); - } catch (Exception e) { - // URISyntaxException, IllegalArgumentException, FileNotFoundException - Logger.getLogger(getClass().getName()).log(Level.WARNING, "Invalid file uri: " + uri); - } - } - - return files; } - - return Collections.emptyList(); } @@ -88,9 +42,7 @@ public abstract class FileTransferablePolicy extends TransferablePolicy { protected abstract void load(List files) throws IOException; - protected void clear() { - // do nothing - } + protected abstract void clear(); public String getFileFilterDescription() { diff --git a/source/net/sourceforge/filebot/web/EpisodeListUtilities.java b/source/net/sourceforge/filebot/web/EpisodeListUtilities.java index 8162c4fd..9006769f 100644 --- a/source/net/sourceforge/filebot/web/EpisodeListUtilities.java +++ b/source/net/sourceforge/filebot/web/EpisodeListUtilities.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.List; -public final class EpisodeListUtilities { +final class EpisodeListUtilities { public static List filterBySeason(Iterable episodes, int season) { diff --git a/source/net/sourceforge/tuned/ByteBufferOutputStream.java b/source/net/sourceforge/tuned/ByteBufferOutputStream.java index 7198e370..2abdc9fa 100644 --- a/source/net/sourceforge/tuned/ByteBufferOutputStream.java +++ b/source/net/sourceforge/tuned/ByteBufferOutputStream.java @@ -93,6 +93,17 @@ public class ByteBufferOutputStream extends OutputStream { } + public byte[] getByteArray() { + ByteBuffer data = getByteBuffer(); + + // copy data to byte array + byte[] bytes = new byte[data.remaining()]; + data.get(bytes); + + return bytes; + } + + public int transferFrom(ReadableByteChannel channel) throws IOException { // make sure buffer is not at its limit ensureCapacity(buffer.position() + 1);