diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java index d5cd52c093..b0184e2991 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java @@ -394,6 +394,34 @@ public class Persona { return queryCallback.getPersonas(); } + /** + * Gets the rows from the Personas table where persona accounts' names are + * similar to the given one. Persona marked as DELETED are not returned. + * + * @param partialName Name substring to match. + * @return Collection of personas matching the given name substring, may be + * empty if no match is found. + * + * @throws CentralRepoException If there is an error in querying the + * Personas table. + */ + public static Collection getPersonaByAccountIdentifierLike(String partialName) throws CentralRepoException { + String queryClause = "SELECT DISTINCT accounts.id as a_id," + + "p.id, p.uuid, p.name, p.comment, p.created_date, p.modified_date, p.status_id, p.examiner_id, e.login_name, e.display_name" + + " FROM accounts" + + " JOIN persona_accounts as pa ON pa.account_id = accounts.id" + + " JOIN personas as p ON p.id = pa.persona_id" + + " JOIN examiners as e ON e.id = p.examiner_id" + + " WHERE LOWER(accounts.account_unique_identifier) LIKE LOWER('%" + partialName + "%')" + + " AND p.status_id != " + Persona.PersonaStatus.DELETED.getStatusId() + + " GROUP BY p.id"; + + PersonaQueryCallback queryCallback = new PersonaQueryCallback(); + CentralRepository.getInstance().executeSelectSQL(queryClause, queryCallback); + + return queryCallback.getPersonas(); + } + /** * Creates an alias for the Persona. * diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.form b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.form index 918e5e4302..4c2a65a276 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.form @@ -145,7 +145,6 @@ - diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java index c2c7476496..be40c8d33c 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java @@ -113,6 +113,14 @@ public final class PersonaManagerTopComponent extends TopComponent { handleSelectionChange(e); } }); + + searchNameRadio.addActionListener((ActionEvent e) -> { + searchField.setText(""); + }); + + searchAccountRadio.addActionListener((ActionEvent e) -> { + searchField.setText(""); + }); } /** @@ -200,7 +208,11 @@ public final class PersonaManagerTopComponent extends TopComponent { private void executeSearch() { Collection results; try { - results = Persona.getPersonaByName(searchField.getText()); + if (searchNameRadio.isSelected()) { + results = Persona.getPersonaByName(searchField.getText()); + } else { + results = Persona.getPersonaByAccountIdentifierLike(searchField.getText()); + } } catch (CentralRepoException ex) { logger.log(Level.SEVERE, "Failed to search personas", ex); JOptionPane.showMessageDialog(this, @@ -254,7 +266,6 @@ public final class PersonaManagerTopComponent extends TopComponent { 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);