1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.tika.gui;
18
19 import java.awt.datatransfer.Clipboard;
20 import java.awt.datatransfer.DataFlavor;
21 import java.awt.datatransfer.Transferable;
22 import java.awt.event.InputEvent;
23 import java.io.File;
24 import java.io.InputStream;
25 import java.util.List;
26 import java.util.StringTokenizer;
27 import java.util.ArrayList;
28 import java.net.URI;
29 import java.net.URL;
30
31 import javax.swing.Icon;
32 import javax.swing.JComponent;
33 import javax.swing.TransferHandler;
34
35 import org.apache.tika.metadata.Metadata;
36 import org.apache.tika.metadata.MetadataHelper;
37
38
39
40
41 class ParsingTransferHandler extends TransferHandler {
42
43
44
45
46 private static final long serialVersionUID = -557932290014044494L;
47
48 private final TransferHandler delegate;
49
50 private final TikaGUI tika;
51
52 private static DataFlavor uriListFlavor;
53 private static DataFlavor urlListFlavor;
54 static {
55 try {
56 uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
57 urlListFlavor = new DataFlavor("text/plain;class=java.lang.String");
58 } catch (ClassNotFoundException e) {
59 }
60 }
61
62 public ParsingTransferHandler(TransferHandler delegate, TikaGUI tika) {
63 this.delegate = delegate;
64 this.tika = tika;
65 }
66
67 public boolean canImport(JComponent component, DataFlavor[] flavors) {
68 for (DataFlavor flavor : flavors) {
69 if (flavor.equals(DataFlavor.javaFileListFlavor) || flavor.equals(uriListFlavor) || flavor.equals(urlListFlavor)) {
70 return true;
71 }
72 }
73 return false;
74 }
75
76 @SuppressWarnings("unchecked")
77 public boolean importData(
78 JComponent component, Transferable transferable) {
79 try {
80 List<File> files = null;
81 if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
82 files = (List<File>) transferable.getTransferData(
83 DataFlavor.javaFileListFlavor);
84 } else if (transferable.isDataFlavorSupported(urlListFlavor)) {
85 Object data = transferable.getTransferData(urlListFlavor);
86 Metadata metadata = new Metadata();
87 InputStream stream = MetadataHelper.getInputStream(
88 new URL(data.toString()), metadata);
89 tika.importStream(stream, metadata);
90 } else if (transferable.isDataFlavorSupported(uriListFlavor)) {
91 files = uriToFileList(
92 transferable.getTransferData(uriListFlavor).toString());
93 }
94
95 for (File file : files) {
96 Metadata metadata = new Metadata();
97 InputStream stream = MetadataHelper.getInputStream(
98 file.toURI().toURL(), metadata);
99 tika.importStream(stream, metadata);
100 }
101 return true;
102 } catch (Exception e) {
103 return false;
104 }
105 }
106
107 public void exportAsDrag(JComponent arg0, InputEvent arg1, int arg2) {
108 delegate.exportAsDrag(arg0, arg1, arg2);
109 }
110
111 public void exportToClipboard(JComponent arg0, Clipboard arg1, int arg2)
112 throws IllegalStateException {
113 delegate.exportToClipboard(arg0, arg1, arg2);
114 }
115
116 public int getSourceActions(JComponent arg0) {
117 return delegate.getSourceActions(arg0);
118 }
119
120 public Icon getVisualRepresentation(Transferable arg0) {
121 return delegate.getVisualRepresentation(arg0);
122 }
123
124 private static List<File> uriToFileList(String data) {
125 List<File> list = new ArrayList<File>();
126 StringTokenizer st = new StringTokenizer(data, "\r\n");
127 while (st.hasMoreTokens())
128 {
129 String s = st.nextToken();
130 if (s.startsWith("#")) {
131 continue;
132 }
133 try {
134 list.add(new File(new URI(s)));
135 } catch (Exception e) {
136 }
137 }
138 return list;
139 }
140 }