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 2012 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 List<LocalDisk> disks;
57  private LocalDiskModel model;
58  private boolean enableNext = false;
59 
63  public LocalDiskPanel() {
64  this.disks = new ArrayList<>();
65  initComponents();
66  customInit();
67 
68  createTimeZoneList();
69 
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  //@Override
189  public String getContentPaths() {
190  if (disks.size() > 0) {
191  LocalDisk selected = (LocalDisk) diskComboBox.getSelectedItem();
192  return selected.getPath();
193  } else {
194  return "";
195  }
196  }
197 
201  // @Override
202  public void setContentPath(String s) {
203  for (int i = 0; i < disks.size(); i++) {
204  if (disks.get(i).getPath().equals(s)) {
205  diskComboBox.setSelectedIndex(i);
206  }
207  }
208  }
209 
210  public String getTimeZone() {
211  String tz = timeZoneComboBox.getSelectedItem().toString();
212  return tz.substring(tz.indexOf(")") + 2).trim();
213 
214  }
215 
216  boolean getNoFatOrphans() {
217  return noFatOrphansCheckbox.isSelected();
218  }
219 
226  //@Override
227  public boolean validatePanel() {
228  return enableNext;
229  }
230 
231  //@Override
232  public void reset() {
233  //nothing to reset
234 
235  }
236 
240  // @Override
241  public void select() {
242  diskComboBox.requestFocusInWindow();
243  model.loadDisks();
244 
245  }
246 
251  public void createTimeZoneList() {
252  // load and add all timezone
253  String[] ids = SimpleTimeZone.getAvailableIDs();
254  for (String id : ids) {
255  TimeZone zone = TimeZone.getTimeZone(id);
256  int offset = zone.getRawOffset() / 1000;
257  int hour = offset / 3600;
258  int minutes = (offset % 3600) / 60;
259  String item = String.format("(GMT%+d:%02d) %s", hour, minutes, id); //NON-NLS
260 
261  /*
262  * DateFormat dfm = new SimpleDateFormat("z");
263  * dfm.setTimeZone(zone); boolean hasDaylight =
264  * zone.useDaylightTime(); String first = dfm.format(new Date(2010,
265  * 1, 1)); String second = dfm.format(new Date(2011, 6, 6)); int mid
266  * = hour * -1; String result = first + Integer.toString(mid);
267  * if(hasDaylight){ result = result + second; }
268  * timeZoneComboBox.addItem(item + " (" + result + ")");
269  */
270  timeZoneComboBox.addItem(item);
271  }
272  // get the current timezone
273  TimeZone thisTimeZone = Calendar.getInstance().getTimeZone();
274  int thisOffset = thisTimeZone.getRawOffset() / 1000;
275  int thisHour = thisOffset / 3600;
276  int thisMinutes = (thisOffset % 3600) / 60;
277  String formatted = String.format("(GMT%+d:%02d) %s", thisHour, thisMinutes, thisTimeZone.getID()); //NON-NLS
278 
279  // set the selected timezone
280  timeZoneComboBox.setSelectedItem(formatted);
281  }
282 
283  @SuppressWarnings("rawtypes")
284  private class LocalDiskModel implements ComboBoxModel, ListCellRenderer {
285 
286  private Object selected;
287 
288  private boolean ready = false;
289 
290  private volatile boolean loadingDisks = false;
291 
292  List<LocalDisk> physicalDrives = new ArrayList<>();
293  List<LocalDisk> partitions = new ArrayList<>();
294 
295  //private String SELECT = "Select a local disk:";
296  private String LOADING = NbBundle.getMessage(this.getClass(), "LocalDiskPanel.localDiskModel.loading.msg");
297  private String NO_DRIVES = NbBundle.getMessage(this.getClass(), "LocalDiskPanel.localDiskModel.nodrives.msg");
298 
299  LocalDiskThread worker = null;
300 
301  private void loadDisks() {
302 
303  // if there is a worker already building the lists, then cancel it first.
304  if (loadingDisks && worker != null) {
305  worker.cancel(false);
306  }
307 
308  // Clear the lists
309  errorLabel.setText("");
310  disks = new ArrayList<>();
311  physicalDrives = new ArrayList<>();
312  partitions = new ArrayList<>();
313  diskComboBox.setEnabled(false);
314  ready = false;
315  enableNext = false;
316  loadingDisks = true;
317 
318  worker = new LocalDiskThread();
319  worker.execute();
320 
321  }
322 
323  @Override
324  public void setSelectedItem(Object anItem) {
325  if (ready) {
326  selected = (LocalDisk) anItem;
327  enableNext = true;
328 
329  try {
330  firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
331  } catch (Exception e) {
332  logger.log(Level.SEVERE, "LocalDiskPanel listener threw exception", e); //NON-NLS
333  MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr"),
334  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.moduleErr.msg"),
336  }
337  }
338  }
339 
340  @Override
341  public Object getSelectedItem() {
342  if (ready) {
343  if (disks.isEmpty()) {
344  return NO_DRIVES;
345  }
346  return selected;
347  } else {
348  return LOADING;
349  }
350  }
351 
352  @Override
353  public int getSize() {
354  if (ready) {
355  if (disks.isEmpty()) {
356  return 1;
357  }
358  return disks.size();
359  } else {
360  return 1;
361  }
362  }
363 
364  @Override
365  public Object getElementAt(int index) {
366  if (ready) {
367  if (disks.isEmpty()) {
368  return NO_DRIVES;
369  }
370  return disks.get(index);
371  } else {
372  return LOADING;
373  }
374  }
375 
376  @Override
377  public void addListDataListener(ListDataListener l) {
378  }
379 
380  @Override
381  public void removeListDataListener(ListDataListener l) {
382  }
383 
384  @SuppressWarnings("rawtypes")
385  @Override
386  public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
387  JPanel panel = new JPanel(new BorderLayout());
388  JLabel label = new JLabel();
389  if ((index == physicalDrives.size() - 1) && (physicalDrives.size() > 0)) {
390  panel.add(new JSeparator(JSeparator.HORIZONTAL), BorderLayout.SOUTH);
391  }
392 
393  if (isSelected) {
394  label.setBackground(list.getSelectionBackground());
395  label.setForeground(list.getSelectionForeground());
396  } else {
397  label.setBackground(list.getBackground());
398  label.setForeground(list.getForeground());
399  }
400 
401  if (value != null) {
402  String localDiskString = value.toString();
403  label.setText(value.toString());
404  if ((localDiskString.equals(LOADING)) || (localDiskString.equals(NO_DRIVES))) {
405  label.setFont(label.getFont().deriveFont(Font.ITALIC));
406  label.setBackground(Color.GRAY);
407  }
408  }
409  label.setOpaque(true);
410  label.setBorder(new EmptyBorder(2, 2, 2, 2));
411 
412  panel.add(label, BorderLayout.CENTER);
413  return panel;
414  }
415 
416  class LocalDiskThread extends SwingWorker<Object, Void> {
417 
418  private Logger logger = Logger.getLogger(LocalDiskThread.class.getName());
419 
420  @Override
421  protected Object doInBackground() throws Exception {
422  // Populate the lists
423  physicalDrives = PlatformUtil.getPhysicalDrives();
424  partitions = PlatformUtil.getPartitions();
425 
426  return null;
427  }
428 
429  private void displayErrors() {
430  if (physicalDrives.isEmpty() && partitions.isEmpty()) {
431  if (PlatformUtil.isWindowsOS()) {
432  errorLabel.setText(
433  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.disksNotDetected.text"));
434  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
435  "LocalDiskPanel.errLabel.disksNotDetected.toolTipText"));
436  } else {
437  errorLabel.setText(
438  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.drivesNotDetected.text"));
439  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
440  "LocalDiskPanel.errLabel.drivesNotDetected.toolTipText"));
441  }
442  diskComboBox.setEnabled(false);
443  } else if (physicalDrives.isEmpty()) {
444  errorLabel.setText(
445  NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.someDisksNotDetected.text"));
446  errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
447  "LocalDiskPanel.errLabel.someDisksNotDetected.toolTipText"));
448  }
449  }
450 
451  @Override
452  protected void done() {
453  try {
454  super.get(); //block and get all exceptions thrown while doInBackground()
455  } catch (CancellationException ex) {
456  logger.log(Level.INFO, "Loading local disks was canceled, which should not be possible."); //NON-NLS
457  } catch (InterruptedException ex) {
458  logger.log(Level.INFO, "Loading local disks was interrupted."); //NON-NLS
459  } catch (Exception ex) {
460  logger.log(Level.SEVERE, "Fatal error when loading local disks", ex); //NON-NLS
461  } finally {
462  if (!this.isCancelled()) {
463  enableNext = false;
464  displayErrors();
465 
466  worker = null;
467  loadingDisks = false;
468 
469  disks.addAll(physicalDrives);
470  disks.addAll(partitions);
471 
472  if (disks.size() > 0) {
473  diskComboBox.setEnabled(true);
474  diskComboBox.setSelectedIndex(0);
475  }
476  ready = true;
477  } else {
478  logger.log(Level.INFO, "Loading local disks was canceled, which should not be possible."); //NON-NLS
479  }
480  }
481  }
482  }
483  }
484 }
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: Tue Oct 25 2016
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.