View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Utility class that turns drag-and-drop events into Tika parse requests.
40   */
41  class ParsingTransferHandler extends TransferHandler {
42  
43      /**
44       * Serial version UID.
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 }