Autopsy  4.15.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
MessageAccountPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2020 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
20 package org.sleuthkit.autopsy.contentviewers.artifactviewers;
21 
22 import java.awt.event.ActionEvent;
23 import java.awt.event.ActionListener;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.List;
27 import java.util.concurrent.CancellationException;
28 import java.util.concurrent.ExecutionException;
29 import java.util.logging.Level;
30 import javax.swing.GroupLayout;
31 import javax.swing.GroupLayout.Alignment;
32 import javax.swing.GroupLayout.ParallelGroup;
33 import javax.swing.GroupLayout.SequentialGroup;
34 import javax.swing.JButton;
35 import javax.swing.JLabel;
36 import javax.swing.JPanel;
37 import javax.swing.LayoutStyle.ComponentPlacement;
38 import javax.swing.SwingUtilities;
39 import javax.swing.SwingWorker;
40 import org.openide.util.NbBundle.Messages;
49 import org.sleuthkit.datamodel.Account;
50 import org.sleuthkit.datamodel.BlackboardArtifact;
51 import org.sleuthkit.datamodel.CommunicationsManager;
52 import org.sleuthkit.datamodel.TskCoreException;
53 
58 final class MessageAccountPanel extends JPanel {
59 
60  private static final long serialVersionUID = 1L;
61  private final static Logger logger = Logger.getLogger(MessageAccountPanel.class.getName());
62 
63  private AccountFetcher currentFetcher = null;
64 
72  void setArtifact(BlackboardArtifact artifact) {
73  removeAll();
74  setLayout(null);
75  repaint();
76 
77  if (artifact == null) {
78  return;
79  }
80 
81  if (currentFetcher != null && !currentFetcher.isDone()) {
82  currentFetcher.cancel(true);
83  }
84 
85  currentFetcher = new AccountFetcher(artifact);
86  currentFetcher.execute();
87  }
88 
92  class AccountFetcher extends SwingWorker<List<AccountContainer>, Void> {
93 
94  private final BlackboardArtifact artifact;
95 
101  AccountFetcher(BlackboardArtifact artifact) {
102  this.artifact = artifact;
103  }
104 
105  @Override
106  protected List<AccountContainer> doInBackground() throws Exception {
107  List<AccountContainer> dataList = new ArrayList<>();
108 
109  CommunicationsManager commManager = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager();
110  List<Account> accountList = commManager.getAccountsRelatedToArtifact(artifact);
111  for (Account account : accountList) {
112  if (isCancelled()) {
113  return new ArrayList<>();
114  }
115 
116  Collection<PersonaAccount> personAccounts = PersonaAccount.getPersonaAccountsForAccount(account);
117  if (personAccounts != null && !personAccounts.isEmpty()) {
118  for (PersonaAccount personaAccount : PersonaAccount.getPersonaAccountsForAccount(account)) {
119  dataList.add(new AccountContainer(account, personaAccount));
120  }
121  } else {
122  dataList.add(new AccountContainer(account, null));
123  }
124  }
125 
126  return dataList;
127  }
128 
129  @Override
130  protected void done() {
131  try {
132  List<AccountContainer> dataList = get();
133 
134  dataList.forEach(container -> {
135  container.initalizeSwingControls();
136  });
137 
138  GroupLayout layout = new GroupLayout(MessageAccountPanel.this);
139  layout.setHorizontalGroup(
140  layout.createParallelGroup(Alignment.LEADING)
141  .addGroup(layout.createSequentialGroup()
142  .addContainerGap()
143  .addGroup(getMainHorizontalGroup(layout, dataList))
144  .addContainerGap(158, Short.MAX_VALUE)));
145 
146  layout.setVerticalGroup(getMainVerticalGroup(layout, dataList));
147  setLayout(layout);
148  repaint();
149  } catch (CancellationException ex) {
150  logger.log(Level.INFO, "MessageAccoutPanel thread cancelled", ex);
151  } catch (InterruptedException | ExecutionException ex) {
152  logger.log(Level.WARNING, "Failed to get account list for MessageAccountPanel", ex);
153  }
154  }
155 
162  private ParallelGroup getMainHorizontalGroup(GroupLayout layout, List<AccountContainer> data) {
163  ParallelGroup group = layout.createParallelGroup(Alignment.LEADING);
164  for (AccountContainer o : data) {
165  group.addComponent(o.getAccountLabel());
166  }
167  group.addGroup(getPersonaHorizontalGroup(layout, data));
168  return group;
169  }
170 
176  private ParallelGroup getMainVerticalGroup(GroupLayout layout, List<AccountContainer> data) {
177  SequentialGroup group = layout.createSequentialGroup();
178  for (AccountContainer o : data) {
179  group.addGap(5)
180  .addComponent(o.getAccountLabel())
181  .addGroup(o.getPersonLineVerticalGroup(layout));
182  }
183 
184  group.addContainerGap(83, Short.MAX_VALUE);
185 
186  return layout.createParallelGroup().addGroup(group);
187 
188  }
189 
196  private ParallelGroup getButtonGroup(GroupLayout layout, List<AccountContainer> data) {
197  ParallelGroup group = layout.createParallelGroup(Alignment.LEADING);
198  for (AccountContainer o : data) {
199  group.addComponent(o.getButton());
200  }
201 
202  return group;
203  }
204 
210  private SequentialGroup getPersonaHorizontalGroup(GroupLayout layout, List<AccountContainer> data) {
211  SequentialGroup group = layout.createSequentialGroup();
212  ParallelGroup pgroup = layout.createParallelGroup(Alignment.LEADING);
213  group.addGap(10);
214  for (AccountContainer o : data) {
215  pgroup.addGroup(o.getPersonaSequentialGroup(layout));
216  }
217  group.addGap(10)
218  .addGroup(pgroup)
219  .addPreferredGap(ComponentPlacement.RELATED)
220  .addGroup(getButtonGroup(layout, data));
221 
222  return group;
223  }
224 
225  }
226 
231  private class AccountContainer {
232 
233  private final Account account;
234  private Persona persona = null;
235 
236  private JLabel accountLabel;
237  private JLabel personaHeader;
238  private JLabel personaDisplayName;
239  private JButton button;
240 
247  AccountContainer(Account account, PersonaAccount personaAccount) {
248  this.account = account;
249  this.persona = personaAccount != null ? personaAccount.getPersona() : null;
250  }
251 
252  @Messages({
253  "MessageAccountPanel_persona_label=Persona:",
254  "MessageAccountPanel_unknown_label=Unknown",
255  "MessageAccountPanel_button_view_label=View",
256  "MessageAccountPanel_button_create_label=Create"
257  })
261  private void initalizeSwingControls() {
262  accountLabel = new JLabel();
263  personaHeader = new JLabel(Bundle.MessageAccountPanel_persona_label());
264  personaDisplayName = new JLabel();
265  button = new JButton();
266  button.addActionListener(new PersonaButtonListener(this));
267 
268  accountLabel.setText(account.getTypeSpecificID());
269 
270  personaDisplayName.setText(persona != null ? persona.getName() : Bundle.MessageAccountPanel_unknown_label());
271  button.setText(persona != null ? Bundle.MessageAccountPanel_button_view_label() : Bundle.MessageAccountPanel_button_create_label());
272  }
273 
279  private void setPersona(Persona persona) {
280  this.persona = persona;
281 
282  // Make sure this runs in EDT
283  SwingUtilities.invokeLater(new Runnable() {
284  @Override
285  public void run() {
286  personaDisplayName.setText(persona != null ? persona.getName() : Bundle.MessageAccountPanel_unknown_label());
287  button.setText(persona != null ? Bundle.MessageAccountPanel_button_view_label() : Bundle.MessageAccountPanel_button_create_label());
288  revalidate();
289  repaint();
290  }
291  });
292  }
293 
299  private Account getAccount() {
300  return account;
301  }
302 
308  private Persona getPersona() {
309  return persona;
310  }
311 
317  private JLabel getAccountLabel() {
318  return accountLabel;
319  }
320 
326  private JButton getButton() {
327  return button;
328  }
329 
337  private SequentialGroup getPersonaSequentialGroup(GroupLayout layout) {
338  SequentialGroup group = layout.createSequentialGroup();
339 
340  group
341  .addComponent(personaHeader)
342  .addPreferredGap(ComponentPlacement.RELATED)
343  .addComponent(personaDisplayName);
344 
345  return group;
346  }
347 
355  private ParallelGroup getPersonLineVerticalGroup(GroupLayout layout) {
356  return layout.createParallelGroup(Alignment.BASELINE)
357  .addComponent(personaHeader)
358  .addComponent(personaDisplayName)
359  .addComponent(button);
360  }
361  }
362 
366  private class PersonaButtonListener implements ActionListener {
367 
369 
375  PersonaButtonListener(AccountContainer accountContainer) {
376  this.accountContainer = accountContainer;
377  }
378 
379  @Override
380  public void actionPerformed(ActionEvent e) {
381  Persona persona = accountContainer.getPersona();
382  if (persona == null) {
383  PersonaDetailsDialog createPersonaDialog = new PersonaDetailsDialog(
384  MessageAccountPanel.this,
386  null,
387  new PersonaDialogCallbackImpl(accountContainer),
388  false);
389 
390  // Pre populate the persona name and accounts if we have them.
391  PersonaDetailsPanel personaPanel = createPersonaDialog.getDetailsPanel();
392 
393  personaPanel.setPersonaName(accountContainer.getAccount().getTypeSpecificID());
394 
395  // display the dialog now
396  createPersonaDialog.display();
397  } else {
398  new PersonaDetailsDialog(MessageAccountPanel.this,
399  PersonaDetailsMode.VIEW, persona, new PersonaDialogCallbackImpl(accountContainer));
400  }
401  }
402 
403  }
404 
409 
411 
412  PersonaDialogCallbackImpl(AccountContainer accountContainer) {
413  this.accountContainer = accountContainer;
414  }
415 
416  @Override
417  public void callback(Persona persona) {
418  accountContainer.setPersona(persona);
419  }
420 
421  }
422 }

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