Autopsy  4.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
FileTypeIdGlobalSettingsPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2014 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.modules.filetypeid;
20 
21 import java.awt.*;
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.io.UnsupportedEncodingException;
25 import java.nio.charset.Charset;
26 import java.util.Collections;
27 import javax.swing.DefaultComboBoxModel;
28 import javax.swing.DefaultListModel;
29 import javax.swing.JOptionPane;
30 import javax.swing.event.DocumentEvent;
31 import javax.swing.event.DocumentListener;
32 import javax.swing.event.ListSelectionEvent;
33 import javax.swing.event.ListSelectionListener;
34 import javax.xml.bind.DatatypeConverter;
35 import org.openide.util.NbBundle;
41 
47 final class FileTypeIdGlobalSettingsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
48 
49  private static final String RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem");
50  private static final String ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem");
51 
52  private static final String START_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.offsetComboBox.startItem");
53  private static final String END_OFFSET_RELATIVE_COMBO_BOX_ITEM = NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem");
60  private DefaultListModel<FileType> typesListModel;
61  private java.util.List<FileType> fileTypes;
62 
69  // TODO: Disabling during ingest would not be necessary if the file ingest
70  // modules obtained and shared a per data source ingest job snapshot of the
71  // file type definitions.
72  IngestJobEventPropertyChangeListener ingestJobEventsListener;
73 
77  FileTypeIdGlobalSettingsPanel() {
78  initComponents();
79  customizeComponents();
80  addIngestJobEventsListener();
81  }
82 
87  @NbBundle.Messages({"FileTypeIdGlobalSettingsPanel.Title=Global File Type Identification Settings"})
88  private void customizeComponents() {
89  setName(Bundle.FileTypeIdGlobalSettingsPanel_Title());
90  setFileTypesListModel();
91  setSignatureTypeComboBoxModel();
92  setOffsetRealtiveToComboBoxModel();
93  clearTypeDetailsComponents();
94  addTypeListSelectionListener();
95  addTextFieldListeners();
96  }
97 
101  private void setFileTypesListModel() {
102  typesListModel = new DefaultListModel<>();
103  typesList.setModel(typesListModel);
104  }
105 
109  private void setSignatureTypeComboBoxModel() {
110  DefaultComboBoxModel<String> sigTypeComboBoxModel = new DefaultComboBoxModel<>();
111  sigTypeComboBoxModel.addElement(FileTypeIdGlobalSettingsPanel.RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
112  sigTypeComboBoxModel.addElement(FileTypeIdGlobalSettingsPanel.ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM);
113  signatureTypeComboBox.setModel(sigTypeComboBoxModel);
114  signatureTypeComboBox.setSelectedItem(FileTypeIdGlobalSettingsPanel.RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
115  }
116 
120  private void setOffsetRealtiveToComboBoxModel() {
121  DefaultComboBoxModel<String> offsetRelComboBoxModel = new DefaultComboBoxModel<>();
122  offsetRelComboBoxModel.addElement(FileTypeIdGlobalSettingsPanel.START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
123  offsetRelComboBoxModel.addElement(FileTypeIdGlobalSettingsPanel.END_OFFSET_RELATIVE_COMBO_BOX_ITEM);
124  offsetRelativeToComboBox.setModel(offsetRelComboBoxModel);
125  offsetRelativeToComboBox.setSelectedItem(FileTypeIdGlobalSettingsPanel.START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
126  }
127 
133  private void addTypeListSelectionListener() {
134  typesList.addListSelectionListener(new ListSelectionListener() {
135  @Override
136  public void valueChanged(ListSelectionEvent e) {
137  if (e.getValueIsAdjusting() == false) {
138  if (typesList.getSelectedIndex() == -1) {
139  clearTypeDetailsComponents();
140  } else {
141  populateTypeDetailsComponents();
142  }
143  }
144  }
145  });
146  }
147 
152  private void addTextFieldListeners() {
153  DocumentListener listener = new DocumentListener() {
154  @Override
155  public void changedUpdate(DocumentEvent e) {
156  enableButtons();
157  }
158 
159  @Override
160  public void removeUpdate(DocumentEvent e) {
161  enableButtons();
162  }
163 
164  @Override
165  public void insertUpdate(DocumentEvent e) {
166  enableButtons();
167  }
168  };
169 
170  mimeTypeTextField.getDocument().addDocumentListener(listener);
171  offsetTextField.getDocument().addDocumentListener(listener);
172  signatureTextField.getDocument().addDocumentListener(listener);
173  filesSetNameTextField.getDocument().addDocumentListener(listener);
174  }
175 
182  // TODO: Disabling during ingest would not be necessary if the file ingest
183  // modules obtained and shared a per data source ingest job snapshot of the
184  // file type definitions.
185  private void addIngestJobEventsListener() {
186  ingestJobEventsListener = new IngestJobEventPropertyChangeListener();
187  IngestManager.getInstance().addIngestJobEventListener(ingestJobEventsListener);
188  }
189 
193  private class IngestJobEventPropertyChangeListener implements PropertyChangeListener {
194 
195  @Override
196  public void propertyChange(PropertyChangeEvent evt) {
197  EventQueue.invokeLater(new Runnable() {
198  @Override
199  public void run() {
200  enableButtons();
201  }
202  });
203  }
204  }
205 
210  private void enableButtons() {
211  boolean ingestIsRunning = IngestManager.getInstance().isIngestRunning();
212  newTypeButton.setEnabled(!ingestIsRunning);
213 
214  boolean fileTypeIsSelected = typesList.getSelectedIndex() != -1;
215  deleteTypeButton.setEnabled(!ingestIsRunning && fileTypeIsSelected);
216 
217  boolean requiredFieldsPopulated
218  = !mimeTypeTextField.getText().isEmpty()
219  && !offsetTextField.getText().isEmpty()
220  && !signatureTextField.getText().isEmpty()
221  && (postHitCheckBox.isSelected() ? !filesSetNameTextField.getText().isEmpty() : true);
222  saveTypeButton.setEnabled(!ingestIsRunning && requiredFieldsPopulated);
223 
224  ingestRunningWarningLabel.setVisible(ingestIsRunning);
225  }
226 
230  @Override
231  public void load() {
232  try {
233  fileTypes = UserDefinedFileTypesManager.getInstance().getUserDefinedFileTypes();
234  updateFileTypesListModel();
235  if (!typesListModel.isEmpty()) {
236  typesList.setSelectedIndex(0);
237  }
238  } catch (UserDefinedFileTypesException ex) {
239  JOptionPane.showMessageDialog(null,
240  ex.getLocalizedMessage(),
241  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title"),
242  JOptionPane.ERROR_MESSAGE);
243  fileTypes = Collections.emptyList();
244  }
245  enableButtons();
246  }
247 
251  private void updateFileTypesListModel() {
252  typesListModel.clear();
253  for (FileType fileType : fileTypes) {
254  typesListModel.addElement(fileType);
255 
256  }
257  }
258 
263  private void populateTypeDetailsComponents() {
264  FileType fileType = typesList.getSelectedValue();
265  if (null != fileType) {
266  mimeTypeTextField.setText(fileType.getMimeType());
267  mimeTypeTextField.setEditable(false);
268  Signature signature = fileType.getSignature();
269  FileType.Signature.Type sigType = signature.getType();
270  signatureTypeComboBox.setSelectedItem(sigType == FileType.Signature.Type.RAW ? FileTypeIdGlobalSettingsPanel.RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM : FileTypeIdGlobalSettingsPanel.ASCII_SIGNATURE_TYPE_COMBO_BOX_ITEM);
271  String signatureBytes;
272  if (Signature.Type.RAW == signature.getType()) {
273  signatureBytes = DatatypeConverter.printHexBinary(signature.getSignatureBytes());
274  } else {
275  try {
276  signatureBytes = new String(signature.getSignatureBytes(), "UTF-8");
277  } catch (UnsupportedEncodingException ex) {
278  JOptionPane.showMessageDialog(null,
279  ex.getLocalizedMessage(),
280  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.storeFailed.title"),
281  JOptionPane.ERROR_MESSAGE);
282  signatureBytes = "";
283  }
284  }
285  signatureTextField.setText(signatureBytes);
286  offsetRelativeToComboBox.setSelectedItem(signature.isRelativeToStart() ? FileTypeIdGlobalSettingsPanel.START_OFFSET_RELATIVE_COMBO_BOX_ITEM : FileTypeIdGlobalSettingsPanel.END_OFFSET_RELATIVE_COMBO_BOX_ITEM);
287  offsetTextField.setText(Long.toString(signature.getOffset()));
288  postHitCheckBox.setSelected(fileType.alertOnMatch());
289  filesSetNameTextField.setEnabled(postHitCheckBox.isSelected());
290  filesSetNameTextField.setText(fileType.getFilesSetName());
291  }
292  enableButtons();
293  }
294 
299  private void clearTypeDetailsComponents() {
300  typesList.clearSelection();
301  mimeTypeTextField.setText(""); //NON-NLS
302  mimeTypeTextField.setEditable(true);
303  signatureTypeComboBox.setSelectedItem(FileTypeIdGlobalSettingsPanel.RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM);
304  hexPrefixLabel.setVisible(true);
305  signatureTextField.setText("0000"); //NON-NLS
306  offsetRelativeToComboBox.setSelectedItem(FileTypeIdGlobalSettingsPanel.START_OFFSET_RELATIVE_COMBO_BOX_ITEM);
307  offsetTextField.setText(""); //NON-NLS
308  postHitCheckBox.setSelected(false);
309  filesSetNameTextField.setText(""); //NON-NLS
310  filesSetNameTextField.setEnabled(false);
311  enableButtons();
312  }
313 
317  @Override
318  public void store() {
319  try {
320  UserDefinedFileTypesManager.getInstance().setUserDefinedFileTypes(fileTypes);
321  } catch (UserDefinedFileTypesManager.UserDefinedFileTypesException ex) {
322  JOptionPane.showMessageDialog(null,
323  ex.getLocalizedMessage(),
324  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.storeFailed.title"),
325  JOptionPane.ERROR_MESSAGE);
326  }
327  }
328 
332  @Override
333  public void saveSettings() {
334  store();
335  }
336 
340  @Override
341  @SuppressWarnings("FinalizeDeclaration")
342  protected void finalize() throws Throwable {
343  IngestManager.getInstance().removeIngestJobEventListener(ingestJobEventsListener);
344  super.finalize();
345  }
346 
352  @SuppressWarnings("unchecked")
353  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
354  private void initComponents() {
355 
356  typesScrollPane = new javax.swing.JScrollPane();
357  typesList = new javax.swing.JList<FileType>();
358  separator = new javax.swing.JSeparator();
359  mimeTypeLabel = new javax.swing.JLabel();
360  mimeTypeTextField = new javax.swing.JTextField();
361  signatureTypeLabel = new javax.swing.JLabel();
362  signatureTextField = new javax.swing.JTextField();
363  offsetLabel = new javax.swing.JLabel();
364  offsetTextField = new javax.swing.JTextField();
365  newTypeButton = new javax.swing.JButton();
366  deleteTypeButton = new javax.swing.JButton();
367  saveTypeButton = new javax.swing.JButton();
368  hexPrefixLabel = new javax.swing.JLabel();
369  signatureTypeComboBox = new javax.swing.JComboBox<String>();
370  signatureLabel = new javax.swing.JLabel();
371  postHitCheckBox = new javax.swing.JCheckBox();
372  filesSetNameLabel = new javax.swing.JLabel();
373  filesSetNameTextField = new javax.swing.JTextField();
374  ingestRunningWarningLabel = new javax.swing.JLabel();
375  jLabel2 = new javax.swing.JLabel();
376  jLabel3 = new javax.swing.JLabel();
377  offsetRelativeToComboBox = new javax.swing.JComboBox<String>();
378  offsetRelativeToLabel = new javax.swing.JLabel();
379 
380  setMaximumSize(new java.awt.Dimension(500, 300));
381  setPreferredSize(new java.awt.Dimension(500, 300));
382 
383  typesList.setFont(typesList.getFont().deriveFont(typesList.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
384  typesList.setMaximumSize(new java.awt.Dimension(150, 0));
385  typesList.setMinimumSize(new java.awt.Dimension(150, 0));
386  typesScrollPane.setViewportView(typesList);
387 
388  separator.setOrientation(javax.swing.SwingConstants.VERTICAL);
389 
390  mimeTypeLabel.setFont(mimeTypeLabel.getFont().deriveFont(mimeTypeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
391  org.openide.awt.Mnemonics.setLocalizedText(mimeTypeLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.mimeTypeLabel.text")); // NOI18N
392 
393  mimeTypeTextField.setFont(mimeTypeTextField.getFont().deriveFont(mimeTypeTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
394  mimeTypeTextField.setText(org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.mimeTypeTextField.text")); // NOI18N
395 
396  signatureTypeLabel.setFont(signatureTypeLabel.getFont().deriveFont(signatureTypeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
397  org.openide.awt.Mnemonics.setLocalizedText(signatureTypeLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.signatureTypeLabel.text")); // NOI18N
398 
399  signatureTextField.setFont(signatureTextField.getFont().deriveFont(signatureTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
400  signatureTextField.setText(org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.signatureTextField.text")); // NOI18N
401  signatureTextField.addActionListener(new java.awt.event.ActionListener() {
402  public void actionPerformed(java.awt.event.ActionEvent evt) {
403  signatureTextFieldActionPerformed(evt);
404  }
405  });
406 
407  offsetLabel.setFont(offsetLabel.getFont().deriveFont(offsetLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
408  org.openide.awt.Mnemonics.setLocalizedText(offsetLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.offsetLabel.text")); // NOI18N
409 
410  offsetTextField.setFont(offsetTextField.getFont().deriveFont(offsetTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
411  offsetTextField.setText(org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.offsetTextField.text")); // NOI18N
412 
413  newTypeButton.setFont(newTypeButton.getFont().deriveFont(newTypeButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
414  org.openide.awt.Mnemonics.setLocalizedText(newTypeButton, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.newTypeButton.text")); // NOI18N
415  newTypeButton.addActionListener(new java.awt.event.ActionListener() {
416  public void actionPerformed(java.awt.event.ActionEvent evt) {
417  newTypeButtonActionPerformed(evt);
418  }
419  });
420 
421  deleteTypeButton.setFont(deleteTypeButton.getFont().deriveFont(deleteTypeButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
422  org.openide.awt.Mnemonics.setLocalizedText(deleteTypeButton, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.deleteTypeButton.text")); // NOI18N
423  deleteTypeButton.addActionListener(new java.awt.event.ActionListener() {
424  public void actionPerformed(java.awt.event.ActionEvent evt) {
425  deleteTypeButtonActionPerformed(evt);
426  }
427  });
428 
429  saveTypeButton.setFont(saveTypeButton.getFont().deriveFont(saveTypeButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
430  org.openide.awt.Mnemonics.setLocalizedText(saveTypeButton, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.saveTypeButton.text")); // NOI18N
431  saveTypeButton.addActionListener(new java.awt.event.ActionListener() {
432  public void actionPerformed(java.awt.event.ActionEvent evt) {
433  saveTypeButtonActionPerformed(evt);
434  }
435  });
436 
437  hexPrefixLabel.setFont(hexPrefixLabel.getFont().deriveFont(hexPrefixLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
438  org.openide.awt.Mnemonics.setLocalizedText(hexPrefixLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.hexPrefixLabel.text")); // NOI18N
439 
440  signatureTypeComboBox.setFont(signatureTypeComboBox.getFont().deriveFont(signatureTypeComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
441  signatureTypeComboBox.addActionListener(new java.awt.event.ActionListener() {
442  public void actionPerformed(java.awt.event.ActionEvent evt) {
443  signatureTypeComboBoxActionPerformed(evt);
444  }
445  });
446 
447  signatureLabel.setFont(signatureLabel.getFont().deriveFont(signatureLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
448  org.openide.awt.Mnemonics.setLocalizedText(signatureLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.signatureLabel.text")); // NOI18N
449 
450  postHitCheckBox.setFont(postHitCheckBox.getFont().deriveFont(postHitCheckBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
451  org.openide.awt.Mnemonics.setLocalizedText(postHitCheckBox, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.postHitCheckBox.text")); // NOI18N
452  postHitCheckBox.addActionListener(new java.awt.event.ActionListener() {
453  public void actionPerformed(java.awt.event.ActionEvent evt) {
454  postHitCheckBoxActionPerformed(evt);
455  }
456  });
457 
458  filesSetNameLabel.setFont(filesSetNameLabel.getFont().deriveFont(filesSetNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
459  org.openide.awt.Mnemonics.setLocalizedText(filesSetNameLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.filesSetNameLabel.text")); // NOI18N
460 
461  filesSetNameTextField.setFont(filesSetNameTextField.getFont().deriveFont(filesSetNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
462  filesSetNameTextField.setText(org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.filesSetNameTextField.text")); // NOI18N
463 
464  ingestRunningWarningLabel.setFont(ingestRunningWarningLabel.getFont().deriveFont(ingestRunningWarningLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
465  ingestRunningWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/filetypeid/warning16.png"))); // NOI18N
466  org.openide.awt.Mnemonics.setLocalizedText(ingestRunningWarningLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text")); // NOI18N
467 
468  jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
469  org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.jLabel2.text")); // NOI18N
470 
471  jLabel3.setFont(jLabel3.getFont().deriveFont(jLabel3.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
472  org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.jLabel3.text")); // NOI18N
473 
474  offsetRelativeToComboBox.setFont(offsetRelativeToComboBox.getFont().deriveFont(offsetRelativeToComboBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
475 
476  offsetRelativeToLabel.setFont(offsetRelativeToLabel.getFont().deriveFont(offsetRelativeToLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
477  org.openide.awt.Mnemonics.setLocalizedText(offsetRelativeToLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.offsetRelativeToLabel.text")); // NOI18N
478 
479  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
480  this.setLayout(layout);
481  layout.setHorizontalGroup(
482  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
483  .addGroup(layout.createSequentialGroup()
484  .addContainerGap()
485  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
486  .addGroup(layout.createSequentialGroup()
487  .addComponent(ingestRunningWarningLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
488  .addGap(30, 30, 30))
489  .addGroup(layout.createSequentialGroup()
490  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
491  .addGroup(layout.createSequentialGroup()
492  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
493  .addComponent(jLabel2)
494  .addGroup(layout.createSequentialGroup()
495  .addGap(10, 10, 10)
496  .addComponent(deleteTypeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
497  .addGap(18, 18, 18)
498  .addComponent(newTypeButton, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE))
499  .addComponent(typesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE))
500  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
501  .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE)
502  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
503  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
504  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
505  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
506  .addGap(21, 21, 21)
507  .addComponent(filesSetNameLabel)
508  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
509  .addComponent(filesSetNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE))
510  .addGroup(layout.createSequentialGroup()
511  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
512  .addGroup(layout.createSequentialGroup()
513  .addComponent(mimeTypeLabel)
514  .addGap(30, 30, 30)
515  .addComponent(mimeTypeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 176, javax.swing.GroupLayout.PREFERRED_SIZE))
516  .addComponent(postHitCheckBox)
517  .addGroup(layout.createSequentialGroup()
518  .addComponent(signatureTypeLabel)
519  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
520  .addComponent(signatureTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 176, javax.swing.GroupLayout.PREFERRED_SIZE))
521  .addGroup(layout.createSequentialGroup()
522  .addComponent(signatureLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)
523  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
524  .addComponent(hexPrefixLabel)
525  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
526  .addComponent(signatureTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE))
527  .addGroup(layout.createSequentialGroup()
528  .addComponent(offsetLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)
529  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
530  .addComponent(offsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE)))
531  .addGap(6, 6, 6)))
532  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
533  .addComponent(saveTypeButton)
534  .addGap(8, 8, 8))
535  .addGroup(layout.createSequentialGroup()
536  .addComponent(offsetRelativeToLabel)
537  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
538  .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
539  .addComponent(jLabel3))
540  .addContainerGap(28, Short.MAX_VALUE))))
541  );
542  layout.setVerticalGroup(
543  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
544  .addGroup(layout.createSequentialGroup()
545  .addContainerGap()
546  .addComponent(jLabel3)
547  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
548  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
549  .addGroup(layout.createSequentialGroup()
550  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
551  .addGroup(layout.createSequentialGroup()
552  .addComponent(jLabel2)
553  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
554  .addComponent(typesScrollPane)
555  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
556  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
557  .addComponent(deleteTypeButton)
558  .addComponent(newTypeButton)))
559  .addComponent(separator))
560  .addGap(18, 18, 18)
561  .addComponent(ingestRunningWarningLabel))
562  .addGroup(layout.createSequentialGroup()
563  .addGap(24, 24, 24)
564  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
565  .addComponent(mimeTypeLabel)
566  .addComponent(mimeTypeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
567  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
568  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
569  .addComponent(signatureTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
570  .addComponent(signatureTypeLabel))
571  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
572  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
573  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
574  .addComponent(hexPrefixLabel)
575  .addComponent(signatureTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
576  .addComponent(signatureLabel))
577  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
578  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
579  .addComponent(offsetLabel)
580  .addComponent(offsetTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
581  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
582  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
583  .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
584  .addComponent(offsetRelativeToLabel))
585  .addGap(16, 16, 16)
586  .addComponent(postHitCheckBox)
587  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
588  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
589  .addComponent(filesSetNameLabel)
590  .addComponent(filesSetNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
591  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
592  .addComponent(saveTypeButton)
593  .addGap(0, 21, Short.MAX_VALUE))))
594  );
595 
596  layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deleteTypeButton, newTypeButton, saveTypeButton});
597 
598  }// </editor-fold>//GEN-END:initComponents
599 
600  private void newTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newTypeButtonActionPerformed
601  clearTypeDetailsComponents();
602  }//GEN-LAST:event_newTypeButtonActionPerformed
603 
604  private void deleteTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteTypeButtonActionPerformed
605  FileType fileType = typesList.getSelectedValue();
606  fileTypes.remove(fileType);
607  updateFileTypesListModel();
608  if (!typesListModel.isEmpty()) {
609  typesList.setSelectedIndex(0);
610  }
611  }//GEN-LAST:event_deleteTypeButtonActionPerformed
612 
613  private void saveTypeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveTypeButtonActionPerformed
617  String typeName = mimeTypeTextField.getText();
618  if (typeName.isEmpty()) {
619  JOptionPane.showMessageDialog(null,
620  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.message"),
621  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.title"),
622  JOptionPane.ERROR_MESSAGE);
623  return;
624  }
625 
629  FileType.Signature.Type sigType = signatureTypeComboBox.getSelectedItem() == FileTypeIdGlobalSettingsPanel.RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM ? FileType.Signature.Type.RAW : FileType.Signature.Type.ASCII;
630 
634  String sigString = signatureTextField.getText();
635  if (sigString.isEmpty()) {
636  JOptionPane.showMessageDialog(null,
637  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.message"),
638  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.title"),
639  JOptionPane.ERROR_MESSAGE);
640  return;
641  }
642  byte[] signatureBytes;
643  if (FileType.Signature.Type.RAW == sigType) {
644  try {
645  sigString = sigString.replaceAll("\\s", ""); //NON-NLS
646  signatureBytes = DatatypeConverter.parseHexBinary(sigString);
647  } catch (IllegalArgumentException ex) {
648  JOptionPane.showMessageDialog(null,
649  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidRawSignatureBytes.message"),
650  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignatureBytes.title"),
651  JOptionPane.ERROR_MESSAGE);
652  return;
653  }
654  } else {
655  signatureBytes = sigString.getBytes(Charset.forName("UTF-8"));
656  }
657 
661  long offset;
662  boolean isRelativeToStart = offsetRelativeToComboBox.getSelectedItem() == FileTypeIdGlobalSettingsPanel.START_OFFSET_RELATIVE_COMBO_BOX_ITEM;
663  try {
664  offset = Long.parseUnsignedLong(offsetTextField.getText());
665  if(!isRelativeToStart && signatureBytes.length > offset+1) {
666  JOptionPane.showMessageDialog(null,
667  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.length"),
668  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title"),
669  JOptionPane.ERROR_MESSAGE);
670  return;
671  }
672  } catch (NumberFormatException ex) {
673  JOptionPane.showMessageDialog(null,
674  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.message"),
675  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title"),
676  JOptionPane.ERROR_MESSAGE);
677  return;
678  }
679 
683  String filesSetName = "";
684  if (postHitCheckBox.isSelected()) {
685  filesSetName = filesSetNameTextField.getText();
686  }
687  if (postHitCheckBox.isSelected() && filesSetName.isEmpty()) {
688  JOptionPane.showMessageDialog(null,
689  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.message"),
690  NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.title"),
691  JOptionPane.ERROR_MESSAGE);
692  return;
693  }
694 
698  FileType.Signature signature = new FileType.Signature(signatureBytes, offset, sigType, isRelativeToStart);
699  FileType fileType = new FileType(typeName, signature, filesSetName, postHitCheckBox.isSelected());
700  FileType selected = typesList.getSelectedValue();
701  if (selected != null) {
702  fileTypes.remove(selected);
703  }
704  fileTypes.add(fileType);
705  updateFileTypesListModel();
706  typesList.setSelectedValue(fileType, true);
707  }//GEN-LAST:event_saveTypeButtonActionPerformed
708 
709  private void postHitCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_postHitCheckBoxActionPerformed
710  filesSetNameTextField.setEnabled(postHitCheckBox.isSelected());
711  enableButtons();
712  }//GEN-LAST:event_postHitCheckBoxActionPerformed
713 
714  private void signatureTypeComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_signatureTypeComboBoxActionPerformed
715  if (signatureTypeComboBox.getSelectedItem() == FileTypeIdGlobalSettingsPanel.RAW_SIGNATURE_TYPE_COMBO_BOX_ITEM) {
716  hexPrefixLabel.setVisible(true);
717  signatureTextField.setText("0000");
718  } else {
719  hexPrefixLabel.setVisible(false);
720  signatureTextField.setText("");
721  }
722  }//GEN-LAST:event_signatureTypeComboBoxActionPerformed
723 
724  private void signatureTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_signatureTextFieldActionPerformed
725  // TODO add your handling code here:
726  }//GEN-LAST:event_signatureTextFieldActionPerformed
727 
728  // Variables declaration - do not modify//GEN-BEGIN:variables
729  private javax.swing.JButton deleteTypeButton;
730  private javax.swing.JLabel filesSetNameLabel;
731  private javax.swing.JTextField filesSetNameTextField;
732  private javax.swing.JLabel hexPrefixLabel;
733  private javax.swing.JLabel ingestRunningWarningLabel;
734  private javax.swing.JLabel jLabel2;
735  private javax.swing.JLabel jLabel3;
736  private javax.swing.JLabel mimeTypeLabel;
737  private javax.swing.JTextField mimeTypeTextField;
738  private javax.swing.JButton newTypeButton;
739  private javax.swing.JLabel offsetLabel;
740  private javax.swing.JComboBox<String> offsetRelativeToComboBox;
741  private javax.swing.JLabel offsetRelativeToLabel;
742  private javax.swing.JTextField offsetTextField;
743  private javax.swing.JCheckBox postHitCheckBox;
744  private javax.swing.JButton saveTypeButton;
745  private javax.swing.JSeparator separator;
746  private javax.swing.JLabel signatureLabel;
747  private javax.swing.JTextField signatureTextField;
748  private javax.swing.JComboBox<String> signatureTypeComboBox;
749  private javax.swing.JLabel signatureTypeLabel;
750  private javax.swing.JList<FileType> typesList;
751  private javax.swing.JScrollPane typesScrollPane;
752  // End of variables declaration//GEN-END:variables
753 
754 }
static synchronized IngestManager getInstance()

Copyright © 2012-2015 Basis Technology. Generated on: Wed Apr 6 2016
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.