Autopsy  4.15.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
PersonaDetailsPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2020 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.centralrepository.persona;
20 
21 import java.awt.Component;
22 import java.awt.event.ActionEvent;
23 import java.text.SimpleDateFormat;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.HashMap;
27 import java.util.Date;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.logging.Level;
31 import javax.swing.JButton;
32 import javax.swing.JOptionPane;
33 import javax.swing.JTable;
34 import javax.swing.ListSelectionModel;
35 import javax.swing.event.ListSelectionEvent;
36 import javax.swing.table.DefaultTableModel;
37 import org.openide.windows.TopComponent;
38 import org.openide.util.NbBundle.Messages;
39 import org.openide.windows.RetainLocation;
50 
54 @TopComponent.Description(preferredID = "PersonaDetailsTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
55 @TopComponent.Registration(mode = "personadetails", openAtStartup = false)
56 @RetainLocation("personadetails")
57 @SuppressWarnings("PMD.SingularField")
58 public final class PersonaDetailsPanel extends javax.swing.JPanel {
59 
60  private static final long serialVersionUID = 1L;
61 
62  private static final Logger logger = Logger.getLogger(PersonaDetailsPanel.class.getName());
63 
65 
66  private final List<PAccount> accountsToAdd = new ArrayList<>();
67  private final List<PMetadata> metadataToAdd = new ArrayList<>();
68  private final List<PAlias> aliasesToAdd = new ArrayList<>();
69 
70  private final List<PersonaAccount> accountsToRemove = new ArrayList<>();
71  private final List<PersonaMetadata> metadataToRemove = new ArrayList<>();
72  private final List<PersonaAlias> aliasesToRemove = new ArrayList<>();
73 
74  private final Map<PersonaAccount, PAccount> accountsToEdit = new HashMap<>();
75  private final Map<PersonaMetadata, PMetadata> metadataToEdit = new HashMap<>();
76  private final Map<PersonaAlias, PAlias> aliasesToEdit = new HashMap<>();
77 
79  private List<PersonaAccount> currentAccounts = new ArrayList<>();
80  private List<PersonaMetadata> currentMetadata = new ArrayList<>();
81  private List<PersonaAlias> currentAliases = new ArrayList<>();
82  private List<CorrelationCase> currentCases = new ArrayList<>();
83 
84  private PersonaDetailsTableModel accountsModel;
85  private PersonaDetailsTableModel metadataModel;
86  private PersonaDetailsTableModel aliasesModel;
87  private PersonaDetailsTableModel casesModel;
88 
89  @Messages({
90  "PersonaDetailsPanel_empty_justification_Title=Empty justification",
91  "PersonaDetailsPanel_empty_justification_msg=The justification field cannot be empty",})
93  initComponents();
94  clear();
95 
96  // Accounts
97  addAccountBtn.addActionListener((ActionEvent e) -> {
98  new PersonaAccountDialog(this);
99  });
100  editAccountBtn.addActionListener((ActionEvent e) -> {
101  int selectedRow = accountsTable.getSelectedRow();
102  if (selectedRow != -1) {
103  if (selectedRow >= currentAccounts.size()) {
104  PAccount acc = accountsToAdd.get(selectedRow - currentAccounts.size());
105  new PersonaAccountDialog(this, acc);
106  } else {
107  PersonaAccount personaAccount = currentAccounts.get(selectedRow);
108  accountsToEdit.putIfAbsent(personaAccount, new PAccount(personaAccount.getAccount(), personaAccount.getJustification(), personaAccount.getConfidence()));
109  new PersonaAccountDialog(this, accountsToEdit.get(personaAccount));
110  }
111  }
112  });
113  deleteAccountBtn.addActionListener((ActionEvent e) -> {
114  int selectedRow = accountsTable.getSelectedRow();
115  if (selectedRow != -1) {
116  // We're keeping accounts in two separate data structures
117  if (selectedRow >= currentAccounts.size()) {
118  accountsToAdd.remove(selectedRow - currentAccounts.size());
119  } else {
120  PersonaAccount toRemove = currentAccounts.get(selectedRow);
121  accountsToEdit.remove(toRemove);
122  accountsToRemove.add(toRemove);
123  currentAccounts.remove(toRemove);
124  }
125  updateAccountsTable();
126  }
127  });
128  accountsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
129  accountsTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
130  handleSelectionChange(e, editAccountBtn, deleteAccountBtn, accountsTable);
131  });
132 
133  // Metadata
134  addMetadataBtn.addActionListener((ActionEvent e) -> {
135  new PersonaMetadataDialog(this);
136  });
137  editMetadataBtn.addActionListener((ActionEvent e) -> {
138  int selectedRow = metadataTable.getSelectedRow();
139  if (selectedRow != -1) {
140  if (selectedRow >= currentMetadata.size()) {
141  PMetadata md = metadataToAdd.get(selectedRow - currentMetadata.size());
142  new PersonaMetadataDialog(this, md);
143  } else {
144  PersonaMetadata personaMetadata = currentMetadata.get(selectedRow);
145  metadataToEdit.putIfAbsent(personaMetadata, new PMetadata(personaMetadata.getName(), personaMetadata.getValue(), personaMetadata.getJustification(), personaMetadata.getConfidence()));
146  new PersonaMetadataDialog(this, metadataToEdit.get(personaMetadata));
147  }
148  }
149  });
150  deleteMetadataBtn.addActionListener((ActionEvent e) -> {
151  int selectedRow = metadataTable.getSelectedRow();
152  if (selectedRow != -1) {
153  // We're keeping metadata in two separate data structures
154  if (selectedRow >= currentMetadata.size()) {
155  metadataToAdd.remove(selectedRow - currentMetadata.size());
156  } else {
157  PersonaMetadata toRemove = currentMetadata.get(selectedRow);
158  metadataToEdit.remove(toRemove);
159  metadataToRemove.add(toRemove);
160  currentMetadata.remove(toRemove);
161  }
162  updateMetadataTable();
163  }
164  });
165  metadataTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
166  metadataTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
167  handleSelectionChange(e, editMetadataBtn, deleteMetadataBtn, metadataTable);
168  });
169 
170  // Aliases
171  addAliasBtn.addActionListener((ActionEvent e) -> {
172  new PersonaAliasDialog(this);
173  });
174  editAliasBtn.addActionListener((ActionEvent e) -> {
175  int selectedRow = aliasesTable.getSelectedRow();
176  if (selectedRow != -1) {
177  if (selectedRow >= currentAliases.size()) {
178  PAlias pa = aliasesToAdd.get(selectedRow - currentAliases.size());
179  new PersonaAliasDialog(this, pa);
180  } else {
181  PersonaAlias personaAlias = currentAliases.get(selectedRow);
182  aliasesToEdit.putIfAbsent(personaAlias, new PAlias(personaAlias.getAlias(), personaAlias.getJustification(), personaAlias.getConfidence()));
183  new PersonaAliasDialog(this, aliasesToEdit.get(personaAlias));
184  }
185  }
186  });
187  deleteAliasBtn.addActionListener((ActionEvent e) -> {
188  int selectedRow = aliasesTable.getSelectedRow();
189  if (selectedRow != -1) {
190  // We're keeping aliases in two separate data structures
191  if (selectedRow >= currentAliases.size()) {
192  aliasesToAdd.remove(selectedRow - currentAliases.size());
193  } else {
194  PersonaAlias toRemove = currentAliases.get(selectedRow);
195  aliasesToEdit.remove(toRemove);
196  aliasesToRemove.add(toRemove);
197  currentAliases.remove(toRemove);
198  }
199  updateAliasesTable();
200  }
201  });
202  aliasesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
203  aliasesTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
204  handleSelectionChange(e, editAliasBtn, deleteAliasBtn, aliasesTable);
205  });
206  }
207 
208  private void handleSelectionChange(ListSelectionEvent e, JButton editBtn, JButton deleteBtn, JTable table) {
209  if (e.getValueIsAdjusting()) {
210  return;
211  }
212  editBtn.setEnabled(mode != PersonaDetailsMode.VIEW && table.getSelectedRow() != -1);
213  deleteBtn.setEnabled(mode != PersonaDetailsMode.VIEW && table.getSelectedRow() != -1);
214  }
215 
216  void addEditExistingAccount(PersonaAccount account, String justification, Persona.Confidence confidence) {
217  accountsToEdit.put(account, new PAccount(account.getAccount(), justification, confidence));
218  }
219 
220  void addEditExistingMetadata(PersonaMetadata metadata, String justification, Persona.Confidence confidence) {
221  metadataToEdit.put(metadata, new PMetadata(metadata.getName(), metadata.getValue(), justification, confidence));
222  }
223 
224  void addEditExistingAlias(PersonaAlias alias, String justification, Persona.Confidence confidence) {
225  aliasesToEdit.put(alias, new PAlias(alias.getAlias(), justification, confidence));
226  }
227 
231  class PAccount {
232 
233  CentralRepoAccount account;
234  String justification;
235  Persona.Confidence confidence;
236 
237  PAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) {
238  this.account = account;
239  this.justification = justification;
240  this.confidence = confidence;
241  }
242  }
243 
244  boolean accountExists(CentralRepoAccount account) {
245  for (PersonaAccount acc : currentAccounts) {
246  if (acc.getAccount().getId() == account.getId()) {
247  return true;
248  }
249  }
250  for (PAccount acc : accountsToAdd) {
251  if (acc.account.getId() == account.getId()) {
252  return true;
253  }
254  }
255  return false;
256  }
257 
258  public boolean addAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) {
259  if (!accountExists(account)) {
260  accountsToAdd.add(new PAccount(account, justification, confidence));
261  updateAccountsTable();
262  return true;
263  }
264  return false;
265  }
266 
270  class PMetadata {
271 
272  String name;
273  String value;
274  String justification;
275  Persona.Confidence confidence;
276 
277  PMetadata(String name, String value, String justification, Persona.Confidence confidence) {
278  this.name = name;
279  this.value = value;
280  this.justification = justification;
281  this.confidence = confidence;
282  }
283  }
284 
285  boolean metadataExists(String name) {
286  for (PersonaMetadata pm : currentMetadata) {
287  if (pm.getName().equals(name)) {
288  return true;
289  }
290  }
291  for (PMetadata pm : metadataToAdd) {
292  if (pm.name.equals(name)) {
293  return true;
294  }
295  }
296  return false;
297  }
298 
299  boolean addMetadata(String name, String value, String justification, Persona.Confidence confidence) {
300  if (!metadataExists(name)) {
301  metadataToAdd.add(new PMetadata(name, value, justification, confidence));
302  updateMetadataTable();
303  return true;
304  }
305  return false;
306  }
307 
311  class PAlias {
312 
313  String alias;
314  String justification;
315  Persona.Confidence confidence;
316 
317  PAlias(String alias, String justification, Persona.Confidence confidence) {
318  this.alias = alias;
319  this.justification = justification;
320  this.confidence = confidence;
321  }
322  }
323 
324  boolean aliasExists(String alias) {
325  for (PersonaAlias pa : currentAliases) {
326  if (pa.getAlias().equals(alias)) {
327  return true;
328  }
329  }
330  for (PAlias pa : aliasesToAdd) {
331  if (pa.alias.equals(alias)) {
332  return true;
333  }
334  }
335  return false;
336  }
337 
338  boolean addAlias(String alias, String justification, Persona.Confidence confidence) {
339  if (!aliasExists(alias)) {
340  aliasesToAdd.add(new PAlias(alias, justification, confidence));
341  updateAliasesTable();
342  return true;
343  }
344  return false;
345  }
346 
352  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
353  private void initComponents() {
354 
355  detailsPanel = new javax.swing.JPanel();
356  examinerLbl = new javax.swing.JLabel();
357  examinerField = new javax.swing.JTextField();
358  creationDateLbl = new javax.swing.JLabel();
359  creationDateField = new javax.swing.JTextField();
360  commentLbl = new javax.swing.JLabel();
361  commentField = new javax.swing.JTextField();
362  nameLbl = new javax.swing.JLabel();
363  nameField = new javax.swing.JTextField();
364  accountsLbl = new javax.swing.JLabel();
365  accountsTablePane = new javax.swing.JScrollPane();
366  accountsTable = new javax.swing.JTable();
367  addAccountBtn = new javax.swing.JButton();
368  editAccountBtn = new javax.swing.JButton();
369  deleteAccountBtn = new javax.swing.JButton();
370  metadataLabel = new javax.swing.JLabel();
371  metadataTablePane = new javax.swing.JScrollPane();
372  metadataTable = new javax.swing.JTable();
373  addMetadataBtn = new javax.swing.JButton();
374  editMetadataBtn = new javax.swing.JButton();
375  deleteMetadataBtn = new javax.swing.JButton();
376  aliasesLabel = new javax.swing.JLabel();
377  aliasesTablePane = new javax.swing.JScrollPane();
378  aliasesTable = new javax.swing.JTable();
379  addAliasBtn = new javax.swing.JButton();
380  editAliasBtn = new javax.swing.JButton();
381  deleteAliasBtn = new javax.swing.JButton();
382  casesLbl = new javax.swing.JLabel();
383  casesTablePane = new javax.swing.JScrollPane();
384  casesTable = new javax.swing.JTable();
385 
386  org.openide.awt.Mnemonics.setLocalizedText(examinerLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.examinerLbl.text")); // NOI18N
387 
388  examinerField.setEditable(false);
389  examinerField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.examinerField.text")); // NOI18N
390 
391  org.openide.awt.Mnemonics.setLocalizedText(creationDateLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.creationDateLbl.text")); // NOI18N
392 
393  creationDateField.setEditable(false);
394  creationDateField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.creationDateField.text")); // NOI18N
395 
396  org.openide.awt.Mnemonics.setLocalizedText(commentLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.commentLbl.text")); // NOI18N
397 
398  commentField.setEditable(false);
399  commentField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.commentField.text")); // NOI18N
400 
401  org.openide.awt.Mnemonics.setLocalizedText(nameLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameLbl.text")); // NOI18N
402 
403  nameField.setEditable(false);
404  nameField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameField.text")); // NOI18N
405 
406  org.openide.awt.Mnemonics.setLocalizedText(accountsLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.accountsLbl.text")); // NOI18N
407 
408  accountsTable.setModel(new javax.swing.table.DefaultTableModel(
409  new Object [][] {
410  {},
411  {},
412  {},
413  {}
414  },
415  new String [] {
416 
417  }
418  ));
419  accountsTablePane.setViewportView(accountsTable);
420 
421  org.openide.awt.Mnemonics.setLocalizedText(addAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAccountBtn.text")); // NOI18N
422  addAccountBtn.setEnabled(false);
423 
424  org.openide.awt.Mnemonics.setLocalizedText(editAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editAccountBtn.text")); // NOI18N
425  editAccountBtn.setEnabled(false);
426 
427  org.openide.awt.Mnemonics.setLocalizedText(deleteAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAccountBtn.text")); // NOI18N
428  deleteAccountBtn.setEnabled(false);
429 
430  org.openide.awt.Mnemonics.setLocalizedText(metadataLabel, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.metadataLabel.text")); // NOI18N
431 
432  metadataTable.setModel(new javax.swing.table.DefaultTableModel(
433  new Object [][] {
434  {},
435  {},
436  {},
437  {}
438  },
439  new String [] {
440 
441  }
442  ));
443  metadataTablePane.setViewportView(metadataTable);
444 
445  org.openide.awt.Mnemonics.setLocalizedText(addMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addMetadataBtn.text")); // NOI18N
446  addMetadataBtn.setEnabled(false);
447 
448  org.openide.awt.Mnemonics.setLocalizedText(editMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editMetadataBtn.text")); // NOI18N
449  editMetadataBtn.setEnabled(false);
450 
451  org.openide.awt.Mnemonics.setLocalizedText(deleteMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteMetadataBtn.text")); // NOI18N
452  deleteMetadataBtn.setEnabled(false);
453 
454  org.openide.awt.Mnemonics.setLocalizedText(aliasesLabel, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.aliasesLabel.text")); // NOI18N
455 
456  aliasesTable.setModel(new javax.swing.table.DefaultTableModel(
457  new Object [][] {
458  {},
459  {},
460  {},
461  {}
462  },
463  new String [] {
464 
465  }
466  ));
467  aliasesTablePane.setViewportView(aliasesTable);
468 
469  org.openide.awt.Mnemonics.setLocalizedText(addAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAliasBtn.text")); // NOI18N
470  addAliasBtn.setEnabled(false);
471 
472  org.openide.awt.Mnemonics.setLocalizedText(editAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editAliasBtn.text")); // NOI18N
473  editAliasBtn.setEnabled(false);
474 
475  org.openide.awt.Mnemonics.setLocalizedText(deleteAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAliasBtn.text")); // NOI18N
476  deleteAliasBtn.setEnabled(false);
477 
478  org.openide.awt.Mnemonics.setLocalizedText(casesLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.casesLbl.text")); // NOI18N
479 
480  casesTable.setModel(new javax.swing.table.DefaultTableModel(
481  new Object [][] {
482  {},
483  {},
484  {},
485  {}
486  },
487  new String [] {
488 
489  }
490  ));
491  casesTablePane.setViewportView(casesTable);
492 
493  javax.swing.GroupLayout detailsPanelLayout = new javax.swing.GroupLayout(detailsPanel);
494  detailsPanel.setLayout(detailsPanelLayout);
495  detailsPanelLayout.setHorizontalGroup(
496  detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
497  .addGroup(detailsPanelLayout.createSequentialGroup()
498  .addContainerGap()
499  .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
500  .addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 605, Short.MAX_VALUE)
501  .addComponent(accountsLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
502  .addComponent(metadataLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
503  .addComponent(metadataTablePane, javax.swing.GroupLayout.Alignment.TRAILING)
504  .addComponent(aliasesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
505  .addComponent(aliasesTablePane)
506  .addComponent(casesLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
507  .addComponent(casesTablePane)
508  .addGroup(detailsPanelLayout.createSequentialGroup()
509  .addComponent(commentLbl)
510  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
511  .addComponent(commentField))
512  .addGroup(detailsPanelLayout.createSequentialGroup()
513  .addComponent(nameLbl)
514  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
515  .addComponent(nameField))
516  .addGroup(detailsPanelLayout.createSequentialGroup()
517  .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
518  .addGroup(detailsPanelLayout.createSequentialGroup()
519  .addComponent(addAccountBtn)
520  .addGap(18, 18, 18)
521  .addComponent(editAccountBtn)
522  .addGap(18, 18, 18)
523  .addComponent(deleteAccountBtn))
524  .addGroup(detailsPanelLayout.createSequentialGroup()
525  .addComponent(addMetadataBtn)
526  .addGap(18, 18, 18)
527  .addComponent(editMetadataBtn)
528  .addGap(18, 18, 18)
529  .addComponent(deleteMetadataBtn))
530  .addGroup(detailsPanelLayout.createSequentialGroup()
531  .addComponent(addAliasBtn)
532  .addGap(18, 18, 18)
533  .addComponent(editAliasBtn)
534  .addGap(18, 18, 18)
535  .addComponent(deleteAliasBtn)))
536  .addGap(0, 0, Short.MAX_VALUE))
537  .addGroup(detailsPanelLayout.createSequentialGroup()
538  .addComponent(examinerLbl)
539  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
540  .addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE)
541  .addGap(18, 18, 18)
542  .addComponent(creationDateLbl)
543  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
544  .addComponent(creationDateField)))
545  .addContainerGap())
546  );
547  detailsPanelLayout.setVerticalGroup(
548  detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
549  .addGroup(detailsPanelLayout.createSequentialGroup()
550  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
551  .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
552  .addComponent(examinerLbl)
553  .addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
554  .addComponent(creationDateLbl)
555  .addComponent(creationDateField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
556  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
557  .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
558  .addComponent(commentField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
559  .addComponent(commentLbl))
560  .addGap(20, 20, 20)
561  .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
562  .addComponent(nameLbl)
563  .addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
564  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
565  .addComponent(accountsLbl)
566  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
567  .addComponent(accountsTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE)
568  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
569  .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
570  .addComponent(addAccountBtn)
571  .addComponent(deleteAccountBtn)
572  .addComponent(editAccountBtn))
573  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
574  .addComponent(metadataLabel)
575  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
576  .addComponent(metadataTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
577  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
578  .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
579  .addComponent(addMetadataBtn)
580  .addComponent(deleteMetadataBtn)
581  .addComponent(editMetadataBtn))
582  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
583  .addComponent(aliasesLabel)
584  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
585  .addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
586  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
587  .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
588  .addComponent(addAliasBtn)
589  .addComponent(deleteAliasBtn)
590  .addComponent(editAliasBtn))
591  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
592  .addComponent(casesLbl)
593  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
594  .addComponent(casesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
595  .addContainerGap())
596  );
597 
598  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
599  this.setLayout(layout);
600  layout.setHorizontalGroup(
601  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
602  .addComponent(detailsPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
603  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
604  .addGap(0, 617, Short.MAX_VALUE))
605  );
606  layout.setVerticalGroup(
607  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
608  .addGap(0, 521, Short.MAX_VALUE)
609  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
610  .addGroup(layout.createSequentialGroup()
611  .addComponent(detailsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
612  .addGap(0, 0, Short.MAX_VALUE)))
613  );
614  }// </editor-fold>//GEN-END:initComponents
615 
616  // Variables declaration - do not modify//GEN-BEGIN:variables
617  private javax.swing.JLabel accountsLbl;
618  private javax.swing.JTable accountsTable;
619  private javax.swing.JScrollPane accountsTablePane;
620  private javax.swing.JButton addAccountBtn;
621  private javax.swing.JButton addAliasBtn;
622  private javax.swing.JButton addMetadataBtn;
623  private javax.swing.JLabel aliasesLabel;
624  private javax.swing.JTable aliasesTable;
625  private javax.swing.JScrollPane aliasesTablePane;
626  private javax.swing.JLabel casesLbl;
627  private javax.swing.JTable casesTable;
628  private javax.swing.JScrollPane casesTablePane;
629  private javax.swing.JTextField commentField;
630  private javax.swing.JLabel commentLbl;
631  private javax.swing.JTextField creationDateField;
632  private javax.swing.JLabel creationDateLbl;
633  private javax.swing.JButton deleteAccountBtn;
634  private javax.swing.JButton deleteAliasBtn;
635  private javax.swing.JButton deleteMetadataBtn;
636  private javax.swing.JPanel detailsPanel;
637  private javax.swing.JButton editAccountBtn;
638  private javax.swing.JButton editAliasBtn;
639  private javax.swing.JButton editMetadataBtn;
640  private javax.swing.JTextField examinerField;
641  private javax.swing.JLabel examinerLbl;
642  private javax.swing.JLabel metadataLabel;
643  private javax.swing.JTable metadataTable;
644  private javax.swing.JScrollPane metadataTablePane;
645  private javax.swing.JTextField nameField;
646  private javax.swing.JLabel nameLbl;
647  // End of variables declaration//GEN-END:variables
648 
649  @Messages({
650  "PersonaDetailsPanel_load_exception_Title=Initialization failure",
651  "PersonaDetailsPanel_load_exception_msg=Failed to load persona.",})
652  private void loadPersona(Component parent, Persona persona) {
653  String examiner;
654  String creationDate;
655  String comment;
656  String name;
657  Collection<PersonaAccount> accounts;
658  Collection<PersonaMetadata> metadata;
659  Collection<PersonaAlias> aliases;
660  Collection<CorrelationCase> cases;
661  try {
662  examiner = persona.getExaminer().getLoginName();
663 
664  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
665  Date cDate = new Date(persona.getCreatedDate());
666  creationDate = dateFormat.format(cDate);
667 
668  comment = persona.getComment();
669  name = persona.getName();
670  accounts = persona.getPersonaAccounts();
671  metadata = persona.getMetadata();
672  aliases = persona.getAliases();
673  cases = persona.getCases();
674  } catch (CentralRepoException ex) {
675  logger.log(Level.SEVERE, "Failed to load persona", ex);
676  JOptionPane.showMessageDialog(parent,
677  Bundle.PersonaDetailsPanel_load_exception_Title(),
678  Bundle.PersonaDetailsPanel_load_exception_msg(),
679  JOptionPane.ERROR_MESSAGE);
680  return;
681  }
682  this.currentPersona = persona;
683  this.examinerField.setText(examiner);
684  this.creationDateField.setText(creationDate);
685  this.commentField.setText(comment);
686  this.nameField.setText(name);
687  this.currentAccounts.addAll(accounts);
688  this.currentMetadata.addAll(metadata);
689  this.currentAliases.addAll(aliases);
690  this.currentCases.addAll(cases);
691  }
692 
693  void clear() {
694  currentPersona = null;
695  examinerField.setText("");
696  creationDateField.setText("");
697  commentField.setText("");
698  nameField.setText(mode == PersonaDetailsMode.CREATE ? Persona.getDefaultName() : "");
699  currentAccounts = new ArrayList<>();
700  currentMetadata = new ArrayList<>();
701  currentAliases = new ArrayList<>();
702  currentCases = new ArrayList<>();
703  accountsToAdd.clear();
704  metadataToAdd.clear();
705  aliasesToAdd.clear();
706  nameField.setEditable(false);
707  commentField.setEditable(false);
708 
709  initializeFields();
710 
711  addAccountBtn.setEnabled(false);
712  addMetadataBtn.setEnabled(false);
713  addAliasBtn.setEnabled(false);
714  deleteAccountBtn.setEnabled(false);
715  deleteMetadataBtn.setEnabled(false);
716  deleteAliasBtn.setEnabled(false);
717  editAccountBtn.setEnabled(false);
718  editMetadataBtn.setEnabled(false);
719  editAliasBtn.setEnabled(false);
720  }
721 
725  final class PersonaDetailsTableModel extends DefaultTableModel {
726 
727  private static final long serialVersionUID = 1L;
728 
729  PersonaDetailsTableModel(Object[][] rows, String[] colNames) {
730  super(rows, colNames);
731  }
732 
733  @Override
734  public boolean isCellEditable(int row, int column) {
735  return false;
736  }
737  }
738 
739  private void updateAccountsTable() {
740  Object[][] rows = new Object[currentAccounts.size() + accountsToAdd.size()][2];
741  int i = 0;
742  for (PersonaAccount acc : currentAccounts) {
743  rows[i] = new Object[]{
744  acc.getAccount().getAccountType().getAcctType().getDisplayName(),
745  acc.getAccount().getIdentifier()
746  };
747  i++;
748  }
749  for (PAccount acc : accountsToAdd) {
750  rows[i] = new Object[]{
751  acc.account.getAccountType().getAcctType().getDisplayName(),
752  acc.account.getIdentifier()
753  };
754  i++;
755  }
756  accountsModel = new PersonaDetailsTableModel(
757  rows,
758  new String[]{"Type", "Identifier"}
759  );
760  accountsTable.setModel(accountsModel);
761 
762  // Formatting
763  accountsTable.getColumnModel().getColumn(0).setMaxWidth(100);
764  accountsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
765  }
766 
767  private void updateMetadataTable() {
768  Object[][] rows = new Object[currentMetadata.size() + metadataToAdd.size()][2];
769  int i = 0;
770  for (PersonaMetadata md : currentMetadata) {
771  rows[i] = new Object[]{md.getName(), md.getValue()};
772  i++;
773  }
774  for (PMetadata md : metadataToAdd) {
775  rows[i] = new Object[]{md.name, md.value};
776  i++;
777  }
778  metadataModel = new PersonaDetailsTableModel(
779  rows,
780  new String[]{"Name", "Value"}
781  );
782  metadataTable.setModel(metadataModel);
783  }
784 
785  private void updateAliasesTable() {
786  Object[][] rows = new Object[currentAliases.size() + aliasesToAdd.size()][1];
787  int i = 0;
788  for (PersonaAlias alias : currentAliases) {
789  rows[i] = new Object[]{alias.getAlias()};
790  i++;
791  }
792  for (PAlias alias : aliasesToAdd) {
793  rows[i] = new Object[]{alias.alias};
794  i++;
795  }
796  aliasesModel = new PersonaDetailsTableModel(
797  rows,
798  new String[]{"Alias"}
799  );
800  aliasesTable.setModel(aliasesModel);
801  }
802 
803  private void updateCasesTable() {
804  Object[][] rows = new Object[currentCases.size()][1];
805  int i = 0;
806  for (CorrelationCase c : currentCases) {
807  rows[i] = new Object[]{c.getDisplayName()};
808  i++;
809  }
810  casesModel = new PersonaDetailsTableModel(
811  rows,
812  new String[]{"Case"}
813  );
814  casesTable.setModel(casesModel);
815  }
816 
817  void configureEditComponents(boolean enabled) {
818  commentField.setEditable(enabled);
819  nameField.setEditable(enabled);
820  addAccountBtn.setEnabled(enabled);
821  addMetadataBtn.setEnabled(enabled);
822  addAliasBtn.setEnabled(enabled);
823 
824  addAccountBtn.setVisible(enabled);
825  editAccountBtn.setVisible(enabled);
826  deleteAccountBtn.setVisible(enabled);
827  addMetadataBtn.setVisible(enabled);
828  editMetadataBtn.setVisible(enabled);
829  deleteMetadataBtn.setVisible(enabled);
830  addAliasBtn.setVisible(enabled);
831  editAliasBtn.setVisible(enabled);
832  deleteAliasBtn.setVisible(enabled);
833  }
834 
835  void initializeFields() {
836  if (mode == PersonaDetailsMode.CREATE) {
837  try {
838  CentralRepoExaminer examiner = CentralRepository.getInstance().getOrInsertExaminer(System.getProperty("user.name"));
839  examinerField.setText(examiner.getLoginName());
840  } catch (CentralRepoException e) {
841  logger.log(Level.SEVERE, "Failed to access central repository", e);
842  JOptionPane.showMessageDialog(this,
843  Bundle.PersonaDetailsPanel_CentralRepoErr_msg(),
844  Bundle.PersonaDetailsPanel_CentralRepoErr_Title(),
845  JOptionPane.ERROR_MESSAGE);
846  }
847  }
848  updateAccountsTable();
849  updateMetadataTable();
850  updateAliasesTable();
851  updateCasesTable();
852  }
853 
854  void setMode(Component parent, PersonaDetailsMode mode, Persona persona) {
855  clear();
856  this.mode = mode;
857  switch (mode) {
858  case CREATE:
859  configureEditComponents(true);
860  break;
861  case EDIT:
862  loadPersona(parent, persona);
863  configureEditComponents(true);
864  break;
865  case VIEW:
866  loadPersona(parent, persona);
867  configureEditComponents(false);
868  break;
869  default:
870  logger.log(Level.WARNING, "Unsupported mode: {0}", mode);
871  break;
872  }
873  initializeFields();
874  }
875 
876  @Messages({
877  "PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account.",
878  "PersonaDetailsPanel_NotEnoughAccounts_Title=Missing account",
879  "PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository.",
880  "PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure",
881  "PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty.",
882  "PersonaDetailsPanel_EmptyName_Title=Empty persona name",
883  "PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty.",
884  "PersonaDetailsPanel_EmptyComment_Title=Empty persona comment",})
885  Persona okHandler() {
886  if (accountsToAdd.size() + currentAccounts.size() < 1) {
887  JOptionPane.showMessageDialog(this,
888  Bundle.PersonaDetailsPanel_NotEnoughAccounts_msg(),
889  Bundle.PersonaDetailsPanel_NotEnoughAccounts_Title(),
890  JOptionPane.ERROR_MESSAGE);
891  return null;
892 
893  }
894  if (commentField.getText().isEmpty()) {
895  JOptionPane.showMessageDialog(this,
896  Bundle.PersonaDetailsPanel_EmptyComment_msg(),
897  Bundle.PersonaDetailsPanel_EmptyComment_Title(),
898  JOptionPane.ERROR_MESSAGE);
899  return null;
900  }
901  if (nameField.getText().isEmpty()) {
902  JOptionPane.showMessageDialog(this,
903  Bundle.PersonaDetailsPanel_EmptyName_msg(),
904  Bundle.PersonaDetailsPanel_EmptyName_Title(),
905  JOptionPane.ERROR_MESSAGE);
906  return null;
907  }
908 
909  Persona ret = null;
910  switch (mode) {
911  case CREATE:
912  try {
913  PAccount firstAccount = accountsToAdd.get(0);
914  ret = Persona.createPersonaForAccount(nameField.getText(),
915  commentField.getText(), Persona.PersonaStatus.ACTIVE, firstAccount.account,
916  firstAccount.justification, firstAccount.confidence);
917  for (int i = 1; i < accountsToAdd.size(); i++) {
918  ret.addAccount(accountsToAdd.get(i).account,
919  accountsToAdd.get(i).justification,
920  accountsToAdd.get(i).confidence);
921  }
922  for (PMetadata md : metadataToAdd) {
923  ret.addMetadata(md.name, md.value, md.justification, md.confidence);
924  }
925  for (PAlias pa : aliasesToAdd) {
926  ret.addAlias(pa.alias, pa.justification, pa.confidence);
927  }
928  } catch (CentralRepoException e) {
929  logger.log(Level.SEVERE, "Failed to access central repository", e);
930  JOptionPane.showMessageDialog(this,
931  Bundle.PersonaDetailsPanel_CentralRepoErr_msg(),
932  Bundle.PersonaDetailsPanel_CentralRepoErr_Title(),
933  JOptionPane.ERROR_MESSAGE);
934  break;
935  }
936  break;
937  case EDIT:
938  try {
939  ret = currentPersona;
940  currentPersona.setComment(commentField.getText());
941  currentPersona.setName(nameField.getText());
942  for (PAccount acc : accountsToAdd) {
943  ret.addAccount(acc.account, acc.justification, acc.confidence);
944  }
945  for (PersonaAccount acc : accountsToRemove) {
946  ret.removeAccount(acc);
947  }
948  for (HashMap.Entry<PersonaAccount, PAccount> entry : accountsToEdit.entrySet()) {
949  ret.modifyAccount(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
950  }
951  for (PMetadata md : metadataToAdd) {
952  ret.addMetadata(md.name, md.value, md.justification, md.confidence);
953  }
954  for (PersonaMetadata md : metadataToRemove) {
955  ret.removeMetadata(md);
956  }
957  for (HashMap.Entry<PersonaMetadata, PMetadata> entry : metadataToEdit.entrySet()) {
958  ret.modifyMetadata(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
959  }
960  for (PAlias pa : aliasesToAdd) {
961  ret.addAlias(pa.alias, pa.justification, pa.confidence);
962  }
963  for (PersonaAlias pa : aliasesToRemove) {
964  ret.removeAlias(pa);
965  }
966  for (HashMap.Entry<PersonaAlias, PAlias> entry : aliasesToEdit.entrySet()) {
967  ret.modifyAlias(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
968  }
969  } catch (CentralRepoException e) {
970  logger.log(Level.SEVERE, "Failed to access central repository", e);
971  JOptionPane.showMessageDialog(this,
972  Bundle.PersonaDetailsPanel_CentralRepoErr_msg(),
973  Bundle.PersonaDetailsPanel_CentralRepoErr_Title(),
974  JOptionPane.ERROR_MESSAGE);
975  break;
976  }
977  break;
978  case VIEW:
979  ret = currentPersona;
980  break;
981  default:
982  logger.log(Level.SEVERE, "Unsupported mode: {0}", mode);
983  }
984  return ret;
985  }
986 
992  public void setPersonaName(String name) {
993  nameField.setText(name);
994  }
995 
996 }
boolean addAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence)
CentralRepoExaminer getOrInsertExaminer(String examinerLoginName)
void handleSelectionChange(ListSelectionEvent e, JButton editBtn, JButton deleteBtn, JTable table)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124

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