19 package org.sleuthkit.autopsy.ingest;
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;
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;
61 @SuppressWarnings(
"PMD.SingularField")
64 private static final long serialVersionUID = 1L;
65 private static ImageIcon warningIcon =
new ImageIcon(
IngestJobSettingsPanel.class.getResource(
"/org/sleuthkit/autopsy/images/warning_triangle.png"));
66 private static ImageIcon infoIcon =
new ImageIcon(
IngestJobSettingsPanel.class.getResource(
"/org/sleuthkit/autopsy/images/information-frame.png"));
68 private final List<Content> dataSources =
new ArrayList<>();
69 private final List<IngestJobInfo> ingestJobs =
new ArrayList<>();
70 private final List<IngestModuleModel> modules =
new ArrayList<>();
82 this.settings = settings;
87 customizeComponents();
99 this.settings = settings;
100 this.dataSources.addAll(dataSources);
103 ingestJobs.addAll(skCase.getIngestJobs());
105 logger.log(Level.SEVERE,
"No open case", ex);
106 }
catch (TskCoreException ex) {
107 logger.log(Level.SEVERE,
"Failed to load ingest job information", ex);
113 customizeComponents();
123 List<IngestModuleTemplate> moduleTemplates =
new ArrayList<>();
126 if (module.hasModuleSettingsPanel()) {
130 moduleTemplates.add(moduleTemplate);
133 return this.settings;
136 @Messages({
"IngestJobSettingsPanel.noPerRunSettings=The selected module has no per-run settings."})
138 modulesTable.setModel(tableModel);
139 modulesTable.setTableHeader(null);
140 modulesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
146 int width = modulesScrollPane.getPreferredSize().width;
147 for (
int i = 0; i < modulesTable.getColumnCount(); ++i) {
148 TableColumn column = modulesTable.getColumnModel().getColumn(i);
150 column.setPreferredWidth(((
int) (width * 0.15)));
152 column.setCellRenderer(renderer);
153 column.setPreferredWidth(((
int) (width * 0.84)));
160 modulesTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
161 ListSelectionModel listSelectionModel = (ListSelectionModel) e.getSource();
162 if (!listSelectionModel.isSelectionEmpty()) {
163 int index = listSelectionModel.getMinSelectionIndex();
164 selectedModule = modules.get(index);
165 ingestSettingsPanel.removeAll();
166 if (null != selectedModule.getModuleSettingsPanel()) {
167 ingestSettingsPanel.add(selectedModule.getModuleSettingsPanel());
169 ingestSettingsPanel.add(
new JLabel(Bundle.IngestJobSettingsPanel_noPerRunSettings()));
171 ingestSettingsPanel.revalidate();
172 ingestSettingsPanel.repaint();
173 globalSettingsButton.setEnabled(null != selectedModule.getGlobalSettingsPanel());
174 descriptionLabel.setText(selectedModule.getDescription());
175 descriptionLabel.setToolTipText(selectedModule.getDescription());
178 modulesTable.setRowSelectionInterval(0, 0);
179 this.modulesTable.getColumnModel().getColumn(0).setMaxWidth(22);
180 this.modulesTable.getColumnModel().getColumn(1).setMaxWidth(20);
181 this.modulesTable.getColumnModel().getColumn(1).setMinWidth(20);
182 modulesTable.setRowHeight(20);
188 pastJobsButton.setEnabled(!dataSources.isEmpty() && !ingestJobs.isEmpty());
191 void setPastJobsButtonVisible(
boolean isVisible) {
192 pastJobsButton.setVisible(isVisible);
200 @SuppressWarnings(
"unchecked")
202 private
void initComponents() {
204 timeGroup =
new javax.swing.ButtonGroup();
205 modulesScrollPane =
new javax.swing.JScrollPane();
206 modulesTable =
new javax.swing.JTable();
207 jPanel1 =
new javax.swing.JPanel();
208 globalSettingsButton =
new javax.swing.JButton();
209 jSeparator2 =
new javax.swing.JSeparator();
210 descriptionLabel =
new javax.swing.JLabel();
211 jScrollPane1 =
new javax.swing.JScrollPane();
212 ingestSettingsPanel =
new javax.swing.JPanel();
213 jButtonSelectAll =
new javax.swing.JButton();
214 jButtonDeselectAll =
new javax.swing.JButton();
215 pastJobsButton =
new javax.swing.JButton();
216 fileIngestFilterLabel =
new javax.swing.JLabel();
217 fileIngestFilterComboBox =
new javax.swing.JComboBox<>();
219 setMaximumSize(
new java.awt.Dimension(5750, 3000));
220 setMinimumSize(
new java.awt.Dimension(0, 0));
221 setPreferredSize(
new java.awt.Dimension(625, 450));
223 modulesScrollPane.setBorder(javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(160, 160, 160)));
224 modulesScrollPane.setMinimumSize(
new java.awt.Dimension(0, 0));
225 modulesScrollPane.setPreferredSize(
new java.awt.Dimension(160, 160));
227 modulesTable.setBackground(
new java.awt.Color(240, 240, 240));
228 modulesTable.setModel(
new javax.swing.table.DefaultTableModel(
236 modulesTable.setShowHorizontalLines(
false);
237 modulesTable.setShowVerticalLines(
false);
238 modulesScrollPane.setViewportView(modulesTable);
240 jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(160, 160, 160)));
241 jPanel1.setPreferredSize(
new java.awt.Dimension(338, 257));
243 globalSettingsButton.setText(
org.openide.util.NbBundle.getMessage(
IngestJobSettingsPanel.class,
"IngestJobSettingsPanel.globalSettingsButton.text"));
244 globalSettingsButton.setActionCommand(
org.openide.util.NbBundle.getMessage(
IngestJobSettingsPanel.class,
"IngestJobSettingsPanel.globalSettingsButton.actionCommand"));
245 globalSettingsButton.setEnabled(
false);
246 globalSettingsButton.addActionListener(
new java.awt.event.ActionListener() {
247 public void actionPerformed(java.awt.event.ActionEvent evt) {
248 globalSettingsButtonActionPerformed(evt);
252 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).");
254 jScrollPane1.setBorder(null);
255 jScrollPane1.setPreferredSize(
new java.awt.Dimension(250, 180));
257 ingestSettingsPanel.setMinimumSize(
new java.awt.Dimension(0, 300));
258 ingestSettingsPanel.setLayout(
new javax.swing.BoxLayout(ingestSettingsPanel, javax.swing.BoxLayout.PAGE_AXIS));
259 jScrollPane1.setViewportView(ingestSettingsPanel);
261 javax.swing.GroupLayout jPanel1Layout =
new javax.swing.GroupLayout(jPanel1);
262 jPanel1.setLayout(jPanel1Layout);
263 jPanel1Layout.setHorizontalGroup(
264 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
265 .addComponent(jSeparator2, javax.swing.GroupLayout.Alignment.TRAILING)
266 .addGroup(jPanel1Layout.createSequentialGroup()
268 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
269 .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
270 .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE)
271 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
272 .addGap(0, 0, Short.MAX_VALUE)
273 .addComponent(globalSettingsButton)))
276 jPanel1Layout.setVerticalGroup(
277 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
278 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
280 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
282 .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
284 .addComponent(descriptionLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
285 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
286 .addComponent(globalSettingsButton)
290 jButtonSelectAll.setText(
org.openide.util.NbBundle.getMessage(
IngestJobSettingsPanel.class,
"IngestJobSettingsPanel.jButtonSelectAll.text"));
291 jButtonSelectAll.setMargin(
new java.awt.Insets(2, 8, 2, 8));
292 jButtonSelectAll.setMaximumSize(
new java.awt.Dimension(87, 23));
293 jButtonSelectAll.setMinimumSize(
new java.awt.Dimension(87, 23));
294 jButtonSelectAll.addActionListener(
new java.awt.event.ActionListener() {
295 public void actionPerformed(java.awt.event.ActionEvent evt) {
296 jButtonSelectAllActionPerformed(evt);
300 jButtonDeselectAll.setText(
org.openide.util.NbBundle.getMessage(
IngestJobSettingsPanel.class,
"IngestJobSettingsPanel.jButtonDeselectAll.text"));
301 jButtonDeselectAll.setMargin(
new java.awt.Insets(2, 8, 2, 8));
302 jButtonDeselectAll.addActionListener(
new java.awt.event.ActionListener() {
303 public void actionPerformed(java.awt.event.ActionEvent evt) {
304 jButtonDeselectAllActionPerformed(evt);
308 pastJobsButton.setText(
org.openide.util.NbBundle.getMessage(
IngestJobSettingsPanel.class,
"IngestJobSettingsPanel.pastJobsButton.text"));
309 pastJobsButton.setMargin(
new java.awt.Insets(2, 8, 2, 8));
310 pastJobsButton.setMaximumSize(
new java.awt.Dimension(87, 23));
311 pastJobsButton.setMinimumSize(
new java.awt.Dimension(87, 23));
312 pastJobsButton.addActionListener(
new java.awt.event.ActionListener() {
313 public void actionPerformed(java.awt.event.ActionEvent evt) {
314 pastJobsButtonActionPerformed(evt);
318 fileIngestFilterLabel.setText(
org.openide.util.NbBundle.getMessage(
IngestJobSettingsPanel.class,
"IngestJobSettingsPanel.fileIngestFilterLabel.text"));
320 fileIngestFilterComboBox.setModel(
new DefaultComboBoxModel<>(getComboBoxContents()));
321 fileIngestFilterComboBox.addActionListener(
new java.awt.event.ActionListener() {
322 public void actionPerformed(java.awt.event.ActionEvent evt) {
323 fileIngestFilterComboBoxActionPerformed(evt);
327 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
328 this.setLayout(layout);
329 layout.setHorizontalGroup(
330 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
331 .addGroup(layout.createSequentialGroup()
333 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
false)
334 .addGroup(layout.createSequentialGroup()
335 .addComponent(jButtonSelectAll, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
336 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
337 .addComponent(jButtonDeselectAll, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
338 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
339 .addComponent(pastJobsButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
340 .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
341 .addComponent(fileIngestFilterLabel)
342 .addComponent(fileIngestFilterComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
344 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 284, Short.MAX_VALUE)
348 layout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
new java.awt.Component[] {jButtonDeselectAll, jButtonSelectAll, pastJobsButton});
350 layout.setVerticalGroup(
351 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
352 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
354 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
355 .addGroup(layout.createSequentialGroup()
356 .addComponent(fileIngestFilterLabel)
357 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
358 .addComponent(fileIngestFilterComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
359 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
360 .addComponent(modulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
361 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
362 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
363 .addComponent(jButtonSelectAll, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
364 .addComponent(jButtonDeselectAll)
365 .addComponent(pastJobsButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
366 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 426, Short.MAX_VALUE))
375 if (selectedModule.hasGlobalSettingsPanel()) {
376 selectedModule.saveResourcesConfig();
381 dialog.addWindowListener(
new WindowAdapter() {
383 public void windowClosing(WindowEvent e) {
388 dialog.
display(selectedModule.getGlobalSettingsPanel());
392 SelectAllModules(
true);
396 SelectAllModules(
false);
398 @Messages({
"IngestJobSettingsPanel.pastJobsButton.action.frame.title=Ingest History"})
400 JDialog topFrame = (JDialog) SwingUtilities.getWindowAncestor(
this);
401 JDialog dialog =
new JDialog(topFrame, Bundle.IngestJobSettingsPanel_pastJobsButton_action_frame_title(),
false);
403 dialog.add(ingestInfo);
404 dialog.setLocationRelativeTo(topFrame);
405 dialog.setResizable(
true);
407 dialog.setVisible(
true);
415 fileIngestFilterPanel.
load();
417 final ArrayList<String> oldFilterList =
new ArrayList<>(Arrays.asList(getComboBoxContents()));
420 fileIngestFilterPanel.
store();
421 ArrayList<FilesSet> newFilterList =
new ArrayList<>();
425 logger.log(Level.SEVERE,
"Failed to get user created file ingest filters, only default available for selection", ex);
428 for (
FilesSet filter : newFilterList) {
429 if (!oldFilterList.contains(filter.getName())) {
431 filterToSelect = filter.getName();
435 fileIngestFilterComboBox.setModel(
new DefaultComboBoxModel<>(getComboBoxContents()));
437 fileIngestFilterComboBox.setSelectedItem(filterToSelect);
440 updateSelectedFilter(filterToSelect);
444 dialog.
display(fileIngestFilterPanel);
447 }
else if (evt.getActionCommand().equals(
"comboBoxChanged")) {
448 updateSelectedFilter(fileIngestFilterComboBox.getSelectedItem().toString());
457 fileIngestFilters.put(fSet.getName(), fSet);
463 logger.log(Level.SEVERE,
"Failed to get file ingest filter from combobox selection, default filter being used", ex);
478 ArrayList<String> nameList =
new ArrayList<>();
480 nameList.add(fSet.getName());
484 nameList.add(fSet.getName());
487 logger.log(Level.SEVERE,
"Failed to get user created file ingest filters for combo box, only default available for selection", ex);
490 return nameList.toArray(
new String[nameList.size()]);
495 module.setEnabled(set);
497 modulesTable.repaint();
529 this.moduleTemplate = moduleTemplate;
539 return moduleTemplate;
546 String getDescription() {
550 void setEnabled(
boolean enabled) {
554 boolean isEnabled() {
558 boolean hasModuleSettingsPanel() {
562 IngestModuleIngestJobSettingsPanel getModuleSettingsPanel() {
563 return moduleSettingsPanel;
566 boolean hasGlobalSettingsPanel() {
570 IngestModuleGlobalSettingsPanel getGlobalSettingsPanel() {
571 return globalSettingsPanel;
574 void saveResourcesConfig() {
585 private static final long serialVersionUID = 1L;
589 return modules.size();
600 switch (columnIndex) {
602 return module.isEnabled();
604 return getIcon(module);
606 return module.getName();
612 return columnIndex == 0;
616 public void setValueAt(Object aValue,
int rowIndex,
int columnIndex) {
617 if (columnIndex == 0) {
618 modules.get(rowIndex).setEnabled((
boolean) aValue);
624 return getValueAt(0, c).getClass();
628 if (dataSources.isEmpty() || ingestJobs.isEmpty()) {
631 boolean previousVersionRun =
false;
632 for (IngestJobInfo ingestJob : ingestJobs) {
633 if (ingestJob.getStatus() != IngestJobInfo.IngestJobStatusType.COMPLETED) {
636 long objectId = ingestJob.getObjectId();
637 boolean isSameDataSource =
false;
638 for (Content dataSource : dataSources) {
639 isSameDataSource = isSameDataSource || dataSource.getId() == objectId;
641 if (isSameDataSource) {
644 String uniqueName = FactoryClassNameNormalizer.normalize(factory.getClass().getCanonicalName()) +
"-"
646 + IngestModuleInfo.IngestModuleType.DATA_SOURCE_LEVEL.toString() +
"-"
648 for (IngestModuleInfo ingestModuleInfo : ingestJob.getIngestModuleInfo()) {
649 boolean sameModule = ingestModuleInfo.getUniqueName().equals(uniqueName);
655 previousVersionRun = previousVersionRun || sameModule;
659 String uniqueName = FactoryClassNameNormalizer.normalize(factory.getClass().getCanonicalName()) +
"-"
661 + IngestModuleInfo.IngestModuleType.FILE_LEVEL.toString() +
"-"
663 for (IngestModuleInfo ingestModuleInfo : ingestJob.getIngestModuleInfo()) {
664 boolean sameModule = ingestModuleInfo.getUniqueName().equals(uniqueName);
670 previousVersionRun = previousVersionRun || sameModule;
675 if (previousVersionRun) {
686 @Messages({
"IngestJobSettingsPanel.IngestModulesTableRenderer.warning.message=This ingest module has been run before on this data source.",
687 "IngestJobSettingsPanel.IngestModulesTableRenderer.info.message=A previous version of this ingest module has been run before on this data source."})
690 private static final long serialVersionUID = 1L;
692 List<String> tooltips =
new ArrayList<>();
696 tooltips.add(moduleTemplate.getDescription());
702 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
705 setToolTipText(tooltips.get(row));
706 }
else if (1 == column) {
707 setIcon((Icon) value);
709 if (warningIcon.equals(value)) {
710 setToolTipText(Bundle.IngestJobSettingsPanel_IngestModulesTableRenderer_warning_message());
711 }
else if (infoIcon.equals(value)) {
712 setToolTipText(Bundle.IngestJobSettingsPanel_IngestModulesTableRenderer_info_message());
IngestJobSettingsPanel(IngestJobSettings settings, List< Content > dataSources)
IngestJobSettingsPanel(IngestJobSettings settings)
IngestModuleFactory getModuleFactory()
javax.swing.JSeparator jSeparator2
javax.swing.JLabel fileIngestFilterLabel
String getModuleVersionNumber()
void display(JPanel panel)
static List< FilesSet > getStandardFileIngestFilters()
boolean isFileIngestModuleFactory()
void setEnabled(boolean enabled)
IngestModulesTableRenderer()
void updateSelectedFilter(String filterName)
void pastJobsButtonActionPerformed(java.awt.event.ActionEvent evt)
static synchronized FilesSetsManager getInstance()
javax.swing.JLabel descriptionLabel
void SelectAllModules(boolean set)
void addApplyButtonListener(ActionListener l)
javax.swing.JTable modulesTable
void jButtonSelectAllActionPerformed(java.awt.event.ActionEvent evt)
Class<?> getColumnClass(int c)
Map< String, FilesSet > getCustomFileIngestFilters()
void setIngestModuleTemplates(List< IngestModuleTemplate > moduleTemplates)
void globalSettingsButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JButton pastJobsButton
boolean hasGlobalSettingsPanel()
javax.swing.JComboBox< String > fileIngestFilterComboBox
ImageIcon getIcon(IngestModuleModel module)
abstract void saveSettings()
javax.swing.JButton jButtonSelectAll
String[] getComboBoxContents()
static String getCreateNewFileIngestFilterString()
IngestJobSettings getSettings()
void setFileFilter(FilesSet fileIngestFilter)
javax.swing.ButtonGroup timeGroup
static FilesSet getDefaultFilter()
SleuthkitCase getSleuthkitCase()
void setValueAt(Object aValue, int rowIndex, int columnIndex)
javax.swing.JScrollPane modulesScrollPane
void fileIngestFilterComboBoxActionPerformed(java.awt.event.ActionEvent evt)
boolean hasModuleSettingsPanel()
final IngestJobSettings settings
void jButtonDeselectAllActionPerformed(java.awt.event.ActionEvent evt)
List< IngestModuleTemplate > getIngestModuleTemplates()
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
javax.swing.JPanel jPanel1
Object getValueAt(int rowIndex, int columnIndex)
synchronized static Logger getLogger(String name)
boolean isCellEditable(int rowIndex, int columnIndex)
javax.swing.JScrollPane jScrollPane1
static Case getCurrentCaseThrows()
IngestModuleModel selectedModule
String getModuleDisplayName()
String getModuleDescription()
javax.swing.JButton globalSettingsButton
final IngestModuleTemplate moduleTemplate
javax.swing.JPanel ingestSettingsPanel
IngestModuleGlobalSettingsPanel getGlobalSettingsPanel()
void setModuleSettings(IngestModuleIngestJobSettings settings)
IngestModuleIngestJobSettingsPanel getModuleSettingsPanel()
boolean isDataSourceIngestModuleFactory()
void customizeComponents()
javax.swing.JButton jButtonDeselectAll