19package org.sleuthkit.autopsy.texttranslation.ui;
21import com.google.common.collect.Lists;
22import com.google.common.util.concurrent.ThreadFactoryBuilder;
23import java.awt.Component;
24import java.awt.ComponentOrientation;
26import java.awt.event.ActionEvent;
27import java.awt.event.ActionListener;
28import java.io.IOException;
30import java.util.Arrays;
31import java.util.concurrent.ExecutorService;
32import java.util.concurrent.Executors;
33import java.util.concurrent.ThreadFactory;
34import org.openide.nodes.Node;
35import org.openide.util.lookup.ServiceProvider;
36import org.sleuthkit.autopsy.corecomponentinterfaces.TextViewer;
37import org.sleuthkit.datamodel.AbstractFile;
38import org.openide.util.Lookup;
39import org.openide.util.NbBundle;
40import org.openide.util.lookup.Lookups;
41import org.sleuthkit.autopsy.coreutils.ExecUtil.ProcessTerminator;
42import org.sleuthkit.autopsy.textextractors.TextExtractor;
43import org.sleuthkit.autopsy.textextractors.TextExtractorFactory;
44import org.sleuthkit.autopsy.textextractors.configs.ImageConfig;
45import org.sleuthkit.autopsy.texttranslation.TextTranslationService;
47import java.util.logging.Level;
48import javax.swing.SwingUtilities;
49import org.sleuthkit.autopsy.contentviewers.utils.ViewerPriority;
50import org.sleuthkit.autopsy.core.UserPreferences;
51import org.sleuthkit.autopsy.coreutils.Logger;
52import org.sleuthkit.autopsy.coreutils.PlatformUtil;
53import org.sleuthkit.autopsy.texttranslation.ui.TranslationContentPanel.DisplayDropdownOptions;
58@ServiceProvider(service =
TextViewer.class, position = 4)
67 private volatile Node
node;
70 =
new ThreadFactoryBuilder().setNameFormat(
"translation-content-viewer-%d").build();
74 "TranslatedTextViewer.maxPayloadSize=Up to the first %dKB of text will be translated"
80 panel.addDisplayTextActionListener(displayDropDownListener);
88 panel.setWarningLabelMsg(String.format(Bundle.TranslatedTextViewer_maxPayloadSize(), payloadMaxInKB));
94 @NbBundle.Messages({
"TranslatedTextViewer.title=Translation"})
97 return Bundle.TranslatedTextViewer_title();
100 @NbBundle.Messages({
"TranslatedTextViewer.toolTip=Displays translated file text."})
103 return Bundle.TranslatedTextViewer_toolTip();
136 AbstractFile file =
node.getLookup().lookup(AbstractFile.class);
152 private final AbstractFile
file;
167 "TranslatedContentViewer.extractingText=Extracting text, please wait...",
168 "# {0} - exception message",
"TranslatedContentViewer.errorExtractingText=An error occurred while extracting the text ({0}).",
170 protected String
retrieveText()
throws IOException, InterruptedException, IllegalStateException {
171 SwingUtilities.invokeLater(() -> {
172 onProgressDisplay(Bundle.TranslatedContentViewer_extractingText(), ComponentOrientation.LEFT_TO_RIGHT, Font.ITALIC);
178 logger.log(Level.WARNING, String.format(
"Error extracting text for file %s (objId=%d)",
file.getName(),
file.getId()), ex);
180 throw new IllegalStateException(Bundle.TranslatedContentViewer_errorExtractingText(ex.getMessage()), ex);
198 "TranslatedContentViewer.ocrNotEnabled=OCR is not enabled. To change, go to Tools->Options->Machine Translation",
201 final boolean isImage =
file.getMIMEType().toLowerCase().startsWith(
"image/");
203 return Bundle.TranslatedContentViewer_ocrNotEnabled();
209 byte[] resultInUTF8Bytes = result.getBytes(
"UTF8");
210 byte[] trimToArraySize = Arrays.copyOfRange(resultInUTF8Bytes, 0,
212 return new String(trimToArraySize,
"UTF-8");
231 char[] cbuf =
new char[8096];
232 StringBuilder textBuilder =
new StringBuilder();
239 while ((read = textExtractor.read(cbuf)) != -1) {
240 if (this.isCancelled()) {
241 throw new InterruptedException();
248 if (bytesLeft < read) {
249 textBuilder.append(cbuf, 0, bytesLeft);
250 return textBuilder.toString();
253 textBuilder.append(cbuf, 0, read);
257 return textBuilder.toString();
275 Lookup context =
null;
281 String ocrSelection =
panel.getSelectedOcrLanguagePack();
282 if (!ocrSelection.isEmpty()) {
289 context = Lookups.fixed(imageConfig, terminator);
302 protected void onTextDisplay(String text, ComponentOrientation orientation,
int font) {
303 panel.display(text, orientation, font);
316 abstract String getSelection();
320 String selection = getSelection();
328 AbstractFile file =
node.getLookup().lookup(AbstractFile.class);
329 String textDisplaySelection =
panel.getDisplayDropDownSelection();
346 String getSelection() {
347 return panel.getDisplayDropDownSelection();
357 String getSelection() {
358 return panel.getSelectedOcrLanguagePack();
static boolean getUseOcrInTranslation()
synchronized static Logger getLogger(String name)
synchronized int getMaxTextChars()
synchronized boolean hasProvider()
static TextTranslationService getInstance()
TranslateTextTask(boolean translateText, String fileDescriptor)
static final Logger logger
final boolean translateText
void onProgressDisplay(String text, ComponentOrientation orientation, int font)
String getFileText(AbstractFile file)
Reader getTextExtractor(AbstractFile file, boolean ocrEnabled)
void onTextDisplay(String text, ComponentOrientation orientation, int font)
ExtractAndTranslateTextTask(AbstractFile file, boolean translateText)
String extractText(AbstractFile source, boolean ocrEnabled)
final void actionPerformed(ActionEvent e)
volatile ExtractAndTranslateTextTask backgroundTask
boolean isSupported(Node node)
final ExecutorService executorService
void setNode(final Node node)
TextViewer createInstance()
final TranslationContentPanel panel
final ThreadFactory translationThreadFactory
static final List< String > INSTALLED_LANGUAGE_PACKS
static final Logger logger
static final int MAX_EXTRACT_SIZE_BYTES
int isPreferred(Node node)