From 34c48f67e178d602e4011c1633784c6696d70a0e Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Wed, 20 May 2020 12:43:50 -0400 Subject: [PATCH 1/3] 6380 Groundwork for persona editing / creating, viewing functional --- .../datamodel/Bundle.properties-MERGED | 1 + .../centralrepository/datamodel/Persona.java | 11 +- .../persona/AddAccountDialog.form | 104 ++++ .../persona/AddAccountDialog.java | 209 +++++++ .../persona/Bundle.properties | 30 + .../persona/Bundle.properties-MERGED | 44 ++ .../persona/Bundle_ja.properties | 2 + .../persona/OpenPersonaManagerAction.java} | 25 +- .../persona/PersonaDetailsMode.java | 27 + .../persona/PersonaDetailsPanel.form | 350 +++++++++++ .../persona/PersonaDetailsPanel.java | 572 ++++++++++++++++++ .../persona/PersonaManagerTopComponent.form | 225 +++++++ .../persona/PersonaManagerTopComponent.java | 312 ++++++++++ .../autopsy/persona/Bundle.properties | 15 - .../autopsy/persona/Bundle.properties-MERGED | 5 - .../persona/PersonaDetailsTopComponent.form | 230 ------- .../persona/PersonaDetailsTopComponent.java | 209 ------- .../persona/PersonaSearchTopComponent.form | 178 ------ .../persona/PersonaSearchTopComponent.java | 217 ------- 19 files changed, 1898 insertions(+), 868 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/AddAccountDialog.form create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/AddAccountDialog.java create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle_ja.properties rename Core/src/org/sleuthkit/autopsy/{persona/OpenPersonasAction.java => centralrepository/persona/OpenPersonaManagerAction.java} (74%) create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsMode.java create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.form create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java delete mode 100644 Core/src/org/sleuthkit/autopsy/persona/Bundle.properties delete mode 100644 Core/src/org/sleuthkit/autopsy/persona/Bundle.properties-MERGED delete mode 100644 Core/src/org/sleuthkit/autopsy/persona/PersonaDetailsTopComponent.form delete mode 100644 Core/src/org/sleuthkit/autopsy/persona/PersonaDetailsTopComponent.java delete mode 100644 Core/src/org/sleuthkit/autopsy/persona/PersonaSearchTopComponent.form delete mode 100644 Core/src/org/sleuthkit/autopsy/persona/PersonaSearchTopComponent.java 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 fd4e26eca2..43049d4eff 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; @@ -213,7 +216,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 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..cefa90d017 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java @@ -0,0 +1,572 @@ +/* + * 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.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 PersonaDetailsMode mode; + + private Persona currentPersona; + private String currentName = null; + private ArrayList currentAccounts = null; + private ArrayList currentMetadata = null; + private ArrayList currentAliases = null; + private ArrayList currentCases = null; + + // Creation + private PersonaDetailsTableModel accountsModel; + private PersonaDetailsTableModel metadataModel; + private PersonaDetailsTableModel aliasesModel; + private PersonaDetailsTableModel casesModel; + + private static final Logger logger = Logger.getLogger(PersonaDetailsPanel.class.getName()); + + @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; + } + 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 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.resultsTable.columnModel.title0" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> + + + + + + + <ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.resultsTable.columnModel.title1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..77bdd72254 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java @@ -0,0 +1,312 @@ +/* + * 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.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 ArrayList 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(PersonaManagerTopComponent.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 @@ - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.filterResultsTable.columnModel.title0" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> - - - - - - - <ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.filterResultsTable.columnModel.title1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> - - - - - - - - - - - - - - - - - - - - - - - -
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 - -} From 9b263c439990b1411236d3a3b3aaa388a4bd5954 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Wed, 20 May 2020 12:55:50 -0400 Subject: [PATCH 2/3] 6380 Codacy 1 --- .../persona/PersonaDetailsPanel.java | 11 +++++++---- .../persona/PersonaManagerTopComponent.java | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java index cefa90d017..f6a9a462b3 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java @@ -24,6 +24,7 @@ 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; @@ -55,10 +56,10 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { private Persona currentPersona; private String currentName = null; - private ArrayList currentAccounts = null; - private ArrayList currentMetadata = null; - private ArrayList currentAliases = null; - private ArrayList currentCases = null; + private List currentAccounts; + private List currentMetadata; + private List currentAliases; + private List currentCases; // Creation private PersonaDetailsTableModel accountsModel; @@ -566,6 +567,8 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { case VIEW: loadPersona(parent, persona); break; + default: + logger.log(Level.WARNING, "Unsupported mode: {0}", mode); } initializeFields(); } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java index 77bdd72254..461feb2e1e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java @@ -154,7 +154,7 @@ public final class PersonaManagerTopComponent extends TopComponent { results = Persona.getPersonaByName(searchField.getText()); } catch (CentralRepoException ex) { logger.log(Level.SEVERE, "Failed to search personas", ex); - JOptionPane.showMessageDialog(PersonaManagerTopComponent.this, + JOptionPane.showMessageDialog(this, Bundle.PMTopComponent_search_exception_Title(), Bundle.PMTopComponent_search_exception_msg(), JOptionPane.ERROR_MESSAGE); From a711cd5bd924d727cc355ab97ecfb7f9b67e9b7b Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Wed, 20 May 2020 13:10:59 -0400 Subject: [PATCH 3/3] 6380 Codacy 2 --- .../centralrepository/persona/PersonaDetailsPanel.java | 6 +++++- .../persona/PersonaManagerTopComponent.java | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java index f6a9a462b3..084218fe30 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java @@ -51,6 +51,10 @@ import org.sleuthkit.autopsy.coreutils.Logger; @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; @@ -67,7 +71,6 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { private PersonaDetailsTableModel aliasesModel; private PersonaDetailsTableModel casesModel; - private static final Logger logger = Logger.getLogger(PersonaDetailsPanel.class.getName()); @Messages({ "PersonaDetailsPanel_NameEdit=Edit Persona", @@ -569,6 +572,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { break; default: logger.log(Level.WARNING, "Unsupported mode: {0}", mode); + break; } initializeFields(); } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java index 461feb2e1e..69b4fdf494 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java @@ -22,6 +22,7 @@ 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; @@ -49,7 +50,7 @@ public final class PersonaManagerTopComponent extends TopComponent { private static final Logger logger = Logger.getLogger(PersonaManagerTopComponent.class.getName()); - private ArrayList currentResults = null; + private List currentResults = null; private Persona selectedPersona = null; @Messages({