19 package org.sleuthkit.autopsy.discovery.ui;
21 import com.google.common.eventbus.Subscribe;
22 import java.awt.Component;
23 import java.util.logging.Level;
24 import javax.swing.JPanel;
25 import javax.swing.SwingUtilities;
26 import javax.swing.event.ChangeEvent;
27 import javax.swing.event.ChangeListener;
28 import org.apache.commons.lang.StringUtils;
29 import org.openide.util.NbBundle;
45 final class DomainDetailsPanel
extends JPanel {
47 private static final long serialVersionUID = 1L;
48 private static final Logger logger = Logger.getLogger(DomainDetailsPanel.class.getName());
49 private ArtifactsWorker singleArtifactDomainWorker;
50 private String domain;
51 private String selectedTabName = null;
58 @NbBundle.Messages({
"DomainDetailsPanel.otherOccurrencesTab.title=Other Occurrences"})
59 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
60 DomainDetailsPanel() {
62 MiniTimelinePanel timelinePanel =
new MiniTimelinePanel();
63 DiscoveryEventUtils.getDiscoveryEventBus().register(timelinePanel);
64 jTabbedPane1.add(Bundle.DomainDetailsPanel_miniTimelineTitle_text(), timelinePanel);
65 for (BlackboardArtifact.ARTIFACT_TYPE type : SearchData.Type.DOMAIN.getArtifactTypes()) {
66 jTabbedPane1.add(type.getDisplayName(),
new DomainArtifactsTabPanel(type));
68 if (CentralRepository.isEnabled()) {
69 jTabbedPane1.add(Bundle.DomainDetailsPanel_otherOccurrencesTab_title(),
new OtherOccurrencesPanel());
79 @NbBundle.Messages({
"DomainDetailsPanel.miniTimelineTitle.text=Timeline"})
80 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
81 void configureArtifactTabs(String tabName) {
82 selectedTabName = tabName;
83 if (StringUtils.isBlank(selectedTabName)) {
84 selectedTabName = Bundle.DomainDetailsPanel_miniTimelineTitle_text();
87 jTabbedPane1.addChangeListener(
new ChangeListener() {
89 public void stateChanged(ChangeEvent e) {
90 if (jTabbedPane1.getSelectedIndex() >= 0) {
91 String newTabTitle = jTabbedPane1.getTitleAt(jTabbedPane1.getSelectedIndex());
92 if (selectedTabName == null || !selectedTabName.equals(newTabTitle)) {
93 selectedTabName = newTabTitle;
94 Component selectedComponent = jTabbedPane1.getSelectedComponent();
95 if (!StringUtils.isBlank(domain) && selectedComponent instanceof DomainArtifactsTabPanel) {
96 runDomainWorker((DomainArtifactsTabPanel) selectedComponent,
true);
97 }
else if (!StringUtils.isBlank(domain) && selectedComponent instanceof MiniTimelinePanel) {
98 runMiniTimelineWorker((MiniTimelinePanel) selectedComponent,
true);
106 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
111 private
void selectTab() {
112 for (
int i = 0; i < jTabbedPane1.getTabCount(); i++) {
113 if (!StringUtils.isBlank(selectedTabName) && selectedTabName.equals(jTabbedPane1.getTitleAt(i))) {
114 jTabbedPane1.setSelectedIndex(i);
125 DomainArtifactsTabPanel.ArtifactRetrievalStatus getCurrentTabStatus() {
126 if (jTabbedPane1.getSelectedComponent() instanceof MiniTimelinePanel) {
127 return ((MiniTimelinePanel) jTabbedPane1.getSelectedComponent()).getStatus();
128 }
else if (jTabbedPane1.getSelectedComponent() instanceof DomainArtifactsTabPanel) {
129 return ((DomainArtifactsTabPanel) jTabbedPane1.getSelectedComponent()).getStatus();
143 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
144 private
void runDomainWorker(DomainArtifactsTabPanel domainArtifactsTabPanel,
boolean shouldGrabFocus) {
145 if (singleArtifactDomainWorker != null && !singleArtifactDomainWorker.isDone()) {
146 singleArtifactDomainWorker.cancel(
true);
148 if (domainArtifactsTabPanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED) {
149 DiscoveryEventUtils.getDiscoveryEventBus().register(domainArtifactsTabPanel);
150 domainArtifactsTabPanel.setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATING);
151 singleArtifactDomainWorker =
new ArtifactsWorker(domainArtifactsTabPanel.getArtifactType(), domain, shouldGrabFocus);
152 singleArtifactDomainWorker.execute();
153 }
else if (domainArtifactsTabPanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATED) {
154 domainArtifactsTabPanel.focusList();
167 private void runMiniTimelineWorker(MiniTimelinePanel miniTimelinePanel,
boolean shouldGrabFocus) {
168 if (miniTimelinePanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED) {
169 miniTimelinePanel.setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATING, domain);
170 new MiniTimelineWorker(domain, shouldGrabFocus).execute();
171 }
else if (miniTimelinePanel.getStatus() == DomainArtifactsTabPanel.ArtifactRetrievalStatus.POPULATED) {
172 miniTimelinePanel.focusList();
183 void handlePopulateDomainTabsEvent(DiscoveryEventUtils.PopulateDomainTabsEvent populateEvent) {
184 SwingUtilities.invokeLater(() -> {
185 domain = populateEvent.getDomain();
186 if (StringUtils.isBlank(domain)) {
189 DiscoveryEventUtils.getDiscoveryEventBus().post(
new DiscoveryEventUtils.DetailsVisibleEvent(
false));
192 Component selectedComponent = jTabbedPane1.getSelectedComponent();
193 if (selectedComponent instanceof DomainArtifactsTabPanel) {
194 runDomainWorker((DomainArtifactsTabPanel) selectedComponent,
false);
195 }
else if (selectedComponent instanceof MiniTimelinePanel) {
196 runMiniTimelineWorker((MiniTimelinePanel) selectedComponent,
false);
197 }
else if (selectedComponent instanceof OtherOccurrencesPanel) {
198 if (CentralRepository.isEnabled()) {
200 ((OtherOccurrencesPanel) selectedComponent).populateTableForOneType(CentralRepository.getInstance().getCorrelationTypeById(CorrelationAttributeInstance.DOMAIN_TYPE_ID), domain);
201 }
catch (CentralRepoException ex) {
202 logger.log(Level.INFO,
"Central repository exception while trying to get instances by type and value for domain: " + domain, ex);
203 ((OtherOccurrencesPanel) selectedComponent).reset();
206 ((OtherOccurrencesPanel) selectedComponent).reset();
210 DiscoveryEventUtils.getDiscoveryEventBus().post(
new DiscoveryEventUtils.DetailsVisibleEvent(
true));
219 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
220 private
void resetTabsStatus() {
221 for (Component comp : jTabbedPane1.getComponents()) {
222 if (comp instanceof DomainArtifactsTabPanel) {
223 ((DomainArtifactsTabPanel) comp).setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED);
224 }
else if (comp instanceof MiniTimelinePanel) {
225 ((MiniTimelinePanel) comp).setStatus(DomainArtifactsTabPanel.ArtifactRetrievalStatus.UNPOPULATED, domain);
226 }
else if (comp instanceof OtherOccurrencesPanel) {
227 ((OtherOccurrencesPanel) comp).reset();
237 @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
238 String getSelectedTabName() {
239 return selectedTabName;
247 @SuppressWarnings(
"unchecked")
249 private
void initComponents() {
251 jTabbedPane1 =
new javax.swing.JTabbedPane();
254 setMinimumSize(
new java.awt.Dimension(0, 0));
255 setPreferredSize(
new java.awt.Dimension(0, 0));
256 setLayout(
new java.awt.BorderLayout());
258 jTabbedPane1.setMinimumSize(
new java.awt.Dimension(0, 0));
259 jTabbedPane1.setPreferredSize(
new java.awt.Dimension(0, 0));
260 add(jTabbedPane1, java.awt.BorderLayout.CENTER);
264 private javax.swing.JTabbedPane jTabbedPane1;
271 for (Component comp : jTabbedPane1.getComponents()) {
272 if (comp instanceof MiniTimelinePanel) {
273 DiscoveryEventUtils.getDiscoveryEventBus().unregister(comp);