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