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