Autopsy  4.6.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
IngestJobSettingsPanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2018 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.ingest;
20 
21 import java.awt.Component;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.WindowAdapter;
24 import java.awt.event.WindowEvent;
25 import java.util.ArrayList;
26 import java.util.Arrays;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.logging.Level;
30 import javax.swing.DefaultComboBoxModel;
31 import javax.swing.Icon;
32 import javax.swing.ImageIcon;
33 import javax.swing.JDialog;
34 import javax.swing.JLabel;
35 import javax.swing.JTable;
36 import javax.swing.ListSelectionModel;
37 import javax.swing.SwingUtilities;
38 import javax.swing.event.ListSelectionEvent;
39 import javax.swing.table.AbstractTableModel;
40 import javax.swing.table.DefaultTableCellRenderer;
41 import javax.swing.table.TableColumn;
42 import org.openide.util.NbBundle.Messages;
51 import org.sleuthkit.datamodel.Content;
52 import org.sleuthkit.datamodel.IngestJobInfo;
53 import org.sleuthkit.datamodel.IngestModuleInfo;
54 import org.sleuthkit.datamodel.SleuthkitCase;
55 import org.sleuthkit.datamodel.TskCoreException;
57 
61 public final class IngestJobSettingsPanel extends javax.swing.JPanel {
62 
63  private static final long serialVersionUID = 1L;
64  private static ImageIcon warningIcon = new ImageIcon(IngestJobSettingsPanel.class.getResource("/org/sleuthkit/autopsy/images/warning_triangle.png"));
65  private static ImageIcon infoIcon = new ImageIcon(IngestJobSettingsPanel.class.getResource("/org/sleuthkit/autopsy/images/information-frame.png"));
66  private final IngestJobSettings settings;
67  private final List<Content> dataSources = new ArrayList<>();
68  private final List<IngestJobInfo> ingestJobs = new ArrayList<>();
69  private final List<IngestModuleModel> modules = new ArrayList<>();
72  private static final Logger logger = Logger.getLogger(IngestJobSettingsPanel.class.getName());
73 
81  this.settings = settings;
82  for (IngestModuleTemplate moduleTemplate : settings.getIngestModuleTemplates()) {
83  modules.add(new IngestModuleModel(moduleTemplate));
84  }
87  fileIngestFilterComboBox.setSelectedItem(settings.getFileFilter().getName());
88  }
89 
97  public IngestJobSettingsPanel(IngestJobSettings settings, List<Content> dataSources) {
98  this.settings = settings;
99  this.dataSources.addAll(dataSources);
100  try {
101  SleuthkitCase skCase = Case.getOpenCase().getSleuthkitCase();
102  ingestJobs.addAll(skCase.getIngestJobs());
103  } catch (NoCurrentCaseException ex) {
104  logger.log(Level.SEVERE, "No open case", ex);
105  } catch (TskCoreException ex) {
106  logger.log(Level.SEVERE, "Failed to load ingest job information", ex);
107  }
108  for (IngestModuleTemplate moduleTemplate : settings.getIngestModuleTemplates()) {
109  this.modules.add(new IngestModuleModel(moduleTemplate));
110  }
111  initComponents();
113  fileIngestFilterComboBox.setSelectedItem(settings.getFileFilter().getName());
114  }
115 
122  List<IngestModuleTemplate> moduleTemplates = new ArrayList<>();
123  for (IngestModuleModel module : modules) {
124  IngestModuleTemplate moduleTemplate = module.getIngestModuleTemplate();
125  if (module.hasModuleSettingsPanel()) {
126  IngestModuleIngestJobSettings moduleSettings = module.getModuleSettingsPanel().getSettings();
127  moduleTemplate.setModuleSettings(moduleSettings);
128  }
129  moduleTemplates.add(moduleTemplate);
130  }
131  this.settings.setIngestModuleTemplates(moduleTemplates);
132  return this.settings;
133  }
134 
135  @Messages({"IngestJobSettingsPanel.noPerRunSettings=The selected module has no per-run settings."})
136  private void customizeComponents() {
137  modulesTable.setModel(tableModel);
138  modulesTable.setTableHeader(null);
139  modulesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
140 
141  // Set the column widths in the table model and add a custom cell
142  // renderer that will display module descriptions from the module models
143  // as tooltips.
145  int width = modulesScrollPane.getPreferredSize().width;
146  for (int i = 0; i < modulesTable.getColumnCount(); ++i) {
147  TableColumn column = modulesTable.getColumnModel().getColumn(i);
148  if (0 == i) {
149  column.setPreferredWidth(((int) (width * 0.15)));
150  } else {
151  column.setCellRenderer(renderer);
152  column.setPreferredWidth(((int) (width * 0.84)));
153  }
154  }
155 
156  // Add a selection listener to the table model that will display the
157  // ingest job options panel of the currently selected module model and
158  // enable or disable the resources configuration panel invocation button.
159  modulesTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
160  ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource();
161  if (!listSelectionModel.isSelectionEmpty()) {
162  int index = listSelectionModel.getMinSelectionIndex();
163  selectedModule = modules.get(index);
164  ingestSettingsPanel.removeAll();
165  if (null != selectedModule.getModuleSettingsPanel()) {
166  ingestSettingsPanel.add(selectedModule.getModuleSettingsPanel());
167  } else {
168  ingestSettingsPanel.add(new JLabel(Bundle.IngestJobSettingsPanel_noPerRunSettings()));
169  }
170  ingestSettingsPanel.revalidate();
171  ingestSettingsPanel.repaint();
172  globalSettingsButton.setEnabled(null != selectedModule.getGlobalSettingsPanel());
173  descriptionLabel.setText(selectedModule.getDescription());
174  descriptionLabel.setToolTipText(selectedModule.getDescription());
175  }
176  });
177  modulesTable.setRowSelectionInterval(0, 0);
178  this.modulesTable.getColumnModel().getColumn(0).setMaxWidth(22);
179  this.modulesTable.getColumnModel().getColumn(1).setMaxWidth(20);
180  this.modulesTable.getColumnModel().getColumn(1).setMinWidth(20);
181  modulesTable.setRowHeight(20);
182 
183  /*
184  * Only enable the ingest jobs history panel if there are data sources
185  * and jobs for which to display the history.
186  */
187  pastJobsButton.setEnabled(!dataSources.isEmpty() && !ingestJobs.isEmpty());
188  }
189 
190  void setPastJobsButtonVisible(boolean isVisible) {
191  pastJobsButton.setVisible(isVisible);
192  }
193 
199  @SuppressWarnings("unchecked")
200  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
201  private void initComponents() {
202 
203  timeGroup = new javax.swing.ButtonGroup();
204  modulesScrollPane = new javax.swing.JScrollPane();
205  modulesTable = new javax.swing.JTable();
206  jPanel1 = new javax.swing.JPanel();
207  globalSettingsButton = new javax.swing.JButton();
208  jSeparator2 = new javax.swing.JSeparator();
209  descriptionLabel = new javax.swing.JLabel();
210  jScrollPane1 = new javax.swing.JScrollPane();
211  ingestSettingsPanel = new javax.swing.JPanel();
212  jButtonSelectAll = new javax.swing.JButton();
213  jButtonDeselectAll = new javax.swing.JButton();
214  pastJobsButton = new javax.swing.JButton();
215  fileIngestFilterLabel = new javax.swing.JLabel();
216  fileIngestFilterComboBox = new javax.swing.JComboBox<>();
217 
218  setMaximumSize(new java.awt.Dimension(5750, 3000));
219  setMinimumSize(new java.awt.Dimension(0, 0));
220  setPreferredSize(new java.awt.Dimension(625, 450));
221 
222  modulesScrollPane.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(160, 160, 160)));
223  modulesScrollPane.setMinimumSize(new java.awt.Dimension(0, 0));
224  modulesScrollPane.setPreferredSize(new java.awt.Dimension(160, 160));
225 
226  modulesTable.setBackground(new java.awt.Color(240, 240, 240));
227  modulesTable.setModel(new javax.swing.table.DefaultTableModel(
228  new Object [][] {
229 
230  },
231  new String [] {
232 
233  }
234  ));
235  modulesTable.setShowHorizontalLines(false);
236  modulesTable.setShowVerticalLines(false);
237  modulesScrollPane.setViewportView(modulesTable);
238 
239  jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(160, 160, 160)));
240  jPanel1.setPreferredSize(new java.awt.Dimension(338, 257));
241 
242  globalSettingsButton.setText(org.openide.util.NbBundle.getMessage(IngestJobSettingsPanel.class, "IngestJobSettingsPanel.globalSettingsButton.text")); // NOI18N
243  globalSettingsButton.setActionCommand(org.openide.util.NbBundle.getMessage(IngestJobSettingsPanel.class, "IngestJobSettingsPanel.globalSettingsButton.actionCommand")); // NOI18N
244  globalSettingsButton.setEnabled(false);
245  globalSettingsButton.addActionListener(new java.awt.event.ActionListener() {
246  public void actionPerformed(java.awt.event.ActionEvent evt) {
248  }
249  });
250 
251  descriptionLabel.setText("DO NOT REMOVE. This dummy text is used to anchor the inner panel's size to the outer panel, while still being expandable. Without this the expandability behavior doesn't work well. This text will never be shown, as it would only be shown when no module is selected (which is not possible).");
252 
253  jScrollPane1.setBorder(null);
254  jScrollPane1.setPreferredSize(new java.awt.Dimension(250, 180));
255 
256  ingestSettingsPanel.setMinimumSize(new java.awt.Dimension(0, 300));
257  ingestSettingsPanel.setLayout(new javax.swing.BoxLayout(ingestSettingsPanel, javax.swing.BoxLayout.PAGE_AXIS));
258  jScrollPane1.setViewportView(ingestSettingsPanel);
259 
260  javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
261  jPanel1.setLayout(jPanel1Layout);
262  jPanel1Layout.setHorizontalGroup(
263  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
264  .addComponent(jSeparator2, javax.swing.GroupLayout.Alignment.TRAILING)
265  .addGroup(jPanel1Layout.createSequentialGroup()
266  .addGap(8, 8, 8)
267  .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
268  .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
269  .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE)
270  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
271  .addGap(0, 0, Short.MAX_VALUE)
272  .addComponent(globalSettingsButton)))
273  .addGap(8, 8, 8))
274  );
275  jPanel1Layout.setVerticalGroup(
276  jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
277  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
278  .addContainerGap()
279  .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
280  .addGap(18, 18, 18)
281  .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
282  .addGap(8, 8, 8)
283  .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
284  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
285  .addComponent(globalSettingsButton)
286  .addGap(8, 8, 8))
287  );
288 
289  jButtonSelectAll.setText(org.openide.util.NbBundle.getMessage(IngestJobSettingsPanel.class, "IngestJobSettingsPanel.jButtonSelectAll.text")); // NOI18N
290  jButtonSelectAll.setMargin(new java.awt.Insets(2, 8, 2, 8));
291  jButtonSelectAll.setMaximumSize(new java.awt.Dimension(87, 23));
292  jButtonSelectAll.setMinimumSize(new java.awt.Dimension(87, 23));
293  jButtonSelectAll.addActionListener(new java.awt.event.ActionListener() {
294  public void actionPerformed(java.awt.event.ActionEvent evt) {
296  }
297  });
298 
299  jButtonDeselectAll.setText(org.openide.util.NbBundle.getMessage(IngestJobSettingsPanel.class, "IngestJobSettingsPanel.jButtonDeselectAll.text")); // NOI18N
300  jButtonDeselectAll.setMargin(new java.awt.Insets(2, 8, 2, 8));
301  jButtonDeselectAll.addActionListener(new java.awt.event.ActionListener() {
302  public void actionPerformed(java.awt.event.ActionEvent evt) {
304  }
305  });
306 
307  pastJobsButton.setText(org.openide.util.NbBundle.getMessage(IngestJobSettingsPanel.class, "IngestJobSettingsPanel.pastJobsButton.text")); // NOI18N
308  pastJobsButton.setMargin(new java.awt.Insets(2, 8, 2, 8));
309  pastJobsButton.setMaximumSize(new java.awt.Dimension(87, 23));
310  pastJobsButton.setMinimumSize(new java.awt.Dimension(87, 23));
311  pastJobsButton.addActionListener(new java.awt.event.ActionListener() {
312  public void actionPerformed(java.awt.event.ActionEvent evt) {
314  }
315  });
316 
317  fileIngestFilterLabel.setText(org.openide.util.NbBundle.getMessage(IngestJobSettingsPanel.class, "IngestJobSettingsPanel.fileIngestFilterLabel.text")); // NOI18N
318 
319  fileIngestFilterComboBox.setModel(new DefaultComboBoxModel<>(getComboBoxContents()));
320  fileIngestFilterComboBox.addActionListener(new java.awt.event.ActionListener() {
321  public void actionPerformed(java.awt.event.ActionEvent evt) {
323  }
324  });
325 
326  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
327  this.setLayout(layout);
328  layout.setHorizontalGroup(
329  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
330  .addGroup(layout.createSequentialGroup()
331  .addGap(5, 5, 5)
332  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
333  .addGroup(layout.createSequentialGroup()
334  .addComponent(jButtonSelectAll, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
335  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
336  .addComponent(jButtonDeselectAll, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
337  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
338  .addComponent(pastJobsButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
339  .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
340  .addComponent(fileIngestFilterLabel)
341  .addComponent(fileIngestFilterComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
342  .addGap(4, 4, 4)
343  .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 284, Short.MAX_VALUE)
344  .addGap(5, 5, 5))
345  );
346 
347  layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jButtonDeselectAll, jButtonSelectAll, pastJobsButton});
348 
349  layout.setVerticalGroup(
350  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
351  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
352  .addContainerGap()
353  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
354  .addGroup(layout.createSequentialGroup()
355  .addComponent(fileIngestFilterLabel)
356  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
357  .addComponent(fileIngestFilterComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
358  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
359  .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
360  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
361  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
362  .addComponent(jButtonSelectAll, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
363  .addComponent(jButtonDeselectAll)
364  .addComponent(pastJobsButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
365  .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 426, Short.MAX_VALUE))
366  .addContainerGap())
367  );
368  }// </editor-fold>//GEN-END:initComponents
369 
370  private void globalSettingsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_globalSettingsButtonActionPerformed
372 
373  dialog.addApplyButtonListener((ActionEvent e) -> {
374  if (selectedModule.hasGlobalSettingsPanel()) {
375  selectedModule.saveResourcesConfig();
376  }
377  dialog.close();
378  });
379 
380  dialog.addWindowListener(new WindowAdapter() {
381  @Override
382  public void windowClosing(WindowEvent e) {
383  dialog.close();
384  }
385  });
386 
387  dialog.display(selectedModule.getGlobalSettingsPanel());
388  }//GEN-LAST:event_globalSettingsButtonActionPerformed
389 
390  private void jButtonSelectAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonSelectAllActionPerformed
391  SelectAllModules(true);
392  }//GEN-LAST:event_jButtonSelectAllActionPerformed
393 
394  private void jButtonDeselectAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonDeselectAllActionPerformed
395  SelectAllModules(false);
396  }//GEN-LAST:event_jButtonDeselectAllActionPerformed
397  @Messages({"IngestJobSettingsPanel.pastJobsButton.action.frame.title=Ingest History"})
398  private void pastJobsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pastJobsButtonActionPerformed
399  JDialog topFrame = (JDialog) SwingUtilities.getWindowAncestor(this);
400  JDialog dialog = new JDialog(topFrame, Bundle.IngestJobSettingsPanel_pastJobsButton_action_frame_title(), false);
401  IngestJobInfoPanel ingestInfo = new IngestJobInfoPanel();
402  dialog.add(ingestInfo);
403  dialog.setLocationRelativeTo(topFrame);
404  dialog.setResizable(true);
405  dialog.pack();
406  dialog.setVisible(true);
407  }//GEN-LAST:event_pastJobsButtonActionPerformed
408 
409  private void fileIngestFilterComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileIngestFilterComboBoxActionPerformed
410  if (fileIngestFilterComboBox.getSelectedItem().toString().equals(FilesSetPanel.getCreateNewFileIngestFilterString())) {
412  FilesSetDefsPanel fileIngestFilterPanel;
414  fileIngestFilterPanel.load();
415  //save the filters that exist before any are created
416  final ArrayList<String> oldFilterList = new ArrayList<>(Arrays.asList(getComboBoxContents()));
417  dialog.addApplyButtonListener(
418  (ActionEvent e) -> {
419  fileIngestFilterPanel.store();
420  ArrayList<FilesSet> newFilterList = new ArrayList<>();
421  try {
422  newFilterList.addAll(FilesSetsManager.getInstance().getCustomFileIngestFilters().values());
424  logger.log(Level.SEVERE, "Failed to get user created file ingest filters, only default available for selection", ex); //NON-NLS
425  }
426  String filterToSelect = settings.getFileFilter().getName();
427  for (FilesSet filter : newFilterList) { //getting one of the recently created filters
428  if (!oldFilterList.contains(filter.getName())) {
429  //set newly created filter to selected filter
430  filterToSelect = filter.getName();
431  break;
432  }
433  }
434  fileIngestFilterComboBox.setModel(new DefaultComboBoxModel<>(getComboBoxContents()));
435  //set the selected filter after the comboBox Contents were updated to include it
436  fileIngestFilterComboBox.setSelectedItem(filterToSelect);
437  //refresh the saved filter in use case where the selected modified filter
438  //has the same name as a previously existing filter
439  updateSelectedFilter(filterToSelect);
440  dialog.close();
441  }
442  );
443  dialog.display(fileIngestFilterPanel);
444  //return to saved selection in case they cancel out of filter creation
445  fileIngestFilterComboBox.setSelectedItem(settings.getFileFilter().getName());
446  } else if (evt.getActionCommand().equals("comboBoxChanged")) {
447  updateSelectedFilter(fileIngestFilterComboBox.getSelectedItem().toString());
448  }
449  }//GEN-LAST:event_fileIngestFilterComboBoxActionPerformed
450 
451  private void updateSelectedFilter(String filterName) {
452  try {
453  Map<String, FilesSet> fileIngestFilters = FilesSetsManager.getInstance()
456  fileIngestFilters.put(fSet.getName(), fSet);
457  }
458  settings.setFileFilter(fileIngestFilters
459  .get(filterName));
462  logger.log(Level.SEVERE, "Failed to get file ingest filter from combobox selection, default filter being used", ex); //NON-NLS
463  }
464  }
465 
476  private String[] getComboBoxContents() {
477  ArrayList<String> nameList = new ArrayList<>();
479  nameList.add(fSet.getName());
480  }
481  try {
483  nameList.add(fSet.getName());
484  }
486  logger.log(Level.SEVERE, "Failed to get user created file ingest filters for combo box, only default available for selection", ex); //NON-NLS
487  }
489  return nameList.toArray(new String[nameList.size()]);
490  }
491 
492  private void SelectAllModules(boolean set) {
493  for (IngestModuleModel module : modules) {
494  module.setEnabled(set);
495  }
496  modulesTable.repaint();
497  }
498 
499  // Variables declaration - do not modify//GEN-BEGIN:variables
500  private javax.swing.JLabel descriptionLabel;
501  private javax.swing.JComboBox<String> fileIngestFilterComboBox;
502  private javax.swing.JLabel fileIngestFilterLabel;
503  private javax.swing.JButton globalSettingsButton;
504  private javax.swing.JPanel ingestSettingsPanel;
505  private javax.swing.JButton jButtonDeselectAll;
506  private javax.swing.JButton jButtonSelectAll;
507  private javax.swing.JPanel jPanel1;
508  private javax.swing.JScrollPane jScrollPane1;
509  private javax.swing.JSeparator jSeparator2;
510  private javax.swing.JScrollPane modulesScrollPane;
511  private javax.swing.JTable modulesTable;
512  private javax.swing.JButton pastJobsButton;
513  private javax.swing.ButtonGroup timeGroup;
514  // End of variables declaration//GEN-END:variables
515 
521  static private class IngestModuleModel {
522 
526 
527  IngestModuleModel(IngestModuleTemplate moduleTemplate) {
528  this.moduleTemplate = moduleTemplate;
529  if (moduleTemplate.hasModuleSettingsPanel()) {
530  moduleSettingsPanel = moduleTemplate.getModuleSettingsPanel();
531  }
532  if (moduleTemplate.hasGlobalSettingsPanel()) {
533  globalSettingsPanel = moduleTemplate.getGlobalSettingsPanel();
534  }
535  }
536 
537  IngestModuleTemplate getIngestModuleTemplate() {
538  return moduleTemplate;
539  }
540 
541  String getName() {
542  return moduleTemplate.getModuleName();
543  }
544 
545  String getDescription() {
546  return moduleTemplate.getModuleDescription();
547  }
548 
549  void setEnabled(boolean enabled) {
550  moduleTemplate.setEnabled(enabled);
551  }
552 
553  boolean isEnabled() {
554  return moduleTemplate.isEnabled();
555  }
556 
557  boolean hasModuleSettingsPanel() {
558  return moduleTemplate.hasModuleSettingsPanel();
559  }
560 
561  IngestModuleIngestJobSettingsPanel getModuleSettingsPanel() {
562  return moduleSettingsPanel;
563  }
564 
565  boolean hasGlobalSettingsPanel() {
566  return moduleTemplate.hasGlobalSettingsPanel();
567  }
568 
569  IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() {
570  return globalSettingsPanel;
571  }
572 
573  void saveResourcesConfig() {
574  globalSettingsPanel.saveSettings();
575  }
576  }
577 
582  private class IngestModulesTableModel extends AbstractTableModel {
583 
584  private static final long serialVersionUID = 1L;
585 
586  @Override
587  public int getRowCount() {
588  return modules.size();
589  }
590 
591  @Override
592  public int getColumnCount() {
593  return 3;
594  }
595 
596  @Override
597  public Object getValueAt(int rowIndex, int columnIndex) {
598  IngestModuleModel module = modules.get(rowIndex);
599  switch (columnIndex) {
600  case 0:
601  return module.isEnabled();
602  case 1:
603  return getIcon(module);
604  default:
605  return module.getName();
606  }
607  }
608 
609  @Override
610  public boolean isCellEditable(int rowIndex, int columnIndex) {
611  return columnIndex == 0;
612  }
613 
614  @Override
615  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
616  if (columnIndex == 0) {
617  modules.get(rowIndex).setEnabled((boolean) aValue);
618  }
619  }
620 
621  @Override
622  public Class<?> getColumnClass(int c) {
623  return getValueAt(0, c).getClass();
624  }
625 
626  private ImageIcon getIcon(IngestModuleModel module) {
627  if (dataSources.isEmpty() || ingestJobs.isEmpty()) {
628  return null;
629  }
630  boolean previousVersionRun = false;
631  for (IngestJobInfo ingestJob : ingestJobs) {
632  if (ingestJob.getStatus() != IngestJobInfo.IngestJobStatusType.COMPLETED) {
633  continue;
634  }
635  long objectId = ingestJob.getObjectId();
636  boolean isSameDataSource = false;
637  for (Content dataSource : dataSources) {
638  isSameDataSource = isSameDataSource || dataSource.getId() == objectId;
639  }
640  if (isSameDataSource) {
641  IngestModuleFactory factory = module.getIngestModuleTemplate().getModuleFactory();
642  if (factory.isDataSourceIngestModuleFactory()) {
643  String uniqueName = FactoryClassNameNormalizer.normalize(factory.getClass().getCanonicalName()) + "-"
644  + factory.getModuleDisplayName() + "-"
645  + IngestModuleInfo.IngestModuleType.DATA_SOURCE_LEVEL.toString() + "-"
646  + factory.getModuleVersionNumber();
647  for (IngestModuleInfo ingestModuleInfo : ingestJob.getIngestModuleInfo()) {
648  boolean sameModule = ingestModuleInfo.getUniqueName().equals(uniqueName);
649  if (sameModule) {
650  if (ingestModuleInfo.getVersion().equals(module.getIngestModuleTemplate().getModuleFactory().getModuleVersionNumber())) {
651  return warningIcon;
652  }
653  }
654  previousVersionRun = previousVersionRun || sameModule;
655  }
656  }
657  if (factory.isFileIngestModuleFactory()) {
658  String uniqueName = FactoryClassNameNormalizer.normalize(factory.getClass().getCanonicalName()) + "-"
659  + factory.getModuleDisplayName() + "-"
660  + IngestModuleInfo.IngestModuleType.FILE_LEVEL.toString() + "-"
661  + factory.getModuleVersionNumber();
662  for (IngestModuleInfo ingestModuleInfo : ingestJob.getIngestModuleInfo()) {
663  boolean sameModule = ingestModuleInfo.getUniqueName().equals(uniqueName);
664  if (sameModule) {
665  if (ingestModuleInfo.getVersion().equals(module.getIngestModuleTemplate().getModuleFactory().getModuleVersionNumber())) {
666  return warningIcon;
667  }
668  }
669  previousVersionRun = previousVersionRun || sameModule;
670  }
671  }
672  }
673  }
674  if (previousVersionRun) {
675  return infoIcon;
676  }
677  return null;
678  }
679  }
680 
685  @Messages({"IngestJobSettingsPanel.IngestModulesTableRenderer.warning.message=This ingest module has been run before on this data source.",
686  "IngestJobSettingsPanel.IngestModulesTableRenderer.info.message=A previous version of this ingest module has been run before on this data source."})
687  private class IngestModulesTableRenderer extends DefaultTableCellRenderer {
688 
689  private static final long serialVersionUID = 1L;
690 
691  List<String> tooltips = new ArrayList<>();
692 
694  for (IngestModuleModel moduleTemplate : modules) {
695  tooltips.add(moduleTemplate.getDescription());
696  }
697  }
698 
699  @Override
700  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
701  super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
702  if (2 == column) {
703  setIcon(null);
704  setToolTipText(tooltips.get(row));
705  } else if (1 == column) {
706  setIcon((Icon) value);
707  setText("");
708  if (warningIcon.equals(value)) {
709  setToolTipText(Bundle.IngestJobSettingsPanel_IngestModulesTableRenderer_warning_message());
710  } else if (infoIcon.equals(value)) {
711  setToolTipText(Bundle.IngestJobSettingsPanel_IngestModulesTableRenderer_info_message());
712  }
713  }
714  return this;
715  }
716  }
717 }
IngestJobSettingsPanel(IngestJobSettings settings, List< Content > dataSources)
void pastJobsButtonActionPerformed(java.awt.event.ActionEvent evt)
void jButtonSelectAllActionPerformed(java.awt.event.ActionEvent evt)
void setIngestModuleTemplates(List< IngestModuleTemplate > moduleTemplates)
void globalSettingsButtonActionPerformed(java.awt.event.ActionEvent evt)
void fileIngestFilterComboBoxActionPerformed(java.awt.event.ActionEvent evt)
void jButtonDeselectAllActionPerformed(java.awt.event.ActionEvent evt)
List< IngestModuleTemplate > getIngestModuleTemplates()
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
IngestModuleGlobalSettingsPanel getGlobalSettingsPanel()
void setModuleSettings(IngestModuleIngestJobSettings settings)
IngestModuleIngestJobSettingsPanel getModuleSettingsPanel()

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