19 package org.sleuthkit.autopsy.datamodel.hosts;
21 import java.awt.Dialog;
22 import java.util.ArrayList;
23 import java.util.Collections;
24 import java.util.HashMap;
25 import java.util.List;
27 import java.util.Objects;
28 import java.util.Vector;
29 import java.util.logging.Level;
30 import java.util.stream.Collectors;
31 import javax.swing.JFrame;
32 import javax.swing.ListModel;
33 import org.apache.commons.collections4.CollectionUtils;
34 import org.openide.util.NbBundle.Messages;
47 "ManageHostsDialog_title_text=Manage Hosts"
56 private final Host host;
57 private final List<DataSource> dataSources;
67 this.dataSources = dataSources;
80 List<DataSource> getDataSources() {
86 return host == null ?
"" : host.getName();
92 hash = 89 * hash + Objects.hashCode(this.host == null ? 0 : this.host.getHostId());
104 if (getClass() != obj.getClass()) {
108 if (this.host == null || other.getHost() == null) {
109 return this.host == null && other.getHost() == null;
112 return this.host.getHostId() == other.getHost().getHostId();
118 private static final long serialVersionUID = 1L;
120 private Map<Host, List<DataSource>> hostChildrenMap = Collections.emptyMap();
128 super(parent, Bundle.ManageHostsDialog_title_text(),
true);
138 super(parent, Bundle.ManageHostsDialog_title_text(),
true);
150 this.hostList.addListSelectionListener((evt) -> refreshComponents());
157 Host getSelectedHost() {
158 return (hostList.getSelectedValue() == null) ? null : hostList.getSelectedValue().getHost();
165 String newHostName = getAddEditDialogName(null);
166 if (newHostName != null) {
167 Long selectedId = null;
170 selectedId = newHost == null ? null : newHost.getHostId();
172 logger.log(Level.WARNING, String.format(
"Unable to add new host '%s' at this time.", newHostName), e);
175 setSelectedHostById(selectedId);
185 if (selectedHost != null && selectedHost.getName() != null) {
189 logger.log(Level.WARNING, String.format(
"Unable to delete host '%s' at this time.", selectedHost.getName()), e);
201 ListModel<HostListItem> model = hostList.getModel();
203 if (selectedId == null) {
204 hostList.clearSelection();
207 for (
int i = 0; i < model.getSize(); i++) {
208 Object o = model.getElementAt(i);
213 Host host = ((HostListItem) o).getHost();
218 if (host.getHostId() == selectedId) {
219 hostList.setSelectedIndex(i);
224 hostList.clearSelection();
234 if (selectedHost != null) {
235 String newHostName = getAddEditDialogName(selectedHost);
236 if (newHostName != null) {
240 logger.log(Level.WARNING, String.format(
"Unable to update host '%s' with id: %d at this time.", selectedHost.getName(), selectedHost.getHostId()), e);
243 HostListItem selectedItem = hostList.getSelectedValue();
244 Long selectedId = selectedItem == null || selectedItem.getHost() == null ? null : selectedItem.getHost().getHostId();
248 setSelectedHostById(selectedId);
261 JFrame parent = (this.getRootPane() != null && this.getRootPane().getParent() instanceof JFrame)
262 ? (JFrame) this.getRootPane().getParent()
265 AddEditHostDialog addEditDialog =
new AddEditHostDialog(parent, hostChildrenMap.keySet(), origValue);
266 addEditDialog.setResizable(
false);
267 addEditDialog.setLocationRelativeTo(parent);
268 addEditDialog.setVisible(
true);
269 addEditDialog.toFront();
271 if (addEditDialog.isChanged()) {
272 String newHostName = addEditDialog.getValue();
293 hostChildrenMap = getHostListData();
295 Vector<HostListItem> jlistData = hostChildrenMap.entrySet().stream()
296 .sorted((a, b) -> getNameOrEmpty(a.getKey()).compareTo(getNameOrEmpty(b.getKey())))
297 .map(entry ->
new HostListItem(entry.getKey(), entry.getValue()))
298 .collect(Collectors.toCollection(Vector::new));
300 hostList.setListData(jlistData);
311 return (h == null || h.getName() == null) ?
"" : h.getName();
321 Map<Host, List<DataSource>> hostMapping =
new HashMap<>();
324 List<Host> hosts = curCase.getHostManager().getAllHosts();
325 List<DataSource> dataSources = curCase.getDataSources();
327 if (dataSources != null) {
328 for (DataSource ds : dataSources) {
329 List<DataSource> hostDataSources = hostMapping.computeIfAbsent(ds.getHost(), (d) ->
new ArrayList<>());
330 hostDataSources.add(ds);
336 for (Host host : hosts) {
337 hostMapping.putIfAbsent(host, Collections.emptyList());
342 logger.log(Level.WARNING,
"There was an error while fetching hosts for current case.", ex);
352 HostListItem selectedItem = hostList.getSelectedValue();
353 Host selectedHost = selectedItem == null ? null : selectedItem.getHost();
354 List<DataSource> dataSources = selectedItem == null ? null : selectedItem.getDataSources();
355 this.editButton.setEnabled(selectedHost != null);
356 this.deleteButton.setEnabled(selectedHost != null && CollectionUtils.isEmpty(dataSources));
357 String nameTextFieldStr = selectedHost != null && selectedHost.getName() != null ? selectedHost.getName() :
"";
358 this.hostNameTextField.setText(nameTextFieldStr);
367 @SuppressWarnings(
"unchecked")
369 private
void initComponents() {
371 javax.swing.JScrollPane manageHostsScrollPane =
new javax.swing.JScrollPane();
372 javax.swing.JPanel manageHostsPanel =
new javax.swing.JPanel();
373 javax.swing.JScrollPane hostListScrollPane =
new javax.swing.JScrollPane();
374 hostList =
new javax.swing.JList<>();
375 javax.swing.JScrollPane hostDescriptionScrollPane =
new javax.swing.JScrollPane();
376 hostDescriptionTextArea =
new javax.swing.JTextArea();
377 newButton =
new javax.swing.JButton();
378 deleteButton =
new javax.swing.JButton();
379 closeButton =
new javax.swing.JButton();
380 javax.swing.JLabel hostListLabel =
new javax.swing.JLabel();
381 javax.swing.JSeparator jSeparator1 =
new javax.swing.JSeparator();
382 javax.swing.JLabel hostNameLabel =
new javax.swing.JLabel();
383 hostNameTextField =
new javax.swing.JTextField();
384 editButton =
new javax.swing.JButton();
385 javax.swing.JLabel hostDetailsLabel =
new javax.swing.JLabel();
387 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
388 setMinimumSize(
new java.awt.Dimension(600, 450));
390 manageHostsScrollPane.setMinimumSize(
new java.awt.Dimension(600, 450));
391 manageHostsScrollPane.setPreferredSize(
new java.awt.Dimension(600, 450));
393 manageHostsPanel.setPreferredSize(
new java.awt.Dimension(527, 407));
395 hostList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
396 hostListScrollPane.setViewportView(hostList);
398 hostDescriptionTextArea.setEditable(
false);
399 hostDescriptionTextArea.setBackground(
new java.awt.Color(240, 240, 240));
400 hostDescriptionTextArea.setColumns(20);
401 hostDescriptionTextArea.setLineWrap(
true);
402 hostDescriptionTextArea.setRows(3);
403 hostDescriptionTextArea.setText(
org.openide.util.NbBundle.getMessage(
ManageHostsDialog.class,
"ManageHostsDialog.hostDescriptionTextArea.text"));
404 hostDescriptionTextArea.setWrapStyleWord(
true);
405 hostDescriptionScrollPane.setViewportView(hostDescriptionTextArea);
407 newButton.setText(
org.openide.util.NbBundle.getMessage(
ManageHostsDialog.class,
"ManageHostsDialog.newButton.text"));
408 newButton.setMargin(
new java.awt.Insets(2, 6, 2, 6));
409 newButton.setMaximumSize(
new java.awt.Dimension(70, 23));
410 newButton.setMinimumSize(
new java.awt.Dimension(70, 23));
411 newButton.setPreferredSize(
new java.awt.Dimension(70, 23));
412 newButton.addActionListener(
new java.awt.event.ActionListener() {
413 public void actionPerformed(java.awt.event.ActionEvent evt) {
414 newButtonActionPerformed(evt);
418 deleteButton.setText(
org.openide.util.NbBundle.getMessage(
ManageHostsDialog.class,
"ManageHostsDialog.deleteButton.text"));
419 deleteButton.setMargin(
new java.awt.Insets(2, 6, 2, 6));
420 deleteButton.setMaximumSize(
new java.awt.Dimension(70, 23));
421 deleteButton.setMinimumSize(
new java.awt.Dimension(70, 23));
422 deleteButton.setPreferredSize(
new java.awt.Dimension(70, 23));
423 deleteButton.addActionListener(
new java.awt.event.ActionListener() {
424 public void actionPerformed(java.awt.event.ActionEvent evt) {
425 deleteButtonActionPerformed(evt);
429 closeButton.setText(
org.openide.util.NbBundle.getMessage(
ManageHostsDialog.class,
"ManageHostsDialog.closeButton.text"));
430 closeButton.addActionListener(
new java.awt.event.ActionListener() {
431 public void actionPerformed(java.awt.event.ActionEvent evt) {
432 closeButtonActionPerformed(evt);
436 hostListLabel.setText(
org.openide.util.NbBundle.getMessage(
ManageHostsDialog.class,
"ManageHostsDialog.hostListLabel.text"));
438 jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
440 hostNameLabel.setText(
org.openide.util.NbBundle.getMessage(
ManageHostsDialog.class,
"ManageHostsDialog.hostNameLabel.text"));
442 hostNameTextField.setEditable(
false);
444 editButton.setText(
org.openide.util.NbBundle.getMessage(
ManageHostsDialog.class,
"ManageHostsDialog.editButton.text"));
445 editButton.setMaximumSize(
new java.awt.Dimension(70, 23));
446 editButton.setMinimumSize(
new java.awt.Dimension(70, 23));
447 editButton.setPreferredSize(
new java.awt.Dimension(70, 23));
448 editButton.addActionListener(
new java.awt.event.ActionListener() {
449 public void actionPerformed(java.awt.event.ActionEvent evt) {
450 editButtonActionPerformed(evt);
454 hostDetailsLabel.setText(
org.openide.util.NbBundle.getMessage(
ManageHostsDialog.class,
"ManageHostsDialog.hostDetailsLabel.text"));
456 javax.swing.GroupLayout manageHostsPanelLayout =
new javax.swing.GroupLayout(manageHostsPanel);
457 manageHostsPanel.setLayout(manageHostsPanelLayout);
458 manageHostsPanelLayout.setHorizontalGroup(
459 manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
460 .addGroup(manageHostsPanelLayout.createSequentialGroup()
462 .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
463 .addComponent(hostDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE)
464 .addComponent(hostListLabel)
465 .addGroup(manageHostsPanelLayout.createSequentialGroup()
466 .addComponent(newButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
467 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
468 .addComponent(editButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
469 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
470 .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
471 .addComponent(hostListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE))
472 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
473 .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
474 .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
475 .addGroup(manageHostsPanelLayout.createSequentialGroup()
476 .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
477 .addGroup(manageHostsPanelLayout.createSequentialGroup()
478 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
479 .addComponent(closeButton))
480 .addGroup(manageHostsPanelLayout.createSequentialGroup()
482 .addComponent(hostNameLabel)
483 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
484 .addComponent(hostNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 79, Short.MAX_VALUE)))
486 .addGroup(manageHostsPanelLayout.createSequentialGroup()
487 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
488 .addComponent(hostDetailsLabel)
489 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
491 manageHostsPanelLayout.setVerticalGroup(
492 manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
493 .addGroup(manageHostsPanelLayout.createSequentialGroup()
495 .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
496 .addGroup(manageHostsPanelLayout.createSequentialGroup()
497 .addComponent(hostDetailsLabel)
498 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
499 .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
500 .addComponent(hostNameLabel)
501 .addComponent(hostNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
502 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
503 .addComponent(closeButton))
504 .addComponent(jSeparator1)
505 .addGroup(manageHostsPanelLayout.createSequentialGroup()
506 .addComponent(hostDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
507 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
508 .addComponent(hostListLabel)
509 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
510 .addComponent(hostListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 325, Short.MAX_VALUE)
511 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
512 .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
513 .addComponent(newButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
514 .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
515 .addComponent(editButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
519 java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle(
"org/sleuthkit/autopsy/datamodel/hosts/Bundle");
520 newButton.getAccessibleContext().setAccessibleName(bundle.getString(
"ManageHostsDialog.newButton.text"));
521 deleteButton.getAccessibleContext().setAccessibleName(bundle.getString(
"ManageHostsDialog.deleteButton.text"));
522 closeButton.getAccessibleContext().setAccessibleName(bundle.getString(
"ManageHostsDialog.closeButton.text"));
523 hostListLabel.getAccessibleContext().setAccessibleName(bundle.getString(
"ManageHostsDialog.hostListLabel.text"));
524 hostNameLabel.getAccessibleContext().setAccessibleName(bundle.getString(
"ManageHostsDialog.hostNameLabel.text"));
525 editButton.getAccessibleContext().setAccessibleName(bundle.getString(
"ManageHostsDialog.editButton.text"));
526 hostDetailsLabel.getAccessibleContext().setAccessibleName(bundle.getString(
"ManageHostsDialog.hostDetailsLabel.text"));
528 manageHostsScrollPane.setViewportView(manageHostsPanel);
530 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
531 getContentPane().setLayout(layout);
532 layout.setHorizontalGroup(
533 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
534 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
536 .addComponent(manageHostsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
538 layout.setVerticalGroup(
539 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
540 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
542 .addComponent(manageHostsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
553 HostListItem listItem = this.hostList.getSelectedValue();
554 if (listItem != null && listItem.getHost() != null) {
555 deleteHost(listItem.getHost());
564 HostListItem listItem = this.hostList.getSelectedValue();
565 if (listItem != null && listItem.getHost() != null) {
566 editHost(listItem.getHost());
void deleteHost(Host selectedHost)
void editButtonActionPerformed(java.awt.event.ActionEvent evt)
void deleteButtonActionPerformed(java.awt.event.ActionEvent evt)
void closeButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JButton deleteButton
String getAddEditDialogName(Host origValue)
void newButtonActionPerformed(java.awt.event.ActionEvent evt)
void editHost(Host selectedHost)
ManageHostsDialog(java.awt.Frame parent)
String getNameOrEmpty(Host h)
boolean equals(Object obj)
javax.swing.JTextArea hostDescriptionTextArea
Map< Host, List< DataSource > > getHostListData()
SleuthkitCase getSleuthkitCase()
javax.swing.JButton closeButton
ManageHostsDialog(Dialog parent)
void setSelectedHostById(Long selectedId)
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
javax.swing.JButton newButton
javax.swing.JTextField hostNameTextField
javax.swing.JButton editButton
javax.swing.JList< org.sleuthkit.autopsy.datamodel.hosts.ManageHostsDialog.HostListItem > hostList