Autopsy  4.14.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
GoogleTranslatorSettingsPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy
3  *
4  * Copyright 2019 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.texttranslation.translators;
20 
21 import com.google.auth.Credentials;
22 import com.google.auth.oauth2.ServiceAccountCredentials;
23 import com.google.cloud.translate.Language;
24 import com.google.cloud.translate.Translate;
25 import com.google.cloud.translate.TranslateOptions;
26 import com.google.cloud.translate.Translation;
27 import java.awt.event.ItemListener;
28 import java.io.File;
29 import java.io.FileInputStream;
30 import java.io.FileNotFoundException;
31 import java.io.IOException;
32 import java.io.InputStream;
33 import java.util.ArrayList;
34 import java.util.List;
35 import java.util.logging.Level;
37 import javax.swing.JFileChooser;
38 import javax.swing.filechooser.FileNameExtensionFilter;
39 import org.apache.commons.lang3.StringUtils;
40 import org.openide.util.NbBundle.Messages;
41 
45 public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
46 
47  private static final Logger logger = Logger.getLogger(GoogleTranslatorSettingsPanel.class.getName());
48  private static final String JSON_EXTENSION = "json";
49  private static final String DEFUALT_TEST_STRING = "traducción exitoso"; //spanish which should translate to something along the lines of "successful translation"
50  private static final long serialVersionUID = 1L;
51  private final ItemListener listener = new ComboBoxSelectionListener();
52  private String targetLanguageCode = "";
53 
57  public GoogleTranslatorSettingsPanel(String credentialsPath, String languageCode) {
59  targetLanguageCode = languageCode;
60  credentialsPathField.setText(credentialsPath);
62  }
63 
70  @Messages({"GoogleTranslatorSettingsPanel.errorMessage.fileNotFound=Credentials file not found, please set the location to be a valid JSON credentials file.",
71  "GoogleTranslatorSettingsPanel.errorMessage.unableToReadCredentials=Unable to read credentials from credentials file, please set the location to be a valid JSON credentials file.",
72  "GoogleTranslatorSettingsPanel.errorMessage.unableToMakeCredentials=Unable to construct credentials object from credentials file, please set the location to be a valid JSON credentials file.",
73  "GoogleTranslatorSettingsPanel.errorMessage.unknownFailureGetting=Failure getting list of supported languages with current credentials file.",})
74  private Translate getTemporaryTranslationService() {
75  //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
76  try {
77  InputStream credentialStream;
78  try {
79  credentialStream = new FileInputStream(credentialsPathField.getText());
80  } catch (FileNotFoundException ignored) {
81  warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_fileNotFound());
82  return null;
83  }
84  Credentials creds;
85  try {
86  creds = ServiceAccountCredentials.fromStream(credentialStream);
87  } catch (IOException ignored) {
88  warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_unableToMakeCredentials());
89  return null;
90  }
91  if (creds == null) {
92  warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_unableToReadCredentials());
93  logger.log(Level.WARNING, "Credentials were not successfully made, no translations will be available from the GoogleTranslator");
94  return null;
95  } else {
96  TranslateOptions.Builder builder = TranslateOptions.newBuilder();
97  builder.setCredentials(creds);
98  builder.setTargetLanguage(targetLanguageCode); //localize the list to the currently selected target language
99  warningLabel.setText(""); //clear any previous warning text
100  return builder.build().getService();
101  }
102  } catch (Throwable throwable) {
103  //Catching throwables because some of this Google Translate code throws throwables
104  warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_unknownFailureGetting());
105  logger.log(Level.WARNING, "Throwable caught while getting list of supported languages", throwable);
106  return null;
107  }
108  }
109 
113  @Messages({"GoogleTranslatorSettingsPanel.errorMessage.noFileSelected=A JSON file must be selected to provide your credentials for Google Translate.",
114  "GoogleTranslatorSettingsPanel.errorMessage.unknownFailurePopulating=Failure populating list of supported languages with current credentials file."})
116  targetLanguageComboBox.removeItemListener(listener);
117  try {
118  if (!StringUtils.isBlank(credentialsPathField.getText())) {
119  List<Language> listSupportedLanguages;
120  Translate tempService = getTemporaryTranslationService();
121  if (tempService != null) {
122  listSupportedLanguages = tempService.listSupportedLanguages();
123  } else {
124  listSupportedLanguages = new ArrayList<>();
125  }
126  targetLanguageComboBox.removeAllItems();
127  if (!listSupportedLanguages.isEmpty()) {
128  listSupportedLanguages.forEach((lang) -> {
129  targetLanguageComboBox.addItem(new LanguageWrapper(lang));
130  });
131  selectLanguageByCode(targetLanguageCode);
132  targetLanguageComboBox.addItemListener(listener);
133  enableControls(true);
134 
135  } else {
136  enableControls(false);
137  }
138  } else {
139  warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_noFileSelected());
140  enableControls(false);
141  }
142  } catch (Throwable throwable) {
143  warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_unknownFailurePopulating());
144  logger.log(Level.WARNING, "Throwable caught while populating list of supported languages", throwable);
145  enableControls(false);
146  }
147  }
148 
155  private void enableControls(boolean enabled) {
156  targetLanguageComboBox.setEnabled(enabled);
157  testButton.setEnabled(enabled);
158  testResultValueLabel.setEnabled(enabled);
159  testUntranslatedTextField.setEnabled(enabled);
160  untranslatedLabel.setEnabled(enabled);
161  resultLabel.setEnabled(enabled);
162  }
163 
170  private void selectLanguageByCode(String code) {
171  for (int i = 0; i < targetLanguageComboBox.getModel().getSize(); i++) {
172  if (targetLanguageComboBox.getItemAt(i).getLanguageCode().equals(code)) {
173  targetLanguageComboBox.setSelectedIndex(i);
174  return;
175  }
176  }
177  }
178 
184  @SuppressWarnings("unchecked")
185  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
186  private void initComponents() {
187 
188  credentialsLabel = new javax.swing.JLabel();
189  credentialsPathField = new javax.swing.JTextField();
190  browseButton = new javax.swing.JButton();
191  targetLanguageComboBox = new javax.swing.JComboBox<>();
192  targetLanguageLabel = new javax.swing.JLabel();
193  warningLabel = new javax.swing.JLabel();
194  testResultValueLabel = new javax.swing.JLabel();
195  resultLabel = new javax.swing.JLabel();
196  untranslatedLabel = new javax.swing.JLabel();
197  testUntranslatedTextField = new javax.swing.JTextField();
198  testButton = new javax.swing.JButton();
199  instructionsScrollPane = new javax.swing.JScrollPane();
200  instructionsTextArea = new javax.swing.JTextArea();
201 
202  org.openide.awt.Mnemonics.setLocalizedText(credentialsLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.credentialsLabel.text")); // NOI18N
203 
204  credentialsPathField.setEditable(false);
205  credentialsPathField.addActionListener(new java.awt.event.ActionListener() {
206  public void actionPerformed(java.awt.event.ActionEvent evt) {
208  }
209  });
210 
211  org.openide.awt.Mnemonics.setLocalizedText(browseButton, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.browseButton.text")); // NOI18N
212  browseButton.addActionListener(new java.awt.event.ActionListener() {
213  public void actionPerformed(java.awt.event.ActionEvent evt) {
215  }
216  });
217 
218  targetLanguageComboBox.setEnabled(false);
219 
220  org.openide.awt.Mnemonics.setLocalizedText(targetLanguageLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.targetLanguageLabel.text")); // NOI18N
221 
222  warningLabel.setForeground(new java.awt.Color(255, 0, 0));
223  org.openide.awt.Mnemonics.setLocalizedText(warningLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.warningLabel.text")); // NOI18N
224 
225  org.openide.awt.Mnemonics.setLocalizedText(testResultValueLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.testResultValueLabel.text")); // NOI18N
226 
227  org.openide.awt.Mnemonics.setLocalizedText(resultLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.resultLabel.text")); // NOI18N
228  resultLabel.setEnabled(false);
229 
230  org.openide.awt.Mnemonics.setLocalizedText(untranslatedLabel, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.untranslatedLabel.text")); // NOI18N
231  untranslatedLabel.setEnabled(false);
232 
233  testUntranslatedTextField.setText(DEFUALT_TEST_STRING);
234  testUntranslatedTextField.setEnabled(false);
235 
236  org.openide.awt.Mnemonics.setLocalizedText(testButton, org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.testButton.text")); // NOI18N
237  testButton.setEnabled(false);
238  testButton.addActionListener(new java.awt.event.ActionListener() {
239  public void actionPerformed(java.awt.event.ActionEvent evt) {
241  }
242  });
243 
244  instructionsScrollPane.setBorder(javax.swing.BorderFactory.createEtchedBorder());
245  instructionsScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
246 
247  instructionsTextArea.setEditable(false);
248  instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240));
249  instructionsTextArea.setColumns(20);
250  instructionsTextArea.setLineWrap(true);
251  instructionsTextArea.setRows(2);
252  instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N
253  instructionsTextArea.setWrapStyleWord(true);
255 
256  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
257  this.setLayout(layout);
258  layout.setHorizontalGroup(
259  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
260  .addGroup(layout.createSequentialGroup()
261  .addContainerGap()
262  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
263  .addGroup(layout.createSequentialGroup()
264  .addComponent(instructionsScrollPane)
265  .addContainerGap())
266  .addGroup(layout.createSequentialGroup()
267  .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 551, javax.swing.GroupLayout.PREFERRED_SIZE)
268  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
269  .addGroup(layout.createSequentialGroup()
270  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
271  .addComponent(testButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
272  .addComponent(credentialsLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
273  .addComponent(targetLanguageLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
274  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
275  .addGroup(layout.createSequentialGroup()
276  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
277  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
278  .addGroup(layout.createSequentialGroup()
279  .addComponent(credentialsPathField)
280  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
281  .addComponent(browseButton)
282  .addGap(14, 14, 14))
283  .addGroup(layout.createSequentialGroup()
284  .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 317, javax.swing.GroupLayout.PREFERRED_SIZE)
285  .addGap(0, 0, Short.MAX_VALUE))))
286  .addGroup(layout.createSequentialGroup()
287  .addGap(7, 7, 7)
288  .addComponent(untranslatedLabel)
289  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
290  .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
291  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
292  .addComponent(resultLabel)
293  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
294  .addComponent(testResultValueLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))))
295  );
296  layout.setVerticalGroup(
297  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
298  .addGroup(layout.createSequentialGroup()
299  .addContainerGap()
300  .addComponent(instructionsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
301  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
302  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
303  .addComponent(credentialsLabel)
304  .addComponent(credentialsPathField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
305  .addComponent(browseButton))
306  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
307  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
308  .addComponent(targetLanguageLabel)
309  .addComponent(targetLanguageComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
310  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
311  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
312  .addComponent(testButton)
313  .addComponent(testUntranslatedTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
314  .addComponent(untranslatedLabel)
315  .addComponent(resultLabel)
316  .addComponent(testResultValueLabel))
317  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
318  .addComponent(warningLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
319  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
320  );
321  }// </editor-fold>//GEN-END:initComponents
322 
323  @Messages({"GoogleTranslatorSettingsPanel.json.description=JSON Files",
324  "GoogleTranslatorSettingsPanel.fileChooser.confirmButton=Select"})
325  private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
326  JFileChooser fileChooser = new JFileChooser();
327  fileChooser.setDragEnabled(false);
328  //if they previously had a path set, start navigation there
329  if (!StringUtils.isBlank(credentialsPathField.getText())) {
330  fileChooser.setCurrentDirectory(new File(credentialsPathField.getText()).getParentFile());
331  }
332  fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
333  fileChooser.setMultiSelectionEnabled(false);
334  fileChooser.setFileFilter(new FileNameExtensionFilter(Bundle.GoogleTranslatorSettingsPanel_json_description(), JSON_EXTENSION));
335  int dialogResult = fileChooser.showDialog(this, Bundle.GoogleTranslatorSettingsPanel_fileChooser_confirmButton());
336  if (dialogResult == JFileChooser.APPROVE_OPTION) {
337  credentialsPathField.setText(fileChooser.getSelectedFile().getPath());
339  testResultValueLabel.setText("");
340  firePropertyChange("SettingChanged", true, false);
341  }
342  }//GEN-LAST:event_browseButtonActionPerformed
343 
344  @Messages({"GoogleTranslatorSettingsPanel.errorMessage.translationFailure=Translation failure with specified credentials"})
345  private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testButtonActionPerformed
346  testResultValueLabel.setText("");
347  Translate tempTranslate = getTemporaryTranslationService();
348  if (tempTranslate != null) {
349  try {
350  Translation translation = tempTranslate.translate(testUntranslatedTextField.getText());
351  testResultValueLabel.setText(translation.getTranslatedText());
352  warningLabel.setText("");
353  } catch (Exception ex) {
354  warningLabel.setText(Bundle.GoogleTranslatorSettingsPanel_errorMessage_translationFailure());
355  logger.log(Level.WARNING, Bundle.GoogleTranslatorSettingsPanel_errorMessage_translationFailure(), ex);
356  }
357  }
358  }//GEN-LAST:event_testButtonActionPerformed
359 
360  private void credentialsPathFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_credentialsPathFieldActionPerformed
361  // TODO add your handling code here:
362  }//GEN-LAST:event_credentialsPathFieldActionPerformed
363 
364  // Variables declaration - do not modify//GEN-BEGIN:variables
365  private javax.swing.JButton browseButton;
366  private javax.swing.JLabel credentialsLabel;
367  private javax.swing.JTextField credentialsPathField;
368  private javax.swing.JScrollPane instructionsScrollPane;
369  private javax.swing.JTextArea instructionsTextArea;
370  private javax.swing.JLabel resultLabel;
372  private javax.swing.JLabel targetLanguageLabel;
373  private javax.swing.JButton testButton;
374  private javax.swing.JLabel testResultValueLabel;
375  private javax.swing.JTextField testUntranslatedTextField;
376  private javax.swing.JLabel untranslatedLabel;
377  private javax.swing.JLabel warningLabel;
378  // End of variables declaration//GEN-END:variables
379 
385  String getTargetLanguageCode() {
386  return targetLanguageCode;
387  }
388 
394  String getCredentialsPath() {
395  return credentialsPathField.getText();
396  }
397 
402  private class ComboBoxSelectionListener implements ItemListener {
403 
404  @Override
405  public void itemStateChanged(java.awt.event.ItemEvent evt) {
406  String selectedCode = ((LanguageWrapper) targetLanguageComboBox.getSelectedItem()).getLanguageCode();
407  if (!StringUtils.isBlank(selectedCode) && !selectedCode.equals(targetLanguageCode)) {
408  targetLanguageCode = selectedCode;
410  testResultValueLabel.setText("");
411  firePropertyChange("SettingChanged", true, false);
412  }
413  }
414  }
415 }
javax.swing.JComboBox< org.sleuthkit.autopsy.texttranslation.translators.LanguageWrapper > targetLanguageComboBox
synchronized static Logger getLogger(String name)
Definition: Logger.java:124

Copyright © 2012-2020 Basis Technology. Generated on: Wed Apr 8 2020
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.