19 package org.sleuthkit.autopsy.logicalimager.configuration;
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;
43 @SuppressWarnings(
"PMD.SingularField")
44 final class EditNonFullPathsRulePanel extends javax.swing.JPanel {
46 private JButton okButton;
47 private JButton cancelButton;
48 private final javax.swing.JTextArea filenamesTextArea;
49 private final javax.swing.JTextArea folderNamesTextArea;
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."
58 EditNonFullPathsRulePanel(JButton okButton, JButton cancelButton, String ruleName, LogicalImagerRule rule,
boolean editing) {
62 ruleNameTextField.setEnabled(!editing);
65 this.setRule(ruleName, rule);
66 this.setButtons(okButton, cancelButton);
68 setExtensions(rule.getExtensions());
70 filenamesTextArea =
new JTextArea();
71 initTextArea(filenamesScrollPane, filenamesTextArea);
72 setTextArea(filenamesTextArea, rule.getFilenames());
74 if (rule.getExtensions() == null) {
75 extensionsRadioButton.setSelected(
false);
76 filenamesRadioButton.setSelected(
true);
78 extensionsRadioButton.setSelected(
true);
79 filenamesRadioButton.setSelected(
false);
82 folderNamesTextArea =
new JTextArea();
83 initTextArea(folderNamesScrollPane, folderNamesTextArea);
84 setTextArea(folderNamesTextArea, rule.getPaths());
86 setMinDays(rule.getMinDays());
88 minSizeTextField.setText(rule.getMinFileSize() == null ?
"" : rule.getMinFileSize().toString());
89 maxSizeTextField.setText(rule.getMaxFileSize() == null ?
"" : rule.getMaxFileSize().toString());
90 ruleNameTextField.requestFocus();
92 EditRulePanel.setTextFieldPrompts(extensionsTextField, Bundle.EditNonFullPathsRulePanel_example() +
"gif,jpg,png");
93 EditRulePanel.setTextFieldPrompts(filenamesTextArea,
"<html>"
94 + Bundle.EditNonFullPathsRulePanel_example()
95 +
"<br>filename.txt<br>readme.txt</html>");
96 EditRulePanel.setTextFieldPrompts(folderNamesTextArea,
"<html>"
97 + Bundle.EditNonFullPathsRulePanel_example()
98 +
"<br>[USER_FOLDER]/My Documents/Downloads"
99 +
"<br>/Program Files/Common Files"
101 + Bundle.EditNonFullPathsRulePanel_note()
107 private void initTextArea(JScrollPane pane, JTextArea textArea) {
108 textArea.setColumns(20);
110 pane.setViewportView(textArea);
111 textArea.addKeyListener(
new KeyAdapter() {
113 public void keyPressed(KeyEvent e) {
114 if (e.getKeyCode() == KeyEvent.VK_TAB) {
115 if (e.getModifiers() > 0) {
116 textArea.transferFocusBackward();
118 textArea.transferFocus();
126 private void setMinDays(Integer minDays) {
127 minDaysTextField.setText(minDays == null ?
"" : minDays.toString());
130 private void setTextArea(JTextArea textArea, List<String> set) {
133 for (String s : set) {
134 text += s + System.getProperty(
"line.separator");
137 textArea.setText(text);
140 private void setExtensions(List<String> extensions) {
141 extensionsTextField.setText(
"");
143 if (extensions != null) {
144 boolean first =
true;
145 for (String ext : extensions) {
146 content += (first ?
"" :
",") + ext;
150 extensionsTextField.setText(content);
157 @SuppressWarnings(
"unchecked")
159 private
void initComponents() {
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();
185 org.openide.awt.Mnemonics.setLocalizedText(modifiedDateLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.modifiedDateLabel.text"));
187 org.openide.awt.Mnemonics.setLocalizedText(daysIncludedLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.daysIncludedLabel.text"));
189 shouldSaveCheckBox.setSelected(
true);
190 org.openide.awt.Mnemonics.setLocalizedText(shouldSaveCheckBox,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.shouldSaveCheckBox.text"));
192 org.openide.awt.Mnemonics.setLocalizedText(shouldAlertCheckBox,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.shouldAlertCheckBox.text"));
193 shouldAlertCheckBox.setActionCommand(
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.shouldAlertCheckBox.actionCommand"));
195 org.openide.awt.Mnemonics.setLocalizedText(extensionsLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.extensionsLabel.text"));
197 extensionsTextField.setText(
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.extensionsTextField.text"));
199 org.openide.awt.Mnemonics.setLocalizedText(filenamesLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.filenamesLabel.text"));
201 org.openide.awt.Mnemonics.setLocalizedText(folderNamesLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.folderNamesLabel.text"));
203 org.openide.awt.Mnemonics.setLocalizedText(fileSizeLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.fileSizeLabel.text"));
205 descriptionTextField.setText(
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.descriptionTextField.text"));
207 org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.descriptionLabel.text"));
209 org.openide.awt.Mnemonics.setLocalizedText(ruleNameLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.ruleNameLabel.text"));
211 ruleNameTextField.setText(
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.ruleNameTextField.text"));
213 org.openide.awt.Mnemonics.setLocalizedText(minSizeLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.minSizeLabel.text"));
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"));
218 org.openide.awt.Mnemonics.setLocalizedText(maxSizeLabel,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.maxSizeLabel.text"));
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"));
223 minDaysTextField.setFormatterFactory(
new javax.swing.text.DefaultFormatterFactory(
new javax.swing.text.NumberFormatter(
new java.text.DecimalFormat(
"####; "))));
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"));
228 extensionsRadioButton.setToolTipText(
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.extensionsRadioButton.toolTipText"));
229 extensionsRadioButton.addActionListener(
new java.awt.event.ActionListener() {
230 public void actionPerformed(java.awt.event.ActionEvent evt) {
231 extensionsRadioButtonActionPerformed(evt);
235 buttonGroup.add(filenamesRadioButton);
236 org.openide.awt.Mnemonics.setLocalizedText(filenamesRadioButton,
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.filenamesRadioButton.text"));
237 filenamesRadioButton.setToolTipText(
org.openide.util.NbBundle.getMessage(EditNonFullPathsRulePanel.class,
"EditNonFullPathsRulePanel.filenamesRadioButton.toolTipText"));
238 filenamesRadioButton.addActionListener(
new java.awt.event.ActionListener() {
239 public void actionPerformed(java.awt.event.ActionEvent evt) {
240 filenamesRadioButtonActionPerformed(evt);
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()
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()
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)
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)))
295 layout.setVerticalGroup(
296 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
297 .addGroup(layout.createSequentialGroup()
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))
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))
336 .addComponent(shouldAlertCheckBox)
337 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
338 .addComponent(shouldSaveCheckBox)
343 private void extensionsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
344 filenamesTextArea.setEnabled(
false);
345 filenamesTextArea.setForeground(Color.LIGHT_GRAY);
346 extensionsTextField.setEnabled(
true);
347 extensionsTextField.setForeground(Color.BLACK);
350 private void filenamesRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
351 filenamesTextArea.setEnabled(
true);
352 filenamesTextArea.setForeground(Color.BLACK);
353 extensionsTextField.setEnabled(
false);
354 extensionsTextField.setForeground(Color.LIGHT_GRAY);
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;
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());
394 private void setOkButton() {
395 if (this.okButton != null) {
396 this.okButton.setEnabled(
true);
407 private JOptionPane getOptionPane(JComponent parent) {
409 if (!(parent instanceof JOptionPane)) {
410 pane = getOptionPane((JComponent) parent.getParent());
412 pane = (JOptionPane) parent;
423 private void setButtons(JButton ok, JButton cancel) {
425 this.cancelButton = cancel;
426 okButton.addActionListener((ActionEvent e) -> {
427 JOptionPane pane = getOptionPane(okButton);
428 pane.setValue(okButton);
430 cancelButton.addActionListener((ActionEvent e) -> {
431 JOptionPane pane = getOptionPane(cancelButton);
432 pane.setValue(cancelButton);
438 "EditNonFullPathsRulePanel.modifiedDaysNotPositiveException=Modified days must be a positive",
440 "EditNonFullPathsRulePanel.modifiedDaysMustBeNumberException=Modified days must be a number: {0}",
441 "EditNonFullPathsRulePanel.minFileSizeNotPositiveException=Minimum file size must be a positive",
443 "EditNonFullPathsRulePanel.minFileSizeMustBeNumberException=Minimum file size must be a number: {0}",
444 "EditNonFullPathsRulePanel.maxFileSizeNotPositiveException=Maximum file size must be a positive",
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",
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());
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);
466 if (extensionsRadioButton.isSelected()) {
467 builder.getExtensions(extensions);
469 builder.getFilenames(filenames);
473 if (!isBlank(minDaysTextField.getText())) {
475 minDaysTextField.commitEdit();
476 minDays = ((Number)minDaysTextField.getValue()).intValue();
478 throw new IOException(Bundle.EditNonFullPathsRulePanel_modifiedDaysNotPositiveException());
480 builder.getMinDays(minDays);
481 }
catch (NumberFormatException | ParseException ex) {
482 throw new IOException(Bundle.EditNonFullPathsRulePanel_modifiedDaysMustBeNumberException(ex.getMessage()), ex);
487 if (!isBlank(minSizeTextField.getText())) {
489 minSizeTextField.commitEdit();
490 minFileSize = ((Number)minSizeTextField.getValue()).intValue();
491 if (minFileSize < 0) {
492 throw new IOException(Bundle.EditNonFullPathsRulePanel_minFileSizeNotPositiveException());
494 }
catch (NumberFormatException | ParseException ex) {
495 throw new IOException(Bundle.EditNonFullPathsRulePanel_minFileSizeMustBeNumberException(ex.getMessage()), ex);
500 if (!isBlank(maxSizeTextField.getText())) {
502 maxSizeTextField.commitEdit();
503 maxFileSize = ((Number)maxSizeTextField.getValue()).intValue();
504 if (maxFileSize < 0) {
505 throw new IOException(Bundle.EditNonFullPathsRulePanel_maxFileSizeNotPositiveException());
507 }
catch (NumberFormatException | ParseException ex) {
508 throw new IOException(Bundle.EditNonFullPathsRulePanel_maxFileSizeMustBeNumberException(ex.getMessage()), ex);
512 if (maxFileSize != 0 && (maxFileSize < minFileSize)) {
513 throw new IOException(Bundle.EditNonFullPathsRulePanel_maxFileSizeSmallerThanMinException(maxFileSize, minFileSize));
515 if (minFileSize != 0) {
516 builder.getMinFileSize(minFileSize);
518 if (maxFileSize != 0) {
519 builder.getMaxFileSize(maxFileSize);
522 LogicalImagerRule rule = builder.build();
523 return new ImmutablePair<>(ruleName, rule);
527 "EditNonFullPathsRulePanel.emptyExtensionException=Extensions cannot have an empty entry",
529 private List<String> validateExtensions(JTextField textField)
throws IOException {
530 if (isBlank(textField.getText())) {
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());
539 extensions.add(extension);
541 if (extensions.isEmpty()) {