Autopsy  4.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
LocalDiskPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2016 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 package org.sleuthkit.autopsy.casemodule;
20 
21 import java.awt.BorderLayout;
22 import java.awt.Color;
23 import java.awt.Component;
24 import java.awt.Font;
25 import java.util.ArrayList;
26 import java.util.Calendar;
27 import java.util.List;
28 import java.util.SimpleTimeZone;
29 import java.util.TimeZone;
30 import java.util.concurrent.CancellationException;
31 import java.util.logging.Level;
32 import javax.swing.ComboBoxModel;
33 import javax.swing.JLabel;
34 import javax.swing.JList;
35 import javax.swing.JPanel;
36 import javax.swing.JSeparator;
37 import javax.swing.ListCellRenderer;
38 import javax.swing.SwingWorker;
39 import javax.swing.border.EmptyBorder;
40 import javax.swing.event.ListDataListener;
41 import org.openide.util.NbBundle;
47 
52 final class LocalDiskPanel extends JPanel {
53 
54  private static final Logger logger = Logger.getLogger(LocalDiskPanel.class.getName());
55  private static LocalDiskPanel instance;
56  private static final long serialVersionUID = 1L;
57  private List<LocalDisk> disks;
58  private LocalDiskModel model;
59  private boolean enableNext = false;
60 
64  public LocalDiskPanel() {
65  this.disks = new ArrayList<>();
66  initComponents();
67  customInit();
68 
69  createTimeZoneList();
70  }
71 
75  public static synchronized LocalDiskPanel getDefault() {
76  if (instance == null) {
77  instance = new LocalDiskPanel();
78  }
79  return instance;
80  }
81 
82  @SuppressWarnings("unchecked")
83  private void customInit() {
84  model = new LocalDiskModel();
85  diskComboBox.setModel(model);
86  diskComboBox.setRenderer(model);
87 
88  errorLabel.setVisible(false);
89  errorLabel.setText("");
90  diskComboBox.setEnabled(false);
91  }
92 
98  @SuppressWarnings("unchecked")
99  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
100  private void initComponents() {
101 
102  diskLabel = new javax.swing.JLabel();
103  diskComboBox = new javax.swing.JComboBox<>();
104  errorLabel = new javax.swing.JLabel();
105  timeZoneLabel = new javax.swing.JLabel();
106  timeZoneComboBox = new javax.swing.JComboBox<>();
107  noFatOrphansCheckbox = new javax.swing.JCheckBox();
108  descLabel = new javax.swing.JLabel();
109 
110  setMinimumSize(new java.awt.Dimension(0, 65));
111  setPreferredSize(new java.awt.Dimension(485, 65));
112 
113  diskLabel.setFont(diskLabel.getFont().deriveFont(diskLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
114  org.openide.awt.Mnemonics.setLocalizedText(diskLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.diskLabel.text")); // NOI18N
115 
116  diskComboBox.setFont(diskComboBox.getFont().deriveFont(diskComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
117 
118  errorLabel.setFont(errorLabel.getFont().deriveFont(errorLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
119  errorLabel.setForeground(new java.awt.Color(255, 0, 0));
120  org.openide.awt.Mnemonics.setLocalizedText(errorLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.errorLabel.text")); // NOI18N
121 
122  timeZoneLabel.setFont(timeZoneLabel.getFont().deriveFont(timeZoneLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
123  org.openide.awt.Mnemonics.setLocalizedText(timeZoneLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.timeZoneLabel.text")); // NOI18N
124 
125  timeZoneComboBox.setFont(timeZoneComboBox.getFont().deriveFont(timeZoneComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
126  timeZoneComboBox.setMaximumRowCount(30);
127 
128  noFatOrphansCheckbox.setFont(noFatOrphansCheckbox.getFont().deriveFont(noFatOrphansCheckbox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
129  org.openide.awt.Mnemonics.setLocalizedText(noFatOrphansCheckbox, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.noFatOrphansCheckbox.text")); // NOI18N
130  noFatOrphansCheckbox.setToolTipText(org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.noFatOrphansCheckbox.toolTipText")); // NOI18N
131 
132  descLabel.setFont(descLabel.getFont().deriveFont(descLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
133  org.openide.awt.Mnemonics.setLocalizedText(descLabel, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.descLabel.text")); // NOI18N
134 
135  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
136  this.setLayout(layout);
137  layout.setHorizontalGroup(
138  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
139  .addGroup(layout.createSequentialGroup()
140  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
141  .addComponent(diskLabel)
142  .addComponent(diskComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 345, javax.swing.GroupLayout.PREFERRED_SIZE)
143  .addComponent(errorLabel)
144  .addGroup(layout.createSequentialGroup()
145  .addComponent(timeZoneLabel)
146  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
147  .addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE))
148  .addComponent(noFatOrphansCheckbox)
149  .addGroup(layout.createSequentialGroup()
150  .addGap(21, 21, 21)
151  .addComponent(descLabel)))
152  .addGap(0, 102, Short.MAX_VALUE))
153  );
154  layout.setVerticalGroup(
155  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
156  .addGroup(layout.createSequentialGroup()
157  .addComponent(diskLabel)
158  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
159  .addComponent(diskComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
160  .addGap(13, 13, 13)
161  .addComponent(errorLabel)
162  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
163  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
164  .addComponent(timeZoneLabel)
165  .addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
166  .addGap(18, 18, 18)
167  .addComponent(noFatOrphansCheckbox)
168  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
169  .addComponent(descLabel)
170  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
171  );
172  }// </editor-fold>//GEN-END:initComponents
173  // Variables declaration - do not modify//GEN-BEGIN:variables
174  private javax.swing.JLabel descLabel;
175  private javax.swing.JComboBox<LocalDisk> diskComboBox;
176  private javax.swing.JLabel diskLabel;
177  private javax.swing.JLabel errorLabel;
178  private javax.swing.JCheckBox noFatOrphansCheckbox;
179  private javax.swing.JComboBox<String> timeZoneComboBox;
180  private javax.swing.JLabel timeZoneLabel;
181  // End of variables declaration//GEN-END:variables
182 
188  public String getContentPaths() {
189  if (disks.size() > 0) {
190  LocalDisk selected = (LocalDisk) diskComboBox.getSelectedItem();
191  return selected.getPath();
192  } else {
193  return "";
194  }
195  }
196 
200  public void setContentPath(String s) {
201  for (int i = 0; i < disks.size(); i++) {
202  if (disks.get(i).getPath().equals(s)) {
203  diskComboBox.setSelectedIndex(i);
204  }
205  }
206  }
207 
208  public String getTimeZone() {
209  String tz = timeZoneComboBox.getSelectedItem().toString();
210  return tz.substring(tz.indexOf(")") + 2).trim();
211 
212  }
213 
214  boolean getNoFatOrphans() {
215  return noFatOrphansCheckbox.isSelected();
216  }
217 
224  public boolean validatePanel() {
225  return enableNext;
226  }
227 
228  public void reset() {
229  //nothing to reset
230  }
231 
235  public void select() {
236  diskComboBox.requestFocusInWindow();
237  model.loadDisks();
238  }
239 
244  public void createTimeZoneList() {
245  // load and add all timezone
246  String[] ids = SimpleTimeZone.getAvailableIDs();
247  for (String id : ids) {
248  TimeZone zone = TimeZone.getTimeZone(id);
249  int offset = zone.getRawOffset() / 1000;
250  int hour = offset / 3600;
251  int minutes = (offset % 3600) / 60;
252  String item = String.format("(GMT%+d:%02d) %s", hour, minutes, id); //NON-NLS
253 
254  /*
255  * DateFormat dfm = new SimpleDateFormat("z");
256  * dfm.setTimeZone(zone); boolean hasDaylight =
257  * zone.useDaylightTime(); String first = dfm.format(new Date(2010,
258  * 1, 1)); String second = dfm.format(new Date(2011, 6, 6)); int mid
259  * = hour * -1; String result = first + Integer.toString(mid);
260  * if(hasDaylight){ result = result + second; }
261  * timeZoneComboBox.addItem(item + " (" + result + ")");
262  */
263  timeZoneComboBox.addItem(item);
264  }
265  // get the current timezone
266  TimeZone thisTimeZone = Calendar.getInstance().getTimeZone();
267  int thisOffset = thisTimeZone.getRawOffset() / 1000;
268  int thisHour = thisOffset / 3600;
269  int thisMinutes = (thisOffset % 3600) / 60;
270  String formatted = String.format("(GMT%+d:%02d) %s", thisHour, thisMinutes, thisTimeZone.getID()); //NON-NLS
271 
272  // set the selected timezone
273  timeZoneComboBox.setSelectedItem(formatted);
274  }
275 
276  @SuppressWarnings("rawtypes")
277  private class LocalDiskModel implements ComboBoxModel, ListCellRenderer {
278 
279  private Object selected;
280 
281  private boolean ready = false;
282 
283  private volatile boolean loadingDisks = false;
284 
285  List<LocalDisk> physicalDrives = new ArrayList<>();
286  List<LocalDisk> partitions = new ArrayList<>();
287 
288  //private String SELECT = "Select a local disk:";
289  private final String LOADING = NbBundle.getMessage(this.getClass(), "LocalDiskPanel.localDiskModel.loading.msg");
290  private final String NO_DRIVES = NbBundle.getMessage(this.getClass(), "LocalDiskPanel.localDiskModel.nodrives.msg");
291 
292  LocalDiskThread worker = null;
293 
294  private void loadDisks() {
295 
296  // if there is a worker already building the lists, then cancel it first.
297  if (loadingDisks && worker != null) {
298  worker.cancel(false);
299  }
300 
301  // Clear the lists
302  errorLabel.setText("");
303  disks = new ArrayList<>();
304  physicalDrives = new ArrayList<>();
305  partitions = new ArrayList<>();
306  diskComboBox.setEnabled(false);
307  ready = false;
308  enableNext = false;
309  loadingDisks = true;
310 
311  worker = new LocalDiskThread();
312  worker.execute();
313 
314  }
315 
316  @Override
317  public void setSelectedItem(Object anItem) {
318  if (ready) {
319  selected = (LocalDisk) anItem;
320  enableNext = true;
321 
322  try {
323  firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
324  } catch (Exception e) {
325  logger.log(Level.SEVERE, "LocalDiskPanel listener threw exception", e); //NON-NLS
326  MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr"),
327  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr.msg"),
329  }
330  }
331  }
332 
333  @Override
334  public Object getSelectedItem() {
335  if (ready) {
336  if (disks.isEmpty()) {
337  return NO_DRIVES;
338  }
339  return selected;
340  } else {
341  return LOADING;
342  }
343  }
344 
345  @Override
346  public int getSize() {
347  if (ready) {
348  if (disks.isEmpty()) {
349  return 1;
350  }
351  return disks.size();
352  } else {
353  return 1;
354  }
355  }
356 
357  @Override
358  public Object getElementAt(int index) {
359  if (ready) {
360  if (disks.isEmpty()) {
361  return NO_DRIVES;
362  }
363  return disks.get(index);
364  } else {
365  return LOADING;
366  }
367  }
368 
369  @Override
370  public void addListDataListener(ListDataListener l) {
371  }
372 
373  @Override
374  public void removeListDataListener(ListDataListener l) {
375  }
376 
377  @SuppressWarnings("rawtypes")
378  @Override
379  public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
380  JPanel panel = new JPanel(new BorderLayout());
381  JLabel label = new JLabel();
382  if ((index == physicalDrives.size() - 1) && (physicalDrives.size() > 0)) {
383  panel.add(new JSeparator(JSeparator.HORIZONTAL), BorderLayout.SOUTH);
384  }
385 
386  if (isSelected) {
387  label.setBackground(list.getSelectionBackground());
388  label.setForeground(list.getSelectionForeground());
389  } else {
390  label.setBackground(list.getBackground());
391  label.setForeground(list.getForeground());
392  }
393 
394  if (value != null) {
395  String localDiskString = value.toString();
396  label.setText(value.toString());
397  if ((localDiskString.equals(LOADING)) || (localDiskString.equals(NO_DRIVES))) {
398  label.setFont(label.getFont().deriveFont(Font.ITALIC));
399  label.setBackground(Color.GRAY);
400  }
401  }
402  label.setOpaque(true);
403  label.setBorder(new EmptyBorder(2, 2, 2, 2));
404 
405  panel.add(label, BorderLayout.CENTER);
406  return panel;
407  }
408 
409  class LocalDiskThread extends SwingWorker<Object, Void> {
410 
411  private final Logger logger = Logger.getLogger(LocalDiskThread.class.getName());
412 
413  @Override
414  protected Object doInBackground() throws Exception {
415  // Populate the lists
416  physicalDrives = PlatformUtil.getPhysicalDrives();
417  partitions = PlatformUtil.getPartitions();
418 
419  return null;
420  }
421 
422  private void displayErrors() {
423  if (physicalDrives.isEmpty() && partitions.isEmpty()) {
424  if (PlatformUtil.isWindowsOS()) {
425  errorLabel.setText(
426  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.disksNotDetected.text"));
427  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
428  "LocalDiskPanel.errLabel.disksNotDetected.toolTipText"));
429  } else {
430  errorLabel.setText(
431  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.drivesNotDetected.text"));
432  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
433  "LocalDiskPanel.errLabel.drivesNotDetected.toolTipText"));
434  }
435  diskComboBox.setEnabled(false);
436  } else if (physicalDrives.isEmpty()) {
437  errorLabel.setText(
438  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.someDisksNotDetected.text"));
439  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
440  "LocalDiskPanel.errLabel.someDisksNotDetected.toolTipText"));
441  }
442  }
443 
444  @Override
445  protected void done() {
446  try {
447  super.get(); //block and get all exceptions thrown while doInBackground()
448  } catch (CancellationException ex) {
449  logger.log(Level.INFO, "Loading local disks was canceled, which should not be possible."); //NON-NLS
450  } catch (InterruptedException ex) {
451  logger.log(Level.INFO, "Loading local disks was interrupted."); //NON-NLS
452  } catch (Exception ex) {
453  logger.log(Level.SEVERE, "Fatal error when loading local disks", ex); //NON-NLS
454  } finally {
455  if (!this.isCancelled()) {
456  enableNext = false;
457  displayErrors();
458 
459  worker = null;
460  loadingDisks = false;
461 
462  disks.addAll(physicalDrives);
463  disks.addAll(partitions);
464 
465  if (disks.size() > 0) {
466  diskComboBox.setEnabled(true);
467  diskComboBox.setSelectedIndex(0);
468  }
469  ready = true;
470  } else {
471  logger.log(Level.INFO, "Loading local disks was canceled, which should not be possible."); //NON-NLS
472  }
473  }
474  }
475  }
476  }
477 }
static List< LocalDisk > getPhysicalDrives()
Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
synchronized static Logger getLogger(String name)
Definition: Logger.java:161
static void show(String title, String message, MessageType type, ActionListener actionListener)

Copyright © 2012-2016 Basis Technology. Generated on: Mon Jan 2 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.