19 package org.sleuthkit.autopsy.centralrepository.persona;
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;
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;
54 @TopComponent.Description(preferredID =
"PersonaDetailsTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
55 @TopComponent.Registration(mode =
"personadetails", openAtStartup =
false)
56 @RetainLocation(
"personadetails")
57 @SuppressWarnings(
"PMD.SingularField")
60 private static final long serialVersionUID = 1L;
66 private final List<PAccount> accountsToAdd =
new ArrayList<>();
67 private final List<PMetadata> metadataToAdd =
new ArrayList<>();
68 private final List<PAlias> aliasesToAdd =
new ArrayList<>();
70 private final List<PersonaAccount> accountsToRemove =
new ArrayList<>();
71 private final List<PersonaMetadata> metadataToRemove =
new ArrayList<>();
72 private final List<PersonaAlias> aliasesToRemove =
new ArrayList<>();
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<>();
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<>();
90 "PersonaDetailsPanel_empty_justification_Title=Empty justification",
91 "PersonaDetailsPanel_empty_justification_msg=The justification field cannot be empty",})
97 addAccountBtn.addActionListener((ActionEvent e) -> {
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());
113 deleteAccountBtn.addActionListener((ActionEvent e) -> {
114 int selectedRow = accountsTable.getSelectedRow();
115 if (selectedRow != -1) {
117 if (selectedRow >= currentAccounts.size()) {
118 accountsToAdd.remove(selectedRow - currentAccounts.size());
121 accountsToEdit.remove(toRemove);
122 accountsToRemove.add(toRemove);
123 currentAccounts.remove(toRemove);
125 updateAccountsTable();
128 accountsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
129 accountsTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
130 handleSelectionChange(e, editAccountBtn, deleteAccountBtn, accountsTable);
134 addMetadataBtn.addActionListener((ActionEvent e) -> {
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());
150 deleteMetadataBtn.addActionListener((ActionEvent e) -> {
151 int selectedRow = metadataTable.getSelectedRow();
152 if (selectedRow != -1) {
154 if (selectedRow >= currentMetadata.size()) {
155 metadataToAdd.remove(selectedRow - currentMetadata.size());
158 metadataToEdit.remove(toRemove);
159 metadataToRemove.add(toRemove);
160 currentMetadata.remove(toRemove);
162 updateMetadataTable();
165 metadataTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
166 metadataTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
167 handleSelectionChange(e, editMetadataBtn, deleteMetadataBtn, metadataTable);
171 addAliasBtn.addActionListener((ActionEvent e) -> {
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());
181 PersonaAlias personaAlias = currentAliases.get(selectedRow);
187 deleteAliasBtn.addActionListener((ActionEvent e) -> {
188 int selectedRow = aliasesTable.getSelectedRow();
189 if (selectedRow != -1) {
191 if (selectedRow >= currentAliases.size()) {
192 aliasesToAdd.remove(selectedRow - currentAliases.size());
194 PersonaAlias toRemove = currentAliases.get(selectedRow);
195 aliasesToEdit.remove(toRemove);
196 aliasesToRemove.add(toRemove);
197 currentAliases.remove(toRemove);
199 updateAliasesTable();
202 aliasesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
203 aliasesTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
204 handleSelectionChange(e, editAliasBtn, deleteAliasBtn, aliasesTable);
209 if (e.getValueIsAdjusting()) {
217 accountsToEdit.put(account,
new PAccount(account.
getAccount(), justification, confidence));
220 void addEditExistingMetadata(PersonaMetadata metadata, String justification, Persona.Confidence confidence) {
221 metadataToEdit.put(metadata,
new PMetadata(metadata.getName(), metadata.getValue(), justification, confidence));
224 void addEditExistingAlias(PersonaAlias alias, String justification, Persona.Confidence confidence) {
225 aliasesToEdit.put(alias,
new PAlias(alias.getAlias(), justification, confidence));
233 CentralRepoAccount account;
234 String justification;
235 Persona.Confidence confidence;
237 PAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) {
238 this.account = account;
239 this.justification = justification;
240 this.confidence = confidence;
244 boolean accountExists(CentralRepoAccount account) {
245 for (PersonaAccount acc : currentAccounts) {
246 if (acc.getAccount().getId() == account.getId()) {
250 for (PAccount acc : accountsToAdd) {
251 if (acc.account.getId() == account.getId()) {
259 if (!accountExists(account)) {
260 accountsToAdd.add(
new PAccount(account, justification, confidence));
261 updateAccountsTable();
274 String justification;
277 PMetadata(String name, String value, String justification,
Persona.
Confidence confidence) {
280 this.justification = justification;
281 this.confidence = confidence;
285 boolean metadataExists(String name) {
286 for (PersonaMetadata pm : currentMetadata) {
287 if (pm.getName().equals(name)) {
291 for (PMetadata pm : metadataToAdd) {
292 if (pm.name.equals(name)) {
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();
314 String justification;
315 Persona.Confidence confidence;
317 PAlias(String alias, String justification, Persona.Confidence confidence) {
319 this.justification = justification;
320 this.confidence = confidence;
324 boolean aliasExists(String alias) {
325 for (PersonaAlias pa : currentAliases) {
326 if (pa.getAlias().equals(alias)) {
330 for (PAlias pa : aliasesToAdd) {
331 if (pa.alias.equals(alias)) {
338 boolean addAlias(String alias, String justification, Persona.Confidence confidence) {
339 if (!aliasExists(alias)) {
340 aliasesToAdd.add(
new PAlias(alias, justification, confidence));
341 updateAliasesTable();
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();
386 org.openide.awt.Mnemonics.setLocalizedText(examinerLbl,
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.examinerLbl.text"));
388 examinerField.setEditable(
false);
389 examinerField.setText(
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.examinerField.text"));
391 org.openide.awt.Mnemonics.setLocalizedText(creationDateLbl,
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.creationDateLbl.text"));
393 creationDateField.setEditable(
false);
394 creationDateField.setText(
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.creationDateField.text"));
396 org.openide.awt.Mnemonics.setLocalizedText(commentLbl,
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.commentLbl.text"));
398 commentField.setEditable(
false);
399 commentField.setText(
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.commentField.text"));
401 org.openide.awt.Mnemonics.setLocalizedText(nameLbl,
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.nameLbl.text"));
403 nameField.setEditable(
false);
404 nameField.setText(
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.nameField.text"));
406 org.openide.awt.Mnemonics.setLocalizedText(accountsLbl,
org.openide.util.NbBundle.getMessage(
PersonaDetailsPanel.class,
"PersonaDetailsPanel.accountsLbl.text"));
408 accountsTable.setModel(
new javax.swing.table.DefaultTableModel(
419 accountsTablePane.setViewportView(accountsTable);
421 org.openide.awt.Mnemonics.setLocalizedText(addAccountBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.addAccountBtn.text"));
422 addAccountBtn.setEnabled(
false);
424 org.openide.awt.Mnemonics.setLocalizedText(editAccountBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.editAccountBtn.text"));
425 editAccountBtn.setEnabled(
false);
427 org.openide.awt.Mnemonics.setLocalizedText(deleteAccountBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.deleteAccountBtn.text"));
428 deleteAccountBtn.setEnabled(
false);
430 org.openide.awt.Mnemonics.setLocalizedText(metadataLabel,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.metadataLabel.text"));
432 metadataTable.setModel(
new javax.swing.table.DefaultTableModel(
443 metadataTablePane.setViewportView(metadataTable);
445 org.openide.awt.Mnemonics.setLocalizedText(addMetadataBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.addMetadataBtn.text"));
446 addMetadataBtn.setEnabled(
false);
448 org.openide.awt.Mnemonics.setLocalizedText(editMetadataBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.editMetadataBtn.text"));
449 editMetadataBtn.setEnabled(
false);
451 org.openide.awt.Mnemonics.setLocalizedText(deleteMetadataBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.deleteMetadataBtn.text"));
452 deleteMetadataBtn.setEnabled(
false);
454 org.openide.awt.Mnemonics.setLocalizedText(aliasesLabel,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.aliasesLabel.text"));
456 aliasesTable.setModel(
new javax.swing.table.DefaultTableModel(
467 aliasesTablePane.setViewportView(aliasesTable);
469 org.openide.awt.Mnemonics.setLocalizedText(addAliasBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.addAliasBtn.text"));
470 addAliasBtn.setEnabled(
false);
472 org.openide.awt.Mnemonics.setLocalizedText(editAliasBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.editAliasBtn.text"));
473 editAliasBtn.setEnabled(
false);
475 org.openide.awt.Mnemonics.setLocalizedText(deleteAliasBtn,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.deleteAliasBtn.text"));
476 deleteAliasBtn.setEnabled(
false);
478 org.openide.awt.Mnemonics.setLocalizedText(casesLbl,
org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class,
"PersonaDetailsPanel.casesLbl.text"));
480 casesTable.setModel(
new javax.swing.table.DefaultTableModel(
491 casesTablePane.setViewportView(casesTable);
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()
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)
521 .addComponent(editAccountBtn)
523 .addComponent(deleteAccountBtn))
524 .addGroup(detailsPanelLayout.createSequentialGroup()
525 .addComponent(addMetadataBtn)
527 .addComponent(editMetadataBtn)
529 .addComponent(deleteMetadataBtn))
530 .addGroup(detailsPanelLayout.createSequentialGroup()
531 .addComponent(addAliasBtn)
533 .addComponent(editAliasBtn)
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)
542 .addComponent(creationDateLbl)
543 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
544 .addComponent(creationDateField)))
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))
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)
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))
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)))
650 "PersonaDetailsPanel_load_exception_Title=Initialization failure",
651 "PersonaDetailsPanel_load_exception_msg=Failed to load persona.",})
657 Collection<PersonaAccount> accounts;
658 Collection<PersonaMetadata> metadata;
659 Collection<PersonaAlias> aliases;
660 Collection<CorrelationCase> cases;
664 SimpleDateFormat dateFormat =
new SimpleDateFormat(
"yyyy/MM/dd HH:mm:ss");
666 creationDate = dateFormat.format(cDate);
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);
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);
694 currentPersona = null;
695 examinerField.setText(
"");
696 creationDateField.setText(
"");
697 commentField.setText(
"");
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);
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);
725 final class PersonaDetailsTableModel
extends DefaultTableModel {
727 private static final long serialVersionUID = 1L;
729 PersonaDetailsTableModel(Object[][] rows, String[] colNames) {
730 super(rows, colNames);
734 public boolean isCellEditable(
int row,
int column) {
740 Object[][] rows =
new Object[currentAccounts.size() + accountsToAdd.size()][2];
743 rows[i] =
new Object[]{
744 acc.getAccount().getAccountType().getAcctType().getDisplayName(),
745 acc.getAccount().getIdentifier()
749 for (PAccount acc : accountsToAdd) {
750 rows[i] =
new Object[]{
751 acc.account.getAccountType().getAcctType().getDisplayName(),
752 acc.account.getIdentifier()
756 accountsModel =
new PersonaDetailsTableModel(
758 new String[]{
"Type",
"Identifier"}
760 accountsTable.setModel(accountsModel);
763 accountsTable.getColumnModel().getColumn(0).setMaxWidth(100);
764 accountsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
768 Object[][] rows =
new Object[currentMetadata.size() + metadataToAdd.size()][2];
771 rows[i] =
new Object[]{md.getName(), md.getValue()};
774 for (PMetadata md : metadataToAdd) {
775 rows[i] =
new Object[]{md.name, md.value};
778 metadataModel =
new PersonaDetailsTableModel(
780 new String[]{
"Name",
"Value"}
782 metadataTable.setModel(metadataModel);
786 Object[][] rows =
new Object[currentAliases.size() + aliasesToAdd.size()][1];
789 rows[i] =
new Object[]{alias.getAlias()};
792 for (PAlias alias : aliasesToAdd) {
793 rows[i] =
new Object[]{alias.alias};
796 aliasesModel =
new PersonaDetailsTableModel(
798 new String[]{
"Alias"}
800 aliasesTable.setModel(aliasesModel);
804 Object[][] rows =
new Object[currentCases.size()][1];
807 rows[i] =
new Object[]{c.getDisplayName()};
810 casesModel =
new PersonaDetailsTableModel(
814 casesTable.setModel(casesModel);
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);
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);
835 void initializeFields() {
836 if (mode == PersonaDetailsMode.
CREATE) {
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);
848 updateAccountsTable();
849 updateMetadataTable();
850 updateAliasesTable();
854 void setMode(Component parent, PersonaDetailsMode mode, Persona persona) {
859 configureEditComponents(
true);
862 loadPersona(parent, persona);
863 configureEditComponents(
true);
866 loadPersona(parent, persona);
867 configureEditComponents(
false);
870 logger.log(Level.WARNING,
"Unsupported mode: {0}", mode);
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);
894 if (commentField.getText().isEmpty()) {
895 JOptionPane.showMessageDialog(
this,
896 Bundle.PersonaDetailsPanel_EmptyComment_msg(),
897 Bundle.PersonaDetailsPanel_EmptyComment_Title(),
898 JOptionPane.ERROR_MESSAGE);
901 if (nameField.getText().isEmpty()) {
902 JOptionPane.showMessageDialog(
this,
903 Bundle.PersonaDetailsPanel_EmptyName_msg(),
904 Bundle.PersonaDetailsPanel_EmptyName_Title(),
905 JOptionPane.ERROR_MESSAGE);
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);
922 for (PMetadata md : metadataToAdd) {
923 ret.addMetadata(md.name, md.value, md.justification, md.confidence);
925 for (PAlias pa : aliasesToAdd) {
926 ret.addAlias(pa.alias, pa.justification, pa.confidence);
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);
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);
945 for (PersonaAccount acc : accountsToRemove) {
946 ret.removeAccount(acc);
948 for (HashMap.Entry<PersonaAccount, PAccount> entry : accountsToEdit.entrySet()) {
949 ret.modifyAccount(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
951 for (PMetadata md : metadataToAdd) {
952 ret.addMetadata(md.name, md.value, md.justification, md.confidence);
954 for (PersonaMetadata md : metadataToRemove) {
955 ret.removeMetadata(md);
957 for (HashMap.Entry<PersonaMetadata, PMetadata> entry : metadataToEdit.entrySet()) {
958 ret.modifyMetadata(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
960 for (PAlias pa : aliasesToAdd) {
961 ret.addAlias(pa.alias, pa.justification, pa.confidence);
963 for (PersonaAlias pa : aliasesToRemove) {
966 for (HashMap.Entry<PersonaAlias, PAlias> entry : aliasesToEdit.entrySet()) {
967 ret.modifyAlias(entry.getKey(), entry.getValue().confidence, entry.getValue().justification);
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);
979 ret = currentPersona;
982 logger.log(Level.SEVERE,
"Unsupported mode: {0}", mode);
993 nameField.setText(name);
boolean addAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence)
javax.swing.JPanel detailsPanel
javax.swing.JButton addAliasBtn
void updateAccountsTable()
javax.swing.JButton editMetadataBtn
void updateAliasesTable()
Collection< PersonaAccount > getPersonaAccounts()
javax.swing.JTable casesTable
javax.swing.JButton addMetadataBtn
javax.swing.JTextField nameField
Persona.Confidence getConfidence()
void setName(String name)
javax.swing.JLabel creationDateLbl
Persona.Confidence getConfidence()
void loadPersona(Component parent, Persona persona)
javax.swing.JScrollPane accountsTablePane
CentralRepoExaminer getOrInsertExaminer(String examinerLoginName)
PersonaDetailsTableModel metadataModel
javax.swing.JButton deleteAliasBtn
CentralRepoExaminer getExaminer()
String getJustification()
javax.swing.JButton addAccountBtn
Collection< PersonaAlias > getAliases()
javax.swing.JLabel casesLbl
Collection< CorrelationCase > getCases()
PersonaDetailsTableModel aliasesModel
javax.swing.JLabel commentLbl
void handleSelectionChange(ListSelectionEvent e, JButton editBtn, JButton deleteBtn, JTable table)
javax.swing.JLabel aliasesLabel
void setComment(String comment)
javax.swing.JButton deleteMetadataBtn
javax.swing.JTable aliasesTable
javax.swing.JLabel accountsLbl
javax.swing.JScrollPane casesTablePane
javax.swing.JLabel examinerLbl
void updateMetadataTable()
PersonaDetailsTableModel accountsModel
String getJustification()
javax.swing.JTextField creationDateField
javax.swing.JScrollPane aliasesTablePane
javax.swing.JButton editAliasBtn
javax.swing.JButton editAccountBtn
javax.swing.JTable accountsTable
void setPersonaName(String name)
PersonaDetailsTableModel casesModel
synchronized static Logger getLogger(String name)
javax.swing.JLabel metadataLabel
CentralRepoAccount getAccount()
javax.swing.JButton deleteAccountBtn
javax.swing.JScrollPane metadataTablePane
javax.swing.JTextField examinerField
javax.swing.JTextField commentField
javax.swing.JLabel nameLbl
static CentralRepository getInstance()
Collection< PersonaMetadata > getMetadata()
static String getDefaultName()
javax.swing.JTable metadataTable