Autopsy  4.14.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
GetTagNameDialog.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2018 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.actions;
20 
21 import java.awt.Window;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.KeyEvent;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.TreeMap;
28 import java.util.logging.Level;
29 import javax.swing.AbstractAction;
30 import javax.swing.ActionMap;
31 import javax.swing.InputMap;
32 import javax.swing.JComponent;
33 import javax.swing.JDialog;
34 import javax.swing.JOptionPane;
35 import javax.swing.KeyStroke;
36 import javax.swing.table.AbstractTableModel;
37 import org.openide.util.ImageUtilities;
38 import org.openide.util.NbBundle;
39 import org.openide.util.NbBundle.Messages;
40 import org.openide.windows.WindowManager;
45 import org.sleuthkit.datamodel.TagName;
46 import org.sleuthkit.datamodel.TskCoreException;
47 import org.sleuthkit.datamodel.TskData;
48 
52 @Messages({"GetTagNameDialog.descriptionLabel.text=Description:",
53  "GetTagNameDialog.notableCheckbox.text=Tag indicates item is notable."})
54 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
55 public class GetTagNameDialog extends JDialog {
56 
57  private static final long serialVersionUID = 1L;
58  private static final String TAG_ICON_PATH = "org/sleuthkit/autopsy/images/tag-folder-blue-icon-16.png"; //NON-NLS
59  private final Map<String, TagName> tagNamesMap = new TreeMap<>();
60  private TagName tagName = null;
61 
70  public static TagName doDialog() {
71  return doDialog(WindowManager.getDefault().getMainWindow());
72  }
73 
84  public static TagName doDialog(Window owner) {
85  GetTagNameDialog dialog = new GetTagNameDialog(owner);
86  dialog.display();
87  return dialog.tagName;
88  }
89 
90  private GetTagNameDialog(Window owner) {
91  super(owner,
92  NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.createTag"),
93  ModalityType.APPLICATION_MODAL);
94  }
95 
96  private void display() {
97  setIconImage(ImageUtilities.loadImage(TAG_ICON_PATH));
98  initComponents();
99 
100  // Set up the dialog to close when Esc is pressed.
101  String cancelName = NbBundle.getMessage(this.getClass(), "GetTagNameDialog.cancelName");
102  InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
103  inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), cancelName);
104  ActionMap actionMap = getRootPane().getActionMap();
105  actionMap.put(cancelName, new AbstractAction() {
106  private static final long serialVersionUID = 1L;
107 
108  @Override
109  public void actionPerformed(ActionEvent e) {
110  cancelButtonActionPerformed(e);
111  }
112  });
113 
114  // Get the current set of tag names and hash them for a speedy lookup in
115  // case the user chooses an existing tag name from the tag names table.
116  try {
118  tagNamesMap.putAll(tagsManager.getDisplayNamesToTagNamesMap());
119  } catch (TskCoreException | NoCurrentCaseException ex) {
120  Logger.getLogger(GetTagNameDialog.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
121  }
122 
123  // Populate the tag names table.
124  tagsTable.setModel(new TagsTableModel(new ArrayList<>(tagNamesMap.keySet())));
125  tagsTable.setTableHeader(null);
126  tagsTable.setCellSelectionEnabled(false);
127  tagsTable.setFocusable(false);
128  tagsTable.setRowHeight(tagsTable.getRowHeight() + 5);
129 
130  // Center and show the dialog box.
131  this.setLocationRelativeTo(this.getOwner());
132  setVisible(true);
133  }
134 
135  private class TagsTableModel extends AbstractTableModel {
136 
137  private static final long serialVersionUID = 1L;
138  private final ArrayList<String> tagDisplayNames = new ArrayList<>();
139 
140  TagsTableModel(List<String> tagDisplayNames) {
141  for (String tagDisplayName : tagDisplayNames) {
142  this.tagDisplayNames.add(tagDisplayName);
143  }
144  }
145 
146  @Override
147  public int getRowCount() {
148  return tagDisplayNames.size();
149  }
150 
151  @Override
152  public boolean isCellEditable(int rowIndex, int columnIndex) {
153  return false;
154  }
155 
156  @Override
157  public int getColumnCount() {
158  return 1;
159  }
160 
161  @Override
162  public String getValueAt(int rowIndex, int columnIndex) {
163  return tagDisplayNames.get(rowIndex);
164  }
165  }
166 
172  @SuppressWarnings("unchecked")
173  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
174  private void initComponents() {
175 
176  cancelButton = new javax.swing.JButton();
177  okButton = new javax.swing.JButton();
178  jScrollPane1 = new javax.swing.JScrollPane();
179  tagsTable = new javax.swing.JTable();
180  preexistingLabel = new javax.swing.JLabel();
181  newTagPanel = new javax.swing.JPanel();
182  tagNameLabel = new javax.swing.JLabel();
183  tagNameField = new javax.swing.JTextField();
184  descriptionLabel = new javax.swing.JLabel();
185  descriptionScrollPane = new javax.swing.JScrollPane();
186  descriptionTextArea = new javax.swing.JTextArea();
187  notableCheckbox = new javax.swing.JCheckBox();
188 
189  setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
190  addKeyListener(new java.awt.event.KeyAdapter() {
191  public void keyReleased(java.awt.event.KeyEvent evt) {
192  formKeyReleased(evt);
193  }
194  });
195 
196  org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.cancelButton.text")); // NOI18N
197  cancelButton.addActionListener(new java.awt.event.ActionListener() {
198  public void actionPerformed(java.awt.event.ActionEvent evt) {
199  cancelButtonActionPerformed(evt);
200  }
201  });
202 
203  org.openide.awt.Mnemonics.setLocalizedText(okButton, org.openide.util.NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.okButton.text")); // NOI18N
204  okButton.addActionListener(new java.awt.event.ActionListener() {
205  public void actionPerformed(java.awt.event.ActionEvent evt) {
206  okButtonActionPerformed(evt);
207  }
208  });
209 
210  jScrollPane1.setBackground(new java.awt.Color(255, 255, 255));
211 
212  tagsTable.setBackground(new java.awt.Color(240, 240, 240));
213  tagsTable.setModel(new javax.swing.table.DefaultTableModel(
214  new Object [][] {
215 
216  },
217  new String [] {
218 
219  }
220  ));
221  tagsTable.setOpaque(false);
222  tagsTable.setShowHorizontalLines(false);
223  tagsTable.setShowVerticalLines(false);
224  tagsTable.setTableHeader(null);
225  jScrollPane1.setViewportView(tagsTable);
226 
227  org.openide.awt.Mnemonics.setLocalizedText(preexistingLabel, org.openide.util.NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.preexistingLabel.text")); // NOI18N
228 
229  newTagPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.newTagPanel.border.title"))); // NOI18N
230 
231  org.openide.awt.Mnemonics.setLocalizedText(tagNameLabel, org.openide.util.NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.tagNameLabel.text")); // NOI18N
232 
233  tagNameField.setText(org.openide.util.NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.tagNameField.text")); // NOI18N
234  tagNameField.addKeyListener(new java.awt.event.KeyAdapter() {
235  public void keyReleased(java.awt.event.KeyEvent evt) {
236  tagNameFieldKeyReleased(evt);
237  }
238  });
239 
240  org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, org.openide.util.NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.descriptionLabel.text")); // NOI18N
241 
242  descriptionTextArea.setColumns(20);
243  descriptionTextArea.setRows(3);
244  descriptionScrollPane.setViewportView(descriptionTextArea);
245 
246  org.openide.awt.Mnemonics.setLocalizedText(notableCheckbox, org.openide.util.NbBundle.getMessage(GetTagNameDialog.class, "GetTagNameDialog.notableCheckbox.text")); // NOI18N
247 
248  javax.swing.GroupLayout newTagPanelLayout = new javax.swing.GroupLayout(newTagPanel);
249  newTagPanel.setLayout(newTagPanelLayout);
250  newTagPanelLayout.setHorizontalGroup(
251  newTagPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
252  .addGroup(newTagPanelLayout.createSequentialGroup()
253  .addContainerGap()
254  .addGroup(newTagPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
255  .addComponent(descriptionScrollPane, javax.swing.GroupLayout.Alignment.TRAILING)
256  .addComponent(tagNameField, javax.swing.GroupLayout.DEFAULT_SIZE, 323, Short.MAX_VALUE)
257  .addGroup(newTagPanelLayout.createSequentialGroup()
258  .addGroup(newTagPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
259  .addComponent(notableCheckbox)
260  .addComponent(descriptionLabel)
261  .addComponent(tagNameLabel))
262  .addGap(0, 0, Short.MAX_VALUE)))
263  .addContainerGap())
264  );
265  newTagPanelLayout.setVerticalGroup(
266  newTagPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
267  .addGroup(newTagPanelLayout.createSequentialGroup()
268  .addGap(6, 6, 6)
269  .addComponent(tagNameLabel)
270  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
271  .addComponent(tagNameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
272  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
273  .addComponent(descriptionLabel)
274  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
275  .addComponent(descriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE)
276  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
277  .addComponent(notableCheckbox)
278  .addContainerGap(31, Short.MAX_VALUE))
279  );
280 
281  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
282  getContentPane().setLayout(layout);
283  layout.setHorizontalGroup(
284  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
285  .addGroup(layout.createSequentialGroup()
286  .addContainerGap()
287  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
288  .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE)
289  .addComponent(preexistingLabel))
290  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
291  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
292  .addGroup(layout.createSequentialGroup()
293  .addGap(0, 233, Short.MAX_VALUE)
294  .addComponent(okButton)
295  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
296  .addComponent(cancelButton))
297  .addComponent(newTagPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
298  .addContainerGap())
299  );
300  layout.setVerticalGroup(
301  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
302  .addGroup(layout.createSequentialGroup()
303  .addContainerGap()
304  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
305  .addGroup(layout.createSequentialGroup()
306  .addComponent(preexistingLabel)
307  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
308  .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
309  .addComponent(newTagPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
310  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
311  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
312  .addComponent(cancelButton)
313  .addComponent(okButton))
314  .addContainerGap())
315  );
316 
317  pack();
318  }// </editor-fold>//GEN-END:initComponents
319 
320  private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
321  tagName = null;
322  dispose();
323  }//GEN-LAST:event_cancelButtonActionPerformed
324 
325  @NbBundle.Messages({"GetTagNameDialog.tagNameAlreadyExists.message=Tag name must be unique. A tag with this name already exists.",
326  "GetTagNameDialog.tagNameAlreadyExists.title=Duplicate Tag Name",
327  "GetTagNameDialog.tagDescriptionIllegalCharacters.message=Tag descriptions may not contain commas (,) or semicolons (;)",
328  "GetTagNameDialog.tagDescriptionIllegalCharacters.title=Invalid character in tag description"})
329  private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
330  String tagDisplayName = tagNameField.getText();
331  String userTagDescription = descriptionTextArea.getText();
332  TskData.FileKnown status = notableCheckbox.isSelected() ? TskData.FileKnown.BAD : TskData.FileKnown.UNKNOWN;
333  if (tagDisplayName.isEmpty()) {
334  JOptionPane.showMessageDialog(this,
335  NbBundle.getMessage(this.getClass(),
336  "GetTagNameDialog.mustSupplyTtagName.msg"),
337  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.tagNameErr"),
338  JOptionPane.ERROR_MESSAGE);
339  } else if (TagsManager.containsIllegalCharacters(tagDisplayName)) {
340  JOptionPane.showMessageDialog(this,
341  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.illegalChars.msg"),
342  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.illegalCharsErr"),
343  JOptionPane.ERROR_MESSAGE);
344  } else if (userTagDescription.contains(",")
345  || userTagDescription.contains(";")) {
346  JOptionPane.showMessageDialog(this,
347  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.tagDescriptionIllegalCharacters.message"),
348  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.tagDescriptionIllegalCharacters.title"),
349  JOptionPane.ERROR_MESSAGE);
350  } else {
351  tagName = tagNamesMap.get(tagDisplayName);
352 
353  if (tagName == null) {
354  try {
355  tagName = Case.getCurrentCaseThrows().getServices().getTagsManager().addTagName(tagDisplayName, userTagDescription, TagName.HTML_COLOR.NONE, status);
356  dispose();
357  } catch (TskCoreException | NoCurrentCaseException ex) {
358  Logger.getLogger(AddTagAction.class.getName()).log(Level.SEVERE, "Error adding " + tagDisplayName + " tag name", ex); //NON-NLS
359  JOptionPane.showMessageDialog(this,
360  NbBundle.getMessage(this.getClass(),
361  "GetTagNameDialog.unableToAddTagNameToCase.msg",
362  tagDisplayName),
363  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.taggingErr"),
364  JOptionPane.ERROR_MESSAGE);
365  tagName = null;
367  try {
369  } catch (TskCoreException | NoCurrentCaseException ex1) {
370  Logger.getLogger(AddTagAction.class.getName()).log(Level.SEVERE, tagDisplayName + " exists in database but an error occurred in retrieving it.", ex1); //NON-NLS
371  JOptionPane.showMessageDialog(this,
372  NbBundle.getMessage(this.getClass(),
373  "GetTagNameDialog.tagNameExistsTskCore.msg",
374  tagDisplayName),
375  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.dupTagErr"),
376  JOptionPane.ERROR_MESSAGE);
377  tagName = null;
378  }
379  }
380  } else {
381  JOptionPane.showMessageDialog(this,
382  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.tagNameAlreadyExists.message"),
383  NbBundle.getMessage(this.getClass(), "GetTagNameDialog.tagNameAlreadyExists.title"),
384  JOptionPane.INFORMATION_MESSAGE);
385  }
386  }
387  }//GEN-LAST:event_okButtonActionPerformed
388 
389  private void formKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyReleased
390  if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
391  okButtonActionPerformed(null);
392  }
393  }//GEN-LAST:event_formKeyReleased
394 
395  private void tagNameFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tagNameFieldKeyReleased
396  if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
397  okButtonActionPerformed(null);
398  }
399  }//GEN-LAST:event_tagNameFieldKeyReleased
400 
401  // Variables declaration - do not modify//GEN-BEGIN:variables
402  private javax.swing.JButton cancelButton;
403  private javax.swing.JLabel descriptionLabel;
404  private javax.swing.JScrollPane descriptionScrollPane;
405  private javax.swing.JTextArea descriptionTextArea;
406  private javax.swing.JScrollPane jScrollPane1;
407  private javax.swing.JPanel newTagPanel;
408  private javax.swing.JCheckBox notableCheckbox;
409  private javax.swing.JButton okButton;
410  private javax.swing.JLabel preexistingLabel;
411  private javax.swing.JTextField tagNameField;
412  private javax.swing.JLabel tagNameLabel;
413  private javax.swing.JTable tagsTable;
414  // End of variables declaration//GEN-END:variables
415 
416 }
void tagNameFieldKeyReleased(java.awt.event.KeyEvent evt)
synchronized TagName addTagName(String displayName)
void okButtonActionPerformed(java.awt.event.ActionEvent evt)
static boolean containsIllegalCharacters(String tagDisplayName)
void formKeyReleased(java.awt.event.KeyEvent evt)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
void cancelButtonActionPerformed(java.awt.event.ActionEvent evt)

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.