Autopsy  4.11.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
EditNonFullPathsRulePanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2019 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.logicalimager.configuration;
20 
21 import java.awt.Color;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.KeyAdapter;
24 import java.awt.event.KeyEvent;
25 import java.io.IOException;
26 import java.text.ParseException;
27 import java.util.ArrayList;
28 import java.util.List;
29 import javax.swing.JButton;
30 import javax.swing.JComponent;
31 import javax.swing.JOptionPane;
32 import javax.swing.JScrollPane;
33 import javax.swing.JTextArea;
34 import javax.swing.JTextField;
35 import static org.apache.commons.lang.StringUtils.isBlank;
36 import static org.apache.commons.lang3.StringUtils.strip;
37 import org.apache.commons.lang3.tuple.ImmutablePair;
38 import org.openide.util.NbBundle;
39 
43 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
44 final class EditNonFullPathsRulePanel extends javax.swing.JPanel {
45 
46  private JButton okButton;
47  private JButton cancelButton;
48  private final javax.swing.JTextArea filenamesTextArea;
49  private final javax.swing.JTextArea folderNamesTextArea;
50 
54  @NbBundle.Messages({
55  "EditNonFullPathsRulePanel.example=Example: ",
56  "EditNonFullPathsRulePanel.note=NOTE: A special [USER_FOLDER] token at the the start of a folder name to allow matches of all user folders in the file system."
57  })
58  EditNonFullPathsRulePanel(JButton okButton, JButton cancelButton, String ruleName, LogicalImagerRule rule, boolean editing) {
59  initComponents();
60 
61  if (editing) {
62  ruleNameTextField.setEnabled(!editing);
63  }
64 
65  this.setRule(ruleName, rule);
66  this.setButtons(okButton, cancelButton);
67 
68  setExtensions(rule.getExtensions());
69 
70  filenamesTextArea = new JTextArea();
71  initTextArea(filenamesScrollPane, filenamesTextArea);
72  setTextArea(filenamesTextArea, rule.getFilenames());
73 
74  if (rule.getExtensions() == null) {
75  extensionsRadioButton.setSelected(false);
76  filenamesRadioButton.setSelected(true);
77  } else {
78  extensionsRadioButton.setSelected(true);
79  filenamesRadioButton.setSelected(false);
80  }
81 
82  folderNamesTextArea = new JTextArea();
83  initTextArea(folderNamesScrollPane, folderNamesTextArea);
84  setTextArea(folderNamesTextArea, rule.getPaths());
85 
86  setMinDays(rule.getMinDays());
87 
88  minSizeTextField.setText(rule.getMinFileSize() == null ? "" : rule.getMinFileSize().toString());
89  maxSizeTextField.setText(rule.getMaxFileSize() == null ? "" : rule.getMaxFileSize().toString());
90  ruleNameTextField.requestFocus();
91 
92  EditRulePanel.setTextFieldPrompts(extensionsTextField, Bundle.EditNonFullPathsRulePanel_example() + "gif,jpg,png"); // NON-NLS
93  EditRulePanel.setTextFieldPrompts(filenamesTextArea, "<html>"
94  + Bundle.EditNonFullPathsRulePanel_example()
95  + "<br>filename.txt<br>readme.txt</html>"); // NON-NLS
96  EditRulePanel.setTextFieldPrompts(folderNamesTextArea, "<html>"
97  + Bundle.EditNonFullPathsRulePanel_example()
98  + "<br>[USER_FOLDER]/My Documents/Downloads"
99  + "<br>/Program Files/Common Files"
100  + "<br>"
101  + Bundle.EditNonFullPathsRulePanel_note()
102  + "</html>"); // NON-NLS
103  validate();
104  repaint();
105  }
106 
107  private void initTextArea(JScrollPane pane, JTextArea textArea) {
108  textArea.setColumns(20);
109  textArea.setRows(5);
110  pane.setViewportView(textArea);
111  textArea.addKeyListener(new KeyAdapter() {
112  @Override
113  public void keyPressed(KeyEvent e) {
114  if (e.getKeyCode() == KeyEvent.VK_TAB) {
115  if (e.getModifiers() > 0) {
116  textArea.transferFocusBackward();
117  } else {
118  textArea.transferFocus();
119  }
120  e.consume();
121  }
122  }
123  });
124  }
125 
126  private void setMinDays(Integer minDays) {
127  minDaysTextField.setText(minDays == null ? "" : minDays.toString());
128  }
129 
130  private void setTextArea(JTextArea textArea, List<String> set) {
131  String text = "";
132  if (set != null) {
133  for (String s : set) {
134  text += s + System.getProperty("line.separator"); // NON-NLS
135  }
136  }
137  textArea.setText(text);
138  }
139 
140  private void setExtensions(List<String> extensions) {
141  extensionsTextField.setText("");
142  String content = "";
143  if (extensions != null) {
144  boolean first = true;
145  for (String ext : extensions) {
146  content += (first ? "" : ",") + ext;
147  first = false;
148  }
149  }
150  extensionsTextField.setText(content);
151  }
157  @SuppressWarnings("unchecked")
158  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
159  private void initComponents() {
160 
161  buttonGroup = new javax.swing.ButtonGroup();
162  modifiedDateLabel = new javax.swing.JLabel();
163  daysIncludedLabel = new javax.swing.JLabel();
164  shouldSaveCheckBox = new javax.swing.JCheckBox();
165  shouldAlertCheckBox = new javax.swing.JCheckBox();
166  extensionsLabel = new javax.swing.JLabel();
167  extensionsTextField = new javax.swing.JTextField();
168  filenamesLabel = new javax.swing.JLabel();
169  folderNamesLabel = new javax.swing.JLabel();
170  fileSizeLabel = new javax.swing.JLabel();
171  descriptionTextField = new javax.swing.JTextField();
172  descriptionLabel = new javax.swing.JLabel();
173  ruleNameLabel = new javax.swing.JLabel();
174  ruleNameTextField = new javax.swing.JTextField();
175  filenamesScrollPane = new javax.swing.JScrollPane();
176  folderNamesScrollPane = new javax.swing.JScrollPane();
177  minSizeLabel = new javax.swing.JLabel();
178  minSizeTextField = new javax.swing.JFormattedTextField();
179  maxSizeLabel = new javax.swing.JLabel();
180  maxSizeTextField = new javax.swing.JFormattedTextField();
181  minDaysTextField = new javax.swing.JFormattedTextField();
182  extensionsRadioButton = new javax.swing.JRadioButton();
183  filenamesRadioButton = new javax.swing.JRadioButton();
184 
185  org.openide.awt.Mnemonics.setLocalizedText(modifiedDateLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.modifiedDateLabel.text")); // NOI18N
186 
187  org.openide.awt.Mnemonics.setLocalizedText(daysIncludedLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.daysIncludedLabel.text")); // NOI18N
188 
189  shouldSaveCheckBox.setSelected(true);
190  org.openide.awt.Mnemonics.setLocalizedText(shouldSaveCheckBox, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.shouldSaveCheckBox.text")); // NOI18N
191 
192  org.openide.awt.Mnemonics.setLocalizedText(shouldAlertCheckBox, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.shouldAlertCheckBox.text")); // NOI18N
193  shouldAlertCheckBox.setActionCommand(org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.shouldAlertCheckBox.actionCommand")); // NOI18N
194 
195  org.openide.awt.Mnemonics.setLocalizedText(extensionsLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.extensionsLabel.text")); // NOI18N
196 
197  extensionsTextField.setText(org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.extensionsTextField.text")); // NOI18N
198 
199  org.openide.awt.Mnemonics.setLocalizedText(filenamesLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.filenamesLabel.text")); // NOI18N
200 
201  org.openide.awt.Mnemonics.setLocalizedText(folderNamesLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.folderNamesLabel.text")); // NOI18N
202 
203  org.openide.awt.Mnemonics.setLocalizedText(fileSizeLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.fileSizeLabel.text")); // NOI18N
204 
205  descriptionTextField.setText(org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.descriptionTextField.text")); // NOI18N
206 
207  org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.descriptionLabel.text")); // NOI18N
208 
209  org.openide.awt.Mnemonics.setLocalizedText(ruleNameLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.ruleNameLabel.text")); // NOI18N
210 
211  ruleNameTextField.setText(org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.ruleNameTextField.text")); // NOI18N
212 
213  org.openide.awt.Mnemonics.setLocalizedText(minSizeLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.minSizeLabel.text")); // NOI18N
214 
215  minSizeTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#,###; "))));
216  minSizeTextField.setText(org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.minSizeTextField.text")); // NOI18N
217 
218  org.openide.awt.Mnemonics.setLocalizedText(maxSizeLabel, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.maxSizeLabel.text")); // NOI18N
219 
220  maxSizeTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#,###; "))));
221  maxSizeTextField.setText(org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.maxSizeTextField.text")); // NOI18N
222 
223  minDaysTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("####; "))));
224 
225  buttonGroup.add(extensionsRadioButton);
226  extensionsRadioButton.setSelected(true);
227  org.openide.awt.Mnemonics.setLocalizedText(extensionsRadioButton, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.extensionsRadioButton.text")); // NOI18N
228  extensionsRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.extensionsRadioButton.toolTipText")); // NOI18N
229  extensionsRadioButton.addActionListener(new java.awt.event.ActionListener() {
230  public void actionPerformed(java.awt.event.ActionEvent evt) {
231  extensionsRadioButtonActionPerformed(evt);
232  }
233  });
234 
235  buttonGroup.add(filenamesRadioButton);
236  org.openide.awt.Mnemonics.setLocalizedText(filenamesRadioButton, org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.filenamesRadioButton.text")); // NOI18N
237  filenamesRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class, "EditNonFullPathsRulePanel.filenamesRadioButton.toolTipText")); // NOI18N
238  filenamesRadioButton.addActionListener(new java.awt.event.ActionListener() {
239  public void actionPerformed(java.awt.event.ActionEvent evt) {
240  filenamesRadioButtonActionPerformed(evt);
241  }
242  });
243 
244  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
245  this.setLayout(layout);
246  layout.setHorizontalGroup(
247  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
248  .addGroup(layout.createSequentialGroup()
249  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
250  .addGroup(layout.createSequentialGroup()
251  .addContainerGap()
252  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
253  .addComponent(extensionsRadioButton)
254  .addComponent(filenamesRadioButton))
255  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
256  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
257  .addComponent(ruleNameLabel)
258  .addComponent(descriptionLabel)
259  .addComponent(extensionsLabel)
260  .addComponent(filenamesLabel)
261  .addComponent(folderNamesLabel)
262  .addComponent(fileSizeLabel)
263  .addComponent(modifiedDateLabel))
264  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
265  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
266  .addComponent(folderNamesScrollPane, javax.swing.GroupLayout.Alignment.TRAILING)
267  .addComponent(filenamesScrollPane, javax.swing.GroupLayout.Alignment.TRAILING)
268  .addComponent(extensionsTextField, javax.swing.GroupLayout.Alignment.TRAILING)
269  .addComponent(descriptionTextField, javax.swing.GroupLayout.Alignment.TRAILING)
270  .addComponent(ruleNameTextField, javax.swing.GroupLayout.Alignment.TRAILING)))
271  .addGroup(layout.createSequentialGroup()
272  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
273  .addGroup(layout.createSequentialGroup()
274  .addGap(23, 23, 23)
275  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
276  .addComponent(shouldSaveCheckBox)
277  .addComponent(shouldAlertCheckBox)))
278  .addGroup(layout.createSequentialGroup()
279  .addGap(108, 108, 108)
280  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
281  .addComponent(minDaysTextField)
282  .addComponent(minSizeLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
283  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
284  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
285  .addGroup(layout.createSequentialGroup()
286  .addComponent(minSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
287  .addGap(18, 18, 18)
288  .addComponent(maxSizeLabel)
289  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
290  .addComponent(maxSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE))
291  .addComponent(daysIncludedLabel))))
292  .addGap(0, 236, Short.MAX_VALUE)))
293  .addContainerGap())
294  );
295  layout.setVerticalGroup(
296  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
297  .addGroup(layout.createSequentialGroup()
298  .addContainerGap()
299  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
300  .addComponent(ruleNameLabel)
301  .addComponent(ruleNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
302  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
303  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
304  .addComponent(descriptionLabel)
305  .addComponent(descriptionTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
306  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
307  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
308  .addComponent(extensionsTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
309  .addComponent(extensionsLabel)
310  .addComponent(extensionsRadioButton))
311  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
312  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
313  .addComponent(filenamesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 70, Short.MAX_VALUE)
314  .addGroup(layout.createSequentialGroup()
315  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
316  .addComponent(filenamesLabel)
317  .addComponent(filenamesRadioButton))
318  .addGap(0, 0, Short.MAX_VALUE)))
319  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
320  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
321  .addComponent(folderNamesLabel)
322  .addComponent(folderNamesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 71, Short.MAX_VALUE))
323  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
324  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
325  .addComponent(fileSizeLabel)
326  .addComponent(minSizeLabel)
327  .addComponent(minSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
328  .addComponent(maxSizeLabel)
329  .addComponent(maxSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
330  .addGap(6, 6, 6)
331  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
332  .addComponent(modifiedDateLabel)
333  .addComponent(daysIncludedLabel)
334  .addComponent(minDaysTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
335  .addGap(14, 14, 14)
336  .addComponent(shouldAlertCheckBox)
337  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
338  .addComponent(shouldSaveCheckBox)
339  .addContainerGap())
340  );
341  }// </editor-fold>//GEN-END:initComponents
342 
343  private void extensionsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extensionsRadioButtonActionPerformed
344  filenamesTextArea.setEnabled(false);
345  filenamesTextArea.setForeground(Color.LIGHT_GRAY);
346  extensionsTextField.setEnabled(true);
347  extensionsTextField.setForeground(Color.BLACK);
348  }//GEN-LAST:event_extensionsRadioButtonActionPerformed
349 
350  private void filenamesRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_filenamesRadioButtonActionPerformed
351  filenamesTextArea.setEnabled(true);
352  filenamesTextArea.setForeground(Color.BLACK);
353  extensionsTextField.setEnabled(false);
354  extensionsTextField.setForeground(Color.LIGHT_GRAY);
355  }//GEN-LAST:event_filenamesRadioButtonActionPerformed
356 
357  // Variables declaration - do not modify//GEN-BEGIN:variables
358  private javax.swing.ButtonGroup buttonGroup;
359  private javax.swing.JLabel daysIncludedLabel;
360  private javax.swing.JLabel descriptionLabel;
361  private javax.swing.JTextField descriptionTextField;
362  private javax.swing.JLabel extensionsLabel;
363  private javax.swing.JRadioButton extensionsRadioButton;
364  private javax.swing.JTextField extensionsTextField;
365  private javax.swing.JLabel fileSizeLabel;
366  private javax.swing.JLabel filenamesLabel;
367  private javax.swing.JRadioButton filenamesRadioButton;
368  private javax.swing.JScrollPane filenamesScrollPane;
369  private javax.swing.JLabel folderNamesLabel;
370  private javax.swing.JScrollPane folderNamesScrollPane;
371  private javax.swing.JLabel maxSizeLabel;
372  private javax.swing.JFormattedTextField maxSizeTextField;
373  private javax.swing.JFormattedTextField minDaysTextField;
374  private javax.swing.JLabel minSizeLabel;
375  private javax.swing.JFormattedTextField minSizeTextField;
376  private javax.swing.JLabel modifiedDateLabel;
377  private javax.swing.JLabel ruleNameLabel;
378  private javax.swing.JTextField ruleNameTextField;
379  private javax.swing.JCheckBox shouldAlertCheckBox;
380  private javax.swing.JCheckBox shouldSaveCheckBox;
381  // End of variables declaration//GEN-END:variables
382 
383  private void setRule(String ruleName, LogicalImagerRule rule) {
384  ruleNameTextField.setText(ruleName);
385  descriptionTextField.setText(rule.getDescription());
386  shouldAlertCheckBox.setSelected(rule.isShouldAlert());
387  shouldSaveCheckBox.setSelected(rule.isShouldSave());
388  }
389 
394  private void setOkButton() {
395  if (this.okButton != null) {
396  this.okButton.setEnabled(true);
397  }
398  }
399 
407  private JOptionPane getOptionPane(JComponent parent) {
408  JOptionPane pane;
409  if (!(parent instanceof JOptionPane)) {
410  pane = getOptionPane((JComponent) parent.getParent());
411  } else {
412  pane = (JOptionPane) parent;
413  }
414  return pane;
415  }
416 
423  private void setButtons(JButton ok, JButton cancel) {
424  this.okButton = ok;
425  this.cancelButton = cancel;
426  okButton.addActionListener((ActionEvent e) -> {
427  JOptionPane pane = getOptionPane(okButton);
428  pane.setValue(okButton);
429  });
430  cancelButton.addActionListener((ActionEvent e) -> {
431  JOptionPane pane = getOptionPane(cancelButton);
432  pane.setValue(cancelButton);
433  });
434  this.setOkButton();
435  }
436 
437  @NbBundle.Messages({
438  "EditNonFullPathsRulePanel.modifiedDaysNotPositiveException=Modified days must be a positive",
439  "# {0} - message",
440  "EditNonFullPathsRulePanel.modifiedDaysMustBeNumberException=Modified days must be a number: {0}",
441  "EditNonFullPathsRulePanel.minFileSizeNotPositiveException=Minimum file size must be a positive",
442  "# {0} - message",
443  "EditNonFullPathsRulePanel.minFileSizeMustBeNumberException=Minimum file size must be a number: {0}",
444  "EditNonFullPathsRulePanel.maxFileSizeNotPositiveException=Maximum file size must be a positive",
445  "# {0} - message",
446  "EditNonFullPathsRulePanel.maxFileSizeMustBeNumberException=Maximum file size must be a number: {0}",
447  "# {0} - maxFileSize",
448  "# {1} - minFileSize",
449  "EditNonFullPathsRulePanel.maxFileSizeSmallerThanMinException=Maximum file size: {0} must be bigger than minimum file size: {1}",
450  "EditNonFullPathsRulePanel.fileNames=File names",
451  "EditNonFullPathsRulePanel.folderNames=Folder names",
452  })
453  ImmutablePair<String, LogicalImagerRule> toRule() throws IOException {
454  String ruleName = EditRulePanel.validRuleName(ruleNameTextField.getText());
455  List<String> extensions = validateExtensions(extensionsTextField);
456  List<String> filenames = EditRulePanel.validateTextList(filenamesTextArea, Bundle.EditNonFullPathsRulePanel_fileNames());
457  List<String> folderNames = EditRulePanel.validateTextList(folderNamesTextArea, Bundle.EditNonFullPathsRulePanel_folderNames());
458 
459  LogicalImagerRule.Builder builder = new LogicalImagerRule.Builder();
460  builder.getName(ruleName)
461  .getDescription(descriptionTextField.getText())
462  .getShouldAlert(shouldAlertCheckBox.isSelected())
463  .getShouldSave(shouldSaveCheckBox.isSelected())
464  .getPaths(folderNames);
465 
466  if (extensionsRadioButton.isSelected()) {
467  builder.getExtensions(extensions);
468  } else {
469  builder.getFilenames(filenames);
470  }
471 
472  int minDays;
473  if (!isBlank(minDaysTextField.getText())) {
474  try {
475  minDaysTextField.commitEdit();
476  minDays = ((Number)minDaysTextField.getValue()).intValue();
477  if (minDays < 0) {
478  throw new IOException(Bundle.EditNonFullPathsRulePanel_modifiedDaysNotPositiveException());
479  }
480  builder.getMinDays(minDays);
481  } catch (NumberFormatException | ParseException ex) {
482  throw new IOException(Bundle.EditNonFullPathsRulePanel_modifiedDaysMustBeNumberException(ex.getMessage()), ex);
483  }
484  }
485 
486  int minFileSize = 0;
487  if (!isBlank(minSizeTextField.getText())) {
488  try {
489  minSizeTextField.commitEdit();
490  minFileSize = ((Number)minSizeTextField.getValue()).intValue();
491  if (minFileSize < 0) {
492  throw new IOException(Bundle.EditNonFullPathsRulePanel_minFileSizeNotPositiveException());
493  }
494  } catch (NumberFormatException | ParseException ex) {
495  throw new IOException(Bundle.EditNonFullPathsRulePanel_minFileSizeMustBeNumberException(ex.getMessage()), ex);
496  }
497  }
498 
499  int maxFileSize = 0;
500  if (!isBlank(maxSizeTextField.getText())) {
501  try {
502  maxSizeTextField.commitEdit();
503  maxFileSize = ((Number)maxSizeTextField.getValue()).intValue();
504  if (maxFileSize < 0) {
505  throw new IOException(Bundle.EditNonFullPathsRulePanel_maxFileSizeNotPositiveException());
506  }
507  } catch (NumberFormatException | ParseException ex) {
508  throw new IOException(Bundle.EditNonFullPathsRulePanel_maxFileSizeMustBeNumberException(ex.getMessage()), ex);
509  }
510  }
511 
512  if (maxFileSize != 0 && (maxFileSize < minFileSize)) {
513  throw new IOException(Bundle.EditNonFullPathsRulePanel_maxFileSizeSmallerThanMinException(maxFileSize, minFileSize));
514  }
515  if (minFileSize != 0) {
516  builder.getMinFileSize(minFileSize);
517  }
518  if (maxFileSize != 0) {
519  builder.getMaxFileSize(maxFileSize);
520  }
521 
522  LogicalImagerRule rule = builder.build();
523  return new ImmutablePair<>(ruleName, rule);
524  }
525 
526  @NbBundle.Messages({
527  "EditNonFullPathsRulePanel.emptyExtensionException=Extensions cannot have an empty entry",
528  })
529  private List<String> validateExtensions(JTextField textField) throws IOException {
530  if (isBlank(textField.getText())) {
531  return null;
532  }
533  List<String> extensions = new ArrayList<>();
534  for (String extension : textField.getText().split(",")) {
535  extension = strip(extension);
536  if (extension.isEmpty()) {
537  throw new IOException(Bundle.EditNonFullPathsRulePanel_emptyExtensionException());
538  }
539  extensions.add(extension);
540  }
541  if (extensions.isEmpty()) {
542  return null;
543  }
544  return extensions;
545  }
546 }

Copyright © 2012-2018 Basis Technology. Generated on: Fri Jun 21 2019
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.