From 85a3124f9d5765e5822d53092d44345131692ecd Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 28 May 2019 16:20:03 -0400 Subject: [PATCH 01/32] 5061 add initial commit of Bing translator --- Core/ivy.xml | 3 + Core/nbproject/project.properties | 4 + Core/nbproject/project.xml | 8 + .../translators/BingTranslator.java | 158 ++++++++++++++++++ .../translators/BingTranslatorTest.java | 89 ++++++++++ 5 files changed, 262 insertions(+) create mode 100644 Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java create mode 100644 Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java diff --git a/Core/ivy.xml b/Core/ivy.xml index 9dfd0fcf85..54ed532feb 100644 --- a/Core/ivy.xml +++ b/Core/ivy.xml @@ -45,6 +45,9 @@ + + + diff --git a/Core/nbproject/project.properties b/Core/nbproject/project.properties index cf21c9a068..74a08fd53d 100644 --- a/Core/nbproject/project.properties +++ b/Core/nbproject/project.properties @@ -111,6 +111,10 @@ file.reference.grpc-context-1.19.0.jar=release/modules/ext/grpc-context-1.19.0.j file.reference.opencensus-api-0.19.2.jar=release/modules/ext/opencensus-api-0.19.2.jar file.reference.opencensus-contrib-http-util-0.19.2.jar=release/modules/ext/opencensus-contrib-http-util-0.19.2.jar file.reference.threetenbp-1.3.3.jar=release/modules/ext/threetenbp-1.3.3.jar +file.reference.okhttp-2.7.5-javadoc.jar=release/modules/ext/okhttp-2.7.5-javadoc.jar +file.reference.okhttp-2.7.5-sources.jar=release/modules/ext/okhttp-2.7.5-sources.jar +file.reference.okhttp-2.7.5.jar=release/modules/ext/okhttp-2.7.5.jar +file.reference.okio-1.6.0.jar=release/modules/ext/okio-1.6.0.jar javac.source=1.8 javac.compilerargs=-Xlint -Xlint:-serial license.file=../LICENSE-2.0.txt diff --git a/Core/nbproject/project.xml b/Core/nbproject/project.xml index 2a2fcd6676..624421be48 100644 --- a/Core/nbproject/project.xml +++ b/Core/nbproject/project.xml @@ -773,6 +773,14 @@ ext/google-api-services-translate-v2-rev20170525-1.27.0.jar release/modules/ext/google-api-services-translate-v2-rev20170525-1.27.0.jar + + ext/okhttp-2.7.5.jar + release/modules/ext/okhttp-2.7.5.jar + + + ext/okio-1.6.0.jar + release/modules/ext/okio-1.6.0.jar + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java new file mode 100644 index 0000000000..892ecb5ac6 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -0,0 +1,158 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sleuthkit.autopsy.texttranslation.translators; + +import java.io.*; +import com.google.gson.*; +import com.squareup.okhttp.*; +import java.awt.Component; +import javax.swing.JLabel; +import org.openide.util.NbBundle.Messages; + +/** + * Translates text by making HTTP requests to Bing Translator. + * This requires a valid subscription key for a Microsoft Azure account. + */ +@ServiceProvider(service = TextTranslator.class) +public class BingTranslator implements TextTranslator{ + // Insert the subscription key here. + private String subscriptionKey = ""; + + //In the String below, "en" is the target language. You can include multiple target + //languages separated by commas. A full list of supported languages is here: + //https://docs.microsoft.com/en-us/azure/cognitive-services/translator/language-support + private static final String URL = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en"; + + // This sends messages to Microsoft. + private final OkHttpClient CLIENT = new OkHttpClient(); + + //We might want to make this a configurable setting for anyone who has a + //paid account that's willing to pay for long documents. + private final int MAX_STRING_LENGTH = 5000; + + /** + * Converts an input test to the JSON format required by Bing Translator, + * posts it to Microsoft, and returns the JSON text response. + * + * @param string The input text to be translated. + * @return The translation response as a JSON string + * @throws IOException if the request could not be executed due to cancellation, a connectivity problem or timeout. + */ + public String postTranslationRequest(String string) throws IOException { + MediaType mediaType = MediaType.parse("application/json"); + + JsonArray jsonArray = new JsonArray(); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("Text", string); + jsonArray.add(jsonObject); + String bodyString = jsonArray.toString(); + + RequestBody body = RequestBody.create(mediaType, + bodyString); + Request request = new Request.Builder() + .url(URL).post(body) + .addHeader("Ocp-Apim-Subscription-Key", subscriptionKey) + .addHeader("Content-type", "application/json").build(); + Response response = CLIENT.newCall(request).execute(); + return response.body().string(); + } + + @Override + public String translate(String string) throws TranslationException { + if (subscriptionKey == null || subscriptionKey.isEmpty()) { + throw new TranslationException("Bing Translator has not been configured, credentials need to be specified"); + } + + //Translates some text into English, without specifying the source langauge. + + // HTML files were producing lots of white space at the end + string = string.trim(); + + //Google Translate required us to replace (\r\n|\n) with
+ //but Bing Translator doesn not have that requirement. + + //The free account has a maximum file size. If you have a paid account, + //you probably still want to limit file size to prevent accidentally + //translating very large documents. + if (string.length() > MAX_STRING_LENGTH) { + string = string.substring(0, MAX_STRING_LENGTH); + } + + try { + String response = postTranslationRequest(string); + return parseJSONResponse(response); + } catch (Throwable e) { + throw new TranslationException(e.getMessage()); + } + } + + @Messages({"BingTranslator.name.text=Bing Translator"}) + @Override + public String getName() { + return Bundle.BingTranslator_name_text(); + } + + @Override + public Component getComponent() { + return new JLabel("There are no settings to configure for Bing Translator"); + } + + @Override + public void saveSettings() { + //There are no settings to configure for Bing Translator + //Possible settings for the future: + //source language, target language, API key, path to JSON file of API key. + //We'll need test code to make sure that exceptions are thrown in all of + //those scenarios. + return; + } + + private String parseJSONResponse(String json_text) throws TranslationException { + /* Here is an example of the text we get from Bing when input is "gato", + the Spanish word for cat: + [ + { + "detectedLanguage": { + "language": "es", + "score": 1.0 + }, + "translations": [ + { + "text": "cat", + "to": "en" + } + ] + } + ] + */ + JsonParser parser = new JsonParser(); + try { + JsonArray responses = parser.parse(json_text).getAsJsonArray(); + //As far as I know, there's always exactly one item in the array. + JsonObject response0 = responses.get(0).getAsJsonObject(); + JsonArray translations = response0.getAsJsonArray("translations"); + JsonObject translation0 = translations.get(0).getAsJsonObject(); + String text = translation0.get("text").getAsString(); + return text; + } catch (IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException e) { + throw new TranslationException("JSON text does not match Bing Translator scheme: " + e); + } + } +} \ No newline at end of file diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java b/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java new file mode 100644 index 0000000000..97512faa3c --- /dev/null +++ b/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java @@ -0,0 +1,89 @@ + +/* + * Autopsy Forensic Browser + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sleuthkit.autopsy.texttranslation.translators; + +import java.io.IOException; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; + +public class BingTranslatorTest { + @Test + public void testTranslate() throws Exception { + BingTranslator translator = new BingTranslator(); + String input = "gato"; + String expectedTranslation = "cat"; + runTest(translator, input, expectedTranslation); + } + + @Test + public void testQuickStartSentence() throws Exception { + BingTranslator translator = new BingTranslator(); + String input = "Willkommen bei Microsoft Translator. Raten Sie mal, wie viele Sprachen ich spreche."; + String expectedTranslation = "Welcome to Microsoft Translator. Guess how many languages I speak."; + runTest(translator, input, expectedTranslation); + } + + @Test + public void testCharacterEscapes() throws Exception { + BingTranslator translator = new BingTranslator(); + String input = "\"gato\"";; + String expectedTranslation = "Cat"; + runTest(translator, input, expectedTranslation); + } + + @Test + public void testLineBreaks() throws Exception { + BingTranslator translator = new BingTranslator(); + String input = "gato\nperro";; + String expectedTranslation = "cat\nDog"; + runTest(translator, input, expectedTranslation); + } + + /** + * Test whether translator throws an error. This should not be part of our + * regular testing, because we are limited to only 2MB of free translations + * ever. + * @param translator A BingTranslator + * @param input Text to translate + * @param expectedTranslation Not used unless you uncomment those lines. + */ + public void runTest(BingTranslator translator, String input, String expectedTranslation) { + String translation; + try { + translation = translator.translate(input); + } + catch (Throwable e) { + fail("Bing translation produced an exception: " + e.getMessage()); + return; + }; + + /* + //It's unrealistic to expect the same answer every time, but sometimes + //it's helpful to have this in your debug process. + System.out.println(translation); + assertEquals(expectedTranslation, translation); + */ + } +} From 1408fd289bd3aa7d61f93e7fa50b188b91f34e42 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 28 May 2019 18:08:24 -0400 Subject: [PATCH 02/32] 5061 allow Bing Translator credentials to be set by user --- .../translators/BingTranslator.java | 44 +++-- .../translators/BingTranslatorSettings.java | 80 ++++++++ .../BingTranslatorSettingsPanel.form | 85 +++++++++ .../BingTranslatorSettingsPanel.java | 171 ++++++++++++++++++ .../translators/Bundle.properties | 1 + .../translators/Bundle.properties-MERGED | 2 + .../translators/GoogleTranslator.java | 2 +- 7 files changed, 368 insertions(+), 17 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java create mode 100644 Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form create mode 100644 Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java index 892ecb5ac6..1f790d14c3 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -19,12 +19,20 @@ package org.sleuthkit.autopsy.texttranslation.translators; -import java.io.*; -import com.google.gson.*; -import com.squareup.okhttp.*; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.RequestBody; +import com.squareup.okhttp.Response; import java.awt.Component; -import javax.swing.JLabel; +import java.io.IOException; import org.openide.util.NbBundle.Messages; +import org.openide.util.lookup.ServiceProvider; +import org.sleuthkit.autopsy.texttranslation.TextTranslator; +import org.sleuthkit.autopsy.texttranslation.TranslationException; /** * Translates text by making HTTP requests to Bing Translator. @@ -32,13 +40,13 @@ import org.openide.util.NbBundle.Messages; */ @ServiceProvider(service = TextTranslator.class) public class BingTranslator implements TextTranslator{ - // Insert the subscription key here. - private String subscriptionKey = ""; - //In the String below, "en" is the target language. You can include multiple target //languages separated by commas. A full list of supported languages is here: //https://docs.microsoft.com/en-us/azure/cognitive-services/translator/language-support private static final String URL = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en"; + private final BingTranslatorSettingsPanel settingsPanel; + private final BingTranslatorSettings settings = new BingTranslatorSettings(); + // This sends messages to Microsoft. private final OkHttpClient CLIENT = new OkHttpClient(); @@ -47,6 +55,15 @@ public class BingTranslator implements TextTranslator{ //paid account that's willing to pay for long documents. private final int MAX_STRING_LENGTH = 5000; + + public BingTranslator(){ + settingsPanel = new BingTranslatorSettingsPanel(settings.getCredentials()); + } + + static String getMicrosftTranlatorUrl(){ + return URL; + } + /** * Converts an input test to the JSON format required by Bing Translator, * posts it to Microsoft, and returns the JSON text response. @@ -68,7 +85,7 @@ public class BingTranslator implements TextTranslator{ bodyString); Request request = new Request.Builder() .url(URL).post(body) - .addHeader("Ocp-Apim-Subscription-Key", subscriptionKey) + .addHeader("Ocp-Apim-Subscription-Key", settings.getCredentials()) .addHeader("Content-type", "application/json").build(); Response response = CLIENT.newCall(request).execute(); return response.body().string(); @@ -76,7 +93,7 @@ public class BingTranslator implements TextTranslator{ @Override public String translate(String string) throws TranslationException { - if (subscriptionKey == null || subscriptionKey.isEmpty()) { + if (settings.getCredentials() == null || settings.getCredentials().isEmpty()) { throw new TranslationException("Bing Translator has not been configured, credentials need to be specified"); } @@ -111,17 +128,12 @@ public class BingTranslator implements TextTranslator{ @Override public Component getComponent() { - return new JLabel("There are no settings to configure for Bing Translator"); + return settingsPanel; } @Override public void saveSettings() { - //There are no settings to configure for Bing Translator - //Possible settings for the future: - //source language, target language, API key, path to JSON file of API key. - //We'll need test code to make sure that exceptions are thrown in all of - //those scenarios. - return; + settings.setCredentials(settingsPanel.getCredentials()); } private String parseJSONResponse(String json_text) throws TranslationException { diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java new file mode 100644 index 0000000000..6d6ef47b39 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java @@ -0,0 +1,80 @@ +/* + * Autopsy + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.texttranslation.translators; + +import org.apache.commons.lang3.StringUtils; +import org.sleuthkit.autopsy.coreutils.ModuleSettings; + +/** + * Class to handle the settings associated with the GoogleTranslator + */ +public final class BingTranslatorSettings { + + private static final String CREDENTIALS_KEY = "Credentials"; + private static final String BING_TRANSLATE_NAME = "BingTranslate"; + private static final String DEFAULT_CREDENTIALS = ""; + private String credentials; + + /** + * Construct a new GoogleTranslatorSettingsObject + */ + BingTranslatorSettings() { + loadSettings(); + } + + /** + * Get the path to the JSON credentials file + * + * @return the path to the credentials file + */ + String getCredentials() { + return credentials; + } + + /** + * Set the path to the JSON credentials file + * + * @param path the path to the credentials file + */ + void setCredentials(String creds) { + credentials = creds; + } + + + /** + * Load the settings into memory from their on disk storage + */ + void loadSettings() { + if (!ModuleSettings.configExists(BING_TRANSLATE_NAME)) { + ModuleSettings.makeConfigFile(BING_TRANSLATE_NAME); + } + if (ModuleSettings.settingExists(BING_TRANSLATE_NAME, CREDENTIALS_KEY)) { + credentials = ModuleSettings.getConfigSetting(BING_TRANSLATE_NAME, CREDENTIALS_KEY); + } else { + credentials = DEFAULT_CREDENTIALS; + } + } + + /** + * Save the setting from memory to their location on disk + */ + void saveSettings() { + ModuleSettings.setConfigSetting(BING_TRANSLATE_NAME, CREDENTIALS_KEY, credentials); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form new file mode 100644 index 0000000000..ae87b5a187 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -0,0 +1,85 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java new file mode 100644 index 0000000000..ae8da0adcf --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -0,0 +1,171 @@ +/* + * Autopsy + * + * Copyright 2019 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.texttranslation.translators; + +import com.google.gson.JsonArray; +import com.google.gson.JsonParser; +import com.google.gson.JsonObject; +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.RequestBody; +import com.squareup.okhttp.Response; +import java.io.IOException; +import java.util.logging.Logger; + +/** + * Settings panel for the GoogleTranslator + */ +public class BingTranslatorSettingsPanel extends javax.swing.JPanel { + + private static final Logger logger = Logger.getLogger(BingTranslatorSettingsPanel.class.getName()); + private static final long serialVersionUID = 1L; + + /** + * Creates new form GoogleTranslatorSettingsPanel + */ + public BingTranslatorSettingsPanel(String credentials) { + initComponents(); + credentialsField.setText(credentials); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + credentialsLabel = new javax.swing.JLabel(); + credentialsField = new javax.swing.JTextField(); + warningLabel = new javax.swing.JLabel(); + testButton = new javax.swing.JButton(); + + org.openide.awt.Mnemonics.setLocalizedText(credentialsLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.credentialsLabel.text")); // NOI18N + + warningLabel.setForeground(new java.awt.Color(255, 0, 0)); + org.openide.awt.Mnemonics.setLocalizedText(warningLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.warningLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(testButton, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.testButton.text")); // NOI18N + testButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + testButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 551, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(credentialsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(credentialsField, javax.swing.GroupLayout.DEFAULT_SIZE, 463, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(testButton) + .addGap(8, 8, 8)))) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(credentialsLabel) + .addComponent(credentialsField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(testButton)) + .addGap(31, 31, 31) + .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(29, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testButtonActionPerformed + if (testTranslationSetup()) { + warningLabel.setText(""); + } else { + warningLabel.setText("Invalid translation credentials"); + } + }//GEN-LAST:event_testButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField credentialsField; + private javax.swing.JLabel credentialsLabel; + private javax.swing.JButton testButton; + private javax.swing.JLabel warningLabel; + // End of variables declaration//GEN-END:variables + /** + * Converts an input test to the JSON format required by Bing Translator, + * posts it to Microsoft, and returns the JSON text response. + * + * @param string The input text to be translated. + * + * @return The translation response as a JSON string + * + * @throws IOException if the request could not be executed due to + * cancellation, a connectivity problem or timeout. + */ + private boolean testTranslationSetup() { + String testString = "forense"; + MediaType mediaType = MediaType.parse("application/json"); + + JsonArray jsonArray = new JsonArray(); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("Text", testString); + jsonArray.add(jsonObject); + String bodyString = jsonArray.toString(); + + RequestBody body = RequestBody.create(mediaType, + bodyString); + Request request = new Request.Builder() + .url(BingTranslator.getMicrosftTranlatorUrl()).post(body) + .addHeader("Ocp-Apim-Subscription-Key", credentialsField.getText()) + .addHeader("Content-type", "application/json").build(); + try { + Response response = new OkHttpClient().newCall(request).execute(); + JsonParser parser = new JsonParser(); + JsonArray responses = parser.parse(response.body().string()).getAsJsonArray(); + //As far as I know, there's always exactly one item in the array. + JsonObject response0 = responses.get(0).getAsJsonObject(); + JsonArray translations = response0.getAsJsonArray("translations"); + JsonObject translation0 = translations.get(0).getAsJsonObject(); + translation0.get("text").getAsString(); + return true; + } catch (IOException | IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException e) { + return false; + } + + } + + /** + * Get the currently set path to the JSON credentials file + * + * @return the path to the credentials file specified in the textarea + */ + String getCredentials() { + return credentialsField.getText(); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index 56782cdf33..024ddfadcd 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -2,3 +2,4 @@ GoogleTranslatorSettingsPanel.browseButton.text=Browse GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials: GoogleTranslatorSettingsPanel.warningLabel.text= GoogleTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: +BingTranslatorSettingsPanel.testButton.text=Test diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index b0e30f632c..bfe84cb856 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -1,3 +1,4 @@ +BingTranslator.name.text=Bing Translator GoogleTranslator.name.text=Google Translate GoogleTranslatorSettingsPanel.browseButton.text=Browse GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials: @@ -11,3 +12,4 @@ GoogleTranslatorSettingsPanel.fileChooser.confirmButton=Select GoogleTranslatorSettingsPanel.json.description=JSON Files GoogleTranslatorSettingsPanel.warningLabel.text= GoogleTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: +BingTranslatorSettingsPanel.jButton1.text=Test diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java index 38506ef936..f40b2129e2 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java @@ -106,7 +106,7 @@ public final class GoogleTranslator implements TextTranslator { } /** - * Load the Google Cloud Translation service give the currently saved + * Load the Google Cloud Translation service given the currently saved * settings */ private void loadTranslator() { From f4e36841b116d35ed1a1c63409a6f13c359426fa Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 28 May 2019 18:09:24 -0400 Subject: [PATCH 03/32] 5061 minor ui panel tweak --- .../translators/BingTranslatorSettingsPanel.form | 4 ++-- .../translators/BingTranslatorSettingsPanel.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index ae87b5a187..6acf950f40 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -44,9 +44,9 @@ - + - + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index ae8da0adcf..b49c3645b8 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -97,9 +97,9 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addComponent(credentialsLabel) .addComponent(credentialsField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(testButton)) - .addGap(31, 31, 31) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(29, Short.MAX_VALUE)) + .addContainerGap(49, Short.MAX_VALUE)) ); }// //GEN-END:initComponents From 5221f35fad788b85b6b2359ef756006f70196850 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 30 May 2019 11:24:04 -0400 Subject: [PATCH 04/32] 5061 disable bing tests since service won't have credentials --- ...guageWrapper.java => LanguageWrapper.java} | 0 .../translators/BingTranslatorTest.java | 117 +++++++++--------- 2 files changed, 60 insertions(+), 57 deletions(-) rename Core/src/org/sleuthkit/autopsy/texttranslation/translators/{GoogleLanguageWrapper.java => LanguageWrapper.java} (100%) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleLanguageWrapper.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java similarity index 100% rename from Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleLanguageWrapper.java rename to Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java b/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java index 97512faa3c..48c29543d3 100644 --- a/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java +++ b/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java @@ -1,4 +1,3 @@ - /* * Autopsy Forensic Browser * @@ -17,7 +16,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.sleuthkit.autopsy.texttranslation.translators; import java.io.IOException; @@ -28,62 +26,67 @@ import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; -public class BingTranslatorTest { +/** + * Tests for the BingTranslator translation service, these tests have been + * commented out because they require credentials to perform + */ +public class BingTranslatorTest { + @Test public void testTranslate() throws Exception { - BingTranslator translator = new BingTranslator(); - String input = "gato"; - String expectedTranslation = "cat"; - runTest(translator, input, expectedTranslation); - } - - @Test - public void testQuickStartSentence() throws Exception { - BingTranslator translator = new BingTranslator(); - String input = "Willkommen bei Microsoft Translator. Raten Sie mal, wie viele Sprachen ich spreche."; - String expectedTranslation = "Welcome to Microsoft Translator. Guess how many languages I speak."; - runTest(translator, input, expectedTranslation); - } - - @Test - public void testCharacterEscapes() throws Exception { - BingTranslator translator = new BingTranslator(); - String input = "\"gato\"";; - String expectedTranslation = "Cat"; - runTest(translator, input, expectedTranslation); - } - - @Test - public void testLineBreaks() throws Exception { - BingTranslator translator = new BingTranslator(); - String input = "gato\nperro";; - String expectedTranslation = "cat\nDog"; - runTest(translator, input, expectedTranslation); - } - - /** - * Test whether translator throws an error. This should not be part of our - * regular testing, because we are limited to only 2MB of free translations - * ever. - * @param translator A BingTranslator - * @param input Text to translate - * @param expectedTranslation Not used unless you uncomment those lines. - */ - public void runTest(BingTranslator translator, String input, String expectedTranslation) { - String translation; - try { - translation = translator.translate(input); - } - catch (Throwable e) { - fail("Bing translation produced an exception: " + e.getMessage()); - return; - }; - - /* - //It's unrealistic to expect the same answer every time, but sometimes - //it's helpful to have this in your debug process. - System.out.println(translation); - assertEquals(expectedTranslation, translation); - */ +// BingTranslator translator = new BingTranslator(); +// String input = "gato"; +// String expectedTranslation = "cat"; +// runTest(translator, input, expectedTranslation); } + +// @Test +// public void testQuickStartSentence() throws Exception { +// BingTranslator translator = new BingTranslator(); +// String input = "Willkommen bei Microsoft Translator. Raten Sie mal, wie viele Sprachen ich spreche."; +// String expectedTranslation = "Welcome to Microsoft Translator. Guess how many languages I speak."; +// runTest(translator, input, expectedTranslation); +// } +// +// @Test +// public void testCharacterEscapes() throws Exception { +// BingTranslator translator = new BingTranslator(); +// String input = "\"gato\"";; +// String expectedTranslation = "Cat"; +// runTest(translator, input, expectedTranslation); +// } +// +// @Test +// public void testLineBreaks() throws Exception { +// BingTranslator translator = new BingTranslator(); +// String input = "gato\nperro";; +// String expectedTranslation = "cat\nDog"; +// runTest(translator, input, expectedTranslation); +// } +// +// /** +// * Test whether translator throws an error. This should not be part of our +// * regular testing, because we are limited to only 2MB of free translations +// * ever. +// * @param translator A BingTranslator +// * @param input Text to translate +// * @param expectedTranslation Not used unless you uncomment those lines. +// */ +// public void runTest(BingTranslator translator, String input, String expectedTranslation) { +// String translation; +// try { +// translation = translator.translate(input); +// } +// catch (Throwable e) { +// fail("Bing translation produced an exception: " + e.getMessage()); +// return; +// }; +// +// /* +// //It's unrealistic to expect the same answer every time, but sometimes +// //it's helpful to have this in your debug process. +// System.out.println(translation); +// assertEquals(expectedTranslation, translation); +// */ +// } } From 0c5ac83644ad09a3e72b1371dfb58c2a8ea2ddf4 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 30 May 2019 11:24:38 -0400 Subject: [PATCH 05/32] 5061 adjust BingTranslator to use user specified settings --- .../translators/BingTranslator.java | 20 +-- .../translators/BingTranslatorSettings.java | 33 +++- .../BingTranslatorSettingsPanel.form | 80 ++++++++- .../BingTranslatorSettingsPanel.java | 169 ++++++++++++++---- .../translators/Bundle.properties | 3 + .../translators/Bundle.properties-MERGED | 5 +- .../GoogleTranslatorSettingsPanel.form | 4 +- .../GoogleTranslatorSettingsPanel.java | 8 +- .../translators/LanguageWrapper.java | 32 +++- 9 files changed, 284 insertions(+), 70 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java index 1f790d14c3..4aaba09ee5 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -43,7 +43,7 @@ public class BingTranslator implements TextTranslator{ //In the String below, "en" is the target language. You can include multiple target //languages separated by commas. A full list of supported languages is here: //https://docs.microsoft.com/en-us/azure/cognitive-services/translator/language-support - private static final String URL = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en"; + private static final String BASE_URL = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to="; private final BingTranslatorSettingsPanel settingsPanel; private final BingTranslatorSettings settings = new BingTranslatorSettings(); @@ -57,11 +57,11 @@ public class BingTranslator implements TextTranslator{ public BingTranslator(){ - settingsPanel = new BingTranslatorSettingsPanel(settings.getCredentials()); + settingsPanel = new BingTranslatorSettingsPanel(settings.getCredentials(), settings.getTargetLanguageCode()); } - static String getMicrosftTranlatorUrl(){ - return URL; + private String getTranlatorUrl(){ + return BASE_URL + settings.getTargetLanguageCode(); } /** @@ -84,7 +84,7 @@ public class BingTranslator implements TextTranslator{ RequestBody body = RequestBody.create(mediaType, bodyString); Request request = new Request.Builder() - .url(URL).post(body) + .url(getTranlatorUrl()).post(body) .addHeader("Ocp-Apim-Subscription-Key", settings.getCredentials()) .addHeader("Content-type", "application/json").build(); Response response = CLIENT.newCall(request).execute(); @@ -96,11 +96,10 @@ public class BingTranslator implements TextTranslator{ if (settings.getCredentials() == null || settings.getCredentials().isEmpty()) { throw new TranslationException("Bing Translator has not been configured, credentials need to be specified"); } - + String toTranslate = string.trim(); //Translates some text into English, without specifying the source langauge. // HTML files were producing lots of white space at the end - string = string.trim(); //Google Translate required us to replace (\r\n|\n) with
//but Bing Translator doesn not have that requirement. @@ -108,12 +107,12 @@ public class BingTranslator implements TextTranslator{ //The free account has a maximum file size. If you have a paid account, //you probably still want to limit file size to prevent accidentally //translating very large documents. - if (string.length() > MAX_STRING_LENGTH) { - string = string.substring(0, MAX_STRING_LENGTH); + if (toTranslate.length() > MAX_STRING_LENGTH) { + toTranslate = toTranslate.substring(0, MAX_STRING_LENGTH); } try { - String response = postTranslationRequest(string); + String response = postTranslationRequest(toTranslate); return parseJSONResponse(response); } catch (Throwable e) { throw new TranslationException(e.getMessage()); @@ -134,6 +133,7 @@ public class BingTranslator implements TextTranslator{ @Override public void saveSettings() { settings.setCredentials(settingsPanel.getCredentials()); + settings.setTargetLanguageCode(settingsPanel.getTargetLanguageCode()); } private String parseJSONResponse(String json_text) throws TranslationException { diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java index 6d6ef47b39..ca68adb77c 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java @@ -29,7 +29,10 @@ public final class BingTranslatorSettings { private static final String CREDENTIALS_KEY = "Credentials"; private static final String BING_TRANSLATE_NAME = "BingTranslate"; private static final String DEFAULT_CREDENTIALS = ""; + private static final String DEFAULT_TARGET_LANGUAGE = "en"; + private static final String TARGET_LANGUAGE_CODE_KEY = "TargetLanguageCode"; private String credentials; + private String targetLanguageCode; /** * Construct a new GoogleTranslatorSettingsObject @@ -56,7 +59,6 @@ public final class BingTranslatorSettings { credentials = creds; } - /** * Load the settings into memory from their on disk storage */ @@ -69,6 +71,34 @@ public final class BingTranslatorSettings { } else { credentials = DEFAULT_CREDENTIALS; } + if (ModuleSettings.settingExists(BING_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY)) { + targetLanguageCode = ModuleSettings.getConfigSetting(BING_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY); + } else { + targetLanguageCode = DEFAULT_TARGET_LANGUAGE; + } + } + + /** + * Get the target language code + * + * @return the code used to identify the target language + */ + String getTargetLanguageCode() { + return targetLanguageCode; + } + + /** + * Set the target language code. If a blank code is specified it sets the + * default code instead. + * + * @param code the target language code to set + */ + void setTargetLanguageCode(String code) { + if (StringUtils.isBlank(code)) { + targetLanguageCode = DEFAULT_TARGET_LANGUAGE; + } else { + targetLanguageCode = code; + } } /** @@ -76,5 +106,6 @@ public final class BingTranslatorSettings { */ void saveSettings() { ModuleSettings.setConfigSetting(BING_TRANSLATE_NAME, CREDENTIALS_KEY, credentials); + ModuleSettings.setConfigSetting(BING_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY, targetLanguageCode); } } diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index 6acf950f40..3e7e151bbf 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -16,13 +16,9 @@ - + - - - - @@ -31,6 +27,24 @@ + + + + + + + + + + + + + + + + + + @@ -44,9 +58,20 @@ - + + + + + + + + + + + + - + @@ -81,5 +106,46 @@
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index b49c3645b8..5488ca9c62 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.texttranslation.translators; import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.JsonObject; import com.squareup.okhttp.MediaType; @@ -27,7 +28,13 @@ import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import java.io.IOException; +import java.util.Iterator; +import java.util.Map.Entry; +import java.util.logging.Level; import java.util.logging.Logger; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import org.apache.commons.lang3.StringUtils; /** * Settings panel for the GoogleTranslator @@ -36,13 +43,70 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(BingTranslatorSettingsPanel.class.getName()); private static final long serialVersionUID = 1L; + private static final String GET_TARGET_LANGUAGES_URL = "https://api.cognitive.microsofttranslator.com/languages?api-version=3.0&scope=translation"; + private String targetLanguageCode = ""; /** * Creates new form GoogleTranslatorSettingsPanel */ - public BingTranslatorSettingsPanel(String credentials) { + public BingTranslatorSettingsPanel(String credentials, String code) { initComponents(); credentialsField.setText(credentials); + credentialsField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + firePropertyChange("SettingChanged", true, false); + } + + @Override + public void removeUpdate(DocumentEvent e) { + firePropertyChange("SettingChanged", true, false); + } + + @Override + public void changedUpdate(DocumentEvent e) { + firePropertyChange("SettingChanged", true, false); + } + + }); + targetLanguageCode = code; + populateComboBox(); + selectLanguageByCode(targetLanguageCode); + } + + private void populateComboBox() { + Request get_request = new Request.Builder() + .url(GET_TARGET_LANGUAGES_URL).build(); + try { + Response response = new OkHttpClient().newCall(get_request).execute(); + JsonParser parser = new JsonParser(); + String responseBody = response.body().string(); + JsonElement elementBody = parser.parse(responseBody); + JsonObject asObject = elementBody.getAsJsonObject(); + JsonElement translationElement = asObject.get("translation"); + JsonObject responses = translationElement.getAsJsonObject(); + for (Entry entry : responses.entrySet()) { + targetLanguageComboBox.addItem(new LanguageWrapper(entry.getKey(), entry.getValue().getAsJsonObject().get("name").getAsString())); + } + } catch (IOException | IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException ex) { + logger.log(Level.WARNING, "Unable to get list of target languages or parse the result that was received", ex); + } + + } + + /** + * Given a language code select the corresponding language in the combo box + * if it is present + * + * @param code language code such as "en" for English + */ + private void selectLanguageByCode(String code) { + for (int i = 0; i < targetLanguageComboBox.getModel().getSize(); i++) { + if (targetLanguageComboBox.getModel().getElementAt(i).getLanguageCode().equals(code)) { + targetLanguageComboBox.setSelectedIndex(i); + break; + } + } } /** @@ -58,6 +122,11 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { credentialsField = new javax.swing.JTextField(); warningLabel = new javax.swing.JLabel(); testButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + targetLanguageComboBox = new javax.swing.JComboBox<>(); + jLabel2 = new javax.swing.JLabel(); + jSpinner1 = new javax.swing.JSpinner(); + jLabel3 = new javax.swing.JLabel(); org.openide.awt.Mnemonics.setLocalizedText(credentialsLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.credentialsLabel.text")); // NOI18N @@ -71,6 +140,20 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { } }); + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.jLabel1.text")); // NOI18N + + targetLanguageComboBox.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + targetLanguageComboBoxSelected(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.jLabel2.text")); // NOI18N + + jSpinner1.setModel(new javax.swing.SpinnerNumberModel(5000, 5000, 500000, 5000)); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.jLabel3.text")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -78,16 +161,27 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 551, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(credentialsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(credentialsField, javax.swing.GroupLayout.DEFAULT_SIZE, 463, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(testButton) - .addGap(8, 8, 8)))) + .addGap(8, 8, 8)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 551, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel3))) + .addGap(0, 0, Short.MAX_VALUE)))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -97,9 +191,18 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addComponent(credentialsLabel) .addComponent(credentialsField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(testButton)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel3)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(49, Short.MAX_VALUE)) + .addContainerGap()) ); }// //GEN-END:initComponents @@ -111,9 +214,22 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { } }//GEN-LAST:event_testButtonActionPerformed + private void targetLanguageComboBoxSelected(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_targetLanguageComboBoxSelected + String selectedCode = ((LanguageWrapper) targetLanguageComboBox.getSelectedItem()).getLanguageCode(); + if (!StringUtils.isBlank(selectedCode) && !selectedCode.equals(targetLanguageCode)) { + targetLanguageCode = selectedCode; + firePropertyChange("SettingChanged", true, false); + } + }//GEN-LAST:event_targetLanguageComboBoxSelected + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField credentialsField; private javax.swing.JLabel credentialsLabel; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JSpinner jSpinner1; + private javax.swing.JComboBox targetLanguageComboBox; private javax.swing.JButton testButton; private javax.swing.JLabel warningLabel; // End of variables declaration//GEN-END:variables @@ -129,35 +245,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { * cancellation, a connectivity problem or timeout. */ private boolean testTranslationSetup() { - String testString = "forense"; - MediaType mediaType = MediaType.parse("application/json"); - - JsonArray jsonArray = new JsonArray(); - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("Text", testString); - jsonArray.add(jsonObject); - String bodyString = jsonArray.toString(); - - RequestBody body = RequestBody.create(mediaType, - bodyString); - Request request = new Request.Builder() - .url(BingTranslator.getMicrosftTranlatorUrl()).post(body) - .addHeader("Ocp-Apim-Subscription-Key", credentialsField.getText()) - .addHeader("Content-type", "application/json").build(); - try { - Response response = new OkHttpClient().newCall(request).execute(); - JsonParser parser = new JsonParser(); - JsonArray responses = parser.parse(response.body().string()).getAsJsonArray(); - //As far as I know, there's always exactly one item in the array. - JsonObject response0 = responses.get(0).getAsJsonObject(); - JsonArray translations = response0.getAsJsonArray("translations"); - JsonObject translation0 = translations.get(0).getAsJsonObject(); - translation0.get("text").getAsString(); - return true; - } catch (IOException | IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException e) { - return false; - } - + return true; } /** @@ -168,4 +256,13 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { String getCredentials() { return credentialsField.getText(); } + + /** + * Get the currently selected target language code + * + * @return the target language code of the language selected in the combobox + */ + String getTargetLanguageCode() { + return targetLanguageCode; + } } diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index 024ddfadcd..888cb51018 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -3,3 +3,6 @@ GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials: GoogleTranslatorSettingsPanel.warningLabel.text= GoogleTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.testButton.text=Test +BingTranslatorSettingsPanel.jLabel1.text=Target Language: +BingTranslatorSettingsPanel.jLabel2.text=Translation Size: +BingTranslatorSettingsPanel.jLabel3.text=characters diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index bfe84cb856..2fb4ea5ef4 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -12,4 +12,7 @@ GoogleTranslatorSettingsPanel.fileChooser.confirmButton=Select GoogleTranslatorSettingsPanel.json.description=JSON Files GoogleTranslatorSettingsPanel.warningLabel.text= GoogleTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: -BingTranslatorSettingsPanel.jButton1.text=Test +BingTranslatorSettingsPanel.testButton.text=Test +BingTranslatorSettingsPanel.jLabel1.text=Target Language: +BingTranslatorSettingsPanel.jLabel2.text=Translation Size: +BingTranslatorSettingsPanel.jLabel3.text=characters diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form index 97a10b500f..1a78f115ac 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form @@ -98,7 +98,7 @@ - +
@@ -119,4 +119,4 @@ - + \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java index fbb957413b..83ad5cf302 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java @@ -118,7 +118,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { targetLanguageComboBox.removeAllItems(); if (!listSupportedLanguages.isEmpty()) { listSupportedLanguages.forEach((lang) -> { - targetLanguageComboBox.addItem(new GoogleLanguageWrapper(lang)); + targetLanguageComboBox.addItem(new LanguageWrapper(lang)); }); selectLanguageByCode(targetLanguageCode); targetLanguageComboBox.addItemListener(listener); @@ -145,7 +145,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { */ private void selectLanguageByCode(String code) { for (int i = 0; i < targetLanguageComboBox.getModel().getSize(); i++) { - if (targetLanguageComboBox.getItemAt(i).getLanguage().getCode().equals(code)) { + if (targetLanguageComboBox.getItemAt(i).getLanguageCode().equals(code)) { targetLanguageComboBox.setSelectedIndex(i); return; } @@ -253,7 +253,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { private javax.swing.JButton browseButton; private javax.swing.JLabel credentialsLabel; private javax.swing.JTextField credentialsPathField; - private javax.swing.JComboBox targetLanguageComboBox; + private javax.swing.JComboBox targetLanguageComboBox; private javax.swing.JLabel targetLanguageLabel; private javax.swing.JLabel warningLabel; // End of variables declaration//GEN-END:variables @@ -284,7 +284,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { @Override public void itemStateChanged(java.awt.event.ItemEvent evt) { - String selectedCode = ((GoogleLanguageWrapper) targetLanguageComboBox.getSelectedItem()).getLanguage().getCode(); + String selectedCode = ((LanguageWrapper) targetLanguageComboBox.getSelectedItem()).getLanguageCode(); if (!StringUtils.isBlank(selectedCode) && !selectedCode.equals(targetLanguageCode)) { targetLanguageCode = selectedCode; populateTargetLanguageComboBox(); diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java index c61ed1c948..3c3c048469 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java @@ -21,19 +21,33 @@ package org.sleuthkit.autopsy.texttranslation.translators; import com.google.cloud.translate.Language; /** - * Wrapper for the Language class + * Wrapper for Language definitions used by translators */ -class GoogleLanguageWrapper { +class LanguageWrapper { - private final Language language; + private final String languageCode; + private final String languageDisplayName; /** - * Create a new GoogleLanguageWrapper + * Create a new LanguageWrapper to wrap the google language object * * @param lang the Language object to wrap */ - GoogleLanguageWrapper(Language lang) { - language = lang; + LanguageWrapper(Language language) { + languageCode = language.getCode(); + languageDisplayName = language.getName(); + } + + /** + * Create a new LanguageWrapper to wrap json elements that identify a + * language for microsofts translation service + * + * @param code the code which uniquely identifies a language + * @param name the name of the language + */ + LanguageWrapper(String code, String name) { + languageCode = code; + languageDisplayName = name; } /** @@ -41,14 +55,14 @@ class GoogleLanguageWrapper { * * @return the wrapped Language */ - Language getLanguage() { - return language; + String getLanguageCode() { + return languageCode; } @Override public String toString() { //toString overridden so that the jComboBox in the GoogleTranslatorSettingsPanel will display the name of the language - return language.getName(); + return languageDisplayName; } } From 90a002efee982071e665ac8156f44f1adaa088c7 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 30 May 2019 12:21:05 -0400 Subject: [PATCH 06/32] 5061 add test button to Bing translator settings panel --- .../translators/BingTranslator.java | 6 +- .../BingTranslatorSettingsPanel.form | 93 ++++++++++---- .../BingTranslatorSettingsPanel.java | 117 +++++++++++++----- .../translators/Bundle.properties | 9 +- .../translators/Bundle.properties-MERGED | 9 +- .../translators/LanguageWrapper.java | 2 +- 6 files changed, 175 insertions(+), 61 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java index 4aaba09ee5..1d27d8ce33 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -60,8 +60,8 @@ public class BingTranslator implements TextTranslator{ settingsPanel = new BingTranslatorSettingsPanel(settings.getCredentials(), settings.getTargetLanguageCode()); } - private String getTranlatorUrl(){ - return BASE_URL + settings.getTargetLanguageCode(); + static String getTranlatorUrl(String languageCode){ + return BASE_URL + languageCode; } /** @@ -84,7 +84,7 @@ public class BingTranslator implements TextTranslator{ RequestBody body = RequestBody.create(mediaType, bodyString); Request request = new Request.Builder() - .url(getTranlatorUrl()).post(body) + .url(getTranlatorUrl(settings.getTargetLanguageCode())).post(body) .addHeader("Ocp-Apim-Subscription-Key", settings.getCredentials()) .addHeader("Content-type", "application/json").build(); Response response = CLIENT.newCall(request).execute(); diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index 3e7e151bbf..944cc3d124 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -23,24 +23,38 @@ - - - + - + - + - + + + + - - - + + + + + + + + + + + + + + + + @@ -56,20 +70,27 @@ - - + - - - + + + - + + + + + + + + + @@ -106,10 +127,10 @@ - + - + @@ -126,24 +147,52 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index 5488ca9c62..4282ecbc63 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -44,6 +44,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(BingTranslatorSettingsPanel.class.getName()); private static final long serialVersionUID = 1L; private static final String GET_TARGET_LANGUAGES_URL = "https://api.cognitive.microsofttranslator.com/languages?api-version=3.0&scope=translation"; + private static final String DEFUALT_TEST_STRING = "traducción exitoso"; //spanish which should translate to something along the lines of translation successful private String targetLanguageCode = ""; /** @@ -51,6 +52,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { */ public BingTranslatorSettingsPanel(String credentials, String code) { initComponents(); + credentialsField.setText(credentials); credentialsField.getDocument().addDocumentListener(new DocumentListener() { @Override @@ -122,11 +124,15 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { credentialsField = new javax.swing.JTextField(); warningLabel = new javax.swing.JLabel(); testButton = new javax.swing.JButton(); - jLabel1 = new javax.swing.JLabel(); + targetLanguageLabel = new javax.swing.JLabel(); targetLanguageComboBox = new javax.swing.JComboBox<>(); - jLabel2 = new javax.swing.JLabel(); - jSpinner1 = new javax.swing.JSpinner(); - jLabel3 = new javax.swing.JLabel(); + translationSizeLabel = new javax.swing.JLabel(); + translationSizeSpinner = new javax.swing.JSpinner(); + unitsLabel = new javax.swing.JLabel(); + testUntranslatedTextField = new javax.swing.JTextField(); + untranslatedLabel = new javax.swing.JLabel(); + resultLabel = new javax.swing.JLabel(); + testResultValueLabel = new javax.swing.JLabel(); org.openide.awt.Mnemonics.setLocalizedText(credentialsLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.credentialsLabel.text")); // NOI18N @@ -140,7 +146,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { } }); - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.jLabel1.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(targetLanguageLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.targetLanguageLabel.text")); // NOI18N targetLanguageComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -148,11 +154,19 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { } }); - org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.jLabel2.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(translationSizeLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.translationSizeLabel.text")); // NOI18N - jSpinner1.setModel(new javax.swing.SpinnerNumberModel(5000, 5000, 500000, 5000)); + translationSizeSpinner.setModel(new javax.swing.SpinnerNumberModel(5000, 5000, 500000, 5000)); - org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.jLabel3.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(unitsLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.unitsLabel.text")); // NOI18N + + testUntranslatedTextField.setText(DEFUALT_TEST_STRING); + + org.openide.awt.Mnemonics.setLocalizedText(untranslatedLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.untranslatedLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(resultLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.resultLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(testResultValueLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.testResultValueLabel.text")); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -165,22 +179,32 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addComponent(credentialsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(credentialsField, javax.swing.GroupLayout.DEFAULT_SIZE, 463, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(testButton) - .addGap(8, 8, 8)) + .addGap(67, 67, 67)) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 551, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() - .addComponent(jLabel1) + .addComponent(targetLanguageLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() - .addComponent(jLabel2) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(translationSizeLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(testButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel3))) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(translationSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(unitsLabel)) + .addGroup(layout.createSequentialGroup() + .addComponent(untranslatedLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(resultLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(testResultValueLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))) .addGap(0, 0, Short.MAX_VALUE)))) ); layout.setVerticalGroup( @@ -189,18 +213,24 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(credentialsLabel) - .addComponent(credentialsField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(testButton)) + .addComponent(credentialsField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel1) + .addComponent(targetLanguageLabel) .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel2) - .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel3)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(translationSizeLabel) + .addComponent(translationSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(unitsLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(testButton) + .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(untranslatedLabel) + .addComponent(resultLabel) + .addComponent(testResultValueLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); @@ -225,12 +255,16 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField credentialsField; private javax.swing.JLabel credentialsLabel; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JSpinner jSpinner1; + private javax.swing.JLabel resultLabel; private javax.swing.JComboBox targetLanguageComboBox; + private javax.swing.JLabel targetLanguageLabel; private javax.swing.JButton testButton; + private javax.swing.JLabel testResultValueLabel; + private javax.swing.JTextField testUntranslatedTextField; + private javax.swing.JLabel translationSizeLabel; + private javax.swing.JSpinner translationSizeSpinner; + private javax.swing.JLabel unitsLabel; + private javax.swing.JLabel untranslatedLabel; private javax.swing.JLabel warningLabel; // End of variables declaration//GEN-END:variables /** @@ -245,7 +279,32 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { * cancellation, a connectivity problem or timeout. */ private boolean testTranslationSetup() { - return true; + MediaType mediaType = MediaType.parse("application/json"); + JsonArray jsonArray = new JsonArray(); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("Text", testUntranslatedTextField.getText()); + jsonArray.add(jsonObject); + String bodyString = jsonArray.toString(); + + RequestBody body = RequestBody.create(mediaType, + bodyString); + Request request = new Request.Builder() + .url(BingTranslator.getTranlatorUrl(targetLanguageCode)).post(body) + .addHeader("Ocp-Apim-Subscription-Key", credentialsField.getText()) + .addHeader("Content-type", "application/json").build(); + try { + Response response = new OkHttpClient().newCall(request).execute(); + JsonParser parser = new JsonParser(); + JsonArray responses = parser.parse(response.body().string()).getAsJsonArray(); + //As far as I know, there's always exactly one item in the array. + JsonObject response0 = responses.get(0).getAsJsonObject(); + JsonArray translations = response0.getAsJsonArray("translations"); + JsonObject translation0 = translations.get(0).getAsJsonObject(); + testResultValueLabel.setText(translation0.get("text").getAsString()); + return true; + } catch (IOException | IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException e) { + return false; + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index 888cb51018..adf27cddfa 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -3,6 +3,9 @@ GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials: GoogleTranslatorSettingsPanel.warningLabel.text= GoogleTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.testButton.text=Test -BingTranslatorSettingsPanel.jLabel1.text=Target Language: -BingTranslatorSettingsPanel.jLabel2.text=Translation Size: -BingTranslatorSettingsPanel.jLabel3.text=characters +BingTranslatorSettingsPanel.testResultValueLabel.text= +BingTranslatorSettingsPanel.resultLabel.text=Result: +BingTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: +BingTranslatorSettingsPanel.translationSizeLabel.text=Translation Size: +BingTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: +BingTranslatorSettingsPanel.unitsLabel.text=characters diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index 2fb4ea5ef4..01c6123934 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -13,6 +13,9 @@ GoogleTranslatorSettingsPanel.json.description=JSON Files GoogleTranslatorSettingsPanel.warningLabel.text= GoogleTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.testButton.text=Test -BingTranslatorSettingsPanel.jLabel1.text=Target Language: -BingTranslatorSettingsPanel.jLabel2.text=Translation Size: -BingTranslatorSettingsPanel.jLabel3.text=characters +BingTranslatorSettingsPanel.testResultValueLabel.text= +BingTranslatorSettingsPanel.resultLabel.text=Result: +BingTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: +BingTranslatorSettingsPanel.translationSizeLabel.text=Translation Size: +BingTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: +BingTranslatorSettingsPanel.unitsLabel.text=characters diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java index 3c3c048469..2fa308291b 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/LanguageWrapper.java @@ -61,7 +61,7 @@ class LanguageWrapper { @Override public String toString() { - //toString overridden so that the jComboBox in the GoogleTranslatorSettingsPanel will display the name of the language + //toString overridden so that the jComboBox in the TranslatorSettingsPanels will display the name of the language return languageDisplayName; } From d2bf1777f293b26d1fbde974274da0d1a7889e56 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 30 May 2019 12:35:24 -0400 Subject: [PATCH 07/32] 5061 reword credentials to be authentication key for bing translator --- .../translators/BingTranslator.java | 15 ++-- .../translators/BingTranslatorSettings.java | 32 +++++---- .../BingTranslatorSettingsPanel.form | 37 ++++++---- .../BingTranslatorSettingsPanel.java | 68 ++++++++++--------- .../translators/Bundle.properties | 3 +- 5 files changed, 86 insertions(+), 69 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java index 1d27d8ce33..db17236edc 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -46,18 +46,15 @@ public class BingTranslator implements TextTranslator{ private static final String BASE_URL = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to="; private final BingTranslatorSettingsPanel settingsPanel; private final BingTranslatorSettings settings = new BingTranslatorSettings(); - - // This sends messages to Microsoft. - private final OkHttpClient CLIENT = new OkHttpClient(); - + private final OkHttpClient CLIENT = new OkHttpClient(); //We might want to make this a configurable setting for anyone who has a //paid account that's willing to pay for long documents. private final int MAX_STRING_LENGTH = 5000; public BingTranslator(){ - settingsPanel = new BingTranslatorSettingsPanel(settings.getCredentials(), settings.getTargetLanguageCode()); + settingsPanel = new BingTranslatorSettingsPanel(settings.getAuthenticationKey(), settings.getTargetLanguageCode()); } static String getTranlatorUrl(String languageCode){ @@ -85,7 +82,7 @@ public class BingTranslator implements TextTranslator{ bodyString); Request request = new Request.Builder() .url(getTranlatorUrl(settings.getTargetLanguageCode())).post(body) - .addHeader("Ocp-Apim-Subscription-Key", settings.getCredentials()) + .addHeader("Ocp-Apim-Subscription-Key", settings.getAuthenticationKey()) .addHeader("Content-type", "application/json").build(); Response response = CLIENT.newCall(request).execute(); return response.body().string(); @@ -93,8 +90,8 @@ public class BingTranslator implements TextTranslator{ @Override public String translate(String string) throws TranslationException { - if (settings.getCredentials() == null || settings.getCredentials().isEmpty()) { - throw new TranslationException("Bing Translator has not been configured, credentials need to be specified"); + if (settings.getAuthenticationKey() == null || settings.getAuthenticationKey().isEmpty()) { + throw new TranslationException("Bing Translator has not been configured, authentication key needs to be specified"); } String toTranslate = string.trim(); //Translates some text into English, without specifying the source langauge. @@ -132,7 +129,7 @@ public class BingTranslator implements TextTranslator{ @Override public void saveSettings() { - settings.setCredentials(settingsPanel.getCredentials()); + settings.setAuthenticationKey(settingsPanel.getAuthenticationKey()); settings.setTargetLanguageCode(settingsPanel.getTargetLanguageCode()); } diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java index ca68adb77c..039c24c480 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java @@ -26,12 +26,12 @@ import org.sleuthkit.autopsy.coreutils.ModuleSettings; */ public final class BingTranslatorSettings { - private static final String CREDENTIALS_KEY = "Credentials"; + private static final String AUTHENTICATION_KEY = "Credentials"; private static final String BING_TRANSLATE_NAME = "BingTranslate"; - private static final String DEFAULT_CREDENTIALS = ""; + private static final String DEFAULT_AUTHENTICATION = ""; private static final String DEFAULT_TARGET_LANGUAGE = "en"; private static final String TARGET_LANGUAGE_CODE_KEY = "TargetLanguageCode"; - private String credentials; + private String authenticationKey; private String targetLanguageCode; /** @@ -42,21 +42,23 @@ public final class BingTranslatorSettings { } /** - * Get the path to the JSON credentials file + * Get the Authentication key to be used for the Microsoft translation + * service * - * @return the path to the credentials file + * @return the Authentication key for the service */ - String getCredentials() { - return credentials; + String getAuthenticationKey() { + return authenticationKey; } /** - * Set the path to the JSON credentials file + * Set the Authentication key to be used for the Microsoft translation + * service * - * @param path the path to the credentials file + * @param authKey the Authentication key for the service */ - void setCredentials(String creds) { - credentials = creds; + void setAuthenticationKey(String authKey) { + authenticationKey = authKey; } /** @@ -66,10 +68,10 @@ public final class BingTranslatorSettings { if (!ModuleSettings.configExists(BING_TRANSLATE_NAME)) { ModuleSettings.makeConfigFile(BING_TRANSLATE_NAME); } - if (ModuleSettings.settingExists(BING_TRANSLATE_NAME, CREDENTIALS_KEY)) { - credentials = ModuleSettings.getConfigSetting(BING_TRANSLATE_NAME, CREDENTIALS_KEY); + if (ModuleSettings.settingExists(BING_TRANSLATE_NAME, AUTHENTICATION_KEY)) { + authenticationKey = ModuleSettings.getConfigSetting(BING_TRANSLATE_NAME, AUTHENTICATION_KEY); } else { - credentials = DEFAULT_CREDENTIALS; + authenticationKey = DEFAULT_AUTHENTICATION; } if (ModuleSettings.settingExists(BING_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY)) { targetLanguageCode = ModuleSettings.getConfigSetting(BING_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY); @@ -105,7 +107,7 @@ public final class BingTranslatorSettings { * Save the setting from memory to their location on disk */ void saveSettings() { - ModuleSettings.setConfigSetting(BING_TRANSLATE_NAME, CREDENTIALS_KEY, credentials); + ModuleSettings.setConfigSetting(BING_TRANSLATE_NAME, AUTHENTICATION_KEY, authenticationKey); ModuleSettings.setConfigSetting(BING_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY, targetLanguageCode); } } diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index 944cc3d124..5b275b52e3 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -19,31 +19,37 @@ - - - - - - - + + + + + + + + + + + + - + + @@ -57,7 +63,7 @@ - + @@ -68,8 +74,8 @@ - - + + @@ -98,14 +104,19 @@ - + - + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index 4282ecbc63..b95887cea1 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -28,7 +28,6 @@ import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import java.io.IOException; -import java.util.Iterator; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; @@ -44,17 +43,17 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(BingTranslatorSettingsPanel.class.getName()); private static final long serialVersionUID = 1L; private static final String GET_TARGET_LANGUAGES_URL = "https://api.cognitive.microsofttranslator.com/languages?api-version=3.0&scope=translation"; - private static final String DEFUALT_TEST_STRING = "traducción exitoso"; //spanish which should translate to something along the lines of translation successful + private static final String DEFUALT_TEST_STRING = "traducción exitoso"; //spanish which should translate to something along the lines of "successful translation" private String targetLanguageCode = ""; /** * Creates new form GoogleTranslatorSettingsPanel */ - public BingTranslatorSettingsPanel(String credentials, String code) { + public BingTranslatorSettingsPanel(String authenticationKey, String code) { initComponents(); - - credentialsField.setText(credentials); - credentialsField.getDocument().addDocumentListener(new DocumentListener() { + + authenticationKeyField.setText(authenticationKey); + authenticationKeyField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { firePropertyChange("SettingChanged", true, false); @@ -69,7 +68,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { public void changedUpdate(DocumentEvent e) { firePropertyChange("SettingChanged", true, false); } - + }); targetLanguageCode = code; populateComboBox(); @@ -87,9 +86,9 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { JsonObject asObject = elementBody.getAsJsonObject(); JsonElement translationElement = asObject.get("translation"); JsonObject responses = translationElement.getAsJsonObject(); - for (Entry entry : responses.entrySet()) { + responses.entrySet().forEach((entry) -> { targetLanguageComboBox.addItem(new LanguageWrapper(entry.getKey(), entry.getValue().getAsJsonObject().get("name").getAsString())); - } + }); } catch (IOException | IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException ex) { logger.log(Level.WARNING, "Unable to get list of target languages or parse the result that was received", ex); } @@ -120,8 +119,8 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - credentialsLabel = new javax.swing.JLabel(); - credentialsField = new javax.swing.JTextField(); + authenticationKeyLabel = new javax.swing.JLabel(); + authenticationKeyField = new javax.swing.JTextField(); warningLabel = new javax.swing.JLabel(); testButton = new javax.swing.JButton(); targetLanguageLabel = new javax.swing.JLabel(); @@ -134,7 +133,9 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { resultLabel = new javax.swing.JLabel(); testResultValueLabel = new javax.swing.JLabel(); - org.openide.awt.Mnemonics.setLocalizedText(credentialsLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.credentialsLabel.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(authenticationKeyLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.credentialsLabel.text")); // NOI18N + + authenticationKeyField.setToolTipText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.authenticationKeyField.toolTipText")); // NOI18N warningLabel.setForeground(new java.awt.Color(255, 0, 0)); org.openide.awt.Mnemonics.setLocalizedText(warningLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.warningLabel.text")); // NOI18N @@ -175,28 +176,32 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(credentialsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(credentialsField, javax.swing.GroupLayout.DEFAULT_SIZE, 463, Short.MAX_VALUE) - .addGap(67, 67, 67)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 551, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addComponent(targetLanguageLabel) + .addGap(18, 18, 18) + .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(authenticationKeyLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(authenticationKeyField, javax.swing.GroupLayout.PREFERRED_SIZE, 486, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 20, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(translationSizeLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(testButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGap(25, 25, 25) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(translationSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(unitsLabel)) + .addComponent(unitsLabel) + .addGap(0, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(untranslatedLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -205,15 +210,15 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addComponent(resultLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(testResultValueLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))) - .addGap(0, 0, Short.MAX_VALUE)))) + .addContainerGap()))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(credentialsLabel) - .addComponent(credentialsField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(authenticationKeyLabel) + .addComponent(authenticationKeyField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(targetLanguageLabel) @@ -240,7 +245,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { if (testTranslationSetup()) { warningLabel.setText(""); } else { - warningLabel.setText("Invalid translation credentials"); + warningLabel.setText("Invalid translation authentication key"); } }//GEN-LAST:event_testButtonActionPerformed @@ -253,8 +258,8 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { }//GEN-LAST:event_targetLanguageComboBoxSelected // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JTextField credentialsField; - private javax.swing.JLabel credentialsLabel; + private javax.swing.JTextField authenticationKeyField; + private javax.swing.JLabel authenticationKeyLabel; private javax.swing.JLabel resultLabel; private javax.swing.JComboBox targetLanguageComboBox; private javax.swing.JLabel targetLanguageLabel; @@ -290,7 +295,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { bodyString); Request request = new Request.Builder() .url(BingTranslator.getTranlatorUrl(targetLanguageCode)).post(body) - .addHeader("Ocp-Apim-Subscription-Key", credentialsField.getText()) + .addHeader("Ocp-Apim-Subscription-Key", authenticationKeyField.getText()) .addHeader("Content-type", "application/json").build(); try { Response response = new OkHttpClient().newCall(request).execute(); @@ -308,12 +313,13 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { } /** - * Get the currently set path to the JSON credentials file + * Get the currently set authentication key to be used for the Microsoft + * translation service * - * @return the path to the credentials file specified in the textarea + * @return the authentication key specified in the textarea */ - String getCredentials() { - return credentialsField.getText(); + String getAuthenticationKey() { + return authenticationKeyField.getText(); } /** diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index adf27cddfa..1d6a9318be 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -1,5 +1,5 @@ GoogleTranslatorSettingsPanel.browseButton.text=Browse -GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials: +GoogleTranslatorSettingsPanel.credentialsLabel.text=Authentication key: GoogleTranslatorSettingsPanel.warningLabel.text= GoogleTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.testButton.text=Test @@ -9,3 +9,4 @@ BingTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: BingTranslatorSettingsPanel.translationSizeLabel.text=Translation Size: BingTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.unitsLabel.text=characters +BingTranslatorSettingsPanel.authenticationKeyField.toolTipText=Enter the hash for the From fd399e4cfb7c080e358ea4dfd6e47ab3fb87f2d3 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 30 May 2019 13:04:32 -0400 Subject: [PATCH 08/32] 5061 clean up loading of settings --- .../texttranslation/translators/BingTranslatorSettings.java | 6 ++++-- .../texttranslation/translators/Bundle.properties-MERGED | 3 ++- .../translators/GoogleTranslatorSettings.java | 6 ++++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java index 039c24c480..dcd54fd6f9 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java @@ -70,12 +70,14 @@ public final class BingTranslatorSettings { } if (ModuleSettings.settingExists(BING_TRANSLATE_NAME, AUTHENTICATION_KEY)) { authenticationKey = ModuleSettings.getConfigSetting(BING_TRANSLATE_NAME, AUTHENTICATION_KEY); - } else { + } + if (authenticationKey == null || StringUtils.isBlank(authenticationKey)) { authenticationKey = DEFAULT_AUTHENTICATION; } if (ModuleSettings.settingExists(BING_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY)) { targetLanguageCode = ModuleSettings.getConfigSetting(BING_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY); - } else { + } + if (targetLanguageCode == null || StringUtils.isBlank(targetLanguageCode)) { targetLanguageCode = DEFAULT_TARGET_LANGUAGE; } } diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index 01c6123934..89f7d8b02a 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -1,7 +1,7 @@ BingTranslator.name.text=Bing Translator GoogleTranslator.name.text=Google Translate GoogleTranslatorSettingsPanel.browseButton.text=Browse -GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials: +GoogleTranslatorSettingsPanel.credentialsLabel.text=Authentication key: GoogleTranslatorSettingsPanel.errorMessage.fileNotFound=Credentials file not found, please set the location to be a valid JSON credentials file. GoogleTranslatorSettingsPanel.errorMessage.noFileSelected=A JSON file must be selected to provide your credentials for Google Translate. GoogleTranslatorSettingsPanel.errorMessage.unableToMakeCredentials=Unable to construct credentials object from credentials file, please set the location to be a valid JSON credentials file. @@ -19,3 +19,4 @@ BingTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: BingTranslatorSettingsPanel.translationSizeLabel.text=Translation Size: BingTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.unitsLabel.text=characters +BingTranslatorSettingsPanel.authenticationKeyField.toolTipText=Enter the hash for the diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettings.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettings.java index 55771b8c7a..34ebfd67d4 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettings.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettings.java @@ -92,12 +92,14 @@ public final class GoogleTranslatorSettings { } if (ModuleSettings.settingExists(GOOGLE_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY)) { targetLanguageCode = ModuleSettings.getConfigSetting(GOOGLE_TRANSLATE_NAME, TARGET_LANGUAGE_CODE_KEY); - } else { + } + if (targetLanguageCode == null || StringUtils.isBlank(targetLanguageCode)) { targetLanguageCode = DEFAULT_TARGET_LANGUAGE; } if (ModuleSettings.settingExists(GOOGLE_TRANSLATE_NAME, CREDENTIAL_PATH_KEY)) { credentialPath = ModuleSettings.getConfigSetting(GOOGLE_TRANSLATE_NAME, CREDENTIAL_PATH_KEY); - } else { + } + if (credentialPath == null) { credentialPath = DEFAULT_CREDENTIAL_PATH; } } From e6670f34bab10ab51a7bbc82d53d35668d0c54fe Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 30 May 2019 13:46:15 -0400 Subject: [PATCH 09/32] 5061 test button added to google translate options panel --- .../translators/BingTranslator.java | 75 ++++++-------- .../BingTranslatorSettingsPanel.java | 2 +- .../translators/Bundle.properties | 6 +- .../translators/Bundle.properties-MERGED | 6 +- .../GoogleTranslatorSettingsPanel.form | 71 ++++++++++++-- .../GoogleTranslatorSettingsPanel.java | 97 +++++++++++++++---- 6 files changed, 184 insertions(+), 73 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java index db17236edc..78f1cf9afd 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -16,7 +16,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.sleuthkit.autopsy.texttranslation.translators; import com.google.gson.JsonArray; @@ -35,11 +34,12 @@ import org.sleuthkit.autopsy.texttranslation.TextTranslator; import org.sleuthkit.autopsy.texttranslation.TranslationException; /** - * Translates text by making HTTP requests to Bing Translator. - * This requires a valid subscription key for a Microsoft Azure account. + * Translates text by making HTTP requests to Bing Translator. This requires a + * valid subscription key for a Microsoft Azure account. */ @ServiceProvider(service = TextTranslator.class) -public class BingTranslator implements TextTranslator{ +public class BingTranslator implements TextTranslator { + //In the String below, "en" is the target language. You can include multiple target //languages separated by commas. A full list of supported languages is here: //https://docs.microsoft.com/en-us/azure/cognitive-services/translator/language-support @@ -47,43 +47,45 @@ public class BingTranslator implements TextTranslator{ private final BingTranslatorSettingsPanel settingsPanel; private final BingTranslatorSettings settings = new BingTranslatorSettings(); // This sends messages to Microsoft. - private final OkHttpClient CLIENT = new OkHttpClient(); + private final OkHttpClient CLIENT = new OkHttpClient(); //We might want to make this a configurable setting for anyone who has a //paid account that's willing to pay for long documents. private final int MAX_STRING_LENGTH = 5000; - - - public BingTranslator(){ + + public BingTranslator() { settingsPanel = new BingTranslatorSettingsPanel(settings.getAuthenticationKey(), settings.getTargetLanguageCode()); } - - static String getTranlatorUrl(String languageCode){ + + static String getTranlatorUrl(String languageCode) { return BASE_URL + languageCode; } - + /** * Converts an input test to the JSON format required by Bing Translator, * posts it to Microsoft, and returns the JSON text response. - * + * * @param string The input text to be translated. + * * @return The translation response as a JSON string - * @throws IOException if the request could not be executed due to cancellation, a connectivity problem or timeout. + * + * @throws IOException if the request could not be executed due to + * cancellation, a connectivity problem or timeout. */ public String postTranslationRequest(String string) throws IOException { MediaType mediaType = MediaType.parse("application/json"); - + JsonArray jsonArray = new JsonArray(); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("Text", string); jsonArray.add(jsonObject); String bodyString = jsonArray.toString(); - + RequestBody body = RequestBody.create(mediaType, - bodyString); + bodyString); Request request = new Request.Builder() - .url(getTranlatorUrl(settings.getTargetLanguageCode())).post(body) - .addHeader("Ocp-Apim-Subscription-Key", settings.getAuthenticationKey()) - .addHeader("Content-type", "application/json").build(); + .url(getTranlatorUrl(settings.getTargetLanguageCode())).post(body) + .addHeader("Ocp-Apim-Subscription-Key", settings.getAuthenticationKey()) + .addHeader("Content-type", "application/json").build(); Response response = CLIENT.newCall(request).execute(); return response.body().string(); } @@ -95,27 +97,25 @@ public class BingTranslator implements TextTranslator{ } String toTranslate = string.trim(); //Translates some text into English, without specifying the source langauge. - + // HTML files were producing lots of white space at the end - //Google Translate required us to replace (\r\n|\n) with
//but Bing Translator doesn not have that requirement. - //The free account has a maximum file size. If you have a paid account, //you probably still want to limit file size to prevent accidentally //translating very large documents. if (toTranslate.length() > MAX_STRING_LENGTH) { toTranslate = toTranslate.substring(0, MAX_STRING_LENGTH); } - + try { String response = postTranslationRequest(toTranslate); return parseJSONResponse(response); } catch (Throwable e) { - throw new TranslationException(e.getMessage()); + throw new TranslationException(e.getMessage()); } } - + @Messages({"BingTranslator.name.text=Bing Translator"}) @Override public String getName() { @@ -131,26 +131,15 @@ public class BingTranslator implements TextTranslator{ public void saveSettings() { settings.setAuthenticationKey(settingsPanel.getAuthenticationKey()); settings.setTargetLanguageCode(settingsPanel.getTargetLanguageCode()); + settings.saveSettings(); } private String parseJSONResponse(String json_text) throws TranslationException { - /* Here is an example of the text we get from Bing when input is "gato", - the Spanish word for cat: - [ - { - "detectedLanguage": { - "language": "es", - "score": 1.0 - }, - "translations": [ - { - "text": "cat", - "to": "en" - } - ] - } - ] - */ + /* + * Here is an example of the text we get from Bing when input is "gato", + * the Spanish word for cat: [ { "detectedLanguage": { "language": "es", + * "score": 1.0 }, "translations": [ { "text": "cat", "to": "en" } ] } ] + */ JsonParser parser = new JsonParser(); try { JsonArray responses = parser.parse(json_text).getAsJsonArray(); @@ -164,4 +153,4 @@ public class BingTranslator implements TextTranslator{ throw new TranslationException("JSON text does not match Bing Translator scheme: " + e); } } -} \ No newline at end of file +} diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index b95887cea1..054f65a2f5 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -51,7 +51,6 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { */ public BingTranslatorSettingsPanel(String authenticationKey, String code) { initComponents(); - authenticationKeyField.setText(authenticationKey); authenticationKeyField.getDocument().addDocumentListener(new DocumentListener() { @Override @@ -284,6 +283,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { * cancellation, a connectivity problem or timeout. */ private boolean testTranslationSetup() { + testResultValueLabel.setText(""); MediaType mediaType = MediaType.parse("application/json"); JsonArray jsonArray = new JsonArray(); JsonObject jsonObject = new JsonObject(); diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index 1d6a9318be..8eebeeab58 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -1,5 +1,5 @@ GoogleTranslatorSettingsPanel.browseButton.text=Browse -GoogleTranslatorSettingsPanel.credentialsLabel.text=Authentication key: +GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials Path: GoogleTranslatorSettingsPanel.warningLabel.text= GoogleTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.testButton.text=Test @@ -10,3 +10,7 @@ BingTranslatorSettingsPanel.translationSizeLabel.text=Translation Size: BingTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.unitsLabel.text=characters BingTranslatorSettingsPanel.authenticationKeyField.toolTipText=Enter the hash for the +GoogleTranslatorSettingsPanel.testButton.text=Test +GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: +GoogleTranslatorSettingsPanel.resultLabel.text=Result: +GoogleTranslatorSettingsPanel.testResultValueLabel.text= diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index 89f7d8b02a..fec94d3419 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -1,7 +1,7 @@ BingTranslator.name.text=Bing Translator GoogleTranslator.name.text=Google Translate GoogleTranslatorSettingsPanel.browseButton.text=Browse -GoogleTranslatorSettingsPanel.credentialsLabel.text=Authentication key: +GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials Path: GoogleTranslatorSettingsPanel.errorMessage.fileNotFound=Credentials file not found, please set the location to be a valid JSON credentials file. GoogleTranslatorSettingsPanel.errorMessage.noFileSelected=A JSON file must be selected to provide your credentials for Google Translate. GoogleTranslatorSettingsPanel.errorMessage.unableToMakeCredentials=Unable to construct credentials object from credentials file, please set the location to be a valid JSON credentials file. @@ -20,3 +20,7 @@ BingTranslatorSettingsPanel.translationSizeLabel.text=Translation Size: BingTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: BingTranslatorSettingsPanel.unitsLabel.text=characters BingTranslatorSettingsPanel.authenticationKeyField.toolTipText=Enter the hash for the +GoogleTranslatorSettingsPanel.testButton.text=Test +GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: +GoogleTranslatorSettingsPanel.resultLabel.text=Result: +GoogleTranslatorSettingsPanel.testResultValueLabel.text= diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form index 1a78f115ac..7d728fd011 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form @@ -16,13 +16,9 @@ - + - - - - @@ -31,7 +27,7 @@ - + @@ -42,6 +38,18 @@ + + + + + + + + + + + + @@ -60,9 +68,16 @@ - + + + + + + + + + -
@@ -118,5 +133,43 @@
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java index 83ad5cf302..8bccc01485 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java @@ -21,7 +21,9 @@ package org.sleuthkit.autopsy.texttranslation.translators; import com.google.auth.Credentials; import com.google.auth.oauth2.ServiceAccountCredentials; import com.google.cloud.translate.Language; +import com.google.cloud.translate.Translate; import com.google.cloud.translate.TranslateOptions; +import com.google.cloud.translate.Translation; import java.awt.event.ItemListener; import java.io.File; import java.io.FileInputStream; @@ -44,6 +46,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(GoogleTranslatorSettingsPanel.class.getName()); private static final String JSON_EXTENSION = "json"; + private static final String DEFUALT_TEST_STRING = "traducción exitoso"; //spanish which should translate to something along the lines of "successful translation" private static final long serialVersionUID = 1L; private final ItemListener listener = new ComboBoxSelectionListener(); private String targetLanguageCode = ""; @@ -60,16 +63,15 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { /** * Private method to make a temporary translation service given the current - * settings and use it to retrieve the available target languages for - * population of combobox with target language with unsaved settings. + * settings with unsaved settings. * - * @return A list of Languages + * @return A Translate object which is the translation service */ @Messages({"GoogleTranslatorSettingsPanel.errorMessage.fileNotFound=Credentials file not found, please set the location to be a valid JSON credentials file.", "GoogleTranslatorSettingsPanel.errorMessage.unableToReadCredentials=Unable to read credentials from credentials file, please set the location to be a valid JSON credentials file.", "GoogleTranslatorSettingsPanel.errorMessage.unableToMakeCredentials=Unable to construct credentials object from credentials file, please set the location to be a valid JSON credentials file.", "GoogleTranslatorSettingsPanel.errorMessage.unknownFailureGetting=Failure getting list of supported languages with current credentials file.",}) - private List getListOfTargetLanguages() { + private Translate getTemporaryTranslationService() { //This method also has the side effect of more or less validating the JSON file which was selected as it is necessary to get the list of target languages try { InputStream credentialStream; @@ -77,31 +79,31 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { credentialStream = new FileInputStream(credentialsPathField.getText()); } catch (FileNotFoundException ignored) { warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_fileNotFound()); - return new ArrayList<>(); + return null; } Credentials creds; try { creds = ServiceAccountCredentials.fromStream(credentialStream); } catch (IOException ignored) { warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_unableToMakeCredentials()); - return new ArrayList<>(); + return null; } if (creds == null) { warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_unableToReadCredentials()); logger.log(Level.WARNING, "Credentials were not successfully made, no translations will be available from the GoogleTranslator"); - return new ArrayList<>(); + return null; } else { TranslateOptions.Builder builder = TranslateOptions.newBuilder(); builder.setCredentials(creds); builder.setTargetLanguage(targetLanguageCode); //localize the list to the currently selected target language warningLabel.setText(""); //clear any previous warning text - return builder.build().getService().listSupportedLanguages(); + return builder.build().getService(); } } catch (Throwable throwable) { //Catching throwables because some of this Google Translate code throws throwables warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_unknownFailureGetting()); logger.log(Level.WARNING, "Throwable caught while getting list of supported languages", throwable); - return new ArrayList<>(); + return null; } } @@ -114,7 +116,13 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { targetLanguageComboBox.removeItemListener(listener); try { if (!StringUtils.isBlank(credentialsPathField.getText())) { - List listSupportedLanguages = getListOfTargetLanguages(); + List listSupportedLanguages; + Translate tempService = getTemporaryTranslationService(); + if (tempService != null) { + listSupportedLanguages = tempService.listSupportedLanguages(); + } else { + listSupportedLanguages = new ArrayList<>(); + } targetLanguageComboBox.removeAllItems(); if (!listSupportedLanguages.isEmpty()) { listSupportedLanguages.forEach((lang) -> { @@ -167,6 +175,11 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { targetLanguageComboBox = new javax.swing.JComboBox<>(); targetLanguageLabel = new javax.swing.JLabel(); warningLabel = new javax.swing.JLabel(); + testResultValueLabel = new javax.swing.JLabel(); + resultLabel = new javax.swing.JLabel(); + untranslatedLabel = new javax.swing.JLabel(); + testUntranslatedTextField = new javax.swing.JTextField(); + testButton = new javax.swing.JButton(); org.openide.awt.Mnemonics.setLocalizedText(credentialsLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.credentialsLabel.text")); // NOI18N @@ -186,6 +199,21 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { warningLabel.setForeground(new java.awt.Color(255, 0, 0)); org.openide.awt.Mnemonics.setLocalizedText(warningLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.warningLabel.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(testResultValueLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.testResultValueLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(resultLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.resultLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(untranslatedLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.untranslatedLabel.text")); // NOI18N + + testUntranslatedTextField.setText(DEFUALT_TEST_STRING); + + org.openide.awt.Mnemonics.setLocalizedText(testButton, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.testButton.text")); // NOI18N + testButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + testButtonActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -193,9 +221,6 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 551, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(credentialsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -203,13 +228,24 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(credentialsPathField, javax.swing.GroupLayout.DEFAULT_SIZE, 443, Short.MAX_VALUE) + .addComponent(credentialsPathField, javax.swing.GroupLayout.DEFAULT_SIZE, 451, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(browseButton) .addGap(14, 14, 14)) .addGroup(layout.createSequentialGroup() .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 317, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)))))) + .addGap(0, 0, Short.MAX_VALUE)))) + .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 551, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addComponent(testButton, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(untranslatedLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(resultLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(testResultValueLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -223,9 +259,15 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(targetLanguageLabel) .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(23, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 15, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(testButton) + .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(untranslatedLabel) + .addComponent(resultLabel) + .addComponent(testResultValueLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)) ); }// //GEN-END:initComponents @@ -249,12 +291,31 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { } }//GEN-LAST:event_browseButtonActionPerformed + private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testButtonActionPerformed + testResultValueLabel.setText(""); + Translate tempTranslate = getTemporaryTranslationService(); + if (tempTranslate != null) { + try { + Translation translation = tempTranslate.translate(testUntranslatedTextField.getText()); + testResultValueLabel.setText(translation.getTranslatedText()); + warningLabel.setText(""); + } catch (Exception ex) { + warningLabel.setText("Invalid translation credentials path"); + } + } + }//GEN-LAST:event_testButtonActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton browseButton; private javax.swing.JLabel credentialsLabel; private javax.swing.JTextField credentialsPathField; + private javax.swing.JLabel resultLabel; private javax.swing.JComboBox targetLanguageComboBox; private javax.swing.JLabel targetLanguageLabel; + private javax.swing.JButton testButton; + private javax.swing.JLabel testResultValueLabel; + private javax.swing.JTextField testUntranslatedTextField; + private javax.swing.JLabel untranslatedLabel; private javax.swing.JLabel warningLabel; // End of variables declaration//GEN-END:variables From 670ef2cfb1d041c1654e84be1234bdae83893171 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 30 May 2019 16:05:30 -0400 Subject: [PATCH 10/32] 5061 fix label on bing translate options panel which was wrong --- .../BingTranslatorSettingsPanel.form | 18 +++++++++--------- .../BingTranslatorSettingsPanel.java | 11 +++++------ .../translators/Bundle.properties | 1 + .../translators/Bundle.properties-MERGED | 1 + 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index 5b275b52e3..64227561b3 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -38,7 +38,7 @@ - + @@ -74,8 +74,8 @@ - + @@ -104,13 +104,6 @@ - - - - - - - @@ -207,5 +200,12 @@ + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index 054f65a2f5..e477fbf662 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -28,7 +28,6 @@ import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import java.io.IOException; -import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.event.DocumentEvent; @@ -118,7 +117,6 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - authenticationKeyLabel = new javax.swing.JLabel(); authenticationKeyField = new javax.swing.JTextField(); warningLabel = new javax.swing.JLabel(); testButton = new javax.swing.JButton(); @@ -131,8 +129,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { untranslatedLabel = new javax.swing.JLabel(); resultLabel = new javax.swing.JLabel(); testResultValueLabel = new javax.swing.JLabel(); - - org.openide.awt.Mnemonics.setLocalizedText(authenticationKeyLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.credentialsLabel.text")); // NOI18N + authenticationKeyLabel = new javax.swing.JLabel(); authenticationKeyField.setToolTipText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.authenticationKeyField.toolTipText")); // NOI18N @@ -168,6 +165,8 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(testResultValueLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.testResultValueLabel.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(authenticationKeyLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.authenticationKeyLabel.text")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -216,8 +215,8 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(authenticationKeyLabel) - .addComponent(authenticationKeyField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(authenticationKeyField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(authenticationKeyLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(targetLanguageLabel) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index 8eebeeab58..6ebd3002ef 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -14,3 +14,4 @@ GoogleTranslatorSettingsPanel.testButton.text=Test GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: GoogleTranslatorSettingsPanel.resultLabel.text=Result: GoogleTranslatorSettingsPanel.testResultValueLabel.text= +BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key: diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index fec94d3419..35e06bda99 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -24,3 +24,4 @@ GoogleTranslatorSettingsPanel.testButton.text=Test GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: GoogleTranslatorSettingsPanel.resultLabel.text=Result: GoogleTranslatorSettingsPanel.testResultValueLabel.text= +BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key: From f05844a62cc162351ceebecd3abaaa8b9b3b5038 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 31 May 2019 14:57:31 -0400 Subject: [PATCH 11/32] 5123 remove all images and other uri elements from html by default --- .../autopsy/contentviewers/HtmlPanel.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java index f915b8d5a6..e4768d075e 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java @@ -18,6 +18,11 @@ */ package org.sleuthkit.autopsy.contentviewers; +import java.io.IOException; +import java.io.StringReader; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; @@ -25,8 +30,9 @@ import javafx.concurrent.Worker; import javafx.scene.web.WebView; import javafx.embed.swing.JFXPanel; import javafx.scene.Scene; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Node; +import net.htmlparser.jericho.Attribute; +import net.htmlparser.jericho.OutputDocument; +import net.htmlparser.jericho.Source; import org.openide.util.NbBundle.Messages; import org.w3c.dom.Document; import org.w3c.dom.NodeList; @@ -38,6 +44,7 @@ import org.w3c.dom.events.EventTarget; @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives final class HtmlPanel extends javax.swing.JPanel { + private static final Logger logger = Logger.getLogger(HtmlPanel.class.getName()); private static final long serialVersionUID = 1L; private static final String TEXT_TYPE = "text/plain"; private final JFXPanel jfxPanel = new JFXPanel(); @@ -99,12 +106,26 @@ final class HtmlPanel extends javax.swing.JPanel { * @return The cleansed HTML String */ private String cleanseHTML(String htmlInString) { - org.jsoup.nodes.Document doc = Jsoup.parse(htmlInString); - // remove all 'img' tags. - doc.select("img").stream().forEach(Node::remove); - // remove all 'span' tags, these are often images which are ads - doc.select("span").stream().forEach(Node::remove); - return doc.html(); + String returnString = ""; + try { + Source source = new Source(new StringReader(htmlInString)); + OutputDocument document = new OutputDocument(source); + //remove background images + source.getAllTags().stream().filter((tag) -> (tag.toString().contains("background-image"))).forEachOrdered((tag) -> { + document.remove(tag); + }); + //remove images + source.getAllElements("img").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove other URI elements such as input boxes + List attributesToRemove = source.getURIAttributes(); + document.remove(attributesToRemove); + returnString = document.toString(); + } catch (IOException ex) { + logger.log(Level.WARNING, "Unable to read html for cleaning out URI elements with Jericho", ex); + } + return returnString; } /** From 74ab8af6e049bda6d0a352488517f247c85bee09 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 3 Jun 2019 11:01:11 -0400 Subject: [PATCH 12/32] 5092 populate ingest status column datasource summary --- .../Bundle.properties-MERGED | 1 + .../datasourcesummary/DataSourceBrowser.java | 11 +++- .../datasourcesummary/DataSourceSummary.java | 56 +++++++++++++++++++ .../DataSourceSummaryNode.java | 4 ++ 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourceSummary/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/casemodule/datasourceSummary/Bundle.properties-MERGED index 508e04b76a..fe998b0e57 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourceSummary/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourceSummary/Bundle.properties-MERGED @@ -66,6 +66,7 @@ DataSourceSummaryDialog.window.title=Data Sources Summary DataSourceSummaryNode.column.dataSourceName.header=Data Source Name DataSourceSummaryNode.column.files.header=Files DataSourceSummaryNode.column.results.header=Results +DataSourceSummaryNode.column.status.header=Ingest Status DataSourceSummaryNode.column.tags.header=Tags DataSourceSummaryNode.column.type.header=Type DataSourceSummaryNode.viewDataSourceAction.text=Go to Data Source diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java index e3b9fa0e93..e946317da8 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java @@ -39,6 +39,7 @@ import org.sleuthkit.autopsy.casemodule.datasourcesummary.DataSourceSummaryNode. import static javax.swing.SwingConstants.RIGHT; import javax.swing.table.TableColumn; import org.sleuthkit.datamodel.DataSource; +import org.sleuthkit.datamodel.IngestJobInfo; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; @@ -50,9 +51,10 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(DataSourceBrowser.class.getName()); - private static final int COUNT_COLUMN_WIDTH = 25; - private static final int USAGE_COLUMN_WIDTH = 120; - private static final int DATA_SOURCE_COLUMN_WIDTH = 325; + private static final int COUNT_COLUMN_WIDTH = 20; + private static final int INGEST_STATUS_WIDTH = 50; + private static final int USAGE_COLUMN_WIDTH = 110; + private static final int DATA_SOURCE_COLUMN_WIDTH = 280; private final Outline outline; private final org.openide.explorer.view.OutlineView outlineView; private final ExplorerManager explorerManager; @@ -69,6 +71,7 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana outlineView = new org.openide.explorer.view.OutlineView(); this.setVisible(true); outlineView.setPropertyColumns( + Bundle.DataSourceSummaryNode_column_status_header(), Bundle.DataSourceSummaryNode_column_status_header(), Bundle.DataSourceSummaryNode_column_type_header(), Bundle.DataSourceSummaryNode_column_type_header(), Bundle.DataSourceSummaryNode_column_files_header(), Bundle.DataSourceSummaryNode_column_files_header(), Bundle.DataSourceSummaryNode_column_results_header(), Bundle.DataSourceSummaryNode_column_results_header(), @@ -90,6 +93,8 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana column.setPreferredWidth(COUNT_COLUMN_WIDTH); } else if (column.getHeaderValue().toString().equals(Bundle.DataSourceSummaryNode_column_type_header())) { column.setPreferredWidth(USAGE_COLUMN_WIDTH); + } else if (column.getHeaderValue().toString().equals(Bundle.DataSourceSummaryNode_column_status_header())) { + column.setPreferredWidth(INGEST_STATUS_WIDTH); } else { column.setPreferredWidth(DATA_SOURCE_COLUMN_WIDTH); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java index 1aa55d95b5..a04604b3cd 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java @@ -18,7 +18,17 @@ */ package org.sleuthkit.autopsy.casemodule.datasourcesummary; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import org.openide.util.Exceptions; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.datamodel.CaseDbAccessManager; import org.sleuthkit.datamodel.DataSource; +import org.sleuthkit.datamodel.IngestJobInfo; +import org.sleuthkit.datamodel.IngestJobInfo.IngestJobStatusType; +import org.sleuthkit.datamodel.TskCoreException; /** * Wrapper object for a DataSource and the information associated with it. @@ -27,6 +37,7 @@ import org.sleuthkit.datamodel.DataSource; class DataSourceSummary { private final DataSource dataSource; + private String status = ""; private final String type; private final long filesCount; private final long resultsCount; @@ -45,12 +56,23 @@ class DataSourceSummary { */ DataSourceSummary(DataSource dSource, String typeValue, Long numberOfFiles, Long numberOfResults, Long numberOfTags) { dataSource = dSource; + updateStatus(); type = typeValue == null ? "" : typeValue; filesCount = numberOfFiles == null ? 0 : numberOfFiles; resultsCount = numberOfResults == null ? 0 : numberOfResults; tagsCount = numberOfTags == null ? 0 : numberOfTags; } + void updateStatus() { + try { + IngestJobQueryCallback callback = new IngestJobQueryCallback(); + Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select("status_id FROM ingest_jobs WHERE obj_id=" + dataSource.getId(), callback); + status = callback.getStatus(); + } catch (NoCurrentCaseException | TskCoreException ex) { + + } + } + /** * Get the DataSource * @@ -87,6 +109,10 @@ class DataSourceSummary { return resultsCount; } + String getIngestStatus(){ + return status; + } + /** * Get the number of tagged content objects in this DataSource * @@ -95,4 +121,34 @@ class DataSourceSummary { long getTagsCount() { return tagsCount; } + + class IngestJobQueryCallback implements CaseDbAccessManager.CaseDbAccessQueryCallback { + + IngestJobStatusType jobStatus = null; + + @Override + public void process(ResultSet rs) { + try { + while (rs.next()) { + IngestJobStatusType currentStatus = IngestJobStatusType.fromID(rs.getInt("status_id")); + if (currentStatus == IngestJobStatusType.COMPLETED) { + jobStatus = currentStatus; + } else if (currentStatus == IngestJobStatusType.STARTED) { + jobStatus = currentStatus; + return; + } + } + } catch (SQLException ex) { + System.out.println("EEEP"); + } + } + + String getStatus() { + if (jobStatus == null) { + return ""; + } else { + return jobStatus.getDisplayName(); + } + } + } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java index 8323061a66..c9aef8c644 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java @@ -109,6 +109,7 @@ final class DataSourceSummaryNode extends AbstractNode { static final class DataSourceSummaryEntryNode extends AbstractNode { private final DataSource dataSource; + private final String status; private final String type; private final long filesCount; private final long resultsCount; @@ -124,6 +125,7 @@ final class DataSourceSummaryNode extends AbstractNode { DataSourceSummaryEntryNode(DataSourceSummary dataSourceSummary) { super(Children.LEAF); dataSource = dataSourceSummary.getDataSource(); + status = dataSourceSummary.getIngestStatus(); type = dataSourceSummary.getType(); filesCount = dataSourceSummary.getFilesCount(); resultsCount = dataSourceSummary.getResultsCount(); @@ -143,6 +145,7 @@ final class DataSourceSummaryNode extends AbstractNode { } @Messages({"DataSourceSummaryNode.column.dataSourceName.header=Data Source Name", + "DataSourceSummaryNode.column.status.header=Ingest Status", "DataSourceSummaryNode.column.type.header=Type", "DataSourceSummaryNode.column.files.header=Files", "DataSourceSummaryNode.column.results.header=Results", @@ -157,6 +160,7 @@ final class DataSourceSummaryNode extends AbstractNode { } sheetSet.put(new NodeProperty<>(Bundle.DataSourceSummaryNode_column_dataSourceName_header(), Bundle.DataSourceSummaryNode_column_dataSourceName_header(), Bundle.DataSourceSummaryNode_column_dataSourceName_header(), dataSource)); + sheetSet.put(new NodeProperty<>(Bundle.DataSourceSummaryNode_column_status_header(), Bundle.DataSourceSummaryNode_column_status_header(), Bundle.DataSourceSummaryNode_column_status_header(), status)); sheetSet.put(new NodeProperty<>(Bundle.DataSourceSummaryNode_column_type_header(), Bundle.DataSourceSummaryNode_column_type_header(), Bundle.DataSourceSummaryNode_column_type_header(), type)); sheetSet.put(new NodeProperty<>(Bundle.DataSourceSummaryNode_column_files_header(), Bundle.DataSourceSummaryNode_column_files_header(), Bundle.DataSourceSummaryNode_column_files_header(), From b9ef321b1e96047407a177dc18ec6fb456d89aa4 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 3 Jun 2019 13:23:48 -0400 Subject: [PATCH 13/32] 5123 remove frames, iframes, audio, video, and other tags --- .../autopsy/contentviewers/HtmlPanel.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java index e4768d075e..b747e661e7 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java @@ -99,7 +99,7 @@ final class HtmlPanel extends javax.swing.JPanel { } /** - * Cleans out input HTML string + * Cleans out input HTML string so it will not access resources over the internet * * @param htmlInString The HTML string to cleanse * @@ -118,6 +118,42 @@ final class HtmlPanel extends javax.swing.JPanel { source.getAllElements("img").forEach((element) -> { document.remove(element.getAllTags()); }); + //remove frames + source.getAllElements("frame").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove iframes + source.getAllElements("iframe").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove pictures + source.getAllElements("picture").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove svg + source.getAllElements("svg").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove audio + source.getAllElements("audio").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove video + source.getAllElements("video").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove tracks + source.getAllElements("track").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove embeded external elements + source.getAllElements("embed").forEach((element) -> { + document.remove(element.getAllTags()); + }); + //remove linked elements + source.getAllElements("link").forEach((element) -> { + document.remove(element.getAllTags()); + }); //remove other URI elements such as input boxes List attributesToRemove = source.getURIAttributes(); document.remove(attributesToRemove); From 51e12b2eaf88e9aaf0c6dbf499de89ca2db0e82f Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 3 Jun 2019 13:32:26 -0400 Subject: [PATCH 14/32] 5123 change text of Show images to say Download instead of show --- Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties | 2 +- Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.form | 2 +- Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties index 652f8781ba..fd3bbc833f 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties @@ -83,7 +83,7 @@ MediaViewImagePanel.zoomResetButton.text=Reset MediaViewImagePanel.zoomTextField.text= MediaViewImagePanel.rotationTextField.text= MediaViewImagePanel.rotateLeftButton.toolTipText= -HtmlPanel.showImagesToggleButton.text=Show Images +HtmlPanel.showImagesToggleButton.text=Download Images MediaPlayerPanel.audioSlider.toolTipText= MediaPlayerPanel.VolumeIcon.text=\ \ \ \ \ Volume MediaPlayerPanel.progressLabel.text=00:00:00/00:00:00 diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.form b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.form index 97b3c67f72..407f0e6ec7 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.form +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.form @@ -18,7 +18,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java index b747e661e7..250f2ba3cd 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java @@ -221,7 +221,7 @@ final class HtmlPanel extends javax.swing.JPanel { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(showImagesToggleButton) - .addGap(0, 95, Short.MAX_VALUE)) + .addGap(0, 75, Short.MAX_VALUE)) .addComponent(htmlJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( From 3c03ee5ce3659422acbc3bf91cffca0c03200949 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 3 Jun 2019 13:36:02 -0400 Subject: [PATCH 15/32] 5123 update merged properties file --- .../sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index 236fddfada..7600a880a2 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -145,7 +145,7 @@ MediaViewImagePanel.zoomResetButton.text=Reset MediaViewImagePanel.zoomTextField.text= MediaViewImagePanel.rotationTextField.text= MediaViewImagePanel.rotateLeftButton.toolTipText= -HtmlPanel.showImagesToggleButton.text=Show Images +HtmlPanel.showImagesToggleButton.text=Download Images MediaPlayerPanel.audioSlider.toolTipText= MediaPlayerPanel.VolumeIcon.text=\ \ \ \ \ Volume MediaPlayerPanel.progressLabel.text=00:00:00/00:00:00 From fd894a71033fc3b2db2ad28a8a7421a0d3689051 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 3 Jun 2019 13:39:37 -0400 Subject: [PATCH 16/32] 5123 change spot I missed show to download change --- Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java index 250f2ba3cd..b53b1dc258 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/HtmlPanel.java @@ -168,7 +168,7 @@ final class HtmlPanel extends javax.swing.JPanel { * Refresh the panel to reflect the current show/hide images setting. */ @Messages({ - "HtmlPanel_showImagesToggleButton_show=Show Images", + "HtmlPanel_showImagesToggleButton_show=Download Images", "HtmlPanel_showImagesToggleButton_hide=Hide Images", "Html_text_display_error=The HTML text cannot be displayed, it may not be correctly formed HTML.",}) private void refresh() { From 476b407c3c71eed72baab2e29efd10abc8245c0c Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 3 Jun 2019 13:47:19 -0400 Subject: [PATCH 17/32] 5123 update to merged properties file --- .../sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index 7600a880a2..7b8fa6ad6b 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -22,7 +22,7 @@ GstVideoPanel.cannotProcFile.err=The media player cannot process this file. GstVideoPanel.noOpenCase.errMsg=No open case available. Html_text_display_error=The HTML text cannot be displayed, it may not be correctly formed HTML. HtmlPanel_showImagesToggleButton_hide=Hide Images -HtmlPanel_showImagesToggleButton_show=Show Images +HtmlPanel_showImagesToggleButton_show=Download Images HtmlViewer_file_error=This file is missing or unreadable. MediaFileViewer.initGst.gstException.msg=Error initializing gstreamer for audio/video viewing and frame extraction capabilities. Video and audio viewing will be disabled. GstVideoPanel.setupVideo.infoLabel.text=Playback of deleted videos is not supported, use an external player. From 2a37021c809da9f976a5cab47d158de350361f24 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 3 Jun 2019 18:35:28 -0400 Subject: [PATCH 18/32] 5092 working changes to update status in table --- .../datasourcesummary/DataSourceBrowser.java | 42 ++++++++++++++++++- .../DataSourceSummaryDialog.java | 11 +++++ .../DataSourceSummaryNode.java | 6 ++- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java index e946317da8..9c73ddadda 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java @@ -37,7 +37,10 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.casemodule.datasourcesummary.DataSourceSummaryNode.DataSourceSummaryEntryNode; import static javax.swing.SwingConstants.RIGHT; +import javax.swing.SwingUtilities; import javax.swing.table.TableColumn; +import org.openide.util.Exceptions; +import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.IngestJobInfo; import org.sleuthkit.datamodel.SleuthkitCase; @@ -58,7 +61,7 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana private final Outline outline; private final org.openide.explorer.view.OutlineView outlineView; private final ExplorerManager explorerManager; - private final List dataSourceSummaryList; + private List dataSourceSummaryList; private final RightAlignedTableCellRenderer rightAlignedRenderer = new RightAlignedTableCellRenderer(); /** @@ -187,6 +190,43 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana return null; } + void refresh(long jobId, IngestJobInfo.IngestJobStatusType newStatus) { + Node[] selectedNodes = explorerManager.getSelectedNodes(); + //attempt to update the status of any datasources that had status which was STARTED + for (DataSourceSummary summary : dataSourceSummaryList) { + //attempt to update the status of any datasources that had status which was STARTED + //the database may not have been updated when this event is received so we need to manually update the UI + if (summary.getIngestStatus() == IngestJobInfo.IngestJobStatusType.STARTED && summary.getJobId() == jobId) { + System.out.println("UPDATING STATUS"); + summary.setStatus(newStatus); + } + } + SwingUtilities.invokeLater(() -> { + explorerManager.setRootContext(new DataSourceSummaryNode(dataSourceSummaryList)); + List nodesToSelect = new ArrayList<>(); + for (Node node : explorerManager.getRootContext().getChildren().getNodes()) { + if (node instanceof DataSourceSummaryEntryNode) { + //there should only be one selected node as multi-select is disabled + for (Node selectedNode : selectedNodes) { + if (((DataSourceSummaryEntryNode) node).getDataSource().equals(((DataSourceSummaryEntryNode) selectedNode).getDataSource())) { + System.out.println("NODE TO SELECT ADDED"); + nodesToSelect.add(node); + } + } + } + } + //reselect the previously selected Nodes + try { + explorerManager.setSelectedNodes(nodesToSelect.toArray(new Node[nodesToSelect.size()])); + } catch (PropertyVetoException ex) { + logger.log(Level.WARNING, "Error selecting previously selected nodes", ex); + } + revalidate(); + repaint(); + + }); + } + /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java index 3fd86c8de8..91ad7da792 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.casemodule.datasourcesummary; import java.awt.Frame; +import java.beans.PropertyChangeEvent; import java.util.Map; import java.util.Observable; import java.util.Observer; @@ -26,7 +27,9 @@ import java.util.logging.Logger; import javax.swing.event.ListSelectionEvent; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.IngestJobInfoPanel; +import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.datamodel.DataSource; +import org.sleuthkit.datamodel.IngestJobInfo; /** * Dialog for displaying the Data Sources Summary information @@ -73,6 +76,14 @@ final class DataSourceSummaryDialog extends javax.swing.JDialog implements Obser this.repaint(); } }); + IngestManager.getInstance().addIngestJobEventListener((PropertyChangeEvent evt) -> { + if (evt.getPropertyName().equals(IngestManager.IngestJobEvent.CANCELLED.toString())){ + dataSourcesPanel.refresh((long)evt.getOldValue(), null); + } + else if (evt.getPropertyName().equals(IngestManager.IngestJobEvent.COMPLETED.toString())) { + dataSourcesPanel.refresh((long)evt.getOldValue(), IngestJobInfo.IngestJobStatusType.COMPLETED); + } + }); this.pack(); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java index c9aef8c644..6c5a212d9d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.casemodule.datasourcesummary; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Observable; import java.util.Observer; import javax.swing.Action; @@ -125,7 +126,7 @@ final class DataSourceSummaryNode extends AbstractNode { DataSourceSummaryEntryNode(DataSourceSummary dataSourceSummary) { super(Children.LEAF); dataSource = dataSourceSummary.getDataSource(); - status = dataSourceSummary.getIngestStatus(); + status = dataSourceSummary.getIngestStatus() == null ? "" : dataSourceSummary.getIngestStatus().toString(); type = dataSourceSummary.getType(); filesCount = dataSourceSummary.getFilesCount(); resultsCount = dataSourceSummary.getResultsCount(); @@ -183,7 +184,8 @@ final class DataSourceSummaryNode extends AbstractNode { } @Override - public Action[] getActions(boolean context) { + public Action[] getActions(boolean context + ) { List actions = new ArrayList<>(); actions.add(new ViewDataSourceInContextAction()); return actions.toArray(new Action[actions.size()]); From fb17d40ca49cd1e1c0f8300f1a2d901684d4f632 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 3 Jun 2019 18:40:46 -0400 Subject: [PATCH 19/32] 5092 query for status --- .../datasourcesummary/DataSourceSummary.java | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java index a04604b3cd..a3de258fe8 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java @@ -20,13 +20,10 @@ package org.sleuthkit.autopsy.casemodule.datasourcesummary; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.List; -import org.openide.util.Exceptions; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.datamodel.CaseDbAccessManager; import org.sleuthkit.datamodel.DataSource; -import org.sleuthkit.datamodel.IngestJobInfo; import org.sleuthkit.datamodel.IngestJobInfo.IngestJobStatusType; import org.sleuthkit.datamodel.TskCoreException; @@ -37,7 +34,8 @@ import org.sleuthkit.datamodel.TskCoreException; class DataSourceSummary { private final DataSource dataSource; - private String status = ""; + private IngestJobStatusType status = null; + private Long jobId = null; private final String type; private final long filesCount; private final long resultsCount; @@ -56,23 +54,29 @@ class DataSourceSummary { */ DataSourceSummary(DataSource dSource, String typeValue, Long numberOfFiles, Long numberOfResults, Long numberOfTags) { dataSource = dSource; - updateStatus(); + getStatusFromDatabase(); type = typeValue == null ? "" : typeValue; filesCount = numberOfFiles == null ? 0 : numberOfFiles; resultsCount = numberOfResults == null ? 0 : numberOfResults; tagsCount = numberOfTags == null ? 0 : numberOfTags; } - void updateStatus() { + private void getStatusFromDatabase() { try { IngestJobQueryCallback callback = new IngestJobQueryCallback(); - Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select("status_id FROM ingest_jobs WHERE obj_id=" + dataSource.getId(), callback); + Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select("ingest_job_id, status_id FROM ingest_jobs WHERE obj_id=" + dataSource.getId(), callback); status = callback.getStatus(); + jobId = callback.getJobId(); + System.out.println("NEW STATUS: " + status); } catch (NoCurrentCaseException | TskCoreException ex) { } } + void setStatus(IngestJobStatusType newStatus){ + status = newStatus; + } + /** * Get the DataSource * @@ -82,6 +86,10 @@ class DataSourceSummary { return dataSource; } + Long getJobId() { + return jobId; + } + /** * Get the type of this DataSource * @@ -109,10 +117,10 @@ class DataSourceSummary { return resultsCount; } - String getIngestStatus(){ + IngestJobStatusType getIngestStatus() { return status; } - + /** * Get the number of tagged content objects in this DataSource * @@ -124,16 +132,18 @@ class DataSourceSummary { class IngestJobQueryCallback implements CaseDbAccessManager.CaseDbAccessQueryCallback { - IngestJobStatusType jobStatus = null; + private IngestJobStatusType jobStatus = null; + private Long ingestJobId = null; @Override public void process(ResultSet rs) { try { while (rs.next()) { IngestJobStatusType currentStatus = IngestJobStatusType.fromID(rs.getInt("status_id")); - if (currentStatus == IngestJobStatusType.COMPLETED) { + if (currentStatus == IngestJobStatusType.COMPLETED) { jobStatus = currentStatus; - } else if (currentStatus == IngestJobStatusType.STARTED) { + } else if (currentStatus == IngestJobStatusType.STARTED) { + ingestJobId = rs.getLong("ingest_job_id"); jobStatus = currentStatus; return; } @@ -143,12 +153,12 @@ class DataSourceSummary { } } - String getStatus() { - if (jobStatus == null) { - return ""; - } else { - return jobStatus.getDisplayName(); - } + IngestJobStatusType getStatus() { + return jobStatus; + } + + Long getJobId() { + return ingestJobId; } } } From 1f1eb95699dc23193a1a39a9ae20694f69261366 Mon Sep 17 00:00:00 2001 From: Brian Kjersten Date: Tue, 4 Jun 2019 09:47:51 -0500 Subject: [PATCH 20/32] 5111 Clean up HTML output --- .../texttranslation/translators/GoogleTranslator.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java index 318191e713..3c761af6e1 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java @@ -34,6 +34,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; +import org.sleuthkit.autopsy.coreutils.EscapeUtil; import org.sleuthkit.autopsy.texttranslation.TextTranslator; import org.sleuthkit.autopsy.texttranslation.TranslationException; @@ -103,6 +104,10 @@ public final class GoogleTranslator implements TextTranslator { // put back the newlines translatedString = translatedString.replaceAll("
", "\n"); + + // With our current settings, Google Translate outputs HTML + // so we need to undo the escape characters. + translatedString = EscapeUtil.unEscapeHtml(translatedString); return translatedString; } catch (Throwable ex) { //Catching throwables because some of this Google Translate code throws throwables From 4a5fbe3aeb7b3ad27b8f3c063f8f0dbc5a91f2ec Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 4 Jun 2019 14:35:17 -0400 Subject: [PATCH 21/32] 5092 working updates for ingest status --- .../datasourcesummary/DataSourceBrowser.java | 13 +++------- .../datasourcesummary/DataSourceSummary.java | 26 +++++-------------- .../DataSourceSummaryDialog.java | 17 ++++++++---- .../DataSourceSummaryNode.java | 2 +- 4 files changed, 23 insertions(+), 35 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java index 9c73ddadda..3fcb50b02e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java @@ -190,15 +190,12 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana return null; } - void refresh(long jobId, IngestJobInfo.IngestJobStatusType newStatus) { + void refresh(content datasource, IngestJobInfo.IngestJobStatusType newStatus) { Node[] selectedNodes = explorerManager.getSelectedNodes(); //attempt to update the status of any datasources that had status which was STARTED for (DataSourceSummary summary : dataSourceSummaryList) { - //attempt to update the status of any datasources that had status which was STARTED - //the database may not have been updated when this event is received so we need to manually update the UI - if (summary.getIngestStatus() == IngestJobInfo.IngestJobStatusType.STARTED && summary.getJobId() == jobId) { - System.out.println("UPDATING STATUS"); - summary.setStatus(newStatus); + if (summary.getDataSource().equals(datasource)) { + summary.updateStatusFromDatabase(); } } SwingUtilities.invokeLater(() -> { @@ -209,7 +206,6 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana //there should only be one selected node as multi-select is disabled for (Node selectedNode : selectedNodes) { if (((DataSourceSummaryEntryNode) node).getDataSource().equals(((DataSourceSummaryEntryNode) selectedNode).getDataSource())) { - System.out.println("NODE TO SELECT ADDED"); nodesToSelect.add(node); } } @@ -221,10 +217,9 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana } catch (PropertyVetoException ex) { logger.log(Level.WARNING, "Error selecting previously selected nodes", ex); } - revalidate(); - repaint(); }); + } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java index a3de258fe8..071be6e3cb 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java @@ -35,7 +35,6 @@ class DataSourceSummary { private final DataSource dataSource; private IngestJobStatusType status = null; - private Long jobId = null; private final String type; private final long filesCount; private final long resultsCount; @@ -54,29 +53,24 @@ class DataSourceSummary { */ DataSourceSummary(DataSource dSource, String typeValue, Long numberOfFiles, Long numberOfResults, Long numberOfTags) { dataSource = dSource; - getStatusFromDatabase(); + updateStatusFromDatabase(); type = typeValue == null ? "" : typeValue; filesCount = numberOfFiles == null ? 0 : numberOfFiles; resultsCount = numberOfResults == null ? 0 : numberOfResults; tagsCount = numberOfTags == null ? 0 : numberOfTags; } - private void getStatusFromDatabase() { + final void updateStatusFromDatabase() { try { IngestJobQueryCallback callback = new IngestJobQueryCallback(); - Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select("ingest_job_id, status_id FROM ingest_jobs WHERE obj_id=" + dataSource.getId(), callback); + Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select("status_id FROM ingest_jobs WHERE obj_id=" + dataSource.getId(), callback); status = callback.getStatus(); - jobId = callback.getJobId(); - System.out.println("NEW STATUS: " + status); + System.out.println("STATUS IN DB: " + status.getDisplayName()); } catch (NoCurrentCaseException | TskCoreException ex) { } } - - void setStatus(IngestJobStatusType newStatus){ - status = newStatus; - } - + /** * Get the DataSource * @@ -85,11 +79,7 @@ class DataSourceSummary { DataSource getDataSource() { return dataSource; } - - Long getJobId() { - return jobId; - } - + /** * Get the type of this DataSource * @@ -143,7 +133,6 @@ class DataSourceSummary { if (currentStatus == IngestJobStatusType.COMPLETED) { jobStatus = currentStatus; } else if (currentStatus == IngestJobStatusType.STARTED) { - ingestJobId = rs.getLong("ingest_job_id"); jobStatus = currentStatus; return; } @@ -157,8 +146,5 @@ class DataSourceSummary { return jobStatus; } - Long getJobId() { - return ingestJobId; - } } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java index 91ad7da792..1ac367c990 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java @@ -28,6 +28,8 @@ import javax.swing.event.ListSelectionEvent; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.IngestJobInfoPanel; import org.sleuthkit.autopsy.ingest.IngestManager; +import org.sleuthkit.autopsy.ingest.events.DataSourceAnalysisCompletedEvent; +import org.sleuthkit.autopsy.ingest.events.DataSourceAnalysisCompletedEvent.Reason; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.IngestJobInfo; @@ -77,11 +79,16 @@ final class DataSourceSummaryDialog extends javax.swing.JDialog implements Obser } }); IngestManager.getInstance().addIngestJobEventListener((PropertyChangeEvent evt) -> { - if (evt.getPropertyName().equals(IngestManager.IngestJobEvent.CANCELLED.toString())){ - dataSourcesPanel.refresh((long)evt.getOldValue(), null); - } - else if (evt.getPropertyName().equals(IngestManager.IngestJobEvent.COMPLETED.toString())) { - dataSourcesPanel.refresh((long)evt.getOldValue(), IngestJobInfo.IngestJobStatusType.COMPLETED); + if (evt instanceof DataSourceAnalysisCompletedEvent) { + DataSourceAnalysisCompletedEvent dsEvent = (DataSourceAnalysisCompletedEvent) evt; + if (dsEvent.getResult() == Reason.ANALYSIS_COMPLETED) { + System.out.println("DS JOB ID: " + dsEvent.getDataSourceIngestJobId()); + System.out.println("JOB ID: " + dsEvent.getIngestJobId()); + dataSourcesPanel.refresh(dsEvent.getDataSource().getId(), IngestJobInfo.IngestJobStatusType.COMPLETED); + + } else if (dsEvent.getResult() == Reason.ANALYSIS_CANCELLED) { + dataSourcesPanel.refresh(dsEvent.getDataSource().getId(), null); + } } }); this.pack(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java index 6c5a212d9d..b833e39743 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java @@ -126,7 +126,7 @@ final class DataSourceSummaryNode extends AbstractNode { DataSourceSummaryEntryNode(DataSourceSummary dataSourceSummary) { super(Children.LEAF); dataSource = dataSourceSummary.getDataSource(); - status = dataSourceSummary.getIngestStatus() == null ? "" : dataSourceSummary.getIngestStatus().toString(); + status = dataSourceSummary.getIngestStatus() == null ? "" : dataSourceSummary.getIngestStatus().getDisplayName(); type = dataSourceSummary.getType(); filesCount = dataSourceSummary.getFilesCount(); resultsCount = dataSourceSummary.getResultsCount(); From d2154cd3809de5981c86e6af32ce29a188327fea Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 4 Jun 2019 14:37:17 -0400 Subject: [PATCH 22/32] 5092 fix accidently reverted check of datasource id --- .../casemodule/datasourcesummary/DataSourceBrowser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java index 3fcb50b02e..9f74f71e2e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java @@ -190,11 +190,11 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana return null; } - void refresh(content datasource, IngestJobInfo.IngestJobStatusType newStatus) { + void refresh(long dataSourceId, IngestJobInfo.IngestJobStatusType newStatus) { Node[] selectedNodes = explorerManager.getSelectedNodes(); //attempt to update the status of any datasources that had status which was STARTED for (DataSourceSummary summary : dataSourceSummaryList) { - if (summary.getDataSource().equals(datasource)) { + if (summary.getDataSource().getId() == dataSourceId) { summary.updateStatusFromDatabase(); } } From c1029fc154a5228395a5f9bbd4ec9191b0cbcf56 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 4 Jun 2019 14:41:20 -0400 Subject: [PATCH 23/32] 5092 reduce number of database queries necessary to display status --- .../casemodule/datasourcesummary/DataSourceBrowser.java | 2 +- .../casemodule/datasourcesummary/DataSourceSummary.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java index 9f74f71e2e..0df95720cf 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java @@ -195,7 +195,7 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana //attempt to update the status of any datasources that had status which was STARTED for (DataSourceSummary summary : dataSourceSummaryList) { if (summary.getDataSource().getId() == dataSourceId) { - summary.updateStatusFromDatabase(); + summary.setIngestStatus(newStatus); } } SwingUtilities.invokeLater(() -> { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java index 071be6e3cb..010c7b17ee 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java @@ -53,14 +53,14 @@ class DataSourceSummary { */ DataSourceSummary(DataSource dSource, String typeValue, Long numberOfFiles, Long numberOfResults, Long numberOfTags) { dataSource = dSource; - updateStatusFromDatabase(); + getStatusFromDatabase(); type = typeValue == null ? "" : typeValue; filesCount = numberOfFiles == null ? 0 : numberOfFiles; resultsCount = numberOfResults == null ? 0 : numberOfResults; tagsCount = numberOfTags == null ? 0 : numberOfTags; } - final void updateStatusFromDatabase() { + private void getStatusFromDatabase() { try { IngestJobQueryCallback callback = new IngestJobQueryCallback(); Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select("status_id FROM ingest_jobs WHERE obj_id=" + dataSource.getId(), callback); @@ -80,6 +80,10 @@ class DataSourceSummary { return dataSource; } + void setIngestStatus(IngestJobStatusType ingestStatus){ + status = ingestStatus; + } + /** * Get the type of this DataSource * From c9c451945db17955c1e4aaa80714fccb833a74c5 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 4 Jun 2019 15:02:28 -0400 Subject: [PATCH 24/32] 5092 add comments to better document how ingest job status is updated --- .../datasourcesummary/DataSourceBrowser.java | 11 +++-- .../datasourcesummary/DataSourceSummary.java | 47 +++++++++++++++---- .../DataSourceSummaryDialog.java | 5 -- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java index 0df95720cf..f423b8a75a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java @@ -39,8 +39,6 @@ import org.sleuthkit.autopsy.casemodule.datasourcesummary.DataSourceSummaryNode. import static javax.swing.SwingConstants.RIGHT; import javax.swing.SwingUtilities; import javax.swing.table.TableColumn; -import org.openide.util.Exceptions; -import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.IngestJobInfo; import org.sleuthkit.datamodel.SleuthkitCase; @@ -61,7 +59,7 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana private final Outline outline; private final org.openide.explorer.view.OutlineView outlineView; private final ExplorerManager explorerManager; - private List dataSourceSummaryList; + private final List dataSourceSummaryList; private final RightAlignedTableCellRenderer rightAlignedRenderer = new RightAlignedTableCellRenderer(); /** @@ -190,6 +188,13 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana return null; } + /** + * Update the DataSourceBrowser to display up to date status information for + * the data sources. + * + * @param dataSourceId the ID of the data source which should be updated + * @param newStatus the new status which the data source should have + */ void refresh(long dataSourceId, IngestJobInfo.IngestJobStatusType newStatus) { Node[] selectedNodes = explorerManager.getSelectedNodes(); //attempt to update the status of any datasources that had status which was STARTED diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java index 010c7b17ee..fedb11884a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java @@ -20,6 +20,8 @@ package org.sleuthkit.autopsy.casemodule.datasourcesummary; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.logging.Level; +import java.util.logging.Logger; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.datamodel.CaseDbAccessManager; @@ -33,6 +35,8 @@ import org.sleuthkit.datamodel.TskCoreException; */ class DataSourceSummary { + private static final Logger logger = Logger.getLogger(DataSourceSummary.class.getName()); + private static final String INGEST_JOB_STATUS_QUERY = "status_id FROM ingest_jobs WHERE obj_id="; private final DataSource dataSource; private IngestJobStatusType status = null; private final String type; @@ -60,17 +64,19 @@ class DataSourceSummary { tagsCount = numberOfTags == null ? 0 : numberOfTags; } + /** + * Get the status of the ingest job from the case database + */ private void getStatusFromDatabase() { try { IngestJobQueryCallback callback = new IngestJobQueryCallback(); - Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select("status_id FROM ingest_jobs WHERE obj_id=" + dataSource.getId(), callback); + Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select(INGEST_JOB_STATUS_QUERY + dataSource.getId(), callback); status = callback.getStatus(); - System.out.println("STATUS IN DB: " + status.getDisplayName()); } catch (NoCurrentCaseException | TskCoreException ex) { } } - + /** * Get the DataSource * @@ -79,11 +85,17 @@ class DataSourceSummary { DataSource getDataSource() { return dataSource; } - - void setIngestStatus(IngestJobStatusType ingestStatus){ + + /** + * Manually set the ingest job status + * + * @param ingestStatus the status which the ingest job should have + * currently, null to display empty string + */ + void setIngestStatus(IngestJobStatusType ingestStatus) { status = ingestStatus; } - + /** * Get the type of this DataSource * @@ -111,6 +123,12 @@ class DataSourceSummary { return resultsCount; } + /** + * Get the IngestJobStatusType associated with this data source. + * + * @return the IngestJobStatusType associated with this data source. Can be + * null if the IngestJobStatusType is not STARTED or COMPLETED. + */ IngestJobStatusType getIngestStatus() { return status; } @@ -124,28 +142,37 @@ class DataSourceSummary { return tagsCount; } + /** + * Callback to parse result set, getting the status to be associated with + * this data source + */ class IngestJobQueryCallback implements CaseDbAccessManager.CaseDbAccessQueryCallback { private IngestJobStatusType jobStatus = null; - private Long ingestJobId = null; @Override public void process(ResultSet rs) { try { while (rs.next()) { IngestJobStatusType currentStatus = IngestJobStatusType.fromID(rs.getInt("status_id")); - if (currentStatus == IngestJobStatusType.COMPLETED) { + if (currentStatus == IngestJobStatusType.COMPLETED) { jobStatus = currentStatus; - } else if (currentStatus == IngestJobStatusType.STARTED) { + } else if (currentStatus == IngestJobStatusType.STARTED) { jobStatus = currentStatus; return; } } } catch (SQLException ex) { - System.out.println("EEEP"); + logger.log(Level.WARNING, "Error getting status for ingest job", ex); } } + /** + * Get the status which was determined for this callback + * + * @return the status of the data source which was + * queried for + */ IngestJobStatusType getStatus() { return jobStatus; } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java index 1ac367c990..f322731f42 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java @@ -23,7 +23,6 @@ import java.beans.PropertyChangeEvent; import java.util.Map; import java.util.Observable; import java.util.Observer; -import java.util.logging.Logger; import javax.swing.event.ListSelectionEvent; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.IngestJobInfoPanel; @@ -43,7 +42,6 @@ final class DataSourceSummaryDialog extends javax.swing.JDialog implements Obser private final DataSourceSummaryDetailsPanel detailsPanel; private final DataSourceBrowser dataSourcesPanel; private final IngestJobInfoPanel ingestHistoryPanel; - private static final Logger logger = Logger.getLogger(DataSourceSummaryDialog.class.getName()); /** * Creates new form DataSourceSummaryDialog for displaying a summary of the @@ -82,10 +80,7 @@ final class DataSourceSummaryDialog extends javax.swing.JDialog implements Obser if (evt instanceof DataSourceAnalysisCompletedEvent) { DataSourceAnalysisCompletedEvent dsEvent = (DataSourceAnalysisCompletedEvent) evt; if (dsEvent.getResult() == Reason.ANALYSIS_COMPLETED) { - System.out.println("DS JOB ID: " + dsEvent.getDataSourceIngestJobId()); - System.out.println("JOB ID: " + dsEvent.getIngestJobId()); dataSourcesPanel.refresh(dsEvent.getDataSource().getId(), IngestJobInfo.IngestJobStatusType.COMPLETED); - } else if (dsEvent.getResult() == Reason.ANALYSIS_CANCELLED) { dataSourcesPanel.refresh(dsEvent.getDataSource().getId(), null); } From 8637f1dfe0305ffb1e61609787d1d2cf140a55d4 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 4 Jun 2019 15:20:07 -0400 Subject: [PATCH 25/32] 5092 minor cleanup before pr --- .../casemodule/datasourcesummary/DataSourceBrowser.java | 4 +++- .../casemodule/datasourcesummary/DataSourceSummary.java | 3 +-- .../casemodule/datasourcesummary/DataSourceSummaryDialog.java | 1 + .../casemodule/datasourcesummary/DataSourceSummaryNode.java | 3 +-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java index f423b8a75a..ac09010de1 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceBrowser.java @@ -196,13 +196,15 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana * @param newStatus the new status which the data source should have */ void refresh(long dataSourceId, IngestJobInfo.IngestJobStatusType newStatus) { - Node[] selectedNodes = explorerManager.getSelectedNodes(); + //attempt to update the status of any datasources that had status which was STARTED for (DataSourceSummary summary : dataSourceSummaryList) { if (summary.getDataSource().getId() == dataSourceId) { summary.setIngestStatus(newStatus); } } + //figure out which nodes were previously selected + Node[] selectedNodes = explorerManager.getSelectedNodes(); SwingUtilities.invokeLater(() -> { explorerManager.setRootContext(new DataSourceSummaryNode(dataSourceSummaryList)); List nodesToSelect = new ArrayList<>(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java index fedb11884a..c9c5b551ce 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java @@ -170,8 +170,7 @@ class DataSourceSummary { /** * Get the status which was determined for this callback * - * @return the status of the data source which was - * queried for + * @return the status of the data source which was queried for */ IngestJobStatusType getStatus() { return jobStatus; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java index f322731f42..1535cbefe0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryDialog.java @@ -76,6 +76,7 @@ final class DataSourceSummaryDialog extends javax.swing.JDialog implements Obser this.repaint(); } }); + //add listener to refresh jobs with Started status when they complete IngestManager.getInstance().addIngestJobEventListener((PropertyChangeEvent evt) -> { if (evt instanceof DataSourceAnalysisCompletedEvent) { DataSourceAnalysisCompletedEvent dsEvent = (DataSourceAnalysisCompletedEvent) evt; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java index b833e39743..703e1f1373 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java @@ -184,8 +184,7 @@ final class DataSourceSummaryNode extends AbstractNode { } @Override - public Action[] getActions(boolean context - ) { + public Action[] getActions(boolean context) { List actions = new ArrayList<>(); actions.add(new ViewDataSourceInContextAction()); return actions.toArray(new Action[actions.size()]); From d34610fb58c118a75196a440d92cb5f43e74be7a Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 4 Jun 2019 15:32:21 -0400 Subject: [PATCH 26/32] 5092 address codacy complaints --- .../datasourcesummary/DataSourceSummary.java | 10 +++++----- .../datasourcesummary/DataSourceSummaryNode.java | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java index c9c5b551ce..390dce1afe 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummary.java @@ -34,7 +34,7 @@ import org.sleuthkit.datamodel.TskCoreException; * */ class DataSourceSummary { - + private static final Logger logger = Logger.getLogger(DataSourceSummary.class.getName()); private static final String INGEST_JOB_STATUS_QUERY = "status_id FROM ingest_jobs WHERE obj_id="; private final DataSource dataSource; @@ -73,7 +73,7 @@ class DataSourceSummary { Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select(INGEST_JOB_STATUS_QUERY + dataSource.getId(), callback); status = callback.getStatus(); } catch (NoCurrentCaseException | TskCoreException ex) { - + logger.log(Level.WARNING, "Error getting status for data source from case database", ex); } } @@ -147,9 +147,9 @@ class DataSourceSummary { * this data source */ class IngestJobQueryCallback implements CaseDbAccessManager.CaseDbAccessQueryCallback { - + private IngestJobStatusType jobStatus = null; - + @Override public void process(ResultSet rs) { try { @@ -175,6 +175,6 @@ class DataSourceSummary { IngestJobStatusType getStatus() { return jobStatus; } - + } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java index 703e1f1373..0411d94bb2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/datasourcesummary/DataSourceSummaryNode.java @@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.casemodule.datasourcesummary; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Observable; import java.util.Observer; import javax.swing.Action; From 21615fca2f339b57b744f772d49b8588fe46ad35 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 5 Jun 2019 10:59:45 -0400 Subject: [PATCH 27/32] 5061 remove translation size setting --- .../BingTranslatorSettingsPanel.form | 56 +++---------------- .../BingTranslatorSettingsPanel.java | 42 +++----------- .../translators/Bundle.properties | 2 - .../GoogleTranslatorSettingsPanel.form | 4 ++ .../GoogleTranslatorSettingsPanel.java | 22 ++++++-- 5 files changed, 38 insertions(+), 88 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index 64227561b3..54dfaa4827 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -39,28 +39,15 @@
- - - - + - - - - - - - - - - - - - - - - - + + + + + + +
@@ -83,12 +70,6 @@
- - - - - - @@ -151,27 +132,6 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index e477fbf662..5a73bca0fa 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -122,9 +122,6 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { testButton = new javax.swing.JButton(); targetLanguageLabel = new javax.swing.JLabel(); targetLanguageComboBox = new javax.swing.JComboBox<>(); - translationSizeLabel = new javax.swing.JLabel(); - translationSizeSpinner = new javax.swing.JSpinner(); - unitsLabel = new javax.swing.JLabel(); testUntranslatedTextField = new javax.swing.JTextField(); untranslatedLabel = new javax.swing.JLabel(); resultLabel = new javax.swing.JLabel(); @@ -151,12 +148,6 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { } }); - org.openide.awt.Mnemonics.setLocalizedText(translationSizeLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.translationSizeLabel.text")); // NOI18N - - translationSizeSpinner.setModel(new javax.swing.SpinnerNumberModel(5000, 5000, 500000, 5000)); - - org.openide.awt.Mnemonics.setLocalizedText(unitsLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.unitsLabel.text")); // NOI18N - testUntranslatedTextField.setText(DEFUALT_TEST_STRING); org.openide.awt.Mnemonics.setLocalizedText(untranslatedLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.untranslatedLabel.text")); // NOI18N @@ -190,24 +181,15 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addComponent(authenticationKeyField, javax.swing.GroupLayout.PREFERRED_SIZE, 486, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 20, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(translationSizeLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(testButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(testButton, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(25, 25, 25) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(translationSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(unitsLabel) - .addGap(0, 0, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addComponent(untranslatedLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(resultLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(testResultValueLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))) + .addComponent(untranslatedLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(resultLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(testResultValueLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()))) ); layout.setVerticalGroup( @@ -222,11 +204,6 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { .addComponent(targetLanguageLabel) .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(translationSizeLabel) - .addComponent(translationSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(unitsLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(testButton) .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -264,9 +241,6 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { private javax.swing.JButton testButton; private javax.swing.JLabel testResultValueLabel; private javax.swing.JTextField testUntranslatedTextField; - private javax.swing.JLabel translationSizeLabel; - private javax.swing.JSpinner translationSizeSpinner; - private javax.swing.JLabel unitsLabel; private javax.swing.JLabel untranslatedLabel; private javax.swing.JLabel warningLabel; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index 6ebd3002ef..0021118e14 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -6,9 +6,7 @@ BingTranslatorSettingsPanel.testButton.text=Test BingTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.resultLabel.text=Result: BingTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: -BingTranslatorSettingsPanel.translationSizeLabel.text=Translation Size: BingTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: -BingTranslatorSettingsPanel.unitsLabel.text=characters BingTranslatorSettingsPanel.authenticationKeyField.toolTipText=Enter the hash for the GoogleTranslatorSettingsPanel.testButton.text=Test GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form index 7d728fd011..b55a40b30f 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form @@ -145,6 +145,7 @@ + @@ -152,6 +153,7 @@ + @@ -159,6 +161,7 @@ + @@ -166,6 +169,7 @@ + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java index 8bccc01485..0041860182 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java @@ -130,21 +130,31 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { }); selectLanguageByCode(targetLanguageCode); targetLanguageComboBox.addItemListener(listener); - targetLanguageComboBox.setEnabled(true); + enableControls(true); + } else { - targetLanguageComboBox.setEnabled(false); + enableControls(false); } } else { warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_noFileSelected()); - targetLanguageComboBox.setEnabled(false); + enableControls(false); } } catch (Throwable throwable) { warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_unknownFailurePopulating()); logger.log(Level.WARNING, "Throwable caught while populating list of supported languages", throwable); - targetLanguageComboBox.setEnabled(false); + enableControls(false); } } + private void enableControls(boolean enabled) { + targetLanguageComboBox.setEnabled(enabled); + testButton.setEnabled(enabled); + testResultValueLabel.setEnabled(enabled); + testUntranslatedTextField.setEnabled(enabled); + untranslatedLabel.setEnabled(enabled); + resultLabel.setEnabled(enabled); + } + /** * Given a language code select the corresponding language in the combo box * if it is present @@ -202,12 +212,16 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(testResultValueLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.testResultValueLabel.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(resultLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.resultLabel.text")); // NOI18N + resultLabel.setEnabled(false); org.openide.awt.Mnemonics.setLocalizedText(untranslatedLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.untranslatedLabel.text")); // NOI18N + untranslatedLabel.setEnabled(false); testUntranslatedTextField.setText(DEFUALT_TEST_STRING); + testUntranslatedTextField.setEnabled(false); org.openide.awt.Mnemonics.setLocalizedText(testButton, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.testButton.text")); // NOI18N + testButton.setEnabled(false); testButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { testButtonActionPerformed(evt); From 852ad67e05f59a3e2860210136e464de054006e7 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 5 Jun 2019 12:16:16 -0400 Subject: [PATCH 28/32] 5061 fix initial selection of english --- .../BingTranslatorSettingsPanel.form | 1 + .../BingTranslatorSettingsPanel.java | 15 ++++++--- .../translators/Bundle.properties-MERGED | 5 +-- .../translators/GoogleTranslator.java | 31 +++++++++++-------- .../GoogleTranslatorSettingsPanel.java | 24 +++++++------- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index 54dfaa4827..cd855ac419 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -124,6 +124,7 @@ + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index 5a73bca0fa..c6d4c9b932 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -33,6 +33,7 @@ import java.util.logging.Logger; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.apache.commons.lang3.StringUtils; +import org.openide.util.NbBundle.Messages; /** * Settings panel for the GoogleTranslator @@ -68,11 +69,12 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { } }); - targetLanguageCode = code; populateComboBox(); - selectLanguageByCode(targetLanguageCode); + selectLanguageByCode(code); + targetLanguageCode = code; } + @Messages({"BingTranslatorSettingsPanel.warning.targetLanguageFailure=Unable to get list of target languages or parse the result that was received"}) private void populateComboBox() { Request get_request = new Request.Builder() .url(GET_TARGET_LANGUAGES_URL).build(); @@ -87,8 +89,11 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { responses.entrySet().forEach((entry) -> { targetLanguageComboBox.addItem(new LanguageWrapper(entry.getKey(), entry.getValue().getAsJsonObject().get("name").getAsString())); }); + targetLanguageComboBox.setEnabled(true); } catch (IOException | IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException ex) { - logger.log(Level.WARNING, "Unable to get list of target languages or parse the result that was received", ex); + logger.log(Level.SEVERE, Bundle.BingTranslatorSettingsPanel_warning_targetLanguageFailure(), ex); + warningLabel.setText(Bundle.BingTranslatorSettingsPanel_warning_targetLanguageFailure()); + targetLanguageComboBox.setEnabled(false); } } @@ -142,6 +147,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(targetLanguageLabel, org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.targetLanguageLabel.text")); // NOI18N + targetLanguageComboBox.setEnabled(false); targetLanguageComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { targetLanguageComboBoxSelected(evt); @@ -216,11 +222,12 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents + @Messages({"BingTranslatorSettingsPanel.warning.invalidKey=Invalid translation authentication key"}) private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testButtonActionPerformed if (testTranslationSetup()) { warningLabel.setText(""); } else { - warningLabel.setText("Invalid translation authentication key"); + warningLabel.setText(Bundle.BingTranslatorSettingsPanel_warning_invalidKey()); } }//GEN-LAST:event_testButtonActionPerformed diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index 35e06bda99..51cbb9a26f 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -1,9 +1,12 @@ BingTranslator.name.text=Bing Translator +BingTranslatorSettingsPanel.warning.invalidKey=Invalid translation authentication key +BingTranslatorSettingsPanel.warning.targetLanguageFailure=Unable to get list of target languages or parse the result that was received GoogleTranslator.name.text=Google Translate GoogleTranslatorSettingsPanel.browseButton.text=Browse GoogleTranslatorSettingsPanel.credentialsLabel.text=Credentials Path: GoogleTranslatorSettingsPanel.errorMessage.fileNotFound=Credentials file not found, please set the location to be a valid JSON credentials file. GoogleTranslatorSettingsPanel.errorMessage.noFileSelected=A JSON file must be selected to provide your credentials for Google Translate. +GoogleTranslatorSettingsPanel.errorMessage.translationFailure=Translation failure with specified credentials GoogleTranslatorSettingsPanel.errorMessage.unableToMakeCredentials=Unable to construct credentials object from credentials file, please set the location to be a valid JSON credentials file. GoogleTranslatorSettingsPanel.errorMessage.unableToReadCredentials=Unable to read credentials from credentials file, please set the location to be a valid JSON credentials file. GoogleTranslatorSettingsPanel.errorMessage.unknownFailureGetting=Failure getting list of supported languages with current credentials file. @@ -16,9 +19,7 @@ BingTranslatorSettingsPanel.testButton.text=Test BingTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.resultLabel.text=Result: BingTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: -BingTranslatorSettingsPanel.translationSizeLabel.text=Translation Size: BingTranslatorSettingsPanel.targetLanguageLabel.text=Target Language: -BingTranslatorSettingsPanel.unitsLabel.text=characters BingTranslatorSettingsPanel.authenticationKeyField.toolTipText=Enter the hash for the GoogleTranslatorSettingsPanel.testButton.text=Test GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java index d55316b86c..3bb6a6c9ed 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java @@ -32,6 +32,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; +import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; import org.sleuthkit.autopsy.coreutils.EscapeUtil; @@ -59,26 +60,26 @@ public final class GoogleTranslator implements TextTranslator { settingsPanel = new GoogleTranslatorSettingsPanel(settings.getCredentialPath(), settings.getTargetLanguageCode()); loadTranslator(); } - + private static boolean googleIsReachable() { String host = "www.google.com"; InetAddress address; try { address = InetAddress.getByName(host); return address.isReachable(1500); - }catch (UnknownHostException ex) { + } catch (UnknownHostException ex) { return false; } catch (IOException ex) { return false; } } - + @Override public String translate(String string) throws TranslationException { if (!googleIsReachable()) { throw new TranslationException("Failure translating using GoogleTranslator: Cannot connect to Google"); } - + if (googleTranslate != null) { try { // Translates some text into English, without specifying the source language. @@ -89,7 +90,7 @@ public final class GoogleTranslator implements TextTranslator { // We can't currently set parameters, so we are using the default behavior of // assuming the input is HTML. We need to replace newlines with
for Google to preserve them substring = substring.replaceAll("(\r\n|\n)", "
"); - + // The API complains if the "Payload" is over 204800 bytes. I'm assuming that // deals with the full request. At some point, we get different errors about too // much text. Officially, Google says they will googleTranslate only 5k chars, @@ -101,15 +102,15 @@ public final class GoogleTranslator implements TextTranslator { Translation translation = googleTranslate.translate(substring); String translatedString = translation.getTranslatedText(); - + // put back the newlines translatedString = translatedString.replaceAll("
", "\n"); - + // With our current settings, Google Translate outputs HTML // so we need to undo the escape characters. translatedString = EscapeUtil.unEscapeHtml(translatedString); return translatedString; - } catch (Throwable ex) { + } catch (Throwable ex) { //Catching throwables because some of this Google Translate code throws throwables throw new TranslationException("Failure translating using GoogleTranslator", ex); } @@ -117,7 +118,7 @@ public final class GoogleTranslator implements TextTranslator { throw new TranslationException("Google Translator has not been configured, credentials need to be specified"); } } - + @Messages({"GoogleTranslator.name.text=Google Translate"}) @Override public String getName() { @@ -136,10 +137,14 @@ public final class GoogleTranslator implements TextTranslator { private void loadTranslator() { InputStream credentialStream = null; Credentials creds = null; - try { - credentialStream = new FileInputStream(settings.getCredentialPath()); - } catch (FileNotFoundException ex) { - logger.log(Level.WARNING, "JSON file for GoogleTranslator credentials not found", ex); + if (StringUtils.isBlank(settings.getCredentialPath())) { + logger.log(Level.INFO, "No credentials file has been provided for Google Translator"); + } else { + try { + credentialStream = new FileInputStream(settings.getCredentialPath()); + } catch (FileNotFoundException ex) { + logger.log(Level.WARNING, "JSON file for GoogleTranslator credentials not found", ex); + } } if (credentialStream != null) { try { diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java index 0041860182..4032d69a05 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java @@ -305,18 +305,20 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { } }//GEN-LAST:event_browseButtonActionPerformed + @Messages({"GoogleTranslatorSettingsPanel.errorMessage.translationFailure=Translation failure with specified credentials"}) private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testButtonActionPerformed - testResultValueLabel.setText(""); - Translate tempTranslate = getTemporaryTranslationService(); - if (tempTranslate != null) { - try { - Translation translation = tempTranslate.translate(testUntranslatedTextField.getText()); - testResultValueLabel.setText(translation.getTranslatedText()); - warningLabel.setText(""); - } catch (Exception ex) { - warningLabel.setText("Invalid translation credentials path"); - } - } + testResultValueLabel.setText(""); + Translate tempTranslate = getTemporaryTranslationService(); + if (tempTranslate != null) { + try { + Translation translation = tempTranslate.translate(testUntranslatedTextField.getText()); + testResultValueLabel.setText(translation.getTranslatedText()); + warningLabel.setText(""); + } catch (Exception ex) { + warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_translationFailure()); + logger.log(Level.WARNING, Bundle.GoogleTranslatorSettingsPanel_errorMessage_translationFailure(), ex); + } + } }//GEN-LAST:event_testButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables From 3d319be5b8af8f35cb48868e27399c7ab662af37 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 5 Jun 2019 12:27:53 -0400 Subject: [PATCH 29/32] 5061 adjust comments for clarity and completeness --- .../translators/BingTranslator.java | 28 ++++++++++++++--- .../BingTranslatorSettingsPanel.java | 3 ++ .../translators/GoogleTranslator.java | 7 ++++- .../GoogleTranslatorSettingsPanel.java | 30 +++++++++++-------- 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java index 78f1cf9afd..775cdf3588 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -40,22 +40,32 @@ import org.sleuthkit.autopsy.texttranslation.TranslationException; @ServiceProvider(service = TextTranslator.class) public class BingTranslator implements TextTranslator { - //In the String below, "en" is the target language. You can include multiple target + //The target language follows the to= in the string below. You can include multiple target //languages separated by commas. A full list of supported languages is here: //https://docs.microsoft.com/en-us/azure/cognitive-services/translator/language-support private static final String BASE_URL = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to="; + private static final int MAX_STRING_LENGTH = 5000; private final BingTranslatorSettingsPanel settingsPanel; private final BingTranslatorSettings settings = new BingTranslatorSettings(); // This sends messages to Microsoft. private final OkHttpClient CLIENT = new OkHttpClient(); - //We might want to make this a configurable setting for anyone who has a - //paid account that's willing to pay for long documents. - private final int MAX_STRING_LENGTH = 5000; + /** + * Create a Bing Translator + */ public BingTranslator() { settingsPanel = new BingTranslatorSettingsPanel(settings.getAuthenticationKey(), settings.getTargetLanguageCode()); } + /** + * Get the tranlationurl for the specified language code + * + * + * + * @param languageCode language code for language to translate to + * + * @return a string representation of the url to request translation from + */ static String getTranlatorUrl(String languageCode) { return BASE_URL + languageCode; } @@ -134,6 +144,16 @@ public class BingTranslator implements TextTranslator { settings.saveSettings(); } + /** + * Parse the response to get the translated text + * + * @param json_text the json which was received as a response to a + * translation request + * + * @return the translated text + * + * @throws TranslationException + */ private String parseJSONResponse(String json_text) throws TranslationException { /* * Here is an example of the text we get from Bing when input is "gato", diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index c6d4c9b932..cb115354e2 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -74,6 +74,9 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { targetLanguageCode = code; } + /** + * Populate the target language combo box with available target languages + */ @Messages({"BingTranslatorSettingsPanel.warning.targetLanguageFailure=Unable to get list of target languages or parse the result that was received"}) private void populateComboBox() { Request get_request = new Request.Builder() diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java index 3bb6a6c9ed..de61222072 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java @@ -61,6 +61,11 @@ public final class GoogleTranslator implements TextTranslator { loadTranslator(); } + /** + * Check if google is able to be reached + * + * @return true if it can be, false otherwise + */ private static boolean googleIsReachable() { String host = "www.google.com"; InetAddress address; @@ -138,7 +143,7 @@ public final class GoogleTranslator implements TextTranslator { InputStream credentialStream = null; Credentials creds = null; if (StringUtils.isBlank(settings.getCredentialPath())) { - logger.log(Level.INFO, "No credentials file has been provided for Google Translator"); + logger.log(Level.INFO, "No credentials file has been provided for Google Translator"); } else { try { credentialStream = new FileInputStream(settings.getCredentialPath()); diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java index 4032d69a05..84fad9e8e1 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java @@ -146,6 +146,12 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { } } + /** + * Helper method to enable/disable all controls which are dependent on valid + * credentials having been provided + * + * @param enabled true to enable the controls, false to disable them + */ private void enableControls(boolean enabled) { targetLanguageComboBox.setEnabled(enabled); testButton.setEnabled(enabled); @@ -307,18 +313,18 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { @Messages({"GoogleTranslatorSettingsPanel.errorMessage.translationFailure=Translation failure with specified credentials"}) private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testButtonActionPerformed - testResultValueLabel.setText(""); - Translate tempTranslate = getTemporaryTranslationService(); - if (tempTranslate != null) { - try { - Translation translation = tempTranslate.translate(testUntranslatedTextField.getText()); - testResultValueLabel.setText(translation.getTranslatedText()); - warningLabel.setText(""); - } catch (Exception ex) { - warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_translationFailure()); - logger.log(Level.WARNING, Bundle.GoogleTranslatorSettingsPanel_errorMessage_translationFailure(), ex); - } - } + testResultValueLabel.setText(""); + Translate tempTranslate = getTemporaryTranslationService(); + if (tempTranslate != null) { + try { + Translation translation = tempTranslate.translate(testUntranslatedTextField.getText()); + testResultValueLabel.setText(translation.getTranslatedText()); + warningLabel.setText(""); + } catch (Exception ex) { + warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_translationFailure()); + logger.log(Level.WARNING, Bundle.GoogleTranslatorSettingsPanel_errorMessage_translationFailure(), ex); + } + } }//GEN-LAST:event_testButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables From 938d0826d7e08b68d32e8f8a7a00520e4997b6ce Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 5 Jun 2019 12:56:49 -0400 Subject: [PATCH 30/32] 5061 address easy to fix codacy issues --- .../translators/BingTranslator.java | 7 +++---- .../translators/BingTranslatorTest.java | 14 +++++++------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java index 775cdf3588..4c2526ab9b 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -121,8 +121,8 @@ public class BingTranslator implements TextTranslator { try { String response = postTranslationRequest(toTranslate); return parseJSONResponse(response); - } catch (Throwable e) { - throw new TranslationException(e.getMessage()); + } catch (IOException | TranslationException ex) { + throw new TranslationException("Exception while attempting to translate using BingTranslator", ex); } } @@ -167,8 +167,7 @@ public class BingTranslator implements TextTranslator { JsonObject response0 = responses.get(0).getAsJsonObject(); JsonArray translations = response0.getAsJsonArray("translations"); JsonObject translation0 = translations.get(0).getAsJsonObject(); - String text = translation0.get("text").getAsString(); - return text; + return translation0.get("text").getAsString(); } catch (IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException e) { throw new TranslationException("JSON text does not match Bing Translator scheme: " + e); } diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java b/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java index 48c29543d3..25c78ba049 100644 --- a/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java +++ b/Core/test/unit/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorTest.java @@ -18,13 +18,13 @@ */ package org.sleuthkit.autopsy.texttranslation.translators; -import java.io.IOException; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; +//import java.io.IOException; +//import org.junit.After; +//import org.junit.AfterClass; +//import org.junit.Before; +//import org.junit.BeforeClass; import org.junit.Test; -import static org.junit.Assert.*; +//import static org.junit.Assert.*; /** * Tests for the BingTranslator translation service, these tests have been @@ -33,7 +33,7 @@ import static org.junit.Assert.*; public class BingTranslatorTest { @Test - public void testTranslate() throws Exception { + public void testTranslate() { // BingTranslator translator = new BingTranslator(); // String input = "gato"; // String expectedTranslation = "cat"; From 65bf9cc4970a9323f5a822496e970c57c432797d Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 6 Jun 2019 12:52:09 -0400 Subject: [PATCH 31/32] 5061 log unlogged exceptions, fix copy paste and typo comment errors --- .../translators/BingTranslator.java | 2 +- .../translators/BingTranslatorSettings.java | 4 ++-- .../translators/BingTranslatorSettingsPanel.java | 16 +++++++--------- .../translators/GoogleTranslator.java | 2 ++ 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java index 4c2526ab9b..2b234f71d3 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslator.java @@ -71,7 +71,7 @@ public class BingTranslator implements TextTranslator { } /** - * Converts an input test to the JSON format required by Bing Translator, + * Converts an input text to the JSON format required by Bing Translator, * posts it to Microsoft, and returns the JSON text response. * * @param string The input text to be translated. diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java index dcd54fd6f9..d00ed61f77 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettings.java @@ -22,7 +22,7 @@ import org.apache.commons.lang3.StringUtils; import org.sleuthkit.autopsy.coreutils.ModuleSettings; /** - * Class to handle the settings associated with the GoogleTranslator + * Class to handle the settings associated with the BingTranslator */ public final class BingTranslatorSettings { @@ -35,7 +35,7 @@ public final class BingTranslatorSettings { private String targetLanguageCode; /** - * Construct a new GoogleTranslatorSettingsObject + * Construct a new BingTranslatorSettings object */ BingTranslatorSettings() { loadSettings(); diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index cb115354e2..9df244d034 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -36,7 +36,7 @@ import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle.Messages; /** - * Settings panel for the GoogleTranslator + * Settings panel for the BingTranslator */ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { @@ -47,7 +47,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { private String targetLanguageCode = ""; /** - * Creates new form GoogleTranslatorSettingsPanel + * Creates new form BingTranslatorSettingsPanel */ public BingTranslatorSettingsPanel(String authenticationKey, String code) { initComponents(); @@ -254,16 +254,13 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { private javax.swing.JLabel untranslatedLabel; private javax.swing.JLabel warningLabel; // End of variables declaration//GEN-END:variables + /** - * Converts an input test to the JSON format required by Bing Translator, - * posts it to Microsoft, and returns the JSON text response. + * Attempts to translate the text specified in the Untranslated field using + * the settings currently specified but not necessarily saved * - * @param string The input text to be translated. + * @return true if the translation was able to be performed, false otherwise * - * @return The translation response as a JSON string - * - * @throws IOException if the request could not be executed due to - * cancellation, a connectivity problem or timeout. */ private boolean testTranslationSetup() { testResultValueLabel.setText(""); @@ -291,6 +288,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { testResultValueLabel.setText(translation0.get("text").getAsString()); return true; } catch (IOException | IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException e) { + logger.log(Level.WARNING, "Test of Bing Translator failed due to exception", ex); return false; } } diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java index de61222072..46bdd6da67 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslator.java @@ -73,8 +73,10 @@ public final class GoogleTranslator implements TextTranslator { address = InetAddress.getByName(host); return address.isReachable(1500); } catch (UnknownHostException ex) { + logger.log(Level.WARNING, "Unable to reach google.com due to unknown host", ex); return false; } catch (IOException ex) { + logger.log(Level.WARNING, "Unable to reach google.com due IOException", ex); return false; } } From 3610495657754e2850886dd19a09d673f5aeef0f Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 6 Jun 2019 12:54:50 -0400 Subject: [PATCH 32/32] 5061 fix typo in exception variable name --- .../translators/BingTranslatorSettingsPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index 9df244d034..1be932873c 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -288,7 +288,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { testResultValueLabel.setText(translation0.get("text").getAsString()); return true; } catch (IOException | IllegalStateException | ClassCastException | NullPointerException | IndexOutOfBoundsException e) { - logger.log(Level.WARNING, "Test of Bing Translator failed due to exception", ex); + logger.log(Level.WARNING, "Test of Bing Translator failed due to exception", e); return false; } }