diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Bundle.properties-MERGED
index 44f4462515..ca1cd14877 100755
--- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Bundle.properties-MERGED
@@ -44,6 +44,7 @@ EamDbUtil.centralRepoConnectionFailed.message=Unable to connect to Central Repos
EamDbUtil.centralRepoDisabled.message=\ The Central Repository has been disabled.
EamDbUtil.centralRepoUpgradeFailed.message=Failed to upgrade Central Repository.
EamDbUtil.exclusiveLockAquisitionFailure.message=Unable to acquire exclusive lock for Central Repository.
+Persona.defaultName=Unnamed
PostgresEamDb.centralRepoDisabled.message=Central Repository module is not enabled.
PostgresEamDb.connectionFailed.message=Error getting connection to database.
PostgresEamDb.multiUserLockError.message=Error acquiring database lock
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java
index 72a5cf2a0a..2c48021400 100644
--- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java
@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.Objects;
import java.util.UUID;
import org.apache.commons.lang3.StringUtils;
+import org.openide.util.NbBundle;
import org.sleuthkit.datamodel.SleuthkitCase;
/**
@@ -114,9 +115,6 @@ public class Persona {
}
}
- // Persona name to use if no name is specified.
- private static final String DEFAULT_PERSONA_NAME = "Unknown";
-
// primary key in the Personas table in CR database
private final long id;
private final String uuidStr;
@@ -126,6 +124,11 @@ public class Persona {
private final long modifiedDate;
private final PersonaStatus status;
private final CentralRepoExaminer examiner;
+
+ @NbBundle.Messages("Persona.defaultName=Unnamed")
+ public static String getDefaultName() {
+ return Bundle.Persona_defaultName();
+ }
public long getId() {
return id;
@@ -240,7 +243,7 @@ public class Persona {
String insertClause = " INTO personas (uuid, comment, name, created_date, modified_date, status_id, examiner_id ) "
+ "VALUES ( '" + uuidStr + "', "
+ "'" + ((StringUtils.isBlank(comment) ? "" : SleuthkitCase.escapeSingleQuotes(comment))) + "',"
- + "'" + ((StringUtils.isBlank(name) ? DEFAULT_PERSONA_NAME : SleuthkitCase.escapeSingleQuotes(name))) + "',"
+ + "'" + ((StringUtils.isBlank(name) ? getDefaultName() : SleuthkitCase.escapeSingleQuotes(name))) + "',"
+ timeStampMillis.toString() + ","
+ timeStampMillis.toString() + ","
+ status.getStatusId() + ","
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/AddAccountDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/AddAccountDialog.form
new file mode 100644
index 0000000000..c4202464ae
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/AddAccountDialog.form
@@ -0,0 +1,104 @@
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/AddAccountDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/AddAccountDialog.java
new file mode 100644
index 0000000000..2d9983a049
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/AddAccountDialog.java
@@ -0,0 +1,209 @@
+/*
+ * Central Repository
+ *
+ * Copyright 2020 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.centralrepository.persona;
+
+import java.awt.Component;
+import java.io.Serializable;
+import java.util.logging.Level;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.ListCellRenderer;
+import org.openide.util.NbBundle.Messages;
+import org.openide.windows.WindowManager;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount.CentralRepoAccountType;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+/**
+ * Configuration dialog for adding an account to a persona.
+ */
+@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
+public class AddAccountDialog extends JDialog {
+
+ private static final Logger logger = Logger.getLogger(AddAccountDialog.class.getName());
+
+ private static final long serialVersionUID = 1L;
+
+ private final TypeChoiceRenderer TYPE_CHOICE_RENDERER = new TypeChoiceRenderer();
+ private final PersonaDetailsPanel pdp;
+
+ /**
+ * Creates new add account dialog
+ */
+ @Messages({"AddAccountDialog.title.text=Add Account",})
+ public AddAccountDialog(PersonaDetailsPanel pdp) {
+ super((JFrame) WindowManager.getDefault().getMainWindow(),
+ Bundle.AddAccountDialog_title_text(),
+ true);
+ this.pdp = pdp;
+
+ initComponents();
+ //typeComboBox.setRenderer(TYPE_CHOICE_RENDERER);
+ display();
+ }
+
+ /**
+ * This class handles displaying and rendering drop down menu for account type choices
+ */
+ private class TypeChoiceRenderer extends JLabel implements ListCellRenderer, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Component getListCellRendererComponent(
+ JList extends CentralRepoAccountType> list, CentralRepoAccountType value,
+ int index, boolean isSelected, boolean cellHasFocus) {
+ setText(value.getAcctType().getDisplayName());
+ return this;
+ }
+ }
+
+ @Messages({
+ "AddAccountDialog_get_types_exception_Title=Central Repository failure",
+ "AddAccountDialog_get_types_exception_msg=Failed to access central repository",
+ })
+ private CentralRepoAccountType[] getAllAccountTypes() {
+ CentralRepoAccountType[] ret = new CentralRepoAccountType[0];
+ try {
+ ret = CentralRepository.getInstance().getAllAccountTypes().toArray(new CentralRepoAccountType[0]);
+ } catch (CentralRepoException e) {
+ logger.log(Level.SEVERE, "Failed to access central repository", e);
+ JOptionPane.showMessageDialog(this,
+ Bundle.AddAccountDialog_get_types_exception_Title(),
+ Bundle.AddAccountDialog_get_types_exception_msg(),
+ JOptionPane.ERROR_MESSAGE);
+ }
+ return ret;
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ settingsPanel = new javax.swing.JPanel();
+ cancelBtn = new javax.swing.JButton();
+ okBtn = new javax.swing.JButton();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+ setResizable(false);
+
+ settingsPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
+
+ javax.swing.GroupLayout settingsPanelLayout = new javax.swing.GroupLayout(settingsPanel);
+ settingsPanel.setLayout(settingsPanelLayout);
+ settingsPanelLayout.setHorizontalGroup(
+ settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 492, Short.MAX_VALUE)
+ );
+ settingsPanelLayout.setVerticalGroup(
+ settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 213, Short.MAX_VALUE)
+ );
+
+ org.openide.awt.Mnemonics.setLocalizedText(cancelBtn, org.openide.util.NbBundle.getMessage(AddAccountDialog.class, "AddAccountDialog.cancelBtn.text")); // NOI18N
+ cancelBtn.setMaximumSize(new java.awt.Dimension(79, 23));
+ cancelBtn.setMinimumSize(new java.awt.Dimension(79, 23));
+ cancelBtn.setPreferredSize(new java.awt.Dimension(79, 23));
+ cancelBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cancelBtnActionPerformed(evt);
+ }
+ });
+
+ org.openide.awt.Mnemonics.setLocalizedText(okBtn, org.openide.util.NbBundle.getMessage(AddAccountDialog.class, "AddAccountDialog.okBtn.text")); // NOI18N
+ okBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ okBtnActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addGap(0, 0, Short.MAX_VALUE)
+ .addComponent(okBtn)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(cancelBtn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(3, 3, 3))
+ .addComponent(settingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ );
+
+ layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {cancelBtn, okBtn});
+
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(settingsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(okBtn)
+ .addComponent(cancelBtn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addContainerGap())
+ );
+
+ pack();
+ }// //GEN-END:initComponents
+
+ private void display() {
+ this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
+ setVisible(true);
+ }
+
+ @Messages({
+ "AddAccountDialog_validate_id_failure_title=Account ID issue",
+ "AddAccountDialog_validate_id_failure=Account ID must not be empty",
+ })
+ private boolean validateFields() {
+ /*if (idTextField.getText().isEmpty()) {
+ JOptionPane.showMessageDialog(this,
+ Bundle.AddAccountDialog_validate_id_failure(),
+ Bundle.AddAccountDialog_validate_id_failure_title(),
+ JOptionPane.WARNING_MESSAGE);
+ }*/
+
+ return true;
+ }
+
+ private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed
+ if (validateFields()) {
+ dispose();
+ }
+ }//GEN-LAST:event_okBtnActionPerformed
+
+ private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed
+ dispose();
+ }//GEN-LAST:event_cancelBtnActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton cancelBtn;
+ private javax.swing.JButton okBtn;
+ private javax.swing.JPanel settingsPanel;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties
new file mode 100644
index 0000000000..606544d405
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties
@@ -0,0 +1,30 @@
+CTL_OpenPersonaManager=Persona Manager
+CTL_PersonaManagerTopComponentAction=Persona Manager
+CTL_PersonaDetailsTopComponent=Persona Details
+PersonaManagerTopComponent.createBtn.text=Create New
+PersonaManagerTopComponent.searchBtn.text=Search
+PersonaManagerTopComponent.resultsTable.columnModel.title1=Name
+PersonaManagerTopComponent.resultsTable.columnModel.title0=ID
+PersonaManagerTopComponent.resultsTable.toolTipText=
+PersonaManagerTopComponent.searchAccountRadio.text=Account
+PersonaManagerTopComponent.searchNameRadio.text=Name
+PersonaManagerTopComponent.searchField.text=
+PersonaDetailsPanel.deleteMetadataBtn.text=Delete
+PersonaDetailsPanel.addMetadataBtn.text=Add
+PersonaDetailsPanel.metadataLabel.text=Metadata:
+PersonaDetailsPanel.deleteAccountBtn.text=Delete
+PersonaDetailsPanel.addAccountBtn.text=Add
+PersonaDetailsPanel.accountsLbl.text=Accounts:
+PersonaDetailsPanel.nameField.text=
+PersonaDetailsPanel.saveBtn.toolTipText=
+PersonaDetailsPanel.saveBtn.text=Save Changes
+PersonaDetailsPanel.nameLbl.text=Name:
+PersonaDetailsPanel.deleteCaseBtn.text=Delete
+PersonaDetailsPanel.addCaseBtn.text=Add
+PersonaDetailsPanel.casesLbl.text=Cases found in:
+PersonaDetailsPanel.deleteAliasBtn.text=Delete
+PersonaDetailsPanel.addAliasBtn.text=Add
+PersonaDetailsPanel.aliasesLabel.text=Aliases:
+AddAccountDialog.cancelBtn.text=Cancel
+AddAccountDialog.okBtn.text=OK
+PersonaManagerTopComponent.editBtn.text=Edit
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED
new file mode 100644
index 0000000000..2258c7df21
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED
@@ -0,0 +1,44 @@
+AddAccountDialog.title.text=Add Account
+AddAccountDialog_get_types_exception_msg=Failed to access central repository
+AddAccountDialog_get_types_exception_Title=Central Repository failure
+AddAccountDialog_validate_id_failure=Account ID must not be empty
+AddAccountDialog_validate_id_failure_title=Account ID issue
+CTL_OpenPersonaManager=Persona Manager
+CTL_PersonaManagerTopComponentAction=Persona Manager
+CTL_PersonaDetailsTopComponent=Persona Details
+OpenPersonasAction.displayName=Persona Manager
+PersonaDetailsPanel_load_exception_msg=Failed to load persona
+PersonaDetailsPanel_load_exception_Title=Initialization failure
+PersonaDetailsPanel_NameCreate=Create Persona
+PersonaDetailsPanel_NameEdit=Edit Persona
+PersonaDetailsPanel_NameView=View Persona
+PersonaManagerTopComponent.createBtn.text=Create New
+PersonaManagerTopComponent.searchBtn.text=Search
+PersonaManagerTopComponent.resultsTable.columnModel.title1=Name
+PersonaManagerTopComponent.resultsTable.columnModel.title0=ID
+PersonaManagerTopComponent.resultsTable.toolTipText=
+PersonaManagerTopComponent.searchAccountRadio.text=Account
+PersonaManagerTopComponent.searchNameRadio.text=Name
+PersonaManagerTopComponent.searchField.text=
+PersonaDetailsPanel.deleteMetadataBtn.text=Delete
+PersonaDetailsPanel.addMetadataBtn.text=Add
+PersonaDetailsPanel.metadataLabel.text=Metadata:
+PersonaDetailsPanel.deleteAccountBtn.text=Delete
+PersonaDetailsPanel.addAccountBtn.text=Add
+PersonaDetailsPanel.accountsLbl.text=Accounts:
+PersonaDetailsPanel.nameField.text=
+PersonaDetailsPanel.saveBtn.toolTipText=
+PersonaDetailsPanel.saveBtn.text=Save Changes
+PersonaDetailsPanel.nameLbl.text=Name:
+PersonaDetailsPanel.deleteCaseBtn.text=Delete
+PersonaDetailsPanel.addCaseBtn.text=Add
+PersonaDetailsPanel.casesLbl.text=Cases found in:
+PersonaDetailsPanel.deleteAliasBtn.text=Delete
+PersonaDetailsPanel.addAliasBtn.text=Add
+PersonaDetailsPanel.aliasesLabel.text=Aliases:
+AddAccountDialog.cancelBtn.text=Cancel
+AddAccountDialog.okBtn.text=OK
+PersonaManagerTopComponent.editBtn.text=Edit
+PMTopComponent_Name=Persona Manager
+PMTopComponent_search_exception_msg=Failed to search personas
+PMTopComponent_search_exception_Title=Search failure
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle_ja.properties
new file mode 100644
index 0000000000..cda1aa22b6
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle_ja.properties
@@ -0,0 +1,2 @@
+AddAccountDialog.cancelBtn.text=\u53d6\u308a\u6d88\u3057
+AddAccountDialog.okBtn.text=OK
diff --git a/Core/src/org/sleuthkit/autopsy/persona/OpenPersonasAction.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/OpenPersonaManagerAction.java
similarity index 74%
rename from Core/src/org/sleuthkit/autopsy/persona/OpenPersonasAction.java
rename to Core/src/org/sleuthkit/autopsy/centralrepository/persona/OpenPersonaManagerAction.java
index 157b25d1cc..9d40eeb357 100644
--- a/Core/src/org/sleuthkit/autopsy/persona/OpenPersonasAction.java
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/OpenPersonaManagerAction.java
@@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.sleuthkit.autopsy.persona;
+package org.sleuthkit.autopsy.centralrepository.persona;
import javax.swing.JMenuItem;
import org.openide.awt.ActionID;
@@ -28,33 +28,33 @@ import org.openide.util.NbBundle;
import org.openide.util.actions.CallableSystemAction;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
/**
- * An Action that opens the Personas window.
+ * An Action that opens the Persona Search window.
*/
-@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.persona.Personas")
-@ActionRegistration(displayName = "#CTL_OpenPersonas", lazy = false)
+@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.centralrepository.persona.OpenPersonaManagerAction")
+@ActionRegistration(displayName = "#CTL_OpenPersonaManager", lazy = false)
@ActionReferences(value = {
@ActionReference(path = "Menu/Tools", position = 105)
})
-public final class OpenPersonasAction extends CallableSystemAction {
+public final class OpenPersonaManagerAction extends CallableSystemAction {
private static final long serialVersionUID = 1L;
private final JMenuItem menuItem;
-
- public OpenPersonasAction() {
+ public OpenPersonaManagerAction() {
menuItem = super.getMenuPresenter();
- this.setEnabled(true);
+ this.setEnabled(CentralRepository.isEnabled());
}
@Override
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
public void performAction() {
- final TopComponent topComponent = WindowManager.getDefault().findTopComponent("PersonasTopComponent");
+ final TopComponent topComponent = WindowManager.getDefault().findTopComponent("PersonaManagerTopComponent");
if (topComponent != null) {
if (topComponent.isOpened() == false) {
topComponent.open();
@@ -65,7 +65,7 @@ public final class OpenPersonasAction extends CallableSystemAction {
}
@Override
- @NbBundle.Messages("OpenPersonasAction.displayName=Personas")
+ @NbBundle.Messages("OpenPersonasAction.displayName=Persona Manager")
public String getName() {
return Bundle.OpenPersonasAction_displayName();
}
@@ -85,6 +85,11 @@ public final class OpenPersonasAction extends CallableSystemAction {
super.setEnabled(enable);
menuItem.setEnabled(enable);
}
+
+ @Override
+ public boolean isEnabled() {
+ return CentralRepository.isEnabled();
+ }
@Override
public JMenuItem getMenuPresenter() {
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsMode.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsMode.java
new file mode 100644
index 0000000000..646c666b15
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsMode.java
@@ -0,0 +1,27 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2020 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.centralrepository.persona;
+
+/**
+ * An enum that represents the mode for the persona details panel
+ */
+
+public enum PersonaDetailsMode {
+ CREATE, VIEW, EDIT
+}
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form
new file mode 100644
index 0000000000..d1661c98c5
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form
@@ -0,0 +1,350 @@
+
+
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java
new file mode 100644
index 0000000000..084218fe30
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java
@@ -0,0 +1,579 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2020 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.centralrepository.persona;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import javax.swing.JOptionPane;
+import javax.swing.JTable;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableModel;
+import org.openide.windows.TopComponent;
+import org.openide.util.NbBundle.Messages;
+import org.openide.windows.RetainLocation;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
+import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
+import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAccount;
+import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAlias;
+import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaMetadata;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+/**
+ * JPanel for persona details
+ */
+@TopComponent.Description(preferredID = "PersonaDetailsTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
+@TopComponent.Registration(mode = "personadetails", openAtStartup = false)
+@RetainLocation("personadetails")
+@SuppressWarnings("PMD.SingularField")
+public final class PersonaDetailsPanel extends javax.swing.JPanel {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Logger logger = Logger.getLogger(PersonaDetailsPanel.class.getName());
+
+ private PersonaDetailsMode mode;
+
+ private Persona currentPersona;
+ private String currentName = null;
+ private List currentAccounts;
+ private List currentMetadata;
+ private List currentAliases;
+ private List currentCases;
+
+ // Creation
+ private PersonaDetailsTableModel accountsModel;
+ private PersonaDetailsTableModel metadataModel;
+ private PersonaDetailsTableModel aliasesModel;
+ private PersonaDetailsTableModel casesModel;
+
+
+ @Messages({
+ "PersonaDetailsPanel_NameEdit=Edit Persona",
+ "PersonaDetailsPanel_NameCreate=Create Persona",
+ "PersonaDetailsPanel_NameView=View Persona",})
+ public PersonaDetailsPanel() {
+ initComponents();
+
+ addAccountBtn.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ showAddAccountDialog();
+ }
+ });
+
+ addAliasBtn.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ addAlias();
+ }
+ });
+
+ deleteAliasBtn.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ deleteAlias();
+ }
+ });
+
+ aliasesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(ListSelectionEvent e) {
+ handleAliasListSelectionChange(e);
+ }
+ });
+
+ saveBtn.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ savePressed();
+ }
+ });
+ }
+
+ private void showAddAccountDialog() {
+ AddAccountDialog dialog = new AddAccountDialog(this);
+ }
+
+ private void addAlias() {
+ aliasesModel.addRow(new String[]{""});
+ }
+
+ private void deleteAlias() {
+ int idx = aliasesTable.getSelectedRow();
+ if (idx != -1) {
+ aliasesModel.removeRow(idx);
+ }
+ deleteAliasBtn.setEnabled(false);
+ }
+
+ private void handleAliasListSelectionChange(ListSelectionEvent e) {
+ if (e.getValueIsAdjusting()) {
+ return;
+ }
+ deleteAliasBtn.setEnabled(true);
+ }
+
+ private void savePressed() {
+ //todo handle
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ detailsPanel = new javax.swing.JPanel();
+ nameLbl = new javax.swing.JLabel();
+ nameField = new javax.swing.JTextField();
+ accountsLbl = new javax.swing.JLabel();
+ accountsTablePane = new javax.swing.JScrollPane();
+ accountsTable = new javax.swing.JTable();
+ addAccountBtn = new javax.swing.JButton();
+ deleteAccountBtn = new javax.swing.JButton();
+ metadataLabel = new javax.swing.JLabel();
+ metadataTablePane = new javax.swing.JScrollPane();
+ metadataTable = new javax.swing.JTable();
+ addMetadataBtn = new javax.swing.JButton();
+ deleteMetadataBtn = new javax.swing.JButton();
+ aliasesLabel = new javax.swing.JLabel();
+ aliasesTablePane = new javax.swing.JScrollPane();
+ aliasesTable = new javax.swing.JTable();
+ addAliasBtn = new javax.swing.JButton();
+ deleteAliasBtn = new javax.swing.JButton();
+ casesLbl = new javax.swing.JLabel();
+ casesTablePane = new javax.swing.JScrollPane();
+ casesTable = new javax.swing.JTable();
+ addCaseBtn = new javax.swing.JButton();
+ deleteCaseBtn = new javax.swing.JButton();
+ saveBtn = new javax.swing.JButton();
+
+ org.openide.awt.Mnemonics.setLocalizedText(nameLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameLbl.text")); // NOI18N
+
+ nameField.setEditable(false);
+ nameField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameField.text")); // NOI18N
+ nameField.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ nameFieldActionPerformed(evt);
+ }
+ });
+
+ org.openide.awt.Mnemonics.setLocalizedText(accountsLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.accountsLbl.text")); // NOI18N
+
+ accountsTable.setModel(new javax.swing.table.DefaultTableModel(
+ new Object [][] {
+ {},
+ {},
+ {},
+ {}
+ },
+ new String [] {
+
+ }
+ ));
+ accountsTablePane.setViewportView(accountsTable);
+
+ org.openide.awt.Mnemonics.setLocalizedText(addAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAccountBtn.text")); // NOI18N
+ addAccountBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(deleteAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAccountBtn.text")); // NOI18N
+ deleteAccountBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(metadataLabel, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.metadataLabel.text")); // NOI18N
+
+ metadataTable.setModel(new javax.swing.table.DefaultTableModel(
+ new Object [][] {
+ {},
+ {},
+ {},
+ {}
+ },
+ new String [] {
+
+ }
+ ));
+ metadataTablePane.setViewportView(metadataTable);
+
+ org.openide.awt.Mnemonics.setLocalizedText(addMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addMetadataBtn.text")); // NOI18N
+ addMetadataBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(deleteMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteMetadataBtn.text")); // NOI18N
+ deleteMetadataBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(aliasesLabel, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.aliasesLabel.text")); // NOI18N
+
+ aliasesTable.setModel(new javax.swing.table.DefaultTableModel(
+ new Object [][] {
+ {},
+ {},
+ {},
+ {}
+ },
+ new String [] {
+
+ }
+ ));
+ aliasesTablePane.setViewportView(aliasesTable);
+
+ org.openide.awt.Mnemonics.setLocalizedText(addAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAliasBtn.text")); // NOI18N
+ addAliasBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(deleteAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAliasBtn.text")); // NOI18N
+ deleteAliasBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(casesLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.casesLbl.text")); // NOI18N
+
+ casesTable.setModel(new javax.swing.table.DefaultTableModel(
+ new Object [][] {
+ {},
+ {},
+ {},
+ {}
+ },
+ new String [] {
+
+ }
+ ));
+ casesTablePane.setViewportView(casesTable);
+
+ org.openide.awt.Mnemonics.setLocalizedText(addCaseBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addCaseBtn.text")); // NOI18N
+ addCaseBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(deleteCaseBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteCaseBtn.text")); // NOI18N
+ deleteCaseBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(saveBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.saveBtn.text")); // NOI18N
+ saveBtn.setToolTipText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.saveBtn.toolTipText")); // NOI18N
+ saveBtn.setEnabled(false);
+
+ javax.swing.GroupLayout detailsPanelLayout = new javax.swing.GroupLayout(detailsPanel);
+ detailsPanel.setLayout(detailsPanelLayout);
+ detailsPanelLayout.setHorizontalGroup(
+ detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(detailsPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 469, Short.MAX_VALUE)
+ .addGroup(detailsPanelLayout.createSequentialGroup()
+ .addComponent(nameLbl)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(nameField))
+ .addComponent(accountsLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(metadataLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(metadataTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
+ .addComponent(aliasesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
+ .addComponent(casesLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, detailsPanelLayout.createSequentialGroup()
+ .addComponent(addCaseBtn)
+ .addGap(18, 18, 18)
+ .addComponent(deleteCaseBtn)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(saveBtn))
+ .addComponent(casesTablePane)
+ .addGroup(detailsPanelLayout.createSequentialGroup()
+ .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(detailsPanelLayout.createSequentialGroup()
+ .addComponent(addAccountBtn)
+ .addGap(18, 18, 18)
+ .addComponent(deleteAccountBtn))
+ .addGroup(detailsPanelLayout.createSequentialGroup()
+ .addComponent(addMetadataBtn)
+ .addGap(18, 18, 18)
+ .addComponent(deleteMetadataBtn))
+ .addGroup(detailsPanelLayout.createSequentialGroup()
+ .addComponent(addAliasBtn)
+ .addGap(18, 18, 18)
+ .addComponent(deleteAliasBtn)))
+ .addGap(0, 0, Short.MAX_VALUE)))
+ .addContainerGap())
+ );
+ detailsPanelLayout.setVerticalGroup(
+ detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(detailsPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(nameLbl)
+ .addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(accountsLbl)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(accountsTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(addAccountBtn)
+ .addComponent(deleteAccountBtn))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(metadataLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(metadataTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(addMetadataBtn)
+ .addComponent(deleteMetadataBtn))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(aliasesLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(addAliasBtn)
+ .addComponent(deleteAliasBtn))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(casesLbl)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(casesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(saveBtn)
+ .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(addCaseBtn)
+ .addComponent(deleteCaseBtn)))
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 481, Short.MAX_VALUE)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(detailsPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGap(0, 583, Short.MAX_VALUE)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(detailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+ }// //GEN-END:initComponents
+
+ private void nameFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nameFieldActionPerformed
+
+ }//GEN-LAST:event_nameFieldActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JLabel accountsLbl;
+ private javax.swing.JTable accountsTable;
+ private javax.swing.JScrollPane accountsTablePane;
+ private javax.swing.JButton addAccountBtn;
+ private javax.swing.JButton addAliasBtn;
+ private javax.swing.JButton addCaseBtn;
+ private javax.swing.JButton addMetadataBtn;
+ private javax.swing.JLabel aliasesLabel;
+ private javax.swing.JTable aliasesTable;
+ private javax.swing.JScrollPane aliasesTablePane;
+ private javax.swing.JLabel casesLbl;
+ private javax.swing.JTable casesTable;
+ private javax.swing.JScrollPane casesTablePane;
+ private javax.swing.JButton deleteAccountBtn;
+ private javax.swing.JButton deleteAliasBtn;
+ private javax.swing.JButton deleteCaseBtn;
+ private javax.swing.JButton deleteMetadataBtn;
+ private javax.swing.JPanel detailsPanel;
+ private javax.swing.JLabel metadataLabel;
+ private javax.swing.JTable metadataTable;
+ private javax.swing.JScrollPane metadataTablePane;
+ private javax.swing.JTextField nameField;
+ private javax.swing.JLabel nameLbl;
+ private javax.swing.JButton saveBtn;
+ // End of variables declaration//GEN-END:variables
+
+ @Messages({
+ "PersonaDetailsPanel_load_exception_Title=Initialization failure",
+ "PersonaDetailsPanel_load_exception_msg=Failed to load persona",})
+ private void loadPersona(Component parent, Persona persona) {
+ String name;
+ Collection accounts;
+ Collection metadata;
+ Collection aliases;
+ Collection cases;
+ try {
+ name = persona.getName();
+ accounts = persona.getPersonaAccounts();
+ metadata = persona.getMetadata();
+ aliases = persona.getAliases();
+ cases = persona.getCases();
+ } catch (CentralRepoException ex) {
+ logger.log(Level.SEVERE, "Failed to load persona", ex);
+ JOptionPane.showMessageDialog(parent,
+ Bundle.PersonaDetailsPanel_load_exception_Title(),
+ Bundle.PersonaDetailsPanel_load_exception_msg(),
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ this.currentPersona = persona;
+ this.currentName = name;
+ this.currentAccounts = new ArrayList<>(accounts);
+ this.currentMetadata = new ArrayList<>(metadata);
+ this.currentAliases = new ArrayList<>(aliases);
+ this.currentCases = new ArrayList<>(cases);
+ }
+
+ void clear() {
+ currentPersona = null;
+ nameField.setText("");
+ nameField.setEditable(false);
+
+ updateAccountsTable(Collections.EMPTY_LIST);
+
+ saveBtn.setEnabled(false);
+ addAccountBtn.setEnabled(false);
+ addMetadataBtn.setEnabled(false);
+ addAliasBtn.setEnabled(false);
+ addCaseBtn.setEnabled(false);
+ deleteAccountBtn.setEnabled(false);
+ deleteMetadataBtn.setEnabled(false);
+ deleteAliasBtn.setEnabled(false);
+ deleteCaseBtn.setEnabled(false);
+ }
+
+ /**
+ * Table model for persona details
+ */
+ final class PersonaDetailsTableModel extends DefaultTableModel {
+
+ private static final long serialVersionUID = 1L;
+
+ PersonaDetailsTableModel(Object[][] rows, String[] colNames) {
+ super(rows, colNames);
+ }
+
+ @Override
+ public boolean isCellEditable(int row, int column) {
+ return mode != PersonaDetailsMode.VIEW;
+ }
+ }
+
+ private void updateAccountsTable(Collection accounts) {
+ Object[][] rows = new Object[accounts.size()][2];
+ int i = 0;
+ for (PersonaAccount account : accounts) {
+ CentralRepoAccount acc = account.getAccount();
+ rows[i] = new Object[]{
+ acc.getAccountType().getAcctType().getDisplayName(),
+ acc.getTypeSpecificId()
+ };
+ i++;
+ }
+ accountsModel = new PersonaDetailsTableModel(
+ rows,
+ new String[]{"Type", "ID"}
+ );
+ accountsTable.setModel(accountsModel);
+
+ // Formatting
+ accountsTable.getColumnModel().getColumn(0).setMaxWidth(100);
+ accountsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+ }
+
+ private void updateMetadataTable(Collection metadata) {
+ Object[][] rows = new Object[metadata.size()][2];
+ int i = 0;
+ for (PersonaMetadata md : metadata) {
+ rows[i] = new Object[]{md.getName(), md.getValue()};
+ i++;
+ }
+ metadataModel = new PersonaDetailsTableModel(
+ rows,
+ new String[]{"Name", "Value"}
+ );
+ metadataTable.setModel(metadataModel);
+ }
+
+ private void updateAliasesTable(Collection aliases) {
+ Object[][] rows = new Object[aliases.size()][1];
+ int i = 0;
+ for (PersonaAlias alias : aliases) {
+ rows[i] = new Object[]{alias.getAlias()};
+ i++;
+ }
+ aliasesModel = new PersonaDetailsTableModel(
+ rows,
+ new String[]{"Alias"}
+ );
+ aliasesTable.setModel(aliasesModel);
+ }
+
+ private void updateCasesTable(Collection cases) {
+ Object[][] rows = new Object[cases.size()][1];
+ int i = 0;
+ for (CorrelationCase c : cases) {
+ rows[i] = new Object[]{c.getDisplayName()};
+ i++;
+ }
+ casesModel = new PersonaDetailsTableModel(
+ rows,
+ new String[]{"Case"}
+ );
+ casesTable.setModel(casesModel);
+ }
+
+ void enableEditUIComponents() {
+ nameField.setEditable(true);
+ addAccountBtn.setEnabled(true);
+ addMetadataBtn.setEnabled(true);
+ addAliasBtn.setEnabled(true);
+ addCaseBtn.setEnabled(true);
+ }
+
+ void initializeFields() {
+ nameField.setText(currentName);
+ updateAccountsTable(currentAccounts);
+ updateMetadataTable(currentMetadata);
+ updateAliasesTable(currentAliases);
+ updateCasesTable(currentCases);
+ }
+
+ void setMode(Component parent, PersonaDetailsMode mode, Persona persona) {
+ clear();
+ this.mode = mode;
+ switch (mode) {
+ case CREATE:
+ currentName = Persona.getDefaultName();
+ currentAccounts = new ArrayList<>();
+ currentMetadata = new ArrayList<>();
+ currentAliases = new ArrayList<>();
+ currentCases = new ArrayList<>();
+ enableEditUIComponents();
+ break;
+ case EDIT:
+ loadPersona(parent, persona);
+ enableEditUIComponents();
+ break;
+ case VIEW:
+ loadPersona(parent, persona);
+ break;
+ default:
+ logger.log(Level.WARNING, "Unsupported mode: {0}", mode);
+ break;
+ }
+ initializeFields();
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.form b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.form
new file mode 100644
index 0000000000..b750ff440f
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.form
@@ -0,0 +1,225 @@
+
+
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java
new file mode 100644
index 0000000000..69b4fdf494
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java
@@ -0,0 +1,313 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2020 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.centralrepository.persona;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import javax.swing.JOptionPane;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableModel;
+import org.openide.util.NbBundle.Messages;
+import org.openide.windows.RetainLocation;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
+import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+/**
+ * Top component for the Personas tool
+ *
+ */
+@TopComponent.Description(preferredID = "PersonaManagerTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
+@TopComponent.Registration(mode = "personamanager", openAtStartup = false)
+@RetainLocation("personamanager")
+@SuppressWarnings("PMD.SingularField")
+public final class PersonaManagerTopComponent extends TopComponent {
+
+ private static final Logger logger = Logger.getLogger(PersonaManagerTopComponent.class.getName());
+
+ private List currentResults = null;
+ private Persona selectedPersona = null;
+
+ @Messages({
+ "PMTopComponent_Name=Persona Manager"
+ })
+ public PersonaManagerTopComponent() {
+ initComponents();
+ setName(Bundle.PMTopComponent_Name());
+ executeSearch();
+
+ searchBtn.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ executeSearch();
+ }
+ });
+
+ editBtn.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ detailsPanel.setMode(PersonaManagerTopComponent.this, PersonaDetailsMode.EDIT, selectedPersona);
+ }
+ });
+
+ createBtn.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ detailsPanel.setMode(PersonaManagerTopComponent.this, PersonaDetailsMode.CREATE, null);
+ resultsTable.clearSelection();
+ }
+ });
+
+ // Results table
+ resultsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ resultsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(ListSelectionEvent e) {
+ handleSelectionChange(e);
+ }
+ });
+ }
+
+ void setPersona(int index) {
+ Persona persona = currentResults.get(index);
+ selectedPersona = persona;
+ editBtn.setEnabled(true);
+ }
+
+ /**
+ * Table model for the persona search results
+ */
+ final class PersonaFilterTableModel extends DefaultTableModel {
+
+ private static final long serialVersionUID = 1L;
+
+ PersonaFilterTableModel(Object[][] rows, String[] colNames) {
+ super(rows, colNames);
+ }
+
+ @Override
+ public boolean isCellEditable(int row, int column) {
+ return false;
+ }
+ }
+
+ private void handleSelectionChange(ListSelectionEvent e) {
+ if (e.getValueIsAdjusting()) {
+ return;
+ }
+ int selectedRow = resultsTable.getSelectedRow();
+ if (selectedRow != -1) {
+ setPersona(resultsTable.getSelectedRow());
+ detailsPanel.setMode(this, PersonaDetailsMode.VIEW, selectedPersona);
+ }
+ }
+
+ private void updateResultsTable(Collection results) {
+ Object[][] rows = new Object[results.size()][2];
+ int i = 0;
+ for (Persona result : results) {
+ rows[i] = new Object[]{result.getId(), result.getName()};
+ i++;
+ }
+ PersonaFilterTableModel updatedTableModel = new PersonaFilterTableModel(
+ rows,
+ new String[]{"ID", "Name"}
+ );
+
+ resultsTable.setModel(updatedTableModel);
+ currentResults = new ArrayList<>(results);
+
+ // Formatting
+ resultsTable.getColumnModel().getColumn(0).setMaxWidth(100);
+ resultsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+ }
+
+ @Messages({
+ "PMTopComponent_search_exception_Title=Search failure",
+ "PMTopComponent_search_exception_msg=Failed to search personas",})
+ private void executeSearch() {
+ Collection results;
+ try {
+ results = Persona.getPersonaByName(searchField.getText());
+ } catch (CentralRepoException ex) {
+ logger.log(Level.SEVERE, "Failed to search personas", ex);
+ JOptionPane.showMessageDialog(this,
+ Bundle.PMTopComponent_search_exception_Title(),
+ Bundle.PMTopComponent_search_exception_msg(),
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ resultsTable.clearSelection();
+ updateResultsTable(results);
+ editBtn.setEnabled(false);
+ }
+
+ @Override
+ public void componentOpened() {
+ super.componentOpened();
+ WindowManager.getDefault().setTopComponentFloating(this, true);
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ searchButtonGroup = new javax.swing.ButtonGroup();
+ jSplitPane1 = new javax.swing.JSplitPane();
+ searchPanel = new javax.swing.JPanel();
+ searchField = new javax.swing.JTextField();
+ searchNameRadio = new javax.swing.JRadioButton();
+ searchAccountRadio = new javax.swing.JRadioButton();
+ resultsPane = new javax.swing.JScrollPane();
+ resultsTable = new javax.swing.JTable();
+ searchBtn = new javax.swing.JButton();
+ editBtn = new javax.swing.JButton();
+ createBtn = new javax.swing.JButton();
+ detailsPanel = new org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel();
+
+ setMinimumSize(new java.awt.Dimension(400, 400));
+
+ searchField.setText(org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.searchField.text")); // NOI18N
+
+ searchButtonGroup.add(searchNameRadio);
+ searchNameRadio.setSelected(true);
+ org.openide.awt.Mnemonics.setLocalizedText(searchNameRadio, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.searchNameRadio.text")); // NOI18N
+ searchNameRadio.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ searchNameRadioActionPerformed(evt);
+ }
+ });
+
+ searchButtonGroup.add(searchAccountRadio);
+ org.openide.awt.Mnemonics.setLocalizedText(searchAccountRadio, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.searchAccountRadio.text")); // NOI18N
+ searchAccountRadio.setEnabled(false);
+
+ resultsTable.setToolTipText(org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.resultsTable.toolTipText")); // NOI18N
+ resultsTable.getTableHeader().setReorderingAllowed(false);
+ resultsPane.setViewportView(resultsTable);
+ if (resultsTable.getColumnModel().getColumnCount() > 0) {
+ resultsTable.getColumnModel().getColumn(0).setMaxWidth(25);
+ resultsTable.getColumnModel().getColumn(0).setHeaderValue(org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.resultsTable.columnModel.title0")); // NOI18N
+ resultsTable.getColumnModel().getColumn(1).setHeaderValue(org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.resultsTable.columnModel.title1")); // NOI18N
+ }
+
+ org.openide.awt.Mnemonics.setLocalizedText(searchBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.searchBtn.text")); // NOI18N
+
+ org.openide.awt.Mnemonics.setLocalizedText(editBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.editBtn.text")); // NOI18N
+ editBtn.setEnabled(false);
+
+ org.openide.awt.Mnemonics.setLocalizedText(createBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.createBtn.text")); // NOI18N
+ createBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ createBtnActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout searchPanelLayout = new javax.swing.GroupLayout(searchPanel);
+ searchPanel.setLayout(searchPanelLayout);
+ searchPanelLayout.setHorizontalGroup(
+ searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(searchPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(resultsPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
+ .addComponent(searchField)
+ .addGroup(searchPanelLayout.createSequentialGroup()
+ .addComponent(searchNameRadio)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(searchAccountRadio)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(searchBtn))
+ .addGroup(searchPanelLayout.createSequentialGroup()
+ .addComponent(editBtn)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(createBtn)))
+ .addContainerGap())
+ );
+ searchPanelLayout.setVerticalGroup(
+ searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(searchPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(searchField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(searchNameRadio)
+ .addComponent(searchAccountRadio)
+ .addComponent(searchBtn))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(resultsPane, javax.swing.GroupLayout.DEFAULT_SIZE, 619, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(editBtn)
+ .addComponent(createBtn))
+ .addContainerGap())
+ );
+
+ jSplitPane1.setLeftComponent(searchPanel);
+ jSplitPane1.setRightComponent(detailsPanel);
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 675, Short.MAX_VALUE)
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jSplitPane1)
+ );
+ }// //GEN-END:initComponents
+
+ private void searchNameRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchNameRadioActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_searchNameRadioActionPerformed
+
+ private void createBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createBtnActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_createBtnActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton createBtn;
+ private org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel detailsPanel;
+ private javax.swing.JButton editBtn;
+ private javax.swing.JSplitPane jSplitPane1;
+ private javax.swing.JScrollPane resultsPane;
+ private javax.swing.JTable resultsTable;
+ private javax.swing.JRadioButton searchAccountRadio;
+ private javax.swing.JButton searchBtn;
+ private javax.swing.ButtonGroup searchButtonGroup;
+ private javax.swing.JTextField searchField;
+ private javax.swing.JRadioButton searchNameRadio;
+ private javax.swing.JPanel searchPanel;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/Core/src/org/sleuthkit/autopsy/persona/Bundle.properties b/Core/src/org/sleuthkit/autopsy/persona/Bundle.properties
deleted file mode 100644
index 508c0d1370..0000000000
--- a/Core/src/org/sleuthkit/autopsy/persona/Bundle.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-CTL_OpenPersonas=Personas
-CTL_PersonasTopComponentAction=PersonasTopComponent
-CTL_PersonasTopComponent=Personas
-PersonaDetailsTopComponent.resultNameLbl.text=Name:
-PersonaDetailsTopComponent.resultCasesLbl.text=Cases found in:
-PersonaDetailsTopComponent.resultAccountsLbl.text=Accounts:
-PersonaDetailsTopComponent.resultAliasesLbl.text=Aliases:
-PersonaDetailsTopComponent.resultNameField.text=Johnathan Dough
-PersonaSearchTopComponent.searchAccountRadio.text=Account
-PersonaSearchTopComponent.searchNameRadio.text=Name
-PersonaSearchTopComponent.searchField.text=
-PersonaSearchTopComponent.searchBtn.text=Search
-PersonaSearchTopComponent.filterResultsTable.columnModel.title1=Name
-PersonaSearchTopComponent.filterResultsTable.columnModel.title0=ID
-PersonaSearchTopComponent.filterResultsTable.toolTipText=
diff --git a/Core/src/org/sleuthkit/autopsy/persona/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/persona/Bundle.properties-MERGED
deleted file mode 100644
index 1e9b1769d2..0000000000
--- a/Core/src/org/sleuthkit/autopsy/persona/Bundle.properties-MERGED
+++ /dev/null
@@ -1,5 +0,0 @@
-CTL_OpenPersonas=Personas
-CTL_PersonasTopComponentAction=PersonasTopComponent
-CTL_PersonasTopComponent=Personas
-OpenPersonasAction.displayName=Personas
-PTopComponent_Name=Personas
diff --git a/Core/src/org/sleuthkit/autopsy/persona/PersonaDetailsTopComponent.form b/Core/src/org/sleuthkit/autopsy/persona/PersonaDetailsTopComponent.form
deleted file mode 100644
index fbfd7ded76..0000000000
--- a/Core/src/org/sleuthkit/autopsy/persona/PersonaDetailsTopComponent.form
+++ /dev/null
@@ -1,230 +0,0 @@
-
-
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/persona/PersonaDetailsTopComponent.java b/Core/src/org/sleuthkit/autopsy/persona/PersonaDetailsTopComponent.java
deleted file mode 100644
index fdc0af6e0d..0000000000
--- a/Core/src/org/sleuthkit/autopsy/persona/PersonaDetailsTopComponent.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2020 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.persona;
-
-import org.openide.windows.TopComponent;
-import org.openide.util.NbBundle.Messages;
-import org.openide.windows.RetainLocation;
-import org.openide.windows.WindowManager;
-
-/**
- * Top component for persona details
- */
-@TopComponent.Description(preferredID = "PersonasTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
-@TopComponent.Registration(mode = "personadetails", openAtStartup = false)
-@RetainLocation("personadetails")
-@SuppressWarnings("PMD.SingularField")
-public final class PersonaDetailsTopComponent extends TopComponent {
-
- @Messages({
- "PDTopComponent_Name=Persona Details"
- })
- public PersonaDetailsTopComponent() {
- initComponents();
- setName(Bundle.PDTopComponent_Name());
- }
-
- /**
- * This method is called from within the constructor to initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is always
- * regenerated by the Form Editor.
- */
- // //GEN-BEGIN:initComponents
- private void initComponents() {
-
- detailsPanel = new javax.swing.JPanel();
- resultNameLbl = new javax.swing.JLabel();
- resultNameField = new javax.swing.JTextField();
- resultAliasesLbl = new javax.swing.JLabel();
- resultAccountsLbl = new javax.swing.JLabel();
- accountsTablePane = new javax.swing.JScrollPane();
- accountsTable = new javax.swing.JTable();
- resultCasesLbl = new javax.swing.JLabel();
- casesListPane = new javax.swing.JScrollPane();
- casesList = new javax.swing.JList<>();
- aliasesListPane = new javax.swing.JScrollPane();
- aliasesList = new javax.swing.JList<>();
-
- org.openide.awt.Mnemonics.setLocalizedText(resultNameLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultNameLbl.text")); // NOI18N
-
- resultNameField.setEditable(false);
- resultNameField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultNameField.text")); // NOI18N
- resultNameField.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- resultNameFieldActionPerformed(evt);
- }
- });
-
- org.openide.awt.Mnemonics.setLocalizedText(resultAliasesLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultAliasesLbl.text")); // NOI18N
-
- org.openide.awt.Mnemonics.setLocalizedText(resultAccountsLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultAccountsLbl.text")); // NOI18N
-
- accountsTable.setModel(new javax.swing.table.DefaultTableModel(
- new Object [][] {
- {"Email", "jdb@yahoo.com"},
- {"Phone", "865-555-5555"},
- {"Twitter", "@jd93.bread"},
- {null, null}
- },
- new String [] {
- "Type", "Data"
- }
- ) {
- Class[] types = new Class [] {
- java.lang.String.class, java.lang.String.class
- };
- boolean[] canEdit = new boolean [] {
- false, false
- };
-
- public Class getColumnClass(int columnIndex) {
- return types [columnIndex];
- }
-
- public boolean isCellEditable(int rowIndex, int columnIndex) {
- return canEdit [columnIndex];
- }
- });
- accountsTablePane.setViewportView(accountsTable);
-
- org.openide.awt.Mnemonics.setLocalizedText(resultCasesLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultCasesLbl.text")); // NOI18N
-
- casesList.setModel(new javax.swing.AbstractListModel() {
- String[] strings = { "Investigation 13", "Scene 5" };
- public int getSize() { return strings.length; }
- public String getElementAt(int i) { return strings[i]; }
- });
- casesListPane.setViewportView(casesList);
-
- aliasesList.setModel(new javax.swing.AbstractListModel() {
- String[] strings = { "J.D.", "Fred Smidge", "Ethan Roseman" };
- public int getSize() { return strings.length; }
- public String getElementAt(int i) { return strings[i]; }
- });
- aliasesListPane.setViewportView(aliasesList);
-
- javax.swing.GroupLayout detailsPanelLayout = new javax.swing.GroupLayout(detailsPanel);
- detailsPanel.setLayout(detailsPanelLayout);
- detailsPanelLayout.setHorizontalGroup(
- detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, detailsPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
- .addComponent(accountsTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
- .addComponent(aliasesListPane)
- .addComponent(casesListPane)
- .addGroup(javax.swing.GroupLayout.Alignment.LEADING, detailsPanelLayout.createSequentialGroup()
- .addComponent(resultNameLbl)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(resultNameField, javax.swing.GroupLayout.DEFAULT_SIZE, 447, Short.MAX_VALUE))
- .addComponent(resultAliasesLbl, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(resultAccountsLbl, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(resultCasesLbl, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addContainerGap())
- );
- detailsPanelLayout.setVerticalGroup(
- detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(detailsPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(resultNameLbl)
- .addComponent(resultNameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGap(18, 18, 18)
- .addComponent(resultAliasesLbl)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(aliasesListPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(resultAccountsLbl)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(accountsTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(resultCasesLbl)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(casesListPane, javax.swing.GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE)
- .addContainerGap())
- );
-
- javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
- this.setLayout(layout);
- layout.setHorizontalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 505, Short.MAX_VALUE)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addGap(0, 0, Short.MAX_VALUE)
- .addComponent(detailsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(0, 0, Short.MAX_VALUE)))
- );
- layout.setVerticalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 555, Short.MAX_VALUE)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addGap(0, 0, Short.MAX_VALUE)
- .addComponent(detailsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(0, 0, Short.MAX_VALUE)))
- );
- }// //GEN-END:initComponents
-
- private void resultNameFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resultNameFieldActionPerformed
-
- }//GEN-LAST:event_resultNameFieldActionPerformed
-
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JTable accountsTable;
- private javax.swing.JScrollPane accountsTablePane;
- private javax.swing.JList aliasesList;
- private javax.swing.JScrollPane aliasesListPane;
- private javax.swing.JList casesList;
- private javax.swing.JScrollPane casesListPane;
- private javax.swing.JPanel detailsPanel;
- private javax.swing.JLabel resultAccountsLbl;
- private javax.swing.JLabel resultAliasesLbl;
- private javax.swing.JLabel resultCasesLbl;
- private javax.swing.JTextField resultNameField;
- private javax.swing.JLabel resultNameLbl;
- // End of variables declaration//GEN-END:variables
-
- @Override
- public void componentOpened() {
- super.componentOpened();
- WindowManager.getDefault().setTopComponentFloating(this, true);
- }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/persona/PersonaSearchTopComponent.form b/Core/src/org/sleuthkit/autopsy/persona/PersonaSearchTopComponent.form
deleted file mode 100644
index ec91c8bb53..0000000000
--- a/Core/src/org/sleuthkit/autopsy/persona/PersonaSearchTopComponent.form
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/persona/PersonaSearchTopComponent.java b/Core/src/org/sleuthkit/autopsy/persona/PersonaSearchTopComponent.java
deleted file mode 100644
index 7cf22279db..0000000000
--- a/Core/src/org/sleuthkit/autopsy/persona/PersonaSearchTopComponent.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2020 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.persona;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Collection;
-import java.util.Collections;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import javax.swing.table.DefaultTableModel;
-import org.openide.util.Exceptions;
-import org.openide.util.NbBundle.Messages;
-import org.openide.windows.RetainLocation;
-import org.openide.windows.TopComponent;
-import org.openide.windows.WindowManager;
-import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
-import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
-
-/**
- * Top component for the Personas tool
- *
- */
-@TopComponent.Description(preferredID = "PersonasTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
-@TopComponent.Registration(mode = "personasearch", openAtStartup = false)
-@RetainLocation("personasearch")
-@SuppressWarnings("PMD.SingularField")
-public final class PersonaSearchTopComponent extends TopComponent {
-
- @Messages({
- "PSTopComponent_Name=Persona Search"
- })
- public PersonaSearchTopComponent() {
- initComponents();
- setName(Bundle.PSTopComponent_Name());
- executeSearch();
-
- searchBtn.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- executeSearch();
- }
- });
- }
-
- /**
- * Table model for the persona search results
- */
- final class PersonaFilterTableModel extends DefaultTableModel {
- private static final long serialVersionUID = 1L;
-
- PersonaFilterTableModel(Object[][] rows, String[] colNames) {
- super(rows, colNames);
- }
-
- @Override
- public boolean isCellEditable(int row, int column) {
- return false;
- }
- }
-
- private void updateResultsTable(Collection results) {
- Object[][] rows = new Object[results.size()][2];
- int i = 0;
- for (Persona result : results) {
- rows[i] = new String[]{String.valueOf(result.getId()), result.getName()};
- i++;
- }
- DefaultTableModel updatedTableModel = new PersonaFilterTableModel(
- rows,
- new String[]{"ID", "Name"}
- );
-
- filterResultsTable.setModel(updatedTableModel);
-
- // Formatting
- filterResultsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- filterResultsTable.getColumnModel().getColumn(0).setMaxWidth(100);
- filterResultsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
- }
-
- private void executeSearch() {
- Collection results = Collections.EMPTY_LIST;
- try {
- results = Persona.getPersonaByName(searchField.getText());
- } catch (CentralRepoException ex) {
- Exceptions.printStackTrace(ex);
- }
- updateResultsTable(results);
- }
-
- @Override
- public void componentOpened() {
- super.componentOpened();
- WindowManager.getDefault().setTopComponentFloating(this, true);
- }
-
- /**
- * This method is called from within the constructor to initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is always
- * regenerated by the Form Editor.
- */
- // //GEN-BEGIN:initComponents
- private void initComponents() {
-
- searchButtonGroup = new javax.swing.ButtonGroup();
- searchPanel = new javax.swing.JPanel();
- searchField = new javax.swing.JTextField();
- searchNameRadio = new javax.swing.JRadioButton();
- searchAccountRadio = new javax.swing.JRadioButton();
- filterResultsPane = new javax.swing.JScrollPane();
- filterResultsTable = new javax.swing.JTable();
- searchBtn = new javax.swing.JButton();
-
- setMinimumSize(new java.awt.Dimension(400, 400));
-
- searchField.setText(org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.searchField.text")); // NOI18N
-
- searchButtonGroup.add(searchNameRadio);
- searchNameRadio.setSelected(true);
- org.openide.awt.Mnemonics.setLocalizedText(searchNameRadio, org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.searchNameRadio.text")); // NOI18N
- searchNameRadio.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- searchNameRadioActionPerformed(evt);
- }
- });
-
- searchButtonGroup.add(searchAccountRadio);
- org.openide.awt.Mnemonics.setLocalizedText(searchAccountRadio, org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.searchAccountRadio.text")); // NOI18N
-
- filterResultsTable.setToolTipText(org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.filterResultsTable.toolTipText")); // NOI18N
- filterResultsTable.getTableHeader().setReorderingAllowed(false);
- filterResultsPane.setViewportView(filterResultsTable);
- if (filterResultsTable.getColumnModel().getColumnCount() > 0) {
- filterResultsTable.getColumnModel().getColumn(0).setMaxWidth(25);
- filterResultsTable.getColumnModel().getColumn(0).setHeaderValue(org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.filterResultsTable.columnModel.title0")); // NOI18N
- filterResultsTable.getColumnModel().getColumn(1).setHeaderValue(org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.filterResultsTable.columnModel.title1")); // NOI18N
- }
-
- org.openide.awt.Mnemonics.setLocalizedText(searchBtn, org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.searchBtn.text")); // NOI18N
-
- javax.swing.GroupLayout searchPanelLayout = new javax.swing.GroupLayout(searchPanel);
- searchPanel.setLayout(searchPanelLayout);
- searchPanelLayout.setHorizontalGroup(
- searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(searchPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(filterResultsPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
- .addComponent(searchField)
- .addGroup(searchPanelLayout.createSequentialGroup()
- .addComponent(searchNameRadio)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(searchAccountRadio)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 155, Short.MAX_VALUE)
- .addComponent(searchBtn)))
- .addContainerGap())
- );
- searchPanelLayout.setVerticalGroup(
- searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(searchPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addComponent(searchField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(searchNameRadio)
- .addComponent(searchAccountRadio)
- .addComponent(searchBtn))
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(filterResultsPane, javax.swing.GroupLayout.DEFAULT_SIZE, 320, Short.MAX_VALUE)
- .addContainerGap())
- );
-
- javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
- this.setLayout(layout);
- layout.setHorizontalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(searchPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- );
- layout.setVerticalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(searchPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- );
- }// //GEN-END:initComponents
-
- private void searchNameRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchNameRadioActionPerformed
- // TODO add your handling code here:
- }//GEN-LAST:event_searchNameRadioActionPerformed
-
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JScrollPane filterResultsPane;
- private javax.swing.JTable filterResultsTable;
- private javax.swing.JRadioButton searchAccountRadio;
- private javax.swing.JButton searchBtn;
- private javax.swing.ButtonGroup searchButtonGroup;
- private javax.swing.JTextField searchField;
- private javax.swing.JRadioButton searchNameRadio;
- private javax.swing.JPanel searchPanel;
- // End of variables declaration//GEN-END:variables
-
-}