From 66a33dcdf0e3a29981817c31f60c68de2f205edb Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 4 Oct 2017 14:50:23 -0400 Subject: [PATCH 01/46] 2774 combine central repo case properties and case properties into one --- .../autopsy/casemodule/Bundle.properties | 5 +- .../autopsy/casemodule/Bundle_ja.properties | 1 - .../sleuthkit/autopsy/casemodule/Case.java | 20 + .../casemodule/CaseInformationPanel.form | 36 +- .../casemodule/CaseInformationPanel.java | 77 ++- .../autopsy/casemodule/CaseMetadata.java | 22 + .../casemodule/CasePropertiesAction.java | 4 +- .../casemodule/CasePropertiesPanel.form | 176 +++---- .../casemodule/CasePropertiesPanel.java | 213 ++++---- .../actions/Bundle.properties | 10 +- .../actions/EamEditCaseInfoAction.java | 78 --- .../eventlisteners/CaseEventListener.java | 46 ++ .../eventlisteners/Installer.java | 3 - .../AddNewOrganizationDialog.java | 9 +- .../optionspanel/Bundle.properties | 21 + .../CentralRepoCaseOptionsPanel.form | 287 +++++++++++ .../CentralRepoCaseOptionsPanel.java | 454 ++++++++++++++++++ 17 files changed, 1180 insertions(+), 282 deletions(-) delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamEditCaseInfoAction.java create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 8ba843a41c..d72c3a8fe1 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -215,7 +215,6 @@ LocalDiskPanel.imageWriterErrorLabel.text=Error Label LocalDiskPanel.jLabel1.text=Note that at least one ingest module must be run to create a complete copy LocalDiskPanel.pathTextField.text= LocalDiskPanel.browseButton.text=Browse -CasePropertiesPanel.updateCaseNameButton.text=Update Name CasePropertiesPanel.caseNameTextField.text= CasePropertiesPanel.caseDirLabel.text=Case Directory: CasePropertiesPanel.crDateLabel.text=Created Date: @@ -225,3 +224,7 @@ CasePropertiesPanel.lbDbType.text=Case Type: CasePropertiesPanel.examinerLabel.text=Examiner: CasePropertiesPanel.caseNumberLabel.text=Case Number: LocalDiskPanel.changeDatabasePathCheckbox.text=Update case to use VHD file upon completion +CasePropertiesPanel.lbCaseUUIDLabel.text=Case UUID: +CaseInformationPanel.centralRepoDetailsLabel.text=The Central Repository Details tab is only available when using a central repository. +CasePropertiesPanel.caseNumberTextField.text=jTextField1 +CasePropertiesPanel.examinerTextField.text=jTextField2 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties index 939c901e57..f7b805a032 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties @@ -188,7 +188,6 @@ Case_caseType_multiUser=\u8907\u6570\u30e6\u30fc\u30b6\u30fc\u30b1\u30fc\u30b9 Case_caseType_singleUser=\u5358\u6570\u30e6\u30fc\u30b6\u30fc\u30b1\u30fc\u30b9 CasePropertiesForm.imagesTable.columnModel.title0=\u30d1\u30b9 CasePropertiesForm.imagesTable.columnModel.title1=\u524a\u9664 -CasePropertiesPanel.updateCaseNameButton.text=\u66f4\u65b0 CasePropertiesPanel.caseDirLabel.text=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff1a CasePropertiesPanel.crDateLabel.text=\u4f5c\u6210\u65e5\uff1a CasePropertiesPanel.caseNameLabel.text=\u30b1\u30fc\u30b9\u540d\uff1a diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index afcf23ed57..e8ca021a00 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1509,6 +1509,26 @@ public class Case { } } + void updateCaseNumber(String newCaseNumber) throws CaseActionException { + String oldCaseNumber = metadata.getCaseNumber(); + try { + metadata.setCaseNumber(newCaseNumber); + } catch (CaseMetadataException ex) { + throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError()); + } + eventPublisher.publish(new AutopsyEvent(Events.NUMBER.toString(), oldCaseNumber, newCaseNumber)); + } + + void updateExaminer(String newExaminer) throws CaseActionException { + String oldExaminer = metadata.getExaminer(); + try { + metadata.setExaminer(newExaminer); + } catch (CaseMetadataException ex) { + throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError()); + } + eventPublisher.publish(new AutopsyEvent(Events.EXAMINER.toString(), oldExaminer, newExaminer)); + } + /** * Constructs a Case object for a new Autopsy case. * diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form index 74892fe40d..bea5e54d2f 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form @@ -18,39 +18,56 @@ - + - + - + - + + + + + + + + + + + - - + + + + + + + + + @@ -74,6 +91,13 @@ + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java index b51f0d8a63..4b901fb1a5 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java @@ -20,7 +20,11 @@ package org.sleuthkit.autopsy.casemodule; import java.awt.event.ActionListener; import javax.swing.event.ChangeEvent; +import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.centralrepository.optionspanel.CentralRepoCaseOptionsPanel; /** * Panel for displaying the case information, including both case details and @@ -29,6 +33,8 @@ import org.openide.util.NbBundle.Messages; class CaseInformationPanel extends javax.swing.JPanel { private static final long serialVersionUID = 1L; + CasePropertiesPanel propertiesPanel; + CentralRepoCaseOptionsPanel centralRepoPanel; /** * Constructs a panel for displaying the case information, including both @@ -44,10 +50,24 @@ class CaseInformationPanel extends javax.swing.JPanel { "CaseInformationPanel.ingestJobInfo.header=Ingest History" }) private void customizeComponents() { - CasePropertiesPanel propertiesPanel = new CasePropertiesPanel(Case.getCurrentCase()); + propertiesPanel = new CasePropertiesPanel(Case.getCurrentCase()); propertiesPanel.setSize(propertiesPanel.getPreferredSize()); this.tabbedPane.addTab(Bundle.CaseInformationPanel_caseDetails_header(), propertiesPanel); this.tabbedPane.addTab(Bundle.CaseInformationPanel_ingestJobInfo_header(), new IngestJobInfoPanel()); + centralRepoPanel = new CentralRepoCaseOptionsPanel(); + this.tabbedPane.addTab("Central Repository Details", centralRepoPanel); + tabbedPane.setEnabledAt(tabbedPane.indexOfComponent(centralRepoPanel), false); + centralRepoDetailsLabel.setVisible(true); + try { + if (EamDb.getInstance() != null) { + tabbedPane.setEnabledAt(tabbedPane.indexOfComponent(centralRepoPanel), true); + centralRepoDetailsLabel.setVisible(false); + } + } catch (EamDbException ex) { + Exceptions.printStackTrace(ex); + } +// this.tabbedPane.addTab("Organization", new CaseOrganizationPanel()); +// this.tabbedPane.addTab("Examiner Details", new ExaminerDetailsPanel()); this.tabbedPane.addChangeListener((ChangeEvent e) -> { tabbedPane.getSelectedComponent().setSize(tabbedPane.getSelectedComponent().getPreferredSize()); }); @@ -71,9 +91,10 @@ class CaseInformationPanel extends javax.swing.JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - jPanel1 = new javax.swing.JPanel(); + outerDetailsPanel = new javax.swing.JPanel(); tabbedPane = new javax.swing.JTabbedPane(); closeButton = new javax.swing.JButton(); + centralRepoDetailsLabel = new javax.swing.JLabel(); tabbedPane.setPreferredSize(new java.awt.Dimension(420, 200)); @@ -84,23 +105,37 @@ class CaseInformationPanel extends javax.swing.JPanel { } }); - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 709, Short.MAX_VALUE) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + org.openide.awt.Mnemonics.setLocalizedText(centralRepoDetailsLabel, org.openide.util.NbBundle.getMessage(CaseInformationPanel.class, "CaseInformationPanel.centralRepoDetailsLabel.text")); // NOI18N + + javax.swing.GroupLayout outerDetailsPanelLayout = new javax.swing.GroupLayout(outerDetailsPanel); + outerDetailsPanel.setLayout(outerDetailsPanelLayout); + outerDetailsPanelLayout.setHorizontalGroup( + outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(outerDetailsPanelLayout.createSequentialGroup() + .addComponent(tabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 709, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, outerDetailsPanelLayout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(closeButton) .addGap(5, 5, 5)) + .addGroup(outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(outerDetailsPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(centralRepoDetailsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 633, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(66, Short.MAX_VALUE))) ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + outerDetailsPanelLayout.setVerticalGroup( + outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(outerDetailsPanelLayout.createSequentialGroup() + .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE) + .addGap(0, 0, 0) .addComponent(closeButton) .addGap(5, 5, 5)) + .addGroup(outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, outerDetailsPanelLayout.createSequentialGroup() + .addContainerGap(237, Short.MAX_VALUE) + .addComponent(centralRepoDetailsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap())) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); @@ -109,23 +144,31 @@ class CaseInformationPanel extends javax.swing.JPanel { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(0, 0, 0) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(outerDetailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(0, 0, 0)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(outerDetailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); }// //GEN-END:initComponents private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed - // Used by CasePropertiesAction + propertiesPanel.saveChanges(); + try { + if (EamDb.getInstance() != null) { + centralRepoPanel.saveChanges(); + } + } catch (EamDbException ex) { + Exceptions.printStackTrace(ex); + } }//GEN-LAST:event_closeButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel centralRepoDetailsLabel; private javax.swing.JButton closeButton; - private javax.swing.JPanel jPanel1; + private javax.swing.JPanel outerDetailsPanel; private javax.swing.JTabbedPane tabbedPane; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java index 1f4c5b7912..b130929b93 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java @@ -227,6 +227,17 @@ public final class CaseMetadata { return caseNumber; } + void setCaseNumber(String newCaseNumber) throws CaseMetadataException { + String oldCaseNumber = this.caseNumber; + this.caseNumber = newCaseNumber; + try { + writeToFile(); + } catch (CaseMetadataException ex) { + this.caseNumber = oldCaseNumber; + throw ex; + } + } + /** * Gets the examiner. * @@ -235,6 +246,17 @@ public final class CaseMetadata { public String getExaminer() { return examiner; } + + void setExaminer(String newExaminer) throws CaseMetadataException { + String oldExaminer = this.examiner; + this.examiner = newExaminer; + try { + writeToFile(); + } catch (CaseMetadataException ex) { + this.examiner = oldExaminer; + throw ex; + } + } /** * Gets the name of the case database. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java index c50c561564..dd4a39c70d 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.casemodule; +import java.awt.Dialog; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; @@ -52,7 +53,7 @@ final class CasePropertiesAction extends CallableSystemAction { public void performAction() { SwingUtilities.invokeLater(() -> { String title = NbBundle.getMessage(this.getClass(), "CasePropertiesAction.window.title"); - casePropertiesDialog = new JDialog(WindowManager.getDefault().getMainWindow(), title, false); + casePropertiesDialog = new JDialog(WindowManager.getDefault().getMainWindow(), title, true); CaseInformationPanel caseInformationPanel = new CaseInformationPanel(); caseInformationPanel.addCloseButtonAction((ActionEvent e) -> { casePropertiesDialog.setVisible(false); @@ -66,7 +67,6 @@ final class CasePropertiesAction extends CallableSystemAction { double h = casePropertiesDialog.getSize().getHeight(); casePropertiesDialog.setLocation((int) ((screenDimension.getWidth() - w) / 2), (int) ((screenDimension.getHeight() - h) / 2)); casePropertiesDialog.setVisible(true); - casePropertiesDialog.setVisible(true); casePropertiesDialog.toFront(); }); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form index d373e58a6e..514b832672 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form @@ -33,12 +33,20 @@ - + + + + + - + + + + + @@ -49,11 +57,25 @@ - + - + - + + + + + + + + + + + + + + + @@ -62,86 +84,62 @@ + - - - - - - - - - - - - - - - - + + + - - - - - - - - + + + + + - - + + - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -195,21 +193,6 @@ - - - - - - - - - - - - - - - @@ -258,10 +241,6 @@ - - - - @@ -285,6 +264,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index 7a513d7261..2319bbb9fd 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -46,15 +46,15 @@ class CasePropertiesPanel extends javax.swing.JPanel { caseNameTextField.setText(theCase.getDisplayName()); String caseNumber = theCase.getNumber(); if (!caseNumber.isEmpty()) { - caseNumberField.setText(caseNumber); + caseNumberTextField.setText(caseNumber); } else { - caseNumberField.setText("N/A"); + caseNumberTextField.setText(""); } String examiner = theCase.getExaminer(); if (!examiner.isEmpty()) { - examinerField.setText(examiner); + examinerTextField.setText(examiner); } else { - examinerField.setText("N/A"); + examinerTextField.setText(""); } crDateField.setText(theCase.getCreatedDate()); caseDirField.setText(theCase.getCaseDirectory()); @@ -64,7 +64,8 @@ class CasePropertiesPanel extends javax.swing.JPanel { dbNameField.setText(theCase.getMetadata().getCaseDatabaseName()); } Case.CaseType caseType = theCase.getCaseType(); - caseTypeField.setText(caseType.getLocalizedDisplayName()); + caseTypeField.setText(caseType.getLocalizedDisplayName()); + lbCaseUIDText.setText(theCase.getName()); } /** @@ -92,17 +93,18 @@ class CasePropertiesPanel extends javax.swing.JPanel { crDateLabel = new javax.swing.JLabel(); caseDirLabel = new javax.swing.JLabel(); caseNameTextField = new javax.swing.JTextField(); - updateCaseNameButton = new javax.swing.JButton(); caseNumberLabel = new javax.swing.JLabel(); examinerLabel = new javax.swing.JLabel(); lbDbType = new javax.swing.JLabel(); lbDbName = new javax.swing.JLabel(); - caseNumberField = new javax.swing.JLabel(); - examinerField = new javax.swing.JLabel(); crDateField = new javax.swing.JLabel(); caseDirField = new javax.swing.JLabel(); dbNameField = new javax.swing.JLabel(); caseTypeField = new javax.swing.JLabel(); + lbCaseUUIDLabel = new javax.swing.JLabel(); + lbCaseUIDText = new javax.swing.JLabel(); + caseNumberTextField = new javax.swing.JTextField(); + examinerTextField = new javax.swing.JTextField(); jTextArea1.setColumns(20); jTextArea1.setRows(5); @@ -120,14 +122,6 @@ class CasePropertiesPanel extends javax.swing.JPanel { caseNameTextField.setFont(caseNameTextField.getFont().deriveFont(caseNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); caseNameTextField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseNameTextField.text")); // NOI18N - updateCaseNameButton.setFont(updateCaseNameButton.getFont().deriveFont(updateCaseNameButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - updateCaseNameButton.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.updateCaseNameButton.text")); // NOI18N - updateCaseNameButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - updateCaseNameButtonActionPerformed(evt); - } - }); - caseNumberLabel.setFont(caseNumberLabel.getFont().deriveFont(caseNumberLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); caseNumberLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseNumberLabel.text")); // NOI18N @@ -146,6 +140,12 @@ class CasePropertiesPanel extends javax.swing.JPanel { caseTypeField.setMaximumSize(new java.awt.Dimension(1, 0)); + lbCaseUUIDLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbCaseUUIDLabel.text")); // NOI18N + + caseNumberTextField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseNumberTextField.text")); // NOI18N + + examinerTextField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.examinerTextField.text")); // NOI18N + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -155,98 +155,100 @@ class CasePropertiesPanel extends javax.swing.JPanel { .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNumberLabel) + .addComponent(caseNameLabel) + .addComponent(examinerLabel)) + .addGap(19, 19, 19) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNameTextField) + .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 333, Short.MAX_VALUE) + .addComponent(examinerTextField))) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(lbCaseUUIDLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbDbName) - .addComponent(lbDbType) - .addComponent(caseDirLabel)) + .addComponent(lbDbType, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseDirLabel, javax.swing.GroupLayout.Alignment.LEADING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(caseDirField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(caseTypeField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(dbNameField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addComponent(dbNameField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbCaseUIDText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(crDateLabel) - .addComponent(examinerLabel) - .addComponent(caseNumberLabel)) + .addComponent(crDateLabel) .addGap(18, 18, 18) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(examinerField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(caseNumberField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(caseNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(updateCaseNameButton, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(crDateField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addComponent(crDateField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addContainerGap() - .addComponent(caseNameLabel) - .addContainerGap(392, Short.MAX_VALUE))) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() - .addContainerGap() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(caseNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(caseNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(caseNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(updateCaseNameButton)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(caseNumberLabel) + .addComponent(caseNumberTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(examinerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(examinerLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(caseNumberField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(examinerLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(crDateField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(crDateLabel, javax.swing.GroupLayout.Alignment.TRAILING)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(caseDirLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(caseDirField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseTypeField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbDbType)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbDbName) - .addComponent(dbNameField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addComponent(caseNumberLabel)) - .addGap(44, 44, 44)) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addContainerGap() - .addComponent(caseNameLabel) - .addContainerGap(173, Short.MAX_VALUE))) + .addComponent(crDateLabel) + .addComponent(crDateField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(caseDirLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(caseDirField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseTypeField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbDbType)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbDbName) + .addComponent(dbNameField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbCaseUUIDLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbCaseUIDText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(20, Short.MAX_VALUE)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) ); }// //GEN-END:initComponents - /** - * Updates the case display name. - * - * @param evt The action event - */ @NbBundle.Messages({ "CasePropertiesPanel.errorDialog.emptyCaseNameMessage=No case name entered.", "CasePropertiesPanel.errorDialog.invalidCaseNameMessage=Case names cannot include the following symbols: \\, /, :, *, ?, \", <, >, |" }) - private void updateCaseNameButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateCaseNameButtonActionPerformed + void saveChanges() { + saveCaseName(); + saveCaseNumber(); + saveExaminerName(); + } + + private void saveCaseName() { String newCaseDisplayName = caseNameTextField.getText(); + if (newCaseDisplayName.equals(theCase.getDisplayName())) { return; } @@ -267,28 +269,77 @@ class CasePropertiesPanel extends javax.swing.JPanel { MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS } - }//GEN-LAST:event_updateCaseNameButtonActionPerformed + } + private void saveCaseNumber() { + String newCaseNumber = caseNumberTextField.getText(); + if (newCaseNumber.equals(theCase.getNumber())) { + return; + } + + if (newCaseNumber.trim().isEmpty()) { + MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); + return; + } + + if (!Case.isValidName(newCaseNumber)) { + MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); + return; + } + + try { + theCase.updateCaseNumber(newCaseNumber); + } catch (CaseActionException ex) { + MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); + LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS + } + } + + private void saveExaminerName() { + String newExaminerName = examinerTextField.getText(); + + if (newExaminerName.equals(theCase.getExaminer())) { + return; + } + + if (newExaminerName.trim().isEmpty()) { + MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); + return; + } + + if (!Case.isValidName(newExaminerName)) { + MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); + return; + } + + try { + theCase.updateExaminer(newExaminerName); + } catch (CaseActionException ex) { + MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); + LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS + } + } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel caseDirField; private javax.swing.JLabel caseDirLabel; private javax.swing.JLabel caseNameLabel; private javax.swing.JTextField caseNameTextField; - private javax.swing.JLabel caseNumberField; private javax.swing.JLabel caseNumberLabel; + private javax.swing.JTextField caseNumberTextField; private javax.swing.JLabel caseTypeField; private javax.swing.JLabel crDateField; private javax.swing.JLabel crDateLabel; private javax.swing.JLabel dbNameField; - private javax.swing.JLabel examinerField; private javax.swing.JLabel examinerLabel; + private javax.swing.JTextField examinerTextField; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea jTextArea1; + private javax.swing.JLabel lbCaseUIDText; + private javax.swing.JLabel lbCaseUUIDLabel; private javax.swing.JLabel lbDbName; private javax.swing.JLabel lbDbType; - private javax.swing.JButton updateCaseNameButton; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties index 6a2b388e78..18fad5033f 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties @@ -17,10 +17,8 @@ * limitations under the License. */ EamCaseEditDetailsDialog.lbExaminerEmailLabel.text=Email: -EamCaseEditDetailsDialog.lbCaseNameLabel.text=Case Name: EamCaseEditDetailsDialog.lbExaminerNameLabel.text=Name: EamCaseEditDetailsDialog.bnOk.text=OK -EamCaseEditDetailsDialog.bnClose.text=Close EamCaseEditDetailsDialog.bnNewOrganization.text=New Organization EamCaseEditDetailsDialog.lbPointOfContactPhoneLabel.text=Phone: EamCaseEditDetailsDialog.lbPointOfContactEmailLabel.text=Email: @@ -28,10 +26,12 @@ EamCaseEditDetailsDialog.lbPointOfContactNameLabel.text=Name: EamCaseEditDetailsDialog.lbPointOfContactGroupLabel.text=Point of Contact: EamCaseEditDetailsDialog.lbOrganizationNameLabel.text=Organization Name: EamCaseEditDetailsDialog.lbNotesLabel.text=Notes: -EamCaseEditDetailsDialog.lbCaseUUIDLabel.text=Case UUID: EamCaseEditDetailsDialog.lbExaminerPhoneLabel.text=Phone: -EamCaseEditDetailsDialog.lbCaseNumberLabel.text=Case Number: -EamCaseEditDetailsDialog.lbCreationDateLabel.text=Creation Date: EamCaseEditDetailsDialog.pnCaseMetadata.title=Case Metadata EamCaseEditDetailsDialog.pnOrganization.title=Organization EamCaseEditDetailsDialog.pnExaminer.title=Examiner +EamCaseEditDetailsDialog.lbCaseNameLabel.text=Case Name: +EamCaseEditDetailsDialog.bnClose.text=Close +EamCaseEditDetailsDialog.lbCaseUUIDLabel.text=Case UUID: +EamCaseEditDetailsDialog.lbCaseNumberLabel.text=Case Number: +EamCaseEditDetailsDialog.lbCreationDateLabel.text=Creation Date: diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamEditCaseInfoAction.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamEditCaseInfoAction.java deleted file mode 100755 index 4123e382ff..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamEditCaseInfoAction.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Central Repository - * - * Copyright 2015-2017 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.centralrepository.actions; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.Action; -import org.openide.awt.ActionID; -import org.openide.awt.ActionReference; -import org.openide.awt.ActionRegistration; -import org.openide.util.HelpCtx; -import org.openide.util.NbBundle.Messages; -import org.openide.util.actions.CallableSystemAction; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; - -/** - * Action to update case details in Central Repository database - */ -@ActionID( - category = "Case", - id = "org.sleuthkit.centralrepository.actions.CentralRepositoryCaseProperties" -) -@ActionRegistration( - displayName = "#CTL_CentralRepositoryCaseProperties", - lazy = false -) -@ActionReference(path = "Menu/Case", position = 650, separatorAfter = 824) -@Messages("CTL_CentralRepositoryCaseProperties=Central Repository Case Properties...") -public final class EamEditCaseInfoAction extends CallableSystemAction implements ActionListener { - - EamEditCaseInfoAction() { - putValue(Action.NAME, Bundle.CTL_CentralRepositoryCaseProperties()); // put the action Name - this.setEnabled(true); - } - - @Override - public boolean isEnabled() { - return EamDb.isEnabled() && Case.isCaseOpen(); - } - - @Override - public void actionPerformed(ActionEvent e) { - performAction(); - } - - @Override - public void performAction() { - - EamCaseEditDetailsDialog caseInformationDialog = new EamCaseEditDetailsDialog(); - } - - @Override - public String getName() { - return Bundle.CTL_CentralRepositoryCaseProperties(); - } - - @Override - public HelpCtx getHelpCtx() { - return HelpCtx.DEFAULT_HELP; - } -} diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 7f4f97d08a..68fe306585 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -338,6 +338,52 @@ public class CaseEventListener implements PropertyChangeListener { } } // NAME break; + case NUMBER: { + // The display name of the case has been changed + + if (!EamDb.isEnabled()) { + break; + } + + if (evt.getNewValue() instanceof String) { + String newNumber = (String) evt.getNewValue(); + try { + // See if the case is in the database. If it is, update the display name. + CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + + if (null != existingCase) { + existingCase.setCaseNumber(newNumber); + dbManager.updateCase(existingCase); + } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS + } + } + } // NUMBER + break; + case EXAMINER: { + // The display name of the case has been changed + + if (!EamDb.isEnabled()) { + break; + } + + if (evt.getNewValue() instanceof String) { + String newExaminerName = (String) evt.getNewValue(); + try { + // See if the case is in the database. If it is, update the display name. + CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + + if (null != existingCase) { + existingCase.setExaminerName(newExaminerName); + dbManager.updateCase(existingCase); + } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS + } + } + } // EXAMINER + break; } } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java index d2b1beebbb..cb4fe16925 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java @@ -23,7 +23,6 @@ import org.openide.modules.ModuleInstall; import org.openide.util.actions.CallableSystemAction; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.centralrepository.actions.EamEditCaseInfoAction; /** * Install event listeners during module initialization @@ -54,8 +53,6 @@ public class Installer extends ModuleInstall { Case.addPropertyChangeListener(pcl); ieListener.installListeners(); - CallableSystemAction.get(EamEditCaseInfoAction.class).setEnabled(true); - // TODO: create a thread pool to process Runners. } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java index 0721c92ca7..27adb7a63d 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java @@ -30,6 +30,7 @@ import javax.swing.event.DocumentListener; import org.netbeans.spi.options.OptionsPanelController; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; @@ -45,6 +46,7 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog { private final Collection textBoxes; private final TextBoxChangedListener textBoxChangedListener; private boolean hasChanged; + private EamOrganization newOrg; /** * Creates new form AddNewOrganizationDialog @@ -57,6 +59,7 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog { textBoxes = new ArrayList<>(); textBoxChangedListener = new TextBoxChangedListener(); hasChanged = false; + newOrg = null; initComponents(); customizeComponents(); display(); @@ -176,6 +179,10 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog { public boolean isChanged() { return hasChanged; } + + public EamOrganization getNewOrg() { + return newOrg; + } /** * This method is called from within the constructor to initialize the form. @@ -304,7 +311,7 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog { @Messages({"AddNewOrganizationDialog.bnOk.addFailed.text=Failed to add new organization."}) private void bnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOKActionPerformed - EamOrganization newOrg = new EamOrganization( + newOrg = new EamOrganization( tfOrganizationName.getText(), tfPocName.getText(), tfPocEmail.getText(), diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties index 32a8938df1..98e2ace7d6 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties @@ -76,3 +76,24 @@ ImportHashDatabaseDialog.lbFilePath.text=File Path: ImportHashDatabaseDialog.tfFilePath.text= EamDbSettingsDialog.lbDatabaseDesc.text=Database File: EamDbSettingsDialog.lbFullDbPath.text=jLabel2 +CentralRepoCaseOptionsPanel.lbOrganizationNameLabel.text=Organization Name: +CentralRepoCaseOptionsPanel.pnOrganization.border.title=Organization +CentralRepoCaseOptionsPanel.lbNotesLabel.text=Notes: +CentralRepoCaseOptionsPanel.lbExaminerPhoneLabel.text=Phone: +CentralRepoCaseOptionsPanel.lbExaminerEmailLabel.text=Email: +CentralRepoCaseOptionsPanel.lbExaminerNameLabel.text=Name: +CentralRepoCaseOptionsPanel.pnExaminer.border.title=Examiner Details +CentralRepoCaseOptionsPanel.bnNewOrganization.text=New Organization +CentralRepoCaseOptionsPanel.lbPointOfContactPhoneLabel.text=Phone: +CentralRepoCaseOptionsPanel.lbPointOfContactEmailLabel.text=Email: +CentralRepoCaseOptionsPanel.lbPointOfContactNameLabel.text=Point of Contact: +CaseOrganizationPanel.bnNewOrganization.text=New Organization +CaseOrganizationPanel.lbPointOfContactPhoneLabel.text=Phone: +CaseOrganizationPanel.lbPointOfContactEmailLabel.text=Email: +CaseOrganizationPanel.lbPointOfContactNameLabel.text=Name: +CaseOrganizationPanel.lbPointOfContactGroupLabel.text=Point of Contact: +CaseOrganizationPanel.lbOrganizationNameLabel.text=Organization Name: +ExaminerDetailsPanel.lbExaminerNameLabel.text=Name: +ExaminerDetailsPanel.lbNotesLabel.text=Notes: +ExaminerDetailsPanel.lbExaminerPhoneLabel.text=Phone: +ExaminerDetailsPanel.lbExaminerEmailLabel.text=Email: diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form new file mode 100644 index 0000000000..dc558aad23 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form @@ -0,0 +1,287 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java new file mode 100644 index 0000000000..0fcf18a1fd --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java @@ -0,0 +1,454 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.centralrepository.optionspanel; + +import java.awt.Cursor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.logging.Level; +import javax.swing.JComboBox; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.centralrepository.actions.EamCaseEditDetailsDialog; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; +import org.sleuthkit.autopsy.coreutils.Logger; + +/** + * + * @author wschaefer + */ +public class CentralRepoCaseOptionsPanel extends javax.swing.JPanel { + + private final static Logger LOGGER = Logger.getLogger(EamCaseEditDetailsDialog.class.getName()); + private CorrelationCase eamCase; + private EamDb dbManager; + private Boolean contentChanged = false; + private final Collection textBoxes = new ArrayList<>(); + private final Collection textAreas = new ArrayList<>(); + private final TextBoxChangedListener textBoxChangedListener = new TextBoxChangedListener(); + private EamOrganization selectedOrg = null; + private List orgs = null; + private boolean comboboxOrganizationActionListenerActive; + + /** + * Creates new form CentralRepoCaseOptionsPanel + */ + public CentralRepoCaseOptionsPanel() { + try { + this.dbManager = EamDb.getInstance(); + if (dbManager != null ) { + this.eamCase = this.dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + if (this.eamCase == null) { + this.eamCase = dbManager.newCase(Case.getCurrentCase()); + } + initComponents(); + loadData(); + customizeComponents(); + } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error getting current case.", ex); + } + } + + private void customizeComponents() { + setTextBoxListeners(); + setTextAreaListeners(); + } + + private void setTextBoxListeners() { + // Register for notifications when the text boxes get updated. + textBoxes.add(tfExaminerNameText); + textBoxes.add(tfExaminerEmailText); + textBoxes.add(tfExaminerPhoneText); + addTextFieldDocumentListeners(textBoxes, textBoxChangedListener); + } + + private void setTextAreaListeners() { + // Register for notifications when the text areas get updated. + textAreas.add(taNotesText); + addTextAreaDocumentListeners(textAreas, textBoxChangedListener); + } + + /** + * Adds a change listener to a collection of text fields. + * + * @param textFields The text fields. + * @param listener The change listener. + */ + private static void addTextFieldDocumentListeners(Collection textFields, TextBoxChangedListener listener) { + textFields.forEach((textField) -> { + textField.getDocument().addDocumentListener(listener); + }); + } + + /** + * Adds a change listener to a collection of text areas. + * + * @param textAreas The text areas. + * @param listener The change listener. + */ + private static void addTextAreaDocumentListeners(Collection textAreas, TextBoxChangedListener listener) { + textAreas.forEach((textArea) -> { + textArea.getDocument().addDocumentListener(listener); + }); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + pnOrganization = new javax.swing.JPanel(); + lbOrganizationNameLabel = new javax.swing.JLabel(); + comboBoxOrgName = new javax.swing.JComboBox<>(); + lbPointOfContactNameLabel = new javax.swing.JLabel(); + lbPointOfContactEmailLabel = new javax.swing.JLabel(); + lbPointOfContactPhoneLabel = new javax.swing.JLabel(); + lbPointOfContactNameText = new javax.swing.JLabel(); + lbPointOfContactEmailText = new javax.swing.JLabel(); + lbPointOfContactPhoneText = new javax.swing.JLabel(); + bnNewOrganization = new javax.swing.JButton(); + pnExaminer = new javax.swing.JPanel(); + lbExaminerNameLabel = new javax.swing.JLabel(); + tfExaminerNameText = new javax.swing.JTextField(); + lbExaminerEmailLabel = new javax.swing.JLabel(); + tfExaminerEmailText = new javax.swing.JTextField(); + lbExaminerPhoneLabel = new javax.swing.JLabel(); + tfExaminerPhoneText = new javax.swing.JTextField(); + lbNotesLabel = new javax.swing.JLabel(); + jScrollPane2 = new javax.swing.JScrollPane(); + taNotesText = new javax.swing.JTextArea(); + + pnOrganization.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.pnOrganization.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbOrganizationNameLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbOrganizationNameLabel.text")); // NOI18N + + comboBoxOrgName.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboBoxOrgNameActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactNameLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbPointOfContactNameLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactEmailLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbPointOfContactEmailLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactPhoneLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbPointOfContactPhoneLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(bnNewOrganization, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.bnNewOrganization.text")); // NOI18N + bnNewOrganization.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnNewOrganizationActionPerformed(evt); + } + }); + + javax.swing.GroupLayout pnOrganizationLayout = new javax.swing.GroupLayout(pnOrganization); + pnOrganization.setLayout(pnOrganizationLayout); + pnOrganizationLayout.setHorizontalGroup( + pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganizationLayout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbOrganizationNameLabel) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactPhoneLabel) + .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(comboBoxOrgName, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(bnNewOrganization, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + pnOrganizationLayout.setVerticalGroup( + pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganizationLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbOrganizationNameLabel) + .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(2, 2, 2) + .addComponent(bnNewOrganization) + .addGap(1, 1, 1) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(0, 0, 0)) + ); + + pnExaminer.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.pnExaminer.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbExaminerNameLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerNameLabel.text")); // NOI18N + + tfExaminerNameText.setEditable(false); + + org.openide.awt.Mnemonics.setLocalizedText(lbExaminerEmailLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerEmailLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbExaminerPhoneLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerPhoneLabel.text")); // NOI18N + + tfExaminerPhoneText.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tfExaminerPhoneTextActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(lbNotesLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbNotesLabel.text")); // NOI18N + + taNotesText.setColumns(20); + taNotesText.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N + taNotesText.setLineWrap(true); + taNotesText.setRows(2); + taNotesText.setWrapStyleWord(true); + jScrollPane2.setViewportView(taNotesText); + + javax.swing.GroupLayout pnExaminerLayout = new javax.swing.GroupLayout(pnExaminer); + pnExaminer.setLayout(pnExaminerLayout); + pnExaminerLayout.setHorizontalGroup( + pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnExaminerLayout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(25, 25, 25) + .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tfExaminerEmailText) + .addComponent(tfExaminerPhoneText) + .addComponent(tfExaminerNameText) + .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 261, Short.MAX_VALUE)) + .addContainerGap()) + ); + pnExaminerLayout.setVerticalGroup( + pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnExaminerLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbExaminerNameLabel) + .addComponent(tfExaminerNameText)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tfExaminerEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerEmailLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tfExaminerPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerPhoneLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbNotesLabel) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(0, 0, 0)) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(pnOrganization, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pnExaminer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(pnOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(pnExaminer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0)) + ); + }// //GEN-END:initComponents + + private void comboBoxOrgNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxOrgNameActionPerformed + JComboBox cb = (JComboBox) evt.getSource(); + String orgName = (String) cb.getSelectedItem(); + if (null == orgName || false == comboboxOrganizationActionListenerActive) { + return; + } + + if ("".equals(orgName)) { + selectedOrg = null; + lbPointOfContactNameText.setText(""); + lbPointOfContactEmailText.setText(""); + lbPointOfContactPhoneText.setText(""); + contentChanged = true; + return; + } + + for (EamOrganization org : orgs) { + if (org.getName().equals(orgName)) { + selectedOrg = org; + lbPointOfContactNameText.setText(selectedOrg.getPocName()); + lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); + lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); + contentChanged = true; + return; + } + } + }//GEN-LAST:event_comboBoxOrgNameActionPerformed + + private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnNewOrganizationActionPerformed + AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(); + // update the combobox options and org data fields + if (dialogO.isChanged()) { + eamCase.setOrg(dialogO.getNewOrg()); + loadOrganizationData(); + updateDb(); + validate(); + repaint(); + } + }//GEN-LAST:event_bnNewOrganizationActionPerformed + + private void tfExaminerPhoneTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tfExaminerPhoneTextActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_tfExaminerPhoneTextActionPerformed + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton bnNewOrganization; + private javax.swing.JComboBox comboBoxOrgName; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JLabel lbExaminerEmailLabel; + private javax.swing.JLabel lbExaminerNameLabel; + private javax.swing.JLabel lbExaminerPhoneLabel; + private javax.swing.JLabel lbNotesLabel; + private javax.swing.JLabel lbOrganizationNameLabel; + private javax.swing.JLabel lbPointOfContactEmailLabel; + private javax.swing.JLabel lbPointOfContactEmailText; + private javax.swing.JLabel lbPointOfContactNameLabel; + private javax.swing.JLabel lbPointOfContactNameText; + private javax.swing.JLabel lbPointOfContactPhoneLabel; + private javax.swing.JLabel lbPointOfContactPhoneText; + private javax.swing.JPanel pnExaminer; + private javax.swing.JPanel pnOrganization; + private javax.swing.JTextArea taNotesText; + private javax.swing.JTextField tfExaminerEmailText; + private javax.swing.JTextField tfExaminerNameText; + private javax.swing.JTextField tfExaminerPhoneText; + // End of variables declaration//GEN-END:variables + + private void loadExaminerData() { + tfExaminerNameText.setText(eamCase.getExaminerName()); + tfExaminerEmailText.setText(eamCase.getExaminerEmail()); + tfExaminerPhoneText.setText(eamCase.getExaminerPhone()); + taNotesText.setText(eamCase.getNotes()); + } + + public void saveChanges(){ + updateEamCase(); + updateDb(); + } + + private void loadOrganizationData() { + comboboxOrganizationActionListenerActive = false; // don't fire action listener while loading combobox content + comboBoxOrgName.removeAllItems(); + try { + orgs = dbManager.getOrganizations(); + comboBoxOrgName.addItem(""); // for when a case has a null Org + orgs.forEach((org) -> { + comboBoxOrgName.addItem(org.getName()); + }); + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Failure populating combobox with organizations.", ex); + } + comboboxOrganizationActionListenerActive = true; + + if (!orgs.isEmpty() && null != eamCase.getOrg()) { + selectedOrg = eamCase.getOrg(); + comboBoxOrgName.setSelectedItem(selectedOrg.getName()); + lbPointOfContactNameText.setText(selectedOrg.getPocName()); + lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); + lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); + } else { + comboBoxOrgName.setSelectedItem(""); + lbPointOfContactNameText.setText(""); + lbPointOfContactEmailText.setText(""); + lbPointOfContactPhoneText.setText(""); + } + } + + private void loadData() { + loadExaminerData(); + loadOrganizationData(); + } + + /** + * Save changed value from text fields and text areas into the EamCase + * object. + */ + private void updateEamCase() { + eamCase.setOrg(selectedOrg); + eamCase.setExaminerName(tfExaminerNameText.getText()); + eamCase.setExaminerEmail(tfExaminerEmailText.getText()); + eamCase.setExaminerPhone(tfExaminerPhoneText.getText()); + eamCase.setNotes(taNotesText.getText()); + } + + private void updateDb() { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + if (!EamDb.isEnabled()) { + LOGGER.log(Level.SEVERE, "Central repository database not enabled"); // NON-NLS + return; + } + + try { + dbManager.updateCase(eamCase); + } catch (IllegalArgumentException | EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to central repository database", ex); // NON-NLS + } finally { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } + + /** + * Used to listen for changes in text areas/boxes. Let the panel know text + * content has changed. + */ + private class TextBoxChangedListener implements DocumentListener { + + @Override + public void changedUpdate(DocumentEvent e) { + setChanged(); + } + + @Override + public void insertUpdate(DocumentEvent e) { + setChanged(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + setChanged(); + } + + private void setChanged() { + contentChanged = true; + } + } +} From 9a36a8591832627b50ec42e40d2332750ea7cd69 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 5 Oct 2017 14:15:56 -0400 Subject: [PATCH 02/46] 2774 fix issue with save order of Case Details Tabs --- .../org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java index 4b901fb1a5..4a1ed7325a 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java @@ -154,7 +154,6 @@ class CaseInformationPanel extends javax.swing.JPanel { }// //GEN-END:initComponents private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed - propertiesPanel.saveChanges(); try { if (EamDb.getInstance() != null) { centralRepoPanel.saveChanges(); @@ -162,6 +161,7 @@ class CaseInformationPanel extends javax.swing.JPanel { } catch (EamDbException ex) { Exceptions.printStackTrace(ex); } + propertiesPanel.saveChanges(); }//GEN-LAST:event_closeButtonActionPerformed From b87e6d679660fa328858d554f26e60abb86ae45d Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 6 Oct 2017 14:28:39 -0400 Subject: [PATCH 03/46] 2774 functioning Manage Organizations Panel added --- .../autopsy/casemodule/Bundle.properties | 5 + .../casemodule/NewCaseVisualPanel2.form | 122 ++++- .../casemodule/NewCaseVisualPanel2.java | 189 +++++++- .../datamodel/AbstractSqlEamDb.java | 63 ++- .../centralrepository/datamodel/EamDb.java | 16 +- .../datamodel/SqliteEamDb.java | 6 +- .../AddNewOrganizationDialog.java | 46 +- .../optionspanel/Bundle.properties | 12 + .../CentralRepoCaseOptionsPanel.form | 15 +- .../CentralRepoCaseOptionsPanel.java | 21 +- .../ManageOrganizationsDialog.form | 347 +++++++++++++++ .../ManageOrganizationsDialog.java | 421 ++++++++++++++++++ 12 files changed, 1195 insertions(+), 68 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form create mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index d72c3a8fe1..676195c402 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -228,3 +228,8 @@ CasePropertiesPanel.lbCaseUUIDLabel.text=Case UUID: CaseInformationPanel.centralRepoDetailsLabel.text=The Central Repository Details tab is only available when using a central repository. CasePropertiesPanel.caseNumberTextField.text=jTextField1 CasePropertiesPanel.examinerTextField.text=jTextField2 +NewCaseVisualPanel2.bnNewOrganization.text=New Organization +NewCaseVisualPanel2.lbOrganizationNameLabel.text=Organization: +NewCaseVisualPanel2.lbPointOfContactEmailLabel.text=Email: +NewCaseVisualPanel2.lbPointOfContactNameLabel.text=Point of Contact: +NewCaseVisualPanel2.lbPointOfContactPhoneLabel.text=Phone: diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form index fcce5c4033..b866695be3 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form @@ -19,16 +19,39 @@ - - - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -50,7 +73,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + @@ -116,5 +161,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index e20fce9aea..5d39c6921a 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -1,15 +1,15 @@ /* * Autopsy Forensic Browser - * + * * Copyright 2011 Basis Technology Corp. * Contact: carrier sleuthkit org - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,7 +17,7 @@ * limitations under the License. */ -/* + /* * NewCaseVisualPanel2.java * * Created on Mar 7, 2012, 11:01:48 AM @@ -27,6 +27,11 @@ package org.sleuthkit.autopsy.casemodule; import org.openide.util.NbBundle; import java.awt.*; +import javax.swing.JComboBox; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; +import org.sleuthkit.autopsy.centralrepository.optionspanel.ManageOrganizationsDialog; /** * @@ -34,11 +39,29 @@ import java.awt.*; */ class NewCaseVisualPanel2 extends javax.swing.JPanel { + private EamOrganization selectedOrg = null; + private java.util.List orgs = null; + private EamDb dbManager; + /** * Creates new form NewCaseVisualPanel2 */ public NewCaseVisualPanel2() { initComponents(); + try { + this.dbManager = EamDb.getInstance(); + } catch (EamDbException ex) { + dbManager = null; + } + if (dbManager == null) { + comboBoxOrgName.setEnabled(false); + bnNewOrganization.setEnabled(false); + lbPointOfContactNameText.setEnabled(false); + lbPointOfContactEmailText.setEnabled(false); + lbPointOfContactPhoneText.setEnabled(false); + } else { + loadOrganizationData(); + } } /** @@ -66,6 +89,15 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { caseNumberLabel = new javax.swing.JLabel(); examinerLabel = new javax.swing.JLabel(); optionalLabel = new javax.swing.JLabel(); + lbOrganizationNameLabel = new javax.swing.JLabel(); + comboBoxOrgName = new javax.swing.JComboBox<>(); + bnNewOrganization = new javax.swing.JButton(); + lbPointOfContactNameLabel = new javax.swing.JLabel(); + lbPointOfContactNameText = new javax.swing.JLabel(); + lbPointOfContactEmailLabel = new javax.swing.JLabel(); + lbPointOfContactEmailText = new javax.swing.JLabel(); + lbPointOfContactPhoneLabel = new javax.swing.JLabel(); + lbPointOfContactPhoneText = new javax.swing.JLabel(); caseNumberTextField.setFont(caseNumberTextField.getFont().deriveFont(caseNumberTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); caseNumberTextField.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.caseNumberTextField.text")); // NOI18N @@ -82,6 +114,27 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { optionalLabel.setFont(optionalLabel.getFont().deriveFont(optionalLabel.getFont().getStyle() | java.awt.Font.BOLD, 14)); optionalLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.optionalLabel.text")); // NOI18N + lbOrganizationNameLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.lbOrganizationNameLabel.text")); // NOI18N + + comboBoxOrgName.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboBoxOrgNameActionPerformed(evt); + } + }); + + bnNewOrganization.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.bnNewOrganization.text")); // NOI18N + bnNewOrganization.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnNewOrganizationActionPerformed(evt); + } + }); + + lbPointOfContactNameLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.lbPointOfContactNameLabel.text")); // NOI18N + + lbPointOfContactEmailLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.lbPointOfContactEmailLabel.text")); // NOI18N + + lbPointOfContactPhoneLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.lbPointOfContactPhoneLabel.text")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -89,15 +142,32 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(optionalLabel) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(caseNumberLabel) - .addGap(25, 25, 25) - .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(examinerLabel) - .addGap(45, 45, 45) - .addComponent(examinerTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 246, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addComponent(optionalLabel) + .addGap(0, 150, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(examinerLabel) + .addComponent(lbOrganizationNameLabel) + .addComponent(caseNumberLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNumberTextField) + .addComponent(examinerTextField) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(bnNewOrganization)) + .addComponent(comboBoxOrgName, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbPointOfContactPhoneLabel) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactNameLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))) .addContainerGap()) ); layout.setVerticalGroup( @@ -113,14 +183,103 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(examinerLabel) .addComponent(examinerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbOrganizationNameLabel) + .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnNewOrganization) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(40, Short.MAX_VALUE)) ); }// //GEN-END:initComponents + + private void comboBoxOrgNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxOrgNameActionPerformed + JComboBox cb = (JComboBox) evt.getSource(); + String orgName = (String) cb.getSelectedItem(); + if (null == orgName) { + return; + } + + if ("".equals(orgName)) { + selectedOrg = null; + lbPointOfContactNameText.setText(""); + lbPointOfContactEmailText.setText(""); + lbPointOfContactPhoneText.setText(""); + return; + } + + for (EamOrganization org : orgs) { + if (org.getName().equals(orgName)) { + selectedOrg = org; + lbPointOfContactNameText.setText(selectedOrg.getPocName()); + lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); + lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); + return; + } + } + }//GEN-LAST:event_comboBoxOrgNameActionPerformed + + private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnNewOrganizationActionPerformed + ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); + // update the combobox options and org data fields + if (dialog.isChanged()) { + selectedOrg = dialog.getNewOrg(); + loadOrganizationData(); + validate(); + repaint(); + } + }//GEN-LAST:event_bnNewOrganizationActionPerformed + private void loadOrganizationData() { + + comboBoxOrgName.removeAllItems(); + try { + orgs = dbManager.getOrganizations(); + comboBoxOrgName.addItem(""); // for when a case has a null Org + orgs.forEach((org) -> { + comboBoxOrgName.addItem(org.getName()); + }); + } catch (EamDbException ex) { + + } + + if (!orgs.isEmpty() && null != selectedOrg) { + comboBoxOrgName.setSelectedItem(selectedOrg.getName()); + lbPointOfContactNameText.setText(selectedOrg.getPocName()); + lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); + lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); + } else { + comboBoxOrgName.setSelectedItem(""); + lbPointOfContactNameText.setText(""); + lbPointOfContactEmailText.setText(""); + lbPointOfContactPhoneText.setText(""); + } + } // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton bnNewOrganization; private javax.swing.JLabel caseNumberLabel; private javax.swing.JTextField caseNumberTextField; + private javax.swing.JComboBox comboBoxOrgName; private javax.swing.JLabel examinerLabel; private javax.swing.JTextField examinerTextField; + private javax.swing.JLabel lbOrganizationNameLabel; + private javax.swing.JLabel lbPointOfContactEmailLabel; + private javax.swing.JLabel lbPointOfContactEmailText; + private javax.swing.JLabel lbPointOfContactNameLabel; + private javax.swing.JLabel lbPointOfContactNameText; + private javax.swing.JLabel lbPointOfContactPhoneLabel; + private javax.swing.JLabel lbPointOfContactPhoneText; private javax.swing.JLabel optionalLabel; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 689d5a22fb..ed3388ce0a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -28,11 +28,13 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import java.sql.Types; import java.time.LocalDate; import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.openide.util.Exceptions; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; @@ -451,7 +453,8 @@ public abstract class AbstractSqlEamDb implements EamDb { /** * Retrieves Data Source details based on data source device ID * - * @param correlationCase the current CorrelationCase used for ensuring uniqueness of DataSource + * @param correlationCase the current CorrelationCase used for ensuring + * uniqueness of DataSource * @param dataSourceDeviceId the data source device ID number * * @return The data source @@ -572,10 +575,11 @@ public abstract class AbstractSqlEamDb implements EamDb { * Retrieves eamArtifact instances from the database that are associated * with the eamArtifactType and eamArtifactValue of the given eamArtifact. * - * @param aType The type of the artifact - * @param value The correlation value + * @param aType The type of the artifact + * @param value The correlation value * * @return List of artifact instances for a given type/value + * * @throws EamDbException */ @Override @@ -675,8 +679,8 @@ public abstract class AbstractSqlEamDb implements EamDb { * Retrieves number of artifact instances in the database that are * associated with the ArtifactType and artifactValue of the given artifact. * - * @param aType The type of the artifact - * @param value The correlation value + * @param aType The type of the artifact + * @param value The correlation value * * @return Number of artifact instances having ArtifactType and * ArtifactValue. @@ -725,8 +729,8 @@ public abstract class AbstractSqlEamDb implements EamDb { * database that are associated with the artifactType and artifactValue of * the given artifact. * - * @param aType The type of the artifact - * @param value The correlation value + * @param aType The type of the artifact + * @param value The correlation value * * @return Number of unique tuples */ @@ -1019,7 +1023,7 @@ public abstract class AbstractSqlEamDb implements EamDb { * given status. * * @param eamArtifact Artifact containing exactly one (1) ArtifactInstance. - * @param knownStatus The status to change the artifact to + * @param knownStatus The status to change the artifact to */ @Override public void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus) throws EamDbException { @@ -1290,25 +1294,33 @@ public abstract class AbstractSqlEamDb implements EamDb { /** * Add a new organization * + * @return the Organization ID of the newly created organization. + * * @param eamOrg The organization to add * * @throws EamDbException */ @Override - public void newOrganization(EamOrganization eamOrg) throws EamDbException { + public long newOrganization(EamOrganization eamOrg) throws EamDbException { Connection conn = connect(); PreparedStatement preparedStatement = null; String sql = "INSERT INTO organizations(org_name, poc_name, poc_email, poc_phone) VALUES (?, ?, ?, ?)"; try { - preparedStatement = conn.prepareStatement(sql); + preparedStatement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); preparedStatement.setString(1, eamOrg.getName()); preparedStatement.setString(2, eamOrg.getPocName()); preparedStatement.setString(3, eamOrg.getPocEmail()); preparedStatement.setString(4, eamOrg.getPocPhone()); preparedStatement.executeUpdate(); + ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); + if (generatedKeys.next()) { + return generatedKeys.getLong(1); + } else { + throw new SQLException("Creating user failed, no ID obtained."); + } } catch (SQLException ex) { throw new EamDbException("Error inserting new organization.", ex); // NON-NLS } finally { @@ -1383,6 +1395,35 @@ public abstract class AbstractSqlEamDb implements EamDb { } } + /** + * Update an existing organization. + * + * @param updatedOrganization the values the Organization with the same ID + * will be updated to in the database. + * + * @throws EamDbException + */ + @Override + public void updateOrganization(EamOrganization updatedOrganization) throws EamDbException { + Connection conn = connect(); + PreparedStatement preparedStatement = null; + String sql = "UPDATE organizations SET org_name = ?, poc_name = ?, poc_email = ?, poc_phone = ? WHERE id = ?"; + try { + preparedStatement = conn.prepareStatement(sql); + preparedStatement.setString(1, updatedOrganization.getName()); + preparedStatement.setString(2, updatedOrganization.getPocName()); + preparedStatement.setString(3, updatedOrganization.getPocEmail()); + preparedStatement.setString(4, updatedOrganization.getPocPhone()); + preparedStatement.setInt(5, updatedOrganization.getOrgID()); + preparedStatement.executeUpdate(); + } catch (SQLException ex) { + throw new EamDbException("Error updating organization.", ex); // NON-NLS + } finally { + EamDbUtil.closePreparedStatement(preparedStatement); + EamDbUtil.closeConnection(conn); + } + } + /** * Add a new Global Set * @@ -1851,7 +1892,7 @@ public abstract class AbstractSqlEamDb implements EamDb { resultSet.getInt("id"), resultSet.getInt("case_id"), resultSet.getString("device_id"), - resultSet.getString("name") + resultSet.getString("name") ); return eamDataSource; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index c3f3c09730..8e4a6bf16e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -314,7 +314,7 @@ public interface EamDb { * exists, it is updated. If eamArtifact does not exist nothing happens * * @param eamArtifact Artifact containing exactly one (1) ArtifactInstance. - * @param knownStatus The status to change the artifact to + * @param knownStatus The status to change the artifact to */ void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus) throws EamDbException; @@ -368,9 +368,11 @@ public interface EamDb { * * @param eamOrg The organization to add * + * @return the Organization ID of the newly created organization. + * * @throws EamDbException */ - void newOrganization(EamOrganization eamOrg) throws EamDbException; + long newOrganization(EamOrganization eamOrg) throws EamDbException; /** * Get all organizations @@ -392,6 +394,16 @@ public interface EamDb { */ EamOrganization getOrganizationByID(int orgID) throws EamDbException; + /** + * Update an existing organization. + * + * @param updatedOrganization the values the Organization with the same ID + * will be updated to in the database. + * + * @throws EamDbException + */ + void updateOrganization(EamOrganization updatedOrganization) throws EamDbException; + /** * Add a new Global Set * diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java index a048d95f9c..40ecc8cb37 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java @@ -656,15 +656,17 @@ public class SqliteEamDb extends AbstractSqlEamDb { /** * Add a new organization * + * @return the Organization ID of the newly created organization. + * * @param eamOrg The organization to add * * @throws EamDbException */ @Override - public void newOrganization(EamOrganization eamOrg) throws EamDbException { + public long newOrganization(EamOrganization eamOrg) throws EamDbException { try{ acquireExclusiveLock(); - super.newOrganization(eamOrg); + return super.newOrganization(eamOrg); } finally { releaseExclusiveLock(); } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java index 27adb7a63d..eacbc51e6d 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java @@ -30,7 +30,6 @@ import javax.swing.event.DocumentListener; import org.netbeans.spi.options.OptionsPanelController; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; -import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; @@ -47,6 +46,7 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog { private final TextBoxChangedListener textBoxChangedListener; private boolean hasChanged; private EamOrganization newOrg; + private final EamOrganization organizationToEdit; /** * Creates new form AddNewOrganizationDialog @@ -62,6 +62,25 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog { newOrg = null; initComponents(); customizeComponents(); + organizationToEdit = null; + display(); + } + + public AddNewOrganizationDialog(EamOrganization orgToEdit) { + super((JFrame) WindowManager.getDefault().getMainWindow(), + Bundle.AddNewOrganizationDialog_addNewOrg_msg(), + true); // NON-NLS + organizationToEdit = orgToEdit; + textBoxes = new ArrayList<>(); + textBoxChangedListener = new TextBoxChangedListener(); + hasChanged = false; + newOrg = null; + initComponents(); + customizeComponents(); + tfOrganizationName.setText(orgToEdit.getName()); + tfPocName.setText(orgToEdit.getPocName()); + tfPocEmail.setText(orgToEdit.getPocEmail()); + tfPocPhone.setText(orgToEdit.getPocPhone()); display(); } @@ -179,7 +198,7 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog { public boolean isChanged() { return hasChanged; } - + public EamOrganization getNewOrg() { return newOrg; } @@ -311,14 +330,25 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog { @Messages({"AddNewOrganizationDialog.bnOk.addFailed.text=Failed to add new organization."}) private void bnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOKActionPerformed - newOrg = new EamOrganization( - tfOrganizationName.getText(), - tfPocName.getText(), - tfPocEmail.getText(), - tfPocPhone.getText()); + try { EamDb dbManager = EamDb.getInstance(); - dbManager.newOrganization(newOrg); + if (organizationToEdit != null) { + //check if new name exists with ID other than the one in use here + newOrg = new EamOrganization(organizationToEdit.getOrgID(), + tfOrganizationName.getText(), + tfPocName.getText(), + tfPocEmail.getText(), + tfPocPhone.getText()); + dbManager.updateOrganization(newOrg); + } else { + newOrg = new EamOrganization( + tfOrganizationName.getText(), + tfPocName.getText(), + tfPocEmail.getText(), + tfPocPhone.getText()); + newOrg.setOrgID((int)dbManager.newOrganization(newOrg)); + } hasChanged = true; dispose(); } catch (EamDbException ex) { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties index 98e2ace7d6..82da099468 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties @@ -97,3 +97,15 @@ ExaminerDetailsPanel.lbExaminerNameLabel.text=Name: ExaminerDetailsPanel.lbNotesLabel.text=Notes: ExaminerDetailsPanel.lbExaminerPhoneLabel.text=Phone: ExaminerDetailsPanel.lbExaminerEmailLabel.text=Email: +ManageOrganizationsDialog.jLabel2.text=Point of Contact Name: +ManageOrganizationsDialog.jLabel1.text=Organizations +ManageOrganizationsDialog.jButton3.text=Close +ManageOrganizationsDialog.jLabel8.text=Organization Name: +ManageOrganizationsDialog.jButton2.text=Delete +ManageOrganizationsDialog.jButton1.text=New +ManageOrganizationsDialog.jLabel6.text=Point of Contact Email: +ManageOrganizationsDialog.jLabel4.text=Point of Contact Phone: +ManageOrganizationsDialog.jTextArea1.text=Organizations are used to provide additional contact information for the content they are associated with. +ManageOrganizationsDialog.jButton4.text=Edit +ManageOrganizationsDialog.jLabel3.text=Organization Details +ManageOrganizationsDialog.pocNameTextField.text= diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form index dc558aad23..7854e6d7f7 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form @@ -50,15 +50,15 @@ - - + + - + - + @@ -181,12 +181,12 @@ - + - + @@ -229,9 +229,6 @@ - - - diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java index 0fcf18a1fd..0bbf91326a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java @@ -6,6 +6,7 @@ package org.sleuthkit.autopsy.centralrepository.optionspanel; import java.awt.Cursor; +import java.awt.Dialog; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -162,14 +163,14 @@ public class CentralRepoCaseOptionsPanel extends javax.swing.JPanel { pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnOrganizationLayout.createSequentialGroup() .addGap(10, 10, 10) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbOrganizationNameLabel) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbPointOfContactPhoneLabel) - .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(comboBoxOrgName, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboBoxOrgName, 0, 269, Short.MAX_VALUE) .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(bnNewOrganization, javax.swing.GroupLayout.Alignment.TRAILING) @@ -204,8 +205,6 @@ public class CentralRepoCaseOptionsPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(lbExaminerNameLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerNameLabel.text")); // NOI18N - tfExaminerNameText.setEditable(false); - org.openide.awt.Mnemonics.setLocalizedText(lbExaminerEmailLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerEmailLabel.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbExaminerPhoneLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerPhoneLabel.text")); // NOI18N @@ -236,12 +235,12 @@ public class CentralRepoCaseOptionsPanel extends javax.swing.JPanel { .addComponent(lbExaminerNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(25, 25, 25) + .addGap(18, 18, 18) .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(tfExaminerEmailText) .addComponent(tfExaminerPhoneText) .addComponent(tfExaminerNameText) - .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 261, Short.MAX_VALUE)) + .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 268, Short.MAX_VALUE)) .addContainerGap()) ); pnExaminerLayout.setVerticalGroup( @@ -313,10 +312,10 @@ public class CentralRepoCaseOptionsPanel extends javax.swing.JPanel { }//GEN-LAST:event_comboBoxOrgNameActionPerformed private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnNewOrganizationActionPerformed - AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(); + ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); // update the combobox options and org data fields - if (dialogO.isChanged()) { - eamCase.setOrg(dialogO.getNewOrg()); + if (dialog.isChanged()) { + eamCase.setOrg(dialog.getNewOrg()); loadOrganizationData(); updateDb(); validate(); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form new file mode 100644 index 0000000000..6ca8920ecd --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form @@ -0,0 +1,347 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java new file mode 100644 index 0000000000..ab1c033e54 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java @@ -0,0 +1,421 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.sleuthkit.autopsy.centralrepository.optionspanel; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.util.List; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import org.openide.util.Exceptions; +import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; + +/** + * + * @author wschaefer + */ +public class ManageOrganizationsDialog extends JDialog { + + private EamDb dbManager; + private EamOrganization newOrg; + private final DefaultListModel rulesListModel = new DefaultListModel<>(); + + /** + * Creates new form ManageOrganizationsPanel + */ + public ManageOrganizationsDialog() { + super((JFrame) WindowManager.getDefault().getMainWindow(), + "Manage Organizations Dialog", + true); // NON-NLS + initComponents(); + try { + this.dbManager = EamDb.getInstance(); + jList1.setCellRenderer(new DefaultListCellRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Component getListCellRendererComponent(javax.swing.JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + setText(((EamOrganization) value).getName()); + return c; + } + }); + jList1.setModel(rulesListModel); + jList1.addListSelectionListener(new OrganizationListSelectionListener()); + populateList(); + newOrg = null; + } catch (EamDbException ex) { + Exceptions.printStackTrace(ex); + } + + display(); + } + + private void display() { + Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); + setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2); + setVisible(true); + } + + private void populateListAndSelect(EamOrganization selected) throws EamDbException { + rulesListModel.clear(); + if (selected != null) { + } + List orgs = dbManager.getOrganizations(); + if (orgs.size() > 0) { + for (EamOrganization org : orgs) { + rulesListModel.addElement(org); + if (selected != null && org.getOrgID() == selected.getOrgID()) { + selected = org; + } + } + if (orgs.contains(selected)) { + jList1.setSelectedValue(selected, true); + } else { + jList1.setSelectedIndex(0); + } + jList1.validate(); + jList1.repaint(); + } + } + + private void populateList() throws EamDbException { + EamOrganization selected = jList1.getSelectedValue(); + populateListAndSelect(selected); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + jScrollPane1 = new javax.swing.JScrollPane(); + jPanel1 = new javax.swing.JPanel(); + jScrollPane2 = new javax.swing.JScrollPane(); + jList1 = new javax.swing.JList<>(); + jScrollPane4 = new javax.swing.JScrollPane(); + jTextArea1 = new javax.swing.JTextArea(); + jButton1 = new javax.swing.JButton(); + jButton2 = new javax.swing.JButton(); + jButton3 = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + jSeparator1 = new javax.swing.JSeparator(); + jLabel2 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + jLabel6 = new javax.swing.JLabel(); + jLabel8 = new javax.swing.JLabel(); + orgNameTextField = new javax.swing.JTextField(); + pocNameTextField = new javax.swing.JTextField(); + pocPhoneTextField = new javax.swing.JTextField(); + pocEmailTextField = new javax.swing.JTextField(); + jButton4 = new javax.swing.JButton(); + jLabel3 = new javax.swing.JLabel(); + + setMinimumSize(new java.awt.Dimension(545, 450)); + setPreferredSize(new java.awt.Dimension(545, 450)); + + jScrollPane1.setMinimumSize(null); + jScrollPane1.setPreferredSize(new java.awt.Dimension(535, 415)); + + jPanel1.setMinimumSize(null); + jPanel1.setPreferredSize(new java.awt.Dimension(527, 407)); + + jList1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + jScrollPane2.setViewportView(jList1); + + jTextArea1.setEditable(false); + jTextArea1.setBackground(new java.awt.Color(240, 240, 240)); + jTextArea1.setColumns(20); + jTextArea1.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N + jTextArea1.setLineWrap(true); + jTextArea1.setRows(3); + jTextArea1.setText(org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jTextArea1.text")); // NOI18N + jTextArea1.setWrapStyleWord(true); + jScrollPane4.setViewportView(jTextArea1); + + org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jButton1.text")); // NOI18N + jButton1.setMargin(new java.awt.Insets(2, 6, 2, 6)); + jButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton1ActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jButton2, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jButton2.text")); // NOI18N + jButton2.setMargin(new java.awt.Insets(2, 6, 2, 6)); + jButton2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton2ActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jButton3, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jButton3.text")); // NOI18N + jButton3.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton3ActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel1.text")); // NOI18N + + jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel2.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel4.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel6.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(jLabel8, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel8.text")); // NOI18N + + orgNameTextField.setEditable(false); + orgNameTextField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + orgNameTextFieldActionPerformed(evt); + } + }); + + pocNameTextField.setEditable(false); + pocNameTextField.setText(org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.pocNameTextField.text")); // NOI18N + + pocPhoneTextField.setEditable(false); + + pocEmailTextField.setEditable(false); + pocEmailTextField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + pocEmailTextFieldActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jButton4, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jButton4.text")); // NOI18N + jButton4.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton4ActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel3.text")); // NOI18N + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jButton4) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jButton2)) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, 217, Short.MAX_VALUE) + .addComponent(jButton3)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(29, 29, 29) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(pocNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE) + .addComponent(pocPhoneTextField) + .addComponent(pocEmailTextField, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(orgNameTextField)))) + .addContainerGap()) + .addGroup(jPanel1Layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + ); + + jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jButton1, jButton2, jButton4}); + + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel8) + .addComponent(orgNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(pocNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(pocPhoneTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel4)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(pocEmailTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 235, Short.MAX_VALUE) + .addComponent(jButton3)) + .addComponent(jSeparator1) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 288, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jButton1) + .addComponent(jButton2) + .addComponent(jButton4)))) + .addContainerGap()) + ); + + jScrollPane1.setViewportView(jPanel1); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + }// //GEN-END:initComponents + + private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_jButton2ActionPerformed + + private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed + dispose(); + }//GEN-LAST:event_jButton3ActionPerformed + + private void pocEmailTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pocEmailTextFieldActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_pocEmailTextFieldActionPerformed + + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(); + if (dialogO.isChanged()) { + try { + newOrg = dialogO.getNewOrg(); + populateListAndSelect(newOrg); + } catch (EamDbException ex) { + + } + } + }//GEN-LAST:event_jButton1ActionPerformed + + private void orgNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_orgNameTextFieldActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_orgNameTextFieldActionPerformed + + private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed + EamOrganization orgToEdit = jList1.getSelectedValue(); + AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(orgToEdit); + if (dialogO.isChanged()) { + try { + newOrg = dialogO.getNewOrg(); + populateListAndSelect(newOrg); + } catch (EamDbException ex) { + + } + } + }//GEN-LAST:event_jButton4ActionPerformed + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton jButton1; + private javax.swing.JButton jButton2; + private javax.swing.JButton jButton3; + private javax.swing.JButton jButton4; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel6; + private javax.swing.JLabel jLabel8; + private javax.swing.JList jList1; + private javax.swing.JPanel jPanel1; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JScrollPane jScrollPane4; + private javax.swing.JSeparator jSeparator1; + private javax.swing.JTextArea jTextArea1; + private javax.swing.JTextField orgNameTextField; + private javax.swing.JTextField pocEmailTextField; + private javax.swing.JTextField pocNameTextField; + private javax.swing.JTextField pocPhoneTextField; + // End of variables declaration//GEN-END:variables + public boolean isChanged() { + return newOrg != null; + } + + public EamOrganization getNewOrg() { + return newOrg; + } + + /** + * A list events listener for the interesting files sets list component. + */ + private final class OrganizationListSelectionListener implements ListSelectionListener { + + @Override + public void valueChanged(ListSelectionEvent e) { + if (e.getValueIsAdjusting()) { + return; + } + EamOrganization selected; + if (newOrg != null) { + selected = newOrg; + } else { + selected = jList1.getSelectedValue(); + } + if (selected != null) { + orgNameTextField.setText(selected.getName()); + pocNameTextField.setText(selected.getPocName()); + pocPhoneTextField.setText(selected.getPocPhone()); + pocEmailTextField.setText(selected.getPocEmail()); + } else { + orgNameTextField.setText(""); + pocNameTextField.setText(""); + pocPhoneTextField.setText(""); + pocEmailTextField.setText(""); + } + } + + } +} From 670d6d668f176dba90c825bccd488c0fda4c8eda Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 10 Oct 2017 12:09:57 -0400 Subject: [PATCH 04/46] 2774 added organization choosing to new case wizards --- .../casemodule/NewCaseVisualPanel2.java | 66 ++++++++++++------- .../casemodule/NewCaseWizardPanel2.java | 7 +- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index 5d39c6921a..c2c79f7e7a 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -48,20 +48,6 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { */ public NewCaseVisualPanel2() { initComponents(); - try { - this.dbManager = EamDb.getInstance(); - } catch (EamDbException ex) { - dbManager = null; - } - if (dbManager == null) { - comboBoxOrgName.setEnabled(false); - bnNewOrganization.setEnabled(false); - lbPointOfContactNameText.setEnabled(false); - lbPointOfContactEmailText.setEnabled(false); - lbPointOfContactPhoneText.setEnabled(false); - } else { - loadOrganizationData(); - } } /** @@ -75,6 +61,26 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { return NbBundle.getMessage(this.getClass(), "NewCaseVisualPanel2.getName.text"); } + void setUpOrganization() { + try { + this.dbManager = EamDb.getInstance(); + } catch (EamDbException ex) { + dbManager = null; + } + boolean cREnabled = (dbManager != null); + comboBoxOrgName.setEnabled(cREnabled); + bnNewOrganization.setEnabled(cREnabled); + lbPointOfContactNameText.setEnabled(cREnabled); + lbPointOfContactEmailText.setEnabled(cREnabled); + lbPointOfContactPhoneText.setEnabled(cREnabled); + if (cREnabled) { + loadOrganizationData(); + } else { + selectedOrg = null; + clearOrganization(); + } + } + /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -213,10 +219,7 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { } if ("".equals(orgName)) { - selectedOrg = null; - lbPointOfContactNameText.setText(""); - lbPointOfContactEmailText.setText(""); - lbPointOfContactPhoneText.setText(""); + clearOrganization(); return; } @@ -251,19 +254,16 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { comboBoxOrgName.addItem(org.getName()); }); } catch (EamDbException ex) { - + selectedOrg = null; } - - if (!orgs.isEmpty() && null != selectedOrg) { + + if (null != selectedOrg) { comboBoxOrgName.setSelectedItem(selectedOrg.getName()); lbPointOfContactNameText.setText(selectedOrg.getPocName()); lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); } else { - comboBoxOrgName.setSelectedItem(""); - lbPointOfContactNameText.setText(""); - lbPointOfContactEmailText.setText(""); - lbPointOfContactPhoneText.setText(""); + clearOrganization(); } } // Variables declaration - do not modify//GEN-BEGIN:variables @@ -283,6 +283,13 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { private javax.swing.JLabel optionalLabel; // End of variables declaration//GEN-END:variables + private void clearOrganization() { + comboBoxOrgName.setSelectedItem(""); + lbPointOfContactNameText.setText(""); + lbPointOfContactEmailText.setText(""); + lbPointOfContactPhoneText.setText(""); + } + String getCaseNumber() { return caseNumberTextField.getText(); } @@ -290,5 +297,14 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { String getExaminer() { return examinerTextField.getText(); } + + String getOrganization() { + if (selectedOrg != null) { + return selectedOrg.getName(); + } + else { + return ""; + } + } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index d8888a8865..6490c9e20e 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -47,6 +47,7 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel Date: Tue, 10 Oct 2017 12:51:16 -0400 Subject: [PATCH 05/46] 2774 changed text for new case wizard panels --- .../org/sleuthkit/autopsy/casemodule/Bundle.properties | 8 ++++---- .../sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 676195c402..a5ed64dc8b 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -30,7 +30,7 @@ NewCaseVisualPanel2.caseNumberTextField.text= NewCaseVisualPanel2.examinerLabel.text=Examiner: NewCaseVisualPanel2.caseNumberLabel.text=Case Number: NewCaseVisualPanel2.examinerTextField.text= -NewCaseVisualPanel2.optionalLabel.text=Optional: Set Case Number and Examiner +NewCaseVisualPanel2.optionalLabel.text=Enter Optional Information: AddImageErrorsDialog.title=Add Image Log AddImageErrorsDialog.copyButton.toolTipText=Copy errors to clipboard AddImageErrorsDialog.copyButton.text=Copy @@ -158,13 +158,13 @@ MissingImageDialog.display.title=Search for Missing Image MissingImageDialog.confDlg.noFileSel.msg=No image file has been selected, are you sure you\nwould like to exit without finding the image. MissingImageDialog.confDlg.noFileSel.title=Missing Image MissingImageDialog.ErrorSettingImage=Error setting image path. Please try again. -NewCaseVisualPanel1.getName.text=Case Info +NewCaseVisualPanel1.getName.text=Case Information NewCaseVisualPanel1.caseDirBrowse.selectButton.text=Select NewCaseVisualPanel1.badCredentials.text=Bad multi-user settings (see Tools, Options, Multi-user) or services are down. -NewCaseVisualPanel2.getName.text=Additional Information +NewCaseVisualPanel2.getName.text=Optional Information NewCaseWizardAction.newCase.windowTitle.text=New Case Information NewCaseWizardAction.getName.text=New Case Wizard -NewCaseWizardAction.databaseProblem1.text=Cannot open database. Cancelling case creation. +NewCaseWizardAction.databaseProblem1.text=Cannot open database. Canceling case creation. NewCaseWizardAction.databaseProblem2.text=Error NewCaseWizardPanel1.validate.errMsg.invalidSymbols=The Case Name cannot contain any of the following symbols\: \\ / \: * ? " < > | NewCaseWizardPanel1.validate.errMsg.dirExists=Case directory ''{0}'' already exists. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index c2c79f7e7a..937d9cc526 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -73,6 +73,10 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { lbPointOfContactNameText.setEnabled(cREnabled); lbPointOfContactEmailText.setEnabled(cREnabled); lbPointOfContactPhoneText.setEnabled(cREnabled); + lbOrganizationNameLabel.setEnabled(cREnabled); + lbPointOfContactNameLabel.setEnabled(cREnabled); + lbPointOfContactEmailLabel.setEnabled(cREnabled); + lbPointOfContactPhoneLabel.setEnabled(cREnabled); if (cREnabled) { loadOrganizationData(); } else { From 168f3a9ecee773b48d92e794c8f0f45fbefd9047 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 12 Oct 2017 12:45:24 -0400 Subject: [PATCH 06/46] 2774 major rework to case properties panel and optional case creation props --- .../autopsy/casemodule/Bundle.properties | 55 +- .../autopsy/casemodule/Bundle_ja.properties | 7 +- .../sleuthkit/autopsy/casemodule/Case.java | 76 +- .../casemodule/CaseInformationPanel.form | 38 +- .../casemodule/CaseInformationPanel.java | 95 +- .../autopsy/casemodule/CaseMetadata.java | 35 +- .../casemodule/CasePropertiesPanel.form | 813 +++++++++++++----- .../casemodule/CasePropertiesPanel.java | 609 ++++++++----- .../EditOptionalCasePropertiesPanel.form | 73 ++ .../EditOptionalCasePropertiesPanel.java | 128 +++ .../autopsy/casemodule/Examiner.java | 72 ++ .../casemodule/NewCaseVisualPanel2.form | 179 +--- .../casemodule/NewCaseVisualPanel2.java | 244 +----- .../casemodule/NewCaseWizardAction.java | 32 +- .../casemodule/NewCaseWizardPanel2.java | 2 +- .../OptionalCasePropertiesPanel.form | 489 +++++++++++ .../OptionalCasePropertiesPanel.java | 538 ++++++++++++ .../actions/Bundle.properties | 2 +- .../datamodel/AbstractSqlEamDb.java | 6 +- .../eventlisteners/CaseEventListener.java | 148 ++-- .../ingestmodule/IngestModule.java | 6 +- .../optionspanel/Bundle.properties | 21 +- .../CentralRepoCaseOptionsPanel.form | 284 ------ .../CentralRepoCaseOptionsPanel.java | 453 ---------- .../optionspanel/GlobalSettingsPanel.form | 104 ++- .../optionspanel/GlobalSettingsPanel.java | 80 +- 26 files changed, 2823 insertions(+), 1766 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form create mode 100644 Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java create mode 100644 Core/src/org/sleuthkit/autopsy/casemodule/Examiner.java create mode 100644 Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form create mode 100644 Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java delete mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form delete mode 100644 Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index a5ed64dc8b..ddfd37cce6 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -26,10 +26,6 @@ CueBannerPanel.openCaseButton.text= CueBannerPanel.openRecentButton.text= OpenRecentCasePanel.cancelButton.text=Cancel OpenRecentCasePanel.jLabel1.text=Recent Cases -NewCaseVisualPanel2.caseNumberTextField.text= -NewCaseVisualPanel2.examinerLabel.text=Examiner: -NewCaseVisualPanel2.caseNumberLabel.text=Case Number: -NewCaseVisualPanel2.examinerTextField.text= NewCaseVisualPanel2.optionalLabel.text=Enter Optional Information: AddImageErrorsDialog.title=Add Image Log AddImageErrorsDialog.copyButton.toolTipText=Copy errors to clipboard @@ -215,21 +211,52 @@ LocalDiskPanel.imageWriterErrorLabel.text=Error Label LocalDiskPanel.jLabel1.text=Note that at least one ingest module must be run to create a complete copy LocalDiskPanel.pathTextField.text= LocalDiskPanel.browseButton.text=Browse -CasePropertiesPanel.caseNameTextField.text= CasePropertiesPanel.caseDirLabel.text=Case Directory: CasePropertiesPanel.crDateLabel.text=Created Date: CasePropertiesPanel.caseNameLabel.text=Case Name: CasePropertiesPanel.lbDbName.text=Database Name: CasePropertiesPanel.lbDbType.text=Case Type: -CasePropertiesPanel.examinerLabel.text=Examiner: CasePropertiesPanel.caseNumberLabel.text=Case Number: LocalDiskPanel.changeDatabasePathCheckbox.text=Update case to use VHD file upon completion CasePropertiesPanel.lbCaseUUIDLabel.text=Case UUID: -CaseInformationPanel.centralRepoDetailsLabel.text=The Central Repository Details tab is only available when using a central repository. -CasePropertiesPanel.caseNumberTextField.text=jTextField1 -CasePropertiesPanel.examinerTextField.text=jTextField2 -NewCaseVisualPanel2.bnNewOrganization.text=New Organization -NewCaseVisualPanel2.lbOrganizationNameLabel.text=Organization: -NewCaseVisualPanel2.lbPointOfContactEmailLabel.text=Email: -NewCaseVisualPanel2.lbPointOfContactNameLabel.text=Point of Contact: -NewCaseVisualPanel2.lbPointOfContactPhoneLabel.text=Phone: +CentralRepoCaseOptionsPanel.pnOrganization.border.title=Organization +CentralRepoCaseOptionsPanel.pnExaminer.border.title=Examiner Details +CentralRepoCaseOptionsPanel.bnNewOrganization.text=Manage Organizations +CentralRepoCaseOptionsPanel.lbNotesLabel.text=Notes: +CentralRepoCaseOptionsPanel.lbPointOfContactPhoneLabel.text=Phone: +CentralRepoCaseOptionsPanel.lbExaminerPhoneLabel.text=Phone: +CentralRepoCaseOptionsPanel.lbPointOfContactEmailLabel.text=Email: +CentralRepoCaseOptionsPanel.lbPointOfContactNameLabel.text=Point of Contact: +CentralRepoCaseOptionsPanel.lbExaminerEmailLabel.text=Email: +CentralRepoCaseOptionsPanel.lbOrganizationNameLabel.text=Organization Name: +CentralRepoCaseOptionsPanel.lbExaminerNameLabel.text=Name: +CasePropertiesPanel.casePanel.border.title=Case +CasePropertiesPanel.examinerLabel.text=Name: +CasePropertiesPanel.lbExaminerPhoneLabel.text=Phone: +CasePropertiesPanel.lbExaminerEmailLabel.text=Email: +CasePropertiesPanel.lbNotesLabel.text=Notes: +CasePropertiesPanel.examinerPanel.border.title=Examiner +CasePropertiesPanel.lbOrganizationNameLabel1.text=Name: +CasePropertiesPanel.pnOrganization1.border.title=Organization +CasePropertiesPanel.lbPointOfContactPhoneLabel1.text=Phone: +CasePropertiesPanel.lbPointOfContactEmailLabel1.text=Email: +CasePropertiesPanel.lbPointOfContactNameLabel1.text=Point of Contact: +CaseInformationPanel.jButton1.text=Edit +OptionalCasePropertiesPanel.lbPointOfContactEmailLabel.text=Email: +OptionalCasePropertiesPanel.lbOrganizationNameLabel.text=Name: +OptionalCasePropertiesPanel.bnNewOrganization.text=Manage Organizations +OptionalCasePropertiesPanel.lbPointOfContactNameLabel.text=Point of Contact: +OptionalCasePropertiesPanel.lbPointOfContactPhoneLabel.text=Phone: +OptionalCasePropertiesPanel.orgainizationPanel.border.title=Organization +OptionalCasePropertiesPanel.lbNotesLabel.text=Notes: +OptionalCasePropertiesPanel.examinerLabel.text=Name: +OptionalCasePropertiesPanel.lbExaminerEmailLabel.text=Email: +OptionalCasePropertiesPanel.examinerTextField.text= +OptionalCasePropertiesPanel.lbExaminerPhoneLabel.text=Phone: +OptionalCasePropertiesPanel.examinerPanel.border.title=Examiner +OptionalCasePropertiesPanel.caseNumberTextField.text= +OptionalCasePropertiesPanel.caseNumberLabel.text=Number: +OptionalCasePropertiesPanel.casePanel.border.title=Case +EditOptionalCasePropertiesPanel.saveButton.text=Save +EditOptionalCasePropertiesPanel.cancelButton.text=Cancel +OptionalCasePropertiesPanel.caseDisplayNameLabel.text=Name: diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties index f7b805a032..6a7deb4da7 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties @@ -18,8 +18,6 @@ CueBannerPanel.closeButton.text=\u9589\u3058\u308b CueBannerPanel.openRecentLabel.text=\u6700\u8fd1\u958b\u3044\u305f\u30b1\u30fc\u30b9\u3092\u958b\u304f OpenRecentCasePanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb OpenRecentCasePanel.jLabel1.text=\u6700\u8fd1\u958b\u3044\u305f\u30d5\u30a1\u30a4\u30eb -NewCaseVisualPanel2.examinerLabel.text=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a -NewCaseVisualPanel2.caseNumberLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a NewCaseVisualPanel2.optionalLabel.text=\u30aa\u30d7\u30b7\u30e7\u30ca\u30eb\uff1a\u30b1\u30fc\u30b9\u756a\u53f7\u304a\u3088\u3073\u8abf\u67fb\u62c5\u5f53\u8005\u3092\u8a2d\u5b9a AddImageErrorsDialog.title=\u30a4\u30e1\u30fc\u30b8\u30ed\u30b0\u3092\u8ffd\u52a0 AddImageErrorsDialog.copyButton.toolTipText=\u30a8\u30e9\u30fc\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059 @@ -193,5 +191,8 @@ CasePropertiesPanel.crDateLabel.text=\u4f5c\u6210\u65e5\uff1a CasePropertiesPanel.caseNameLabel.text=\u30b1\u30fc\u30b9\u540d\uff1a CasePropertiesPanel.lbDbName.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u540d\uff1a CasePropertiesPanel.lbDbType.text=\u30b1\u30fc\u30b9\u30bf\u30a4\u30d7\uff1a -CasePropertiesPanel.examinerLabel.text=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a CasePropertiesPanel.caseNumberLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a +CasePropertiesPanel.examinerLabel.text=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a +OptionalCasePropertiesPanel.caseNumberLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a +OptionalCasePropertiesPanel.examinerLabel.text=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a +OptionalCasePropertiesPanel.caseDisplayNameLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index e8ca021a00..a9f7187f0c 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -478,11 +478,35 @@ public class Case { * case. * @throws CaseActionCancelledException If creating the case is cancelled. */ + public static void createAsCurrentCase(String caseDir, String caseDisplayName, String caseNumber, String examiner, CaseType caseType) throws CaseActionException, CaseActionCancelledException { + createAsCurrentCase(caseDir, caseDisplayName, caseNumber, new Examiner(examiner, "", "", ""), caseType); + } + + /** + * Creates a new case and makes it the current case. + * + * IMPORTANT: This method should not be called in the event dispatch thread + * (EDT). + * + * @param caseDir The full path of the case directory. The directory + * will be created if it doesn't already exist; if it + * exists, it is ASSUMED it was created by calling + * createCaseDirectory. + * @param caseDisplayName The display name of case, which may be changed + * later by the user. + * @param caseNumber The case number, can be the empty string. + * @param examiner The examiner to associate with the case. + * @param caseType The type of case (single-user or multi-user). + * + * @throws CaseActionException If there is a problem creating the + * case. + * @throws CaseActionCancelledException If creating the case is cancelled. + */ @Messages({ "Case.exceptionMessage.emptyCaseName=Must specify a case name.", "Case.exceptionMessage.emptyCaseDir=Must specify a case directory path." }) - public static void createAsCurrentCase(String caseDir, String caseDisplayName, String caseNumber, String examiner, CaseType caseType) throws CaseActionException, CaseActionCancelledException { + public static void createAsCurrentCase(String caseDir, String caseDisplayName, String caseNumber, Examiner examiner, CaseType caseType) throws CaseActionException, CaseActionCancelledException { if (caseDisplayName.isEmpty()) { throw new CaseActionException(Bundle.Case_exceptionMessage_emptyCaseName()); } @@ -1164,7 +1188,34 @@ public class Case { * @return The examiner name. */ public String getExaminer() { - return metadata.getExaminer(); + return metadata.getExaminer().getName(); + } + + /** + * Gets the examiner phone number. + * + * @return The examiner phone number. + */ + public String getExaminerPhone() { + return metadata.getExaminer().getPhone(); + } + + /** + * Gets the examiner email address. + * + * @return The examiner email address. + */ + public String getExaminerEmail() { + return metadata.getExaminer().getEmail(); + } + + /** + * Gets the examiner notes. + * + * @return The examiner notes. + */ + public String getExaminerNotes() { + return metadata.getExaminer().getNotes(); } /** @@ -1484,7 +1535,11 @@ public class Case { } /** - * Updates the case display name name. + * Updates the case display name. + * + * @param newDisplayName the new display name for the case + * + * @throws org.sleuthkit.autopsy.casemodule.CaseActionException */ @Messages({ "Case.exceptionMessage.metadataUpdateError=Failed to update case metadata, cannot change case display name." @@ -1516,17 +1571,22 @@ public class Case { } catch (CaseMetadataException ex) { throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError()); } - eventPublisher.publish(new AutopsyEvent(Events.NUMBER.toString(), oldCaseNumber, newCaseNumber)); } - void updateExaminer(String newExaminer) throws CaseActionException { - String oldExaminer = metadata.getExaminer(); + /** + * Update the examiner details associated with the case. + * + * @param newExaminer the new examiner for the case + * + * @throws CaseActionException + */ + void updateExaminer(Examiner newExaminer) throws CaseActionException { + Examiner oldExaminer = metadata.getExaminer(); try { metadata.setExaminer(newExaminer); } catch (CaseMetadataException ex) { throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError()); } - eventPublisher.publish(new AutopsyEvent(Events.EXAMINER.toString(), oldExaminer, newExaminer)); } /** @@ -1543,7 +1603,7 @@ public class Case { * @param examiner The examiner to associate with the case, can be * the empty string. */ - private Case(CaseType caseType, String caseDir, String caseDisplayName, String caseNumber, String examiner) { + private Case(CaseType caseType, String caseDir, String caseDisplayName, String caseNumber, Examiner examiner) { metadata = new CaseMetadata(caseDir, caseType, displayNameToUniqueName(caseDisplayName), caseDisplayName, caseNumber, examiner); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form index bea5e54d2f..58550c6604 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form @@ -35,22 +35,14 @@ - - - - + - + + + - - - - - - - @@ -58,15 +50,11 @@ - - - - - - - - + + + + @@ -87,16 +75,16 @@
- - -
- + - + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java index 4a1ed7325a..4a26158d7b 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java @@ -18,13 +18,15 @@ */ package org.sleuthkit.autopsy.casemodule; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import javax.swing.JDialog; import javax.swing.event.ChangeEvent; -import org.openide.util.Exceptions; +import javax.swing.event.ChangeListener; import org.openide.util.NbBundle.Messages; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; -import org.sleuthkit.autopsy.centralrepository.optionspanel.CentralRepoCaseOptionsPanel; +import org.openide.windows.WindowManager; /** * Panel for displaying the case information, including both case details and @@ -34,7 +36,6 @@ class CaseInformationPanel extends javax.swing.JPanel { private static final long serialVersionUID = 1L; CasePropertiesPanel propertiesPanel; - CentralRepoCaseOptionsPanel centralRepoPanel; /** * Constructs a panel for displaying the case information, including both @@ -54,22 +55,11 @@ class CaseInformationPanel extends javax.swing.JPanel { propertiesPanel.setSize(propertiesPanel.getPreferredSize()); this.tabbedPane.addTab(Bundle.CaseInformationPanel_caseDetails_header(), propertiesPanel); this.tabbedPane.addTab(Bundle.CaseInformationPanel_ingestJobInfo_header(), new IngestJobInfoPanel()); - centralRepoPanel = new CentralRepoCaseOptionsPanel(); - this.tabbedPane.addTab("Central Repository Details", centralRepoPanel); - tabbedPane.setEnabledAt(tabbedPane.indexOfComponent(centralRepoPanel), false); - centralRepoDetailsLabel.setVisible(true); - try { - if (EamDb.getInstance() != null) { - tabbedPane.setEnabledAt(tabbedPane.indexOfComponent(centralRepoPanel), true); - centralRepoDetailsLabel.setVisible(false); + this.tabbedPane.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + tabbedPane.getSelectedComponent().setSize(tabbedPane.getSelectedComponent().getPreferredSize()); } - } catch (EamDbException ex) { - Exceptions.printStackTrace(ex); - } -// this.tabbedPane.addTab("Organization", new CaseOrganizationPanel()); -// this.tabbedPane.addTab("Examiner Details", new ExaminerDetailsPanel()); - this.tabbedPane.addChangeListener((ChangeEvent e) -> { - tabbedPane.getSelectedComponent().setSize(tabbedPane.getSelectedComponent().getPreferredSize()); }); } @@ -94,48 +84,43 @@ class CaseInformationPanel extends javax.swing.JPanel { outerDetailsPanel = new javax.swing.JPanel(); tabbedPane = new javax.swing.JTabbedPane(); closeButton = new javax.swing.JButton(); - centralRepoDetailsLabel = new javax.swing.JLabel(); + jButton1 = new javax.swing.JButton(); tabbedPane.setPreferredSize(new java.awt.Dimension(420, 200)); org.openide.awt.Mnemonics.setLocalizedText(closeButton, org.openide.util.NbBundle.getMessage(CaseInformationPanel.class, "CaseInformationPanel.closeButton.text")); // NOI18N - closeButton.addActionListener(new java.awt.event.ActionListener() { + + org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(CaseInformationPanel.class, "CaseInformationPanel.jButton1.text")); // NOI18N + jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - closeButtonActionPerformed(evt); + jButton1ActionPerformed(evt); } }); - org.openide.awt.Mnemonics.setLocalizedText(centralRepoDetailsLabel, org.openide.util.NbBundle.getMessage(CaseInformationPanel.class, "CaseInformationPanel.centralRepoDetailsLabel.text")); // NOI18N - javax.swing.GroupLayout outerDetailsPanelLayout = new javax.swing.GroupLayout(outerDetailsPanel); outerDetailsPanel.setLayout(outerDetailsPanelLayout); outerDetailsPanelLayout.setHorizontalGroup( outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(outerDetailsPanelLayout.createSequentialGroup() - .addComponent(tabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 709, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)) + .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 709, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, outerDetailsPanelLayout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(closeButton) .addGap(5, 5, 5)) - .addGroup(outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(outerDetailsPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(centralRepoDetailsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 633, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(66, Short.MAX_VALUE))) ); + + outerDetailsPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {closeButton, jButton1}); + outerDetailsPanelLayout.setVerticalGroup( outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(outerDetailsPanelLayout.createSequentialGroup() .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE) .addGap(0, 0, 0) - .addComponent(closeButton) + .addGroup(outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(closeButton) + .addComponent(jButton1)) .addGap(5, 5, 5)) - .addGroup(outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, outerDetailsPanelLayout.createSequentialGroup() - .addContainerGap(237, Short.MAX_VALUE) - .addComponent(centralRepoDetailsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap())) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); @@ -153,21 +138,31 @@ class CaseInformationPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents - private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed - try { - if (EamDb.getInstance() != null) { - centralRepoPanel.saveChanges(); - } - } catch (EamDbException ex) { - Exceptions.printStackTrace(ex); - } - propertiesPanel.saveChanges(); - }//GEN-LAST:event_closeButtonActionPerformed + private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + JDialog editCasePropertiesDialog = new JDialog(WindowManager.getDefault().getMainWindow(), "Edit Case Details", true); + EditOptionalCasePropertiesPanel casePropertiesPanel = new EditOptionalCasePropertiesPanel(); + casePropertiesPanel.addCancelButtonAction((ActionEvent e) -> { + editCasePropertiesDialog.setVisible(false); + }); + casePropertiesPanel.addSaveButtonAction((ActionEvent e) -> { + editCasePropertiesDialog.setVisible(false); + }); + editCasePropertiesDialog.add(casePropertiesPanel); + editCasePropertiesDialog.setResizable(true); + editCasePropertiesDialog.pack(); + + Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); + double w = editCasePropertiesDialog.getSize().getWidth(); + double h = editCasePropertiesDialog.getSize().getHeight(); + editCasePropertiesDialog.setLocation((int) ((screenDimension.getWidth() - w) / 2), (int) ((screenDimension.getHeight() - h) / 2)); + editCasePropertiesDialog.setVisible(true); + editCasePropertiesDialog.toFront(); + }//GEN-LAST:event_jButton1ActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel centralRepoDetailsLabel; private javax.swing.JButton closeButton; + private javax.swing.JButton jButton1; private javax.swing.JPanel outerDetailsPanel; private javax.swing.JTabbedPane tabbedPane; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java index b130929b93..a7c21c4830 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java @@ -66,6 +66,9 @@ public final class CaseMetadata { private final static String CASE_NAME_ELEMENT_NAME = "Name"; //NON-NLS private final static String CASE_NUMBER_ELEMENT_NAME = "Number"; //NON-NLS private final static String EXAMINER_ELEMENT_NAME = "Examiner"; //NON-NLS + private final static String EXAMINER_ELEMENT_PHONE = "ExaminerPhone"; //NON-NLS + private final static String EXAMINER_ELEMENT_EMAIL = "ExaminerEmail"; //NON-NLS + private final static String EXAMINER_ELEMENT_NOTES = "ExaminerNotes"; //NON-NLS private final static String CASE_TYPE_ELEMENT_NAME = "CaseType"; //NON-NLS private final static String CASE_DATABASE_NAME_ELEMENT_NAME = "DatabaseName"; //NON-NLS private final static String TEXT_INDEX_NAME_ELEMENT = "TextIndexName"; //NON-NLS @@ -98,7 +101,7 @@ public final class CaseMetadata { private String caseName; private String caseDisplayName; private String caseNumber; - private String examiner; + private Examiner examiner; private String caseDatabaseName; private String caseDatabasePath; // Legacy private String textIndexName; // Legacy @@ -127,7 +130,7 @@ public final class CaseMetadata { * @param caseNumber The case number. * @param examiner The name of the case examiner. */ - CaseMetadata(String caseDirectory, Case.CaseType caseType, String caseName, String caseDisplayName, String caseNumber, String examiner) { + CaseMetadata(String caseDirectory, Case.CaseType caseType, String caseName, String caseDisplayName, String caseNumber, Examiner examiner) { metadataFilePath = Paths.get(caseDirectory, caseDisplayName + FILE_EXTENSION); this.caseType = caseType; this.caseName = caseName; @@ -243,12 +246,12 @@ public final class CaseMetadata { * * @return The examiner, may be empty. */ - public String getExaminer() { + public Examiner getExaminer() { return examiner; } - - void setExaminer(String newExaminer) throws CaseMetadataException { - String oldExaminer = this.examiner; + + void setExaminer(Examiner newExaminer) throws CaseMetadataException { + Examiner oldExaminer = this.examiner; this.examiner = newExaminer; try { writeToFile(); @@ -413,7 +416,10 @@ public final class CaseMetadata { createChildElement(doc, caseElement, CASE_NAME_ELEMENT_NAME, caseName); createChildElement(doc, caseElement, CASE_DISPLAY_NAME_ELEMENT_NAME, caseDisplayName); createChildElement(doc, caseElement, CASE_NUMBER_ELEMENT_NAME, caseNumber); - createChildElement(doc, caseElement, EXAMINER_ELEMENT_NAME, examiner); + createChildElement(doc, caseElement, EXAMINER_ELEMENT_NAME, examiner.getName()); + createChildElement(doc, caseElement, EXAMINER_ELEMENT_PHONE, examiner.getPhone()); + createChildElement(doc, caseElement, EXAMINER_ELEMENT_EMAIL, examiner.getEmail()); + createChildElement(doc, caseElement, EXAMINER_ELEMENT_NOTES, examiner.getNotes()); createChildElement(doc, caseElement, CASE_TYPE_ELEMENT_NAME, caseType.toString()); createChildElement(doc, caseElement, CASE_DB_ABSOLUTE_PATH_ELEMENT_NAME, caseDatabasePath); createChildElement(doc, caseElement, CASE_DB_NAME_RELATIVE_ELEMENT_NAME, caseDatabaseName); @@ -480,7 +486,20 @@ public final class CaseMetadata { this.caseDisplayName = getElementTextContent(caseElement, CASE_DISPLAY_NAME_ELEMENT_NAME, true); } this.caseNumber = getElementTextContent(caseElement, CASE_NUMBER_ELEMENT_NAME, false); - this.examiner = getElementTextContent(caseElement, EXAMINER_ELEMENT_NAME, false); + String examinerName = getElementTextContent(caseElement, EXAMINER_ELEMENT_NAME, false); + String examinerPhone; + String examinerEmail; + String examinerNotes; + try { + examinerPhone = getElementTextContent(caseElement, EXAMINER_ELEMENT_PHONE, false); + examinerEmail = getElementTextContent(caseElement, EXAMINER_ELEMENT_EMAIL, false); + examinerNotes = getElementTextContent(caseElement, EXAMINER_ELEMENT_NOTES, false); + } catch (CaseMetadataException ex) { + examinerPhone = ""; //case had metadata file written before additional examiner details were included + examinerEmail = ""; + examinerNotes = ""; + } + this.examiner = new Examiner(examinerName, examinerPhone, examinerEmail, examinerNotes); this.caseType = Case.CaseType.fromString(getElementTextContent(caseElement, CASE_TYPE_ELEMENT_NAME, true)); if (null == this.caseType) { throw new CaseMetadataException("Case metadata file corrupted"); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form index 514b832672..50f83be13c 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form @@ -33,25 +33,25 @@ - - - - + + + + - - - + + + - + @@ -59,39 +59,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -100,193 +70,610 @@ - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index 2319bbb9fd..3c0c82564f 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -19,10 +19,7 @@ package org.sleuthkit.autopsy.casemodule; import java.nio.file.Paths; -import java.util.logging.Level; -import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; /** * A panel that allows the user to view various properties of a case and change @@ -32,7 +29,7 @@ class CasePropertiesPanel extends javax.swing.JPanel { private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(CasePropertiesPanel.class.getName()); - private final Case theCase; + private Case theCase; /** * Constructs a panel that allows the user to view various properties of the @@ -40,22 +37,19 @@ class CasePropertiesPanel extends javax.swing.JPanel { * * @param aCase A case. */ - CasePropertiesPanel(Case aCase) { + CasePropertiesPanel(Case caseInfo) { initComponents(); - theCase = aCase; - caseNameTextField.setText(theCase.getDisplayName()); - String caseNumber = theCase.getNumber(); - if (!caseNumber.isEmpty()) { - caseNumberTextField.setText(caseNumber); - } else { - caseNumberTextField.setText(""); - } - String examiner = theCase.getExaminer(); - if (!examiner.isEmpty()) { - examinerTextField.setText(examiner); - } else { - examinerTextField.setText(""); - } + updateCaseInfo(caseInfo); + } + + void updateCaseInfo(Case caseInfo) { + theCase = Case.getCurrentCase(); + lbCaseNameText.setText(theCase.getDisplayName()); + lbCaseNumberText.setText(theCase.getNumber()); + lbExaminerNameText.setText(theCase.getExaminer()); + lbExaminerPhoneText.setText(theCase.getExaminerPhone()); + lbExaminerEmailText.setText(theCase.getExaminerEmail()); + taNotesText.setText(theCase.getExaminerNotes()); crDateField.setText(theCase.getCreatedDate()); caseDirField.setText(theCase.getCaseDirectory()); if (Case.CaseType.SINGLE_USER_CASE == theCase.getCaseType()) { @@ -66,6 +60,9 @@ class CasePropertiesPanel extends javax.swing.JPanel { Case.CaseType caseType = theCase.getCaseType(); caseTypeField.setText(caseType.getLocalizedDisplayName()); lbCaseUIDText.setText(theCase.getName()); + validate(); + repaint(); + System.out.println("repainged CASE PROPS"); } /** @@ -88,258 +85,468 @@ class CasePropertiesPanel extends javax.swing.JPanel { jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); - jPanel1 = new javax.swing.JPanel(); + detailsPanel = new javax.swing.JPanel(); + casePanel = new javax.swing.JPanel(); caseNameLabel = new javax.swing.JLabel(); - crDateLabel = new javax.swing.JLabel(); - caseDirLabel = new javax.swing.JLabel(); - caseNameTextField = new javax.swing.JTextField(); - caseNumberLabel = new javax.swing.JLabel(); - examinerLabel = new javax.swing.JLabel(); lbDbType = new javax.swing.JLabel(); - lbDbName = new javax.swing.JLabel(); - crDateField = new javax.swing.JLabel(); - caseDirField = new javax.swing.JLabel(); - dbNameField = new javax.swing.JLabel(); - caseTypeField = new javax.swing.JLabel(); lbCaseUUIDLabel = new javax.swing.JLabel(); + caseTypeField = new javax.swing.JLabel(); + dbNameField = new javax.swing.JLabel(); + lbDbName = new javax.swing.JLabel(); + caseNumberLabel = new javax.swing.JLabel(); + caseDirLabel = new javax.swing.JLabel(); + caseDirField = new javax.swing.JLabel(); + crDateLabel = new javax.swing.JLabel(); + crDateField = new javax.swing.JLabel(); lbCaseUIDText = new javax.swing.JLabel(); - caseNumberTextField = new javax.swing.JTextField(); - examinerTextField = new javax.swing.JTextField(); + lbCaseNameText = new javax.swing.JLabel(); + lbCaseNumberText = new javax.swing.JLabel(); + examinerPanel = new javax.swing.JPanel(); + lbExaminerNameText = new javax.swing.JLabel(); + lbNotesLabel = new javax.swing.JLabel(); + examinerLabel = new javax.swing.JLabel(); + examinerNotesScrollPane = new javax.swing.JScrollPane(); + taNotesText = new javax.swing.JTextArea(); + lbExaminerEmailLabel = new javax.swing.JLabel(); + lbExaminerPhoneLabel = new javax.swing.JLabel(); + lbExaminerPhoneText = new javax.swing.JLabel(); + lbExaminerEmailText = new javax.swing.JLabel(); + pnOrganization1 = new javax.swing.JPanel(); + lbOrganizationNameLabel1 = new javax.swing.JLabel(); + lbPointOfContactNameLabel1 = new javax.swing.JLabel(); + lbPointOfContactEmailLabel1 = new javax.swing.JLabel(); + lbPointOfContactPhoneLabel1 = new javax.swing.JLabel(); + lbPointOfContactNameText1 = new javax.swing.JLabel(); + lbPointOfContactEmailText1 = new javax.swing.JLabel(); + lbPointOfContactPhoneText1 = new javax.swing.JLabel(); + lbOrganizationNameText = new javax.swing.JLabel(); jTextArea1.setColumns(20); jTextArea1.setRows(5); jScrollPane1.setViewportView(jTextArea1); + casePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.casePanel.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N + caseNameLabel.setFont(caseNameLabel.getFont().deriveFont(caseNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); caseNameLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseNameLabel.text")); // NOI18N - - crDateLabel.setFont(crDateLabel.getFont().deriveFont(crDateLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - crDateLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.crDateLabel.text")); // NOI18N - - caseDirLabel.setFont(caseDirLabel.getFont().deriveFont(caseDirLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - caseDirLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseDirLabel.text")); // NOI18N - - caseNameTextField.setFont(caseNameTextField.getFont().deriveFont(caseNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - caseNameTextField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseNameTextField.text")); // NOI18N - - caseNumberLabel.setFont(caseNumberLabel.getFont().deriveFont(caseNumberLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - caseNumberLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseNumberLabel.text")); // NOI18N - - examinerLabel.setFont(examinerLabel.getFont().deriveFont(examinerLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - examinerLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.examinerLabel.text")); // NOI18N + caseNameLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + caseNameLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + caseNameLabel.setPreferredSize(new java.awt.Dimension(82, 14)); lbDbType.setFont(lbDbType.getFont().deriveFont(lbDbType.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); lbDbType.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbDbType.text")); // NOI18N + lbDbType.setMaximumSize(new java.awt.Dimension(82, 14)); + lbDbType.setMinimumSize(new java.awt.Dimension(82, 14)); + lbDbType.setPreferredSize(new java.awt.Dimension(82, 14)); - lbDbName.setFont(lbDbName.getFont().deriveFont(lbDbName.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - lbDbName.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbDbName.text")); // NOI18N - - caseDirField.setMinimumSize(new java.awt.Dimension(25, 14)); - - dbNameField.setMinimumSize(new java.awt.Dimension(25, 14)); + lbCaseUUIDLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbCaseUUIDLabel.text")); // NOI18N + lbCaseUUIDLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbCaseUUIDLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbCaseUUIDLabel.setPreferredSize(new java.awt.Dimension(82, 14)); caseTypeField.setMaximumSize(new java.awt.Dimension(1, 0)); - lbCaseUUIDLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbCaseUUIDLabel.text")); // NOI18N + dbNameField.setMinimumSize(new java.awt.Dimension(25, 14)); - caseNumberTextField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseNumberTextField.text")); // NOI18N + lbDbName.setFont(lbDbName.getFont().deriveFont(lbDbName.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + lbDbName.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbDbName.text")); // NOI18N + lbDbName.setMaximumSize(new java.awt.Dimension(82, 14)); + lbDbName.setMinimumSize(new java.awt.Dimension(82, 14)); + lbDbName.setPreferredSize(new java.awt.Dimension(82, 14)); - examinerTextField.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.examinerTextField.text")); // NOI18N + caseNumberLabel.setFont(caseNumberLabel.getFont().deriveFont(caseNumberLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + caseNumberLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseNumberLabel.text")); // NOI18N + caseNumberLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + caseNumberLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + caseNumberLabel.setPreferredSize(new java.awt.Dimension(82, 14)); - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() + caseDirLabel.setFont(caseDirLabel.getFont().deriveFont(caseDirLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + caseDirLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.caseDirLabel.text")); // NOI18N + caseDirLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + caseDirLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + caseDirLabel.setPreferredSize(new java.awt.Dimension(82, 14)); + + caseDirField.setMinimumSize(new java.awt.Dimension(25, 14)); + + crDateLabel.setFont(crDateLabel.getFont().deriveFont(crDateLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + crDateLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.crDateLabel.text")); // NOI18N + crDateLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + crDateLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + crDateLabel.setPreferredSize(new java.awt.Dimension(82, 14)); + + lbCaseNameText.setMinimumSize(new java.awt.Dimension(25, 14)); + + lbCaseNumberText.setMinimumSize(new java.awt.Dimension(25, 14)); + + javax.swing.GroupLayout casePanelLayout = new javax.swing.GroupLayout(casePanel); + casePanel.setLayout(casePanelLayout); + casePanelLayout.setHorizontalGroup( + casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(casePanelLayout.createSequentialGroup() .addContainerGap() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseNumberLabel) - .addComponent(caseNameLabel) - .addComponent(examinerLabel)) - .addGap(19, 19, 19) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseNameTextField) - .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 333, Short.MAX_VALUE) - .addComponent(examinerTextField))) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(lbCaseUUIDLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbDbName) - .addComponent(lbDbType, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseDirLabel, javax.swing.GroupLayout.Alignment.LEADING)) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(casePanelLayout.createSequentialGroup() + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(caseNumberLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(6, 6, 6) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbCaseNumberText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbCaseNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(casePanelLayout.createSequentialGroup() + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(lbCaseUUIDLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbDbName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbDbType, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(caseDirLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(crDateLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(crDateField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(caseDirField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(caseTypeField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(dbNameField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbCaseUIDText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(crDateLabel) - .addGap(18, 18, 18) - .addComponent(crDateField, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addComponent(lbCaseUIDText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) .addContainerGap()) ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(caseNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(caseNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + casePanelLayout.setVerticalGroup( + casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(casePanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbCaseNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(caseNumberLabel) - .addComponent(caseNumberTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNumberLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbCaseNumberText, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(examinerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(examinerLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(crDateLabel) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(crDateLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(crDateField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(caseDirLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(caseDirField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(caseTypeField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbDbType)) + .addComponent(lbDbType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbDbName) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbDbName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(dbNameField, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(lbCaseUUIDLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbCaseUIDText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(20, Short.MAX_VALUE)) + .addGap(6, 6, 6)) + ); + + examinerPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.examinerPanel.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N + + lbNotesLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbNotesLabel.text")); // NOI18N + lbNotesLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbNotesLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbNotesLabel.setPreferredSize(new java.awt.Dimension(82, 14)); + lbNotesLabel.setRequestFocusEnabled(false); + + examinerLabel.setFont(examinerLabel.getFont().deriveFont(examinerLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + examinerLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.examinerLabel.text")); // NOI18N + examinerLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + examinerLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + examinerLabel.setPreferredSize(new java.awt.Dimension(82, 14)); + + examinerNotesScrollPane.setBorder(null); + + taNotesText.setBackground(new java.awt.Color(240, 240, 240)); + taNotesText.setColumns(20); + taNotesText.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N + taNotesText.setLineWrap(true); + taNotesText.setRows(2); + taNotesText.setWrapStyleWord(true); + taNotesText.setBorder(null); + examinerNotesScrollPane.setViewportView(taNotesText); + + lbExaminerEmailLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbExaminerEmailLabel.text")); // NOI18N + lbExaminerEmailLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbExaminerEmailLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbExaminerEmailLabel.setPreferredSize(new java.awt.Dimension(82, 14)); + + lbExaminerPhoneLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbExaminerPhoneLabel.text")); // NOI18N + lbExaminerPhoneLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbExaminerPhoneLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbExaminerPhoneLabel.setPreferredSize(new java.awt.Dimension(82, 14)); + + javax.swing.GroupLayout examinerPanelLayout = new javax.swing.GroupLayout(examinerPanel); + examinerPanel.setLayout(examinerPanelLayout); + examinerPanelLayout.setHorizontalGroup( + examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(examinerPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(examinerPanelLayout.createSequentialGroup() + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbNotesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbExaminerPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, examinerPanelLayout.createSequentialGroup() + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(examinerLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbExaminerNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbExaminerEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addContainerGap()) + ); + examinerPanelLayout.setVerticalGroup( + examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(examinerPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(examinerLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbExaminerEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbExaminerPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(6, 6, 6)) + ); + + pnOrganization1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.pnOrganization1.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N + + lbOrganizationNameLabel1.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbOrganizationNameLabel1.text")); // NOI18N + lbOrganizationNameLabel1.setMaximumSize(new java.awt.Dimension(82, 14)); + lbOrganizationNameLabel1.setMinimumSize(new java.awt.Dimension(82, 14)); + lbOrganizationNameLabel1.setPreferredSize(new java.awt.Dimension(82, 14)); + + lbPointOfContactNameLabel1.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactNameLabel1.text")); // NOI18N + + lbPointOfContactEmailLabel1.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactEmailLabel1.text")); // NOI18N + lbPointOfContactEmailLabel1.setMaximumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactEmailLabel1.setMinimumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactEmailLabel1.setPreferredSize(new java.awt.Dimension(82, 14)); + + lbPointOfContactPhoneLabel1.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactPhoneLabel1.text")); // NOI18N + lbPointOfContactPhoneLabel1.setMaximumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactPhoneLabel1.setMinimumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactPhoneLabel1.setPreferredSize(new java.awt.Dimension(82, 14)); + + javax.swing.GroupLayout pnOrganization1Layout = new javax.swing.GroupLayout(pnOrganization1); + pnOrganization1.setLayout(pnOrganization1Layout); + pnOrganization1Layout.setHorizontalGroup( + pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganization1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactEmailLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactPhoneLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactNameLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(lbOrganizationNameLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(lbPointOfContactNameText1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbOrganizationNameText, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactPhoneText1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + pnOrganization1Layout.setVerticalGroup( + pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganization1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbOrganizationNameLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbOrganizationNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactNameLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactNameText1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactEmailLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbPointOfContactPhoneLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactPhoneText1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(6, 6, 6)) + ); + + javax.swing.GroupLayout detailsPanelLayout = new javax.swing.GroupLayout(detailsPanel); + detailsPanel.setLayout(detailsPanelLayout); + detailsPanelLayout.setHorizontalGroup( + detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(detailsPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(casePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(examinerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pnOrganization1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + detailsPanelLayout.setVerticalGroup( + detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, detailsPanelLayout.createSequentialGroup() + .addComponent(casePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(examinerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(pnOrganization1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) + .addGroup(layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(detailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(0, 0, 0)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) + .addGap(0, 0, 0) + .addComponent(detailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(0, 0, 0)) ); }// //GEN-END:initComponents - @NbBundle.Messages({ - "CasePropertiesPanel.errorDialog.emptyCaseNameMessage=No case name entered.", - "CasePropertiesPanel.errorDialog.invalidCaseNameMessage=Case names cannot include the following symbols: \\, /, :, *, ?, \", <, >, |" - }) - void saveChanges() { - saveCaseName(); - saveCaseNumber(); - saveExaminerName(); - } - - private void saveCaseName() { - String newCaseDisplayName = caseNameTextField.getText(); - - if (newCaseDisplayName.equals(theCase.getDisplayName())) { - return; - } - - if (newCaseDisplayName.trim().isEmpty()) { - MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); - return; - } - - if (!Case.isValidName(newCaseDisplayName)) { - MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); - return; - } - - try { - theCase.updateDisplayName(newCaseDisplayName); - } catch (CaseActionException ex) { - MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); - LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS - } - } - - private void saveCaseNumber() { - String newCaseNumber = caseNumberTextField.getText(); - - if (newCaseNumber.equals(theCase.getNumber())) { - return; - } - - if (newCaseNumber.trim().isEmpty()) { - MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); - return; - } - - if (!Case.isValidName(newCaseNumber)) { - MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); - return; - } - - try { - theCase.updateCaseNumber(newCaseNumber); - } catch (CaseActionException ex) { - MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); - LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS - } - } - - private void saveExaminerName() { - String newExaminerName = examinerTextField.getText(); - - if (newExaminerName.equals(theCase.getExaminer())) { - return; - } - - if (newExaminerName.trim().isEmpty()) { - MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); - return; - } - - if (!Case.isValidName(newExaminerName)) { - MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); - return; - } - - try { - theCase.updateExaminer(newExaminerName); - } catch (CaseActionException ex) { - MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); - LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS - } - } +// @NbBundle.Messages({ +// "CasePropertiesPanel.errorDialog.emptyCaseNameMessage=No case name entered.", +// "CasePropertiesPanel.errorDialog.invalidCaseNameMessage=Case names cannot include the following symbols: \\, /, :, *, ?, \", <, >, |" +// }) +// void saveChanges() { +// saveCaseName(); +// saveCaseNumber(); +// saveExaminerName(); +// } +// private void saveCaseName() { +// String newCaseDisplayName = caseNameTextField.getText(); +// +// if (newCaseDisplayName.equals(theCase.getDisplayName())) { +// return; +// } +// +// if (newCaseDisplayName.trim().isEmpty()) { +// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); +// return; +// } +// +// if (!Case.isValidName(newCaseDisplayName)) { +// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); +// return; +// } +// +// try { +// theCase.updateDisplayName(newCaseDisplayName); +// } catch (CaseActionException ex) { +// MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); +// LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS +// } +// } +// private void saveCaseNumber() { +// String newCaseNumber = caseNumberTextField.getText(); +// +// if (newCaseNumber.equals(theCase.getNumber())) { +// return; +// } +// +// if (newCaseNumber.trim().isEmpty()) { +// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); +// return; +// } +// +// if (!Case.isValidName(newCaseNumber)) { +// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); +// return; +// } +// +// try { +// theCase.updateCaseNumber(newCaseNumber); +// } catch (CaseActionException ex) { +// MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); +// LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS +// } +// } +// private void saveExaminerName() { +// String newExaminerName = examinerTextField.getText(); +// +// if (newExaminerName.equals(theCase.getExaminer())) { +// return; +// } +// +// if (newExaminerName.trim().isEmpty()) { +// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); +// return; +// } +// +// if (!Case.isValidName(newExaminerName)) { +// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); +// return; +// } +// +// try { +// theCase.updateExaminer(newExaminerName); +// } catch (CaseActionException ex) { +// MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); +// LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS +// } +// } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel caseDirField; private javax.swing.JLabel caseDirLabel; private javax.swing.JLabel caseNameLabel; - private javax.swing.JTextField caseNameTextField; private javax.swing.JLabel caseNumberLabel; - private javax.swing.JTextField caseNumberTextField; + private javax.swing.JPanel casePanel; private javax.swing.JLabel caseTypeField; private javax.swing.JLabel crDateField; private javax.swing.JLabel crDateLabel; private javax.swing.JLabel dbNameField; + private javax.swing.JPanel detailsPanel; private javax.swing.JLabel examinerLabel; - private javax.swing.JTextField examinerTextField; - private javax.swing.JPanel jPanel1; + private javax.swing.JScrollPane examinerNotesScrollPane; + private javax.swing.JPanel examinerPanel; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea jTextArea1; + private javax.swing.JLabel lbCaseNameText; + private javax.swing.JLabel lbCaseNumberText; private javax.swing.JLabel lbCaseUIDText; private javax.swing.JLabel lbCaseUUIDLabel; private javax.swing.JLabel lbDbName; private javax.swing.JLabel lbDbType; + private javax.swing.JLabel lbExaminerEmailLabel; + private javax.swing.JLabel lbExaminerEmailText; + private javax.swing.JLabel lbExaminerNameText; + private javax.swing.JLabel lbExaminerPhoneLabel; + private javax.swing.JLabel lbExaminerPhoneText; + private javax.swing.JLabel lbNotesLabel; + private javax.swing.JLabel lbOrganizationNameLabel1; + private javax.swing.JLabel lbOrganizationNameText; + private javax.swing.JLabel lbPointOfContactEmailLabel1; + private javax.swing.JLabel lbPointOfContactEmailText1; + private javax.swing.JLabel lbPointOfContactNameLabel1; + private javax.swing.JLabel lbPointOfContactNameText1; + private javax.swing.JLabel lbPointOfContactPhoneLabel1; + private javax.swing.JLabel lbPointOfContactPhoneText1; + private javax.swing.JPanel pnOrganization1; + private javax.swing.JTextArea taNotesText; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form new file mode 100644 index 0000000000..a19cf1605f --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form @@ -0,0 +1,73 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java new file mode 100644 index 0000000000..08ca101536 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java @@ -0,0 +1,128 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.sleuthkit.autopsy.casemodule; + +import java.awt.event.ActionListener; + +/** + * + * @author wschaefer + */ +class EditOptionalCasePropertiesPanel extends javax.swing.JPanel { + + private static final long serialVersionUID = 1L; + + private final OptionalCasePropertiesPanel propertiesPanel; + + /** + * Creates new form EditOptionalCasePropertiesPanel + */ + EditOptionalCasePropertiesPanel() { + initComponents(); + propertiesPanel = new OptionalCasePropertiesPanel(true); + optionsPanel.add(propertiesPanel); + optionsPanel.setVisible(true); + propertiesPanel.setVisible(true); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + optionsPanel = new javax.swing.JPanel(); + cancelButton = new javax.swing.JButton(); + saveButton = new javax.swing.JButton(); + + optionsPanel.setLayout(new java.awt.BorderLayout()); + + org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(EditOptionalCasePropertiesPanel.class, "EditOptionalCasePropertiesPanel.cancelButton.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(saveButton, org.openide.util.NbBundle.getMessage(EditOptionalCasePropertiesPanel.class, "EditOptionalCasePropertiesPanel.saveButton.text")); // NOI18N + saveButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + saveButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(254, Short.MAX_VALUE) + .addComponent(cancelButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(saveButton) + .addContainerGap()) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(optionsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {cancelButton, saveButton}); + + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap(266, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(saveButton)) + .addContainerGap()) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(optionsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE) + .addGap(38, 38, 38))) + ); + }// //GEN-END:initComponents + + private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed + this.propertiesPanel.saveUpdatedCaseDetails(); + }//GEN-LAST:event_saveButtonActionPerformed + + /** + * Adds an action listener to the Save button of the panel. + * + * @param action + */ + void addSaveButtonAction(ActionListener action) { + this.saveButton.addActionListener(action); + } + + /** + * Adds an action listener to the Cancel button of the panel. + * + * @param action + */ + void addCancelButtonAction(ActionListener action) { + this.cancelButton.addActionListener(action); + } + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton cancelButton; + private javax.swing.JPanel optionsPanel; + private javax.swing.JButton saveButton; + // End of variables declaration//GEN-END:variables +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Examiner.java b/Core/src/org/sleuthkit/autopsy/casemodule/Examiner.java new file mode 100644 index 0000000000..97d53f340c --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Examiner.java @@ -0,0 +1,72 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.casemodule; + +/** + * Wrapper to contain the details associated with an Examiner + */ +class Examiner { + private final String name; + private final String phone; + private final String email; + private final String notes; + + Examiner(String exName, String exPhone, String exEmail, String exNotes){ + name = exName; + phone = exPhone; + email = exEmail; + notes = exNotes; + } + + /** + * Get the examiner name + * + * @return name - the name associated with the examiner + */ + String getName() { + return name; + } + + /** + * Get the examiner phone number + * + * @return phone - the phone number associated with the examiner + */ + String getPhone() { + return phone; + } + + /** + * Get the examiner email address + * + * @return email - the email address associated with the examiner + */ + String getEmail() { + return email; + } + + /** + * Get the examiner notes + * + * @return notes - the note asssociated with the examiner + */ + String getNotes() { + return notes; + } +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form index b866695be3..73c1406f93 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form @@ -19,42 +19,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - @@ -63,92 +33,14 @@ - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -161,62 +53,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index 937d9cc526..6009b20cee 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,28 +26,23 @@ package org.sleuthkit.autopsy.casemodule; import org.openide.util.NbBundle; -import java.awt.*; -import javax.swing.JComboBox; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; -import org.sleuthkit.autopsy.centralrepository.optionspanel.ManageOrganizationsDialog; - /** * * @author dfickling */ class NewCaseVisualPanel2 extends javax.swing.JPanel { - private EamOrganization selectedOrg = null; - private java.util.List orgs = null; - private EamDb dbManager; - + OptionalCasePropertiesPanel propertiesPanel; /** * Creates new form NewCaseVisualPanel2 */ public NewCaseVisualPanel2() { initComponents(); + propertiesPanel = new OptionalCasePropertiesPanel(); + optionalPanel.add(propertiesPanel); + optionalPanel.setVisible(true); + propertiesPanel.setVisible(true); + } /** @@ -61,29 +56,7 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { return NbBundle.getMessage(this.getClass(), "NewCaseVisualPanel2.getName.text"); } - void setUpOrganization() { - try { - this.dbManager = EamDb.getInstance(); - } catch (EamDbException ex) { - dbManager = null; - } - boolean cREnabled = (dbManager != null); - comboBoxOrgName.setEnabled(cREnabled); - bnNewOrganization.setEnabled(cREnabled); - lbPointOfContactNameText.setEnabled(cREnabled); - lbPointOfContactEmailText.setEnabled(cREnabled); - lbPointOfContactPhoneText.setEnabled(cREnabled); - lbOrganizationNameLabel.setEnabled(cREnabled); - lbPointOfContactNameLabel.setEnabled(cREnabled); - lbPointOfContactEmailLabel.setEnabled(cREnabled); - lbPointOfContactPhoneLabel.setEnabled(cREnabled); - if (cREnabled) { - loadOrganizationData(); - } else { - selectedOrg = null; - clearOrganization(); - } - } + /** * This method is called from within the constructor to initialize the form. @@ -94,56 +67,13 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - caseNumberTextField = new javax.swing.JTextField(); - examinerTextField = new javax.swing.JTextField(); - caseNumberLabel = new javax.swing.JLabel(); - examinerLabel = new javax.swing.JLabel(); optionalLabel = new javax.swing.JLabel(); - lbOrganizationNameLabel = new javax.swing.JLabel(); - comboBoxOrgName = new javax.swing.JComboBox<>(); - bnNewOrganization = new javax.swing.JButton(); - lbPointOfContactNameLabel = new javax.swing.JLabel(); - lbPointOfContactNameText = new javax.swing.JLabel(); - lbPointOfContactEmailLabel = new javax.swing.JLabel(); - lbPointOfContactEmailText = new javax.swing.JLabel(); - lbPointOfContactPhoneLabel = new javax.swing.JLabel(); - lbPointOfContactPhoneText = new javax.swing.JLabel(); - - caseNumberTextField.setFont(caseNumberTextField.getFont().deriveFont(caseNumberTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - caseNumberTextField.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.caseNumberTextField.text")); // NOI18N - - examinerTextField.setFont(examinerTextField.getFont().deriveFont(examinerTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - examinerTextField.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.examinerTextField.text")); // NOI18N - - caseNumberLabel.setFont(caseNumberLabel.getFont().deriveFont(caseNumberLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - caseNumberLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.caseNumberLabel.text")); // NOI18N - - examinerLabel.setFont(examinerLabel.getFont().deriveFont(examinerLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - examinerLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.examinerLabel.text")); // NOI18N + optionalPanel = new javax.swing.JPanel(); optionalLabel.setFont(optionalLabel.getFont().deriveFont(optionalLabel.getFont().getStyle() | java.awt.Font.BOLD, 14)); optionalLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.optionalLabel.text")); // NOI18N - lbOrganizationNameLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.lbOrganizationNameLabel.text")); // NOI18N - - comboBoxOrgName.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - comboBoxOrgNameActionPerformed(evt); - } - }); - - bnNewOrganization.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.bnNewOrganization.text")); // NOI18N - bnNewOrganization.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnNewOrganizationActionPerformed(evt); - } - }); - - lbPointOfContactNameLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.lbPointOfContactNameLabel.text")); // NOI18N - - lbPointOfContactEmailLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.lbPointOfContactEmailLabel.text")); // NOI18N - - lbPointOfContactPhoneLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.lbPointOfContactPhoneLabel.text")); // NOI18N + optionalPanel.setLayout(new java.awt.BorderLayout()); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -152,163 +82,41 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(optionalLabel) - .addGap(0, 150, Short.MAX_VALUE)) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(examinerLabel) - .addComponent(lbOrganizationNameLabel) - .addComponent(caseNumberLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseNumberTextField) - .addComponent(examinerTextField) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(bnNewOrganization)) - .addComponent(comboBoxOrgName, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbPointOfContactPhoneLabel) - .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbPointOfContactNameLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))) - .addContainerGap()) + .addComponent(optionalLabel) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(optionalPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(optionalLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(caseNumberLabel) - .addComponent(caseNumberTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(18, 18, 18) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(examinerLabel) - .addComponent(examinerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbOrganizationNameLabel) - .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnNewOrganization) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(40, Short.MAX_VALUE)) + .addComponent(optionalPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) ); }// //GEN-END:initComponents - - private void comboBoxOrgNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxOrgNameActionPerformed - JComboBox cb = (JComboBox) evt.getSource(); - String orgName = (String) cb.getSelectedItem(); - if (null == orgName) { - return; - } - - if ("".equals(orgName)) { - clearOrganization(); - return; - } - - for (EamOrganization org : orgs) { - if (org.getName().equals(orgName)) { - selectedOrg = org; - lbPointOfContactNameText.setText(selectedOrg.getPocName()); - lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); - lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); - return; - } - } - }//GEN-LAST:event_comboBoxOrgNameActionPerformed - - private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnNewOrganizationActionPerformed - ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); - // update the combobox options and org data fields - if (dialog.isChanged()) { - selectedOrg = dialog.getNewOrg(); - loadOrganizationData(); - validate(); - repaint(); - } - }//GEN-LAST:event_bnNewOrganizationActionPerformed - private void loadOrganizationData() { - - comboBoxOrgName.removeAllItems(); - try { - orgs = dbManager.getOrganizations(); - comboBoxOrgName.addItem(""); // for when a case has a null Org - orgs.forEach((org) -> { - comboBoxOrgName.addItem(org.getName()); - }); - } catch (EamDbException ex) { - selectedOrg = null; - } - - if (null != selectedOrg) { - comboBoxOrgName.setSelectedItem(selectedOrg.getName()); - lbPointOfContactNameText.setText(selectedOrg.getPocName()); - lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); - lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); - } else { - clearOrganization(); - } - } + // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton bnNewOrganization; - private javax.swing.JLabel caseNumberLabel; - private javax.swing.JTextField caseNumberTextField; - private javax.swing.JComboBox comboBoxOrgName; - private javax.swing.JLabel examinerLabel; - private javax.swing.JTextField examinerTextField; - private javax.swing.JLabel lbOrganizationNameLabel; - private javax.swing.JLabel lbPointOfContactEmailLabel; - private javax.swing.JLabel lbPointOfContactEmailText; - private javax.swing.JLabel lbPointOfContactNameLabel; - private javax.swing.JLabel lbPointOfContactNameText; - private javax.swing.JLabel lbPointOfContactPhoneLabel; - private javax.swing.JLabel lbPointOfContactPhoneText; private javax.swing.JLabel optionalLabel; + private javax.swing.JPanel optionalPanel; // End of variables declaration//GEN-END:variables - private void clearOrganization() { - comboBoxOrgName.setSelectedItem(""); - lbPointOfContactNameText.setText(""); - lbPointOfContactEmailText.setText(""); - lbPointOfContactPhoneText.setText(""); - } - String getCaseNumber() { - return caseNumberTextField.getText(); + return propertiesPanel.getCaseNumber(); } - String getExaminer() { - return examinerTextField.getText(); + Examiner getExaminer() { + return propertiesPanel.getExaminer(); } String getOrganization() { - if (selectedOrg != null) { - return selectedOrg.getName(); - } - else { - return ""; - } + return propertiesPanel.getOrganization(); + } + + void refreshCentralRepoFields() { + propertiesPanel.setUpCentralRepoFields(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 3679587491..f21b40b092 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -37,6 +37,10 @@ import org.openide.util.actions.SystemAction; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.actions.IngestRunningCheck; import org.sleuthkit.autopsy.casemodule.Case.CaseType; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; import org.sleuthkit.autopsy.coreutils.FileUtil; import org.sleuthkit.autopsy.coreutils.Logger; @@ -75,11 +79,33 @@ final class NewCaseWizardAction extends CallableSystemAction { @Override protected Void doInBackground() throws Exception { String caseNumber = (String) wizardDescriptor.getProperty("caseNumber"); //NON-NLS - String examiner = (String) wizardDescriptor.getProperty("caseExaminer"); //NON-NLS + Examiner examiner = (Examiner) wizardDescriptor.getProperty("caseExaminer"); //NON-NLS + String organizationName = (String) wizardDescriptor.getProperty("caseOrganization"); //NON-NLS final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS CaseType caseType = CaseType.values()[(int) wizardDescriptor.getProperty("caseType")]; //NON-NLS Case.createAsCurrentCase(createdDirectory, caseName, caseNumber, examiner, caseType); + if (EamDb.isEnabled()) { + try { + EamDb dbManager = EamDb.getInstance(); + if (dbManager != null) { + CorrelationCase cRCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + if (cRCase == null) { + cRCase = dbManager.newCase(Case.getCurrentCase()); + } + if (!organizationName.isEmpty()) { + for (EamOrganization org : dbManager.getOrganizations()) { + if (org.getName().equals(organizationName)) { + cRCase.setOrg(org); + dbManager.updateCase(cRCase); + } + } + } + } + } catch (EamDbException ex) { + + } + } return null; } @@ -118,6 +144,10 @@ final class NewCaseWizardAction extends CallableSystemAction { } } + private void updateCentralRepoCase() { + + } + private void doFailedCaseCleanup(WizardDescriptor wizardDescriptor) { String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS if (createdDirectory != null) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index 6490c9e20e..13d2105271 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -47,7 +47,7 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java new file mode 100644 index 0000000000..5c026afc23 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -0,0 +1,538 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.casemodule; + +import java.awt.Cursor; +import java.util.logging.Level; +import javax.swing.JComboBox; +import org.openide.util.Exceptions; +import org.sleuthkit.autopsy.centralrepository.actions.EamCaseEditDetailsDialog; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; +import org.sleuthkit.autopsy.centralrepository.optionspanel.ManageOrganizationsDialog; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; + +/** + * + * @author wschaefer + */ +class OptionalCasePropertiesPanel extends javax.swing.JPanel { + + private final static Logger LOGGER = Logger.getLogger(EamCaseEditDetailsDialog.class.getName()); + private static final long serialVersionUID = 1L; + private EamOrganization selectedOrg = null; + private java.util.List orgs = null; + private EamDb dbManager; + + /** + * Creates new form OptionalCasePropertiesPanel + */ + OptionalCasePropertiesPanel() { + initComponents(); + caseDisplayNameLabel.setVisible(false); + caseDisplayNameTextField.setVisible(false); + } + + OptionalCasePropertiesPanel(boolean editCurrentCase) { + initComponents(); + if (editCurrentCase) { + caseDisplayNameTextField.setText(Case.getCurrentCase().getDisplayName()); + caseNumberTextField.setText(Case.getCurrentCase().getNumber()); + examinerTextField.setText(Case.getCurrentCase().getExaminer()); + tfExaminerEmailText.setText(Case.getCurrentCase().getExaminerEmail()); + tfExaminerPhoneText.setText(Case.getCurrentCase().getExaminerPhone()); + taNotesText.setText(Case.getCurrentCase().getExaminerNotes()); + try { + this.dbManager = EamDb.getInstance(); + if (dbManager != null) { + selectedOrg = dbManager.getCaseByUUID(Case.getCurrentCase().getName()).getOrg(); + } + } catch (EamDbException ex) { + dbManager = null; + } + + } + + } + + void setUpCentralRepoFields() { + try { + this.dbManager = EamDb.getInstance(); + } catch (EamDbException ex) { + dbManager = null; + } + boolean cREnabled = (dbManager != null); + comboBoxOrgName.setEnabled(cREnabled); + bnNewOrganization.setEnabled(cREnabled); + lbPointOfContactNameText.setEnabled(cREnabled); + lbPointOfContactEmailText.setEnabled(cREnabled); + lbPointOfContactPhoneText.setEnabled(cREnabled); + lbOrganizationNameLabel.setEnabled(cREnabled); + lbPointOfContactNameLabel.setEnabled(cREnabled); + lbPointOfContactEmailLabel.setEnabled(cREnabled); + lbPointOfContactPhoneLabel.setEnabled(cREnabled); + orgainizationPanel.setEnabled(cREnabled); + + if (cREnabled) { + loadOrganizationData(); + } else { + selectedOrg = null; + clearOrganization(); + } + } + + private void loadOrganizationData() { + + comboBoxOrgName.removeAllItems(); + try { + orgs = dbManager.getOrganizations(); + comboBoxOrgName.addItem(""); // for when a case has a null Org + orgs.forEach((org) -> { + comboBoxOrgName.addItem(org.getName()); + }); + } catch (EamDbException ex) { + selectedOrg = null; + } + + if (null != selectedOrg) { + comboBoxOrgName.setSelectedItem(selectedOrg.getName()); + lbPointOfContactNameText.setText(selectedOrg.getPocName()); + lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); + lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); + } else { + clearOrganization(); + } + } + + private void clearOrganization() { + comboBoxOrgName.setSelectedItem(""); + lbPointOfContactNameText.setText(""); + lbPointOfContactEmailText.setText(""); + lbPointOfContactPhoneText.setText(""); + } + + String getCaseNumber() { + return caseNumberTextField.getText(); + } + + Examiner getExaminer() { + return new Examiner(examinerTextField.getText(), tfExaminerPhoneText.getText(), tfExaminerEmailText.getText(), taNotesText.getText()); + } + + String getOrganization() { + if (selectedOrg != null) { + return selectedOrg.getName(); + } else { + return ""; + } + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + casePanel = new javax.swing.JPanel(); + caseNumberLabel = new javax.swing.JLabel(); + caseNumberTextField = new javax.swing.JTextField(); + caseDisplayNameLabel = new javax.swing.JLabel(); + caseDisplayNameTextField = new javax.swing.JTextField(); + examinerPanel = new javax.swing.JPanel(); + tfExaminerPhoneText = new javax.swing.JTextField(); + lbExaminerPhoneLabel = new javax.swing.JLabel(); + examinerNotesScrollPane = new javax.swing.JScrollPane(); + taNotesText = new javax.swing.JTextArea(); + tfExaminerEmailText = new javax.swing.JTextField(); + examinerTextField = new javax.swing.JTextField(); + lbExaminerEmailLabel = new javax.swing.JLabel(); + examinerLabel = new javax.swing.JLabel(); + lbNotesLabel = new javax.swing.JLabel(); + orgainizationPanel = new javax.swing.JPanel(); + lbPointOfContactPhoneLabel = new javax.swing.JLabel(); + comboBoxOrgName = new javax.swing.JComboBox<>(); + lbPointOfContactNameLabel = new javax.swing.JLabel(); + bnNewOrganization = new javax.swing.JButton(); + lbPointOfContactEmailText = new javax.swing.JLabel(); + lbPointOfContactNameText = new javax.swing.JLabel(); + lbOrganizationNameLabel = new javax.swing.JLabel(); + lbPointOfContactEmailLabel = new javax.swing.JLabel(); + lbPointOfContactPhoneText = new javax.swing.JLabel(); + + casePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.casePanel.border.title"))); // NOI18N + + caseNumberLabel.setFont(caseNumberLabel.getFont().deriveFont(caseNumberLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + org.openide.awt.Mnemonics.setLocalizedText(caseNumberLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseNumberLabel.text")); // NOI18N + + caseNumberTextField.setFont(caseNumberTextField.getFont().deriveFont(caseNumberTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + caseNumberTextField.setText(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseNumberTextField.text")); // NOI18N + + caseDisplayNameLabel.setFont(caseDisplayNameLabel.getFont().deriveFont(caseDisplayNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + org.openide.awt.Mnemonics.setLocalizedText(caseDisplayNameLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseDisplayNameLabel.text")); // NOI18N + caseDisplayNameLabel.setMaximumSize(new java.awt.Dimension(41, 14)); + caseDisplayNameLabel.setMinimumSize(new java.awt.Dimension(41, 14)); + caseDisplayNameLabel.setPreferredSize(new java.awt.Dimension(41, 14)); + + caseDisplayNameTextField.setFont(caseDisplayNameTextField.getFont().deriveFont(caseDisplayNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + + javax.swing.GroupLayout casePanelLayout = new javax.swing.GroupLayout(casePanel); + casePanel.setLayout(casePanelLayout); + casePanelLayout.setHorizontalGroup( + casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(casePanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseNumberLabel) + .addComponent(caseDisplayNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(caseDisplayNameTextField) + .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE)) + .addContainerGap()) + ); + casePanelLayout.setVerticalGroup( + casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(casePanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(caseDisplayNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(caseDisplayNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(caseNumberLabel) + .addComponent(caseNumberTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + + examinerPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.examinerPanel.border.title"))); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbExaminerPhoneLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbExaminerPhoneLabel.text")); // NOI18N + lbExaminerPhoneLabel.setMaximumSize(new java.awt.Dimension(41, 14)); + lbExaminerPhoneLabel.setMinimumSize(new java.awt.Dimension(41, 14)); + lbExaminerPhoneLabel.setPreferredSize(new java.awt.Dimension(41, 14)); + + examinerNotesScrollPane.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + + taNotesText.setColumns(20); + taNotesText.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N + taNotesText.setLineWrap(true); + taNotesText.setRows(2); + taNotesText.setWrapStyleWord(true); + taNotesText.setBorder(null); + examinerNotesScrollPane.setViewportView(taNotesText); + + examinerTextField.setFont(examinerTextField.getFont().deriveFont(examinerTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + examinerTextField.setText(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.examinerTextField.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbExaminerEmailLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbExaminerEmailLabel.text")); // NOI18N + lbExaminerEmailLabel.setMaximumSize(new java.awt.Dimension(41, 14)); + lbExaminerEmailLabel.setMinimumSize(new java.awt.Dimension(41, 14)); + lbExaminerEmailLabel.setPreferredSize(new java.awt.Dimension(41, 14)); + + examinerLabel.setFont(examinerLabel.getFont().deriveFont(examinerLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + org.openide.awt.Mnemonics.setLocalizedText(examinerLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.examinerLabel.text")); // NOI18N + examinerLabel.setMaximumSize(new java.awt.Dimension(41, 14)); + examinerLabel.setMinimumSize(new java.awt.Dimension(41, 14)); + examinerLabel.setPreferredSize(new java.awt.Dimension(41, 14)); + + org.openide.awt.Mnemonics.setLocalizedText(lbNotesLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbNotesLabel.text")); // NOI18N + lbNotesLabel.setMaximumSize(new java.awt.Dimension(41, 14)); + lbNotesLabel.setMinimumSize(new java.awt.Dimension(41, 14)); + lbNotesLabel.setPreferredSize(new java.awt.Dimension(41, 14)); + + javax.swing.GroupLayout examinerPanelLayout = new javax.swing.GroupLayout(examinerPanel); + examinerPanel.setLayout(examinerPanelLayout); + examinerPanelLayout.setHorizontalGroup( + examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(examinerPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(examinerPanelLayout.createSequentialGroup() + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(10, 10, 10) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tfExaminerPhoneText) + .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE))) + .addGroup(examinerPanelLayout.createSequentialGroup() + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(examinerLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(examinerTextField) + .addComponent(tfExaminerEmailText)))) + .addContainerGap()) + ); + examinerPanelLayout.setVerticalGroup( + examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(examinerPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(examinerLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(examinerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tfExaminerEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tfExaminerPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + + orgainizationPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.orgainizationPanel.border.title"))); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactPhoneLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbPointOfContactPhoneLabel.text")); // NOI18N + + comboBoxOrgName.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboBoxOrgNameActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactNameLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbPointOfContactNameLabel.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(bnNewOrganization, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.bnNewOrganization.text")); // NOI18N + bnNewOrganization.setMargin(new java.awt.Insets(2, 6, 2, 6)); + bnNewOrganization.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnNewOrganizationActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(lbOrganizationNameLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbOrganizationNameLabel.text")); // NOI18N + lbOrganizationNameLabel.setMaximumSize(new java.awt.Dimension(41, 14)); + lbOrganizationNameLabel.setMinimumSize(new java.awt.Dimension(41, 14)); + lbOrganizationNameLabel.setPreferredSize(new java.awt.Dimension(41, 14)); + + org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactEmailLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbPointOfContactEmailLabel.text")); // NOI18N + + javax.swing.GroupLayout orgainizationPanelLayout = new javax.swing.GroupLayout(orgainizationPanel); + orgainizationPanel.setLayout(orgainizationPanelLayout); + orgainizationPanelLayout.setHorizontalGroup( + orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(orgainizationPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(orgainizationPanelLayout.createSequentialGroup() + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbPointOfContactPhoneLabel) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactNameLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(orgainizationPanelLayout.createSequentialGroup() + .addComponent(comboBoxOrgName, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnNewOrganization))) + .addContainerGap()) + ); + orgainizationPanelLayout.setVerticalGroup( + orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(orgainizationPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(bnNewOrganization)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 561, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(orgainizationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(examinerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(casePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap())) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 413, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(casePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(examinerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(orgainizationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap())) + ); + }// //GEN-END:initComponents + + private void comboBoxOrgNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxOrgNameActionPerformed + @SuppressWarnings("unchecked") + JComboBox cb = (JComboBox) evt.getSource(); + String orgName = (String) cb.getSelectedItem(); + if (null == orgName) { + return; + } + + if ("".equals(orgName)) { + clearOrganization(); + return; + } + + for (EamOrganization org : orgs) { + if (org.getName().equals(orgName)) { + selectedOrg = org; + lbPointOfContactNameText.setText(selectedOrg.getPocName()); + lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); + lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); + return; + } + } + }//GEN-LAST:event_comboBoxOrgNameActionPerformed + + private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnNewOrganizationActionPerformed + ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); + // update the combobox options and org data fields + if (dialog.isChanged()) { + selectedOrg = dialog.getNewOrg(); + loadOrganizationData(); + validate(); + repaint(); + } + }//GEN-LAST:event_bnNewOrganizationActionPerformed + + private void updateCaseNumber() { + try { + Case.getCurrentCase().updateCaseNumber(caseNumberTextField.getText()); + } catch (CaseActionException ex) { + Exceptions.printStackTrace(ex); + } + } + + void saveUpdatedCaseDetails() { + updateCaseName(); + updateCaseNumber(); + updateExaminer(); + updateCorrelationCase(); + } + + private void updateCaseName() { + if (caseDisplayNameTextField.isVisible()) { + try { + Case.getCurrentCase().updateDisplayName(caseDisplayNameTextField.getText()); + } catch (CaseActionException ex) { + Exceptions.printStackTrace(ex); + } + } + } + + private void updateExaminer() { + try { + Case.getCurrentCase().updateExaminer(new Examiner(examinerTextField.getText(), tfExaminerPhoneText.getText(), tfExaminerEmailText.getText(), taNotesText.getText())); + } catch (CaseActionException ex) { + MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); + LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS + } + } + + /** + * Save changed value from text fields and text areas into the EamCase + * object. + */ + private void updateCorrelationCase() { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + if (EamDb.isEnabled()) { + try { + CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + if (caseDisplayNameTextField.isVisible()) { + correlationCase.setDisplayName(caseDisplayNameTextField.getText()); + } + correlationCase.setOrg(selectedOrg); + correlationCase.setCaseNumber(caseNumberTextField.getText()); + correlationCase.setExaminerName(examinerTextField.getText()); + correlationCase.setExaminerEmail(tfExaminerEmailText.getText()); + correlationCase.setExaminerPhone(tfExaminerPhoneText.getText()); + correlationCase.setNotes(taNotesText.getText()); + dbManager.updateCase(correlationCase); + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to central repository database", ex); // NON-NLS + } finally { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton bnNewOrganization; + private javax.swing.JLabel caseDisplayNameLabel; + private javax.swing.JTextField caseDisplayNameTextField; + private javax.swing.JLabel caseNumberLabel; + private javax.swing.JTextField caseNumberTextField; + private javax.swing.JPanel casePanel; + private javax.swing.JComboBox comboBoxOrgName; + private javax.swing.JLabel examinerLabel; + private javax.swing.JScrollPane examinerNotesScrollPane; + private javax.swing.JPanel examinerPanel; + private javax.swing.JTextField examinerTextField; + private javax.swing.JLabel lbExaminerEmailLabel; + private javax.swing.JLabel lbExaminerPhoneLabel; + private javax.swing.JLabel lbNotesLabel; + private javax.swing.JLabel lbOrganizationNameLabel; + private javax.swing.JLabel lbPointOfContactEmailLabel; + private javax.swing.JLabel lbPointOfContactEmailText; + private javax.swing.JLabel lbPointOfContactNameLabel; + private javax.swing.JLabel lbPointOfContactNameText; + private javax.swing.JLabel lbPointOfContactPhoneLabel; + private javax.swing.JLabel lbPointOfContactPhoneText; + private javax.swing.JPanel orgainizationPanel; + private javax.swing.JTextArea taNotesText; + private javax.swing.JTextField tfExaminerEmailText; + private javax.swing.JTextField tfExaminerPhoneText; + // End of variables declaration//GEN-END:variables +} diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties index 18fad5033f..51bcbbd01c 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties @@ -19,7 +19,7 @@ EamCaseEditDetailsDialog.lbExaminerEmailLabel.text=Email: EamCaseEditDetailsDialog.lbExaminerNameLabel.text=Name: EamCaseEditDetailsDialog.bnOk.text=OK -EamCaseEditDetailsDialog.bnNewOrganization.text=New Organization +EamCaseEditDetailsDialog.bnNewOrganization.text=Manage Organizations EamCaseEditDetailsDialog.lbPointOfContactPhoneLabel.text=Phone: EamCaseEditDetailsDialog.lbPointOfContactEmailLabel.text=Email: EamCaseEditDetailsDialog.lbPointOfContactNameLabel.text=Name: diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index ed3388ce0a..98f80f96aa 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -274,9 +274,9 @@ public abstract class AbstractSqlEamDb implements EamDb { autopsyCase.getCreatedDate(), autopsyCase.getNumber(), autopsyCase.getExaminer(), - null, - null, - null); + autopsyCase.getExaminerEmail(), + autopsyCase.getExaminerPhone(), + autopsyCase.getExaminerNotes()); newCase(curCeCase); return curCeCase; } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 68fe306585..9c4c971f51 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -292,9 +292,9 @@ public class CaseEventListener implements PropertyChangeListener { curCase.getCreatedDate(), curCase.getNumber(), curCase.getExaminer(), - null, - null, - null); + curCase.getExaminerEmail(), + curCase.getExaminerPhone(), + curCase.getExaminerNotes()); if (!EamDb.isEnabled()) { break; @@ -313,77 +313,77 @@ public class CaseEventListener implements PropertyChangeListener { } } } // CURRENT_CASE - break; - - case NAME: { - // The display name of the case has been changed - - if (!EamDb.isEnabled()) { - break; - } - - if (evt.getNewValue() instanceof String) { - String newName = (String) evt.getNewValue(); - try { - // See if the case is in the database. If it is, update the display name. - CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); - - if (null != existingCase) { - existingCase.setDisplayName(newName); - dbManager.updateCase(existingCase); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS - } - } - } // NAME - break; - case NUMBER: { - // The display name of the case has been changed - - if (!EamDb.isEnabled()) { - break; - } - - if (evt.getNewValue() instanceof String) { - String newNumber = (String) evt.getNewValue(); - try { - // See if the case is in the database. If it is, update the display name. - CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); - - if (null != existingCase) { - existingCase.setCaseNumber(newNumber); - dbManager.updateCase(existingCase); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS - } - } - } // NUMBER - break; - case EXAMINER: { - // The display name of the case has been changed - - if (!EamDb.isEnabled()) { - break; - } - - if (evt.getNewValue() instanceof String) { - String newExaminerName = (String) evt.getNewValue(); - try { - // See if the case is in the database. If it is, update the display name. - CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); - - if (null != existingCase) { - existingCase.setExaminerName(newExaminerName); - dbManager.updateCase(existingCase); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS - } - } - } // EXAMINER - break; +// break; +// +// case NAME: { +// // The display name of the case has been changed +// +// if (!EamDb.isEnabled()) { +// break; +// } +// +// if (evt.getNewValue() instanceof String) { +// String newName = (String) evt.getNewValue(); +// try { +// // See if the case is in the database. If it is, update the display name. +// CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); +// +// if (null != existingCase) { +// existingCase.setDisplayName(newName); +// dbManager.updateCase(existingCase); +// } +// } catch (EamDbException ex) { +// LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS +// } +// } +// } // NAME +// break; +// case NUMBER: { +// // The display name of the case has been changed +// +// if (!EamDb.isEnabled()) { +// break; +// } +// +// if (evt.getNewValue() instanceof String) { +// String newNumber = (String) evt.getNewValue(); +// try { +// // See if the case is in the database. If it is, update the display name. +// CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); +// +// if (null != existingCase) { +// existingCase.setCaseNumber(newNumber); +// dbManager.updateCase(existingCase); +// } +// } catch (EamDbException ex) { +// LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS +// } +// } +// } // NUMBER +// break; +// case EXAMINER: { +// // The display name of the case has been changed +// +// if (!EamDb.isEnabled()) { +// break; +// } +// +// if (evt.getNewValue() instanceof String) { +// String newExaminerName = (String) evt.getNewValue(); +// try { +// // See if the case is in the database. If it is, update the display name. +// CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); +// +// if (null != existingCase) { +// existingCase.setExaminerName(newExaminerName); +// dbManager.updateCase(existingCase); +// } +// } catch (EamDbException ex) { +// LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS +// } +// } +// } // EXAMINER +// break; } } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java index fc8d100c37..5c61ef74d8 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java @@ -241,9 +241,9 @@ class IngestModule implements FileIngestModule { curCase.getCreatedDate(), curCase.getNumber(), curCase.getExaminer(), - null, - null, - null); + curCase.getExaminerEmail(), + curCase.getExaminerPhone(), + curCase.getExaminerNotes()); try { dbManager.newCase(curCeCase); eamCase = dbManager.getCaseByUUID(curCase.getName()); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties index 82da099468..2477bcd683 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties @@ -76,18 +76,7 @@ ImportHashDatabaseDialog.lbFilePath.text=File Path: ImportHashDatabaseDialog.tfFilePath.text= EamDbSettingsDialog.lbDatabaseDesc.text=Database File: EamDbSettingsDialog.lbFullDbPath.text=jLabel2 -CentralRepoCaseOptionsPanel.lbOrganizationNameLabel.text=Organization Name: -CentralRepoCaseOptionsPanel.pnOrganization.border.title=Organization -CentralRepoCaseOptionsPanel.lbNotesLabel.text=Notes: -CentralRepoCaseOptionsPanel.lbExaminerPhoneLabel.text=Phone: -CentralRepoCaseOptionsPanel.lbExaminerEmailLabel.text=Email: -CentralRepoCaseOptionsPanel.lbExaminerNameLabel.text=Name: -CentralRepoCaseOptionsPanel.pnExaminer.border.title=Examiner Details -CentralRepoCaseOptionsPanel.bnNewOrganization.text=New Organization -CentralRepoCaseOptionsPanel.lbPointOfContactPhoneLabel.text=Phone: -CentralRepoCaseOptionsPanel.lbPointOfContactEmailLabel.text=Email: -CentralRepoCaseOptionsPanel.lbPointOfContactNameLabel.text=Point of Contact: -CaseOrganizationPanel.bnNewOrganization.text=New Organization +CaseOrganizationPanel.bnNewOrganization.text=Manage Organizations CaseOrganizationPanel.lbPointOfContactPhoneLabel.text=Phone: CaseOrganizationPanel.lbPointOfContactEmailLabel.text=Email: CaseOrganizationPanel.lbPointOfContactNameLabel.text=Name: @@ -109,3 +98,11 @@ ManageOrganizationsDialog.jTextArea1.text=Organizations are used to provide addi ManageOrganizationsDialog.jButton4.text=Edit ManageOrganizationsDialog.jLabel3.text=Organization Details ManageOrganizationsDialog.pocNameTextField.text= +GlobalSettingsPanel.organizationPanel.border.title=Organizations +GlobalSettingsPanel.manageOrganizationButton.text=Manage Organizations +GlobalSettingsPanel.organizationTextArea.text=Organization information can be tracked in the central repository. +ExaminerDetailsPanel.lbNotesLabel.text_1=Notes: +ExaminerDetailsPanel.lbExaminerPhoneLabel.text_1=Phone: +ExaminerDetailsPanel.lbExaminerEmailLabel.text_1=Email: +ExaminerDetailsPanel.lbExaminerNameLabel.text_1=Name: +ExaminerDetailsPanel.pnExaminer.border.title=Examiner Details diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form deleted file mode 100644 index 7854e6d7f7..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.form +++ /dev/null @@ -1,284 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java deleted file mode 100644 index 0bbf91326a..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/CentralRepoCaseOptionsPanel.java +++ /dev/null @@ -1,453 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.sleuthkit.autopsy.centralrepository.optionspanel; - -import java.awt.Cursor; -import java.awt.Dialog; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.logging.Level; -import javax.swing.JComboBox; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.centralrepository.actions.EamCaseEditDetailsDialog; -import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; -import org.sleuthkit.autopsy.coreutils.Logger; - -/** - * - * @author wschaefer - */ -public class CentralRepoCaseOptionsPanel extends javax.swing.JPanel { - - private final static Logger LOGGER = Logger.getLogger(EamCaseEditDetailsDialog.class.getName()); - private CorrelationCase eamCase; - private EamDb dbManager; - private Boolean contentChanged = false; - private final Collection textBoxes = new ArrayList<>(); - private final Collection textAreas = new ArrayList<>(); - private final TextBoxChangedListener textBoxChangedListener = new TextBoxChangedListener(); - private EamOrganization selectedOrg = null; - private List orgs = null; - private boolean comboboxOrganizationActionListenerActive; - - /** - * Creates new form CentralRepoCaseOptionsPanel - */ - public CentralRepoCaseOptionsPanel() { - try { - this.dbManager = EamDb.getInstance(); - if (dbManager != null ) { - this.eamCase = this.dbManager.getCaseByUUID(Case.getCurrentCase().getName()); - if (this.eamCase == null) { - this.eamCase = dbManager.newCase(Case.getCurrentCase()); - } - initComponents(); - loadData(); - customizeComponents(); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error getting current case.", ex); - } - } - - private void customizeComponents() { - setTextBoxListeners(); - setTextAreaListeners(); - } - - private void setTextBoxListeners() { - // Register for notifications when the text boxes get updated. - textBoxes.add(tfExaminerNameText); - textBoxes.add(tfExaminerEmailText); - textBoxes.add(tfExaminerPhoneText); - addTextFieldDocumentListeners(textBoxes, textBoxChangedListener); - } - - private void setTextAreaListeners() { - // Register for notifications when the text areas get updated. - textAreas.add(taNotesText); - addTextAreaDocumentListeners(textAreas, textBoxChangedListener); - } - - /** - * Adds a change listener to a collection of text fields. - * - * @param textFields The text fields. - * @param listener The change listener. - */ - private static void addTextFieldDocumentListeners(Collection textFields, TextBoxChangedListener listener) { - textFields.forEach((textField) -> { - textField.getDocument().addDocumentListener(listener); - }); - } - - /** - * Adds a change listener to a collection of text areas. - * - * @param textAreas The text areas. - * @param listener The change listener. - */ - private static void addTextAreaDocumentListeners(Collection textAreas, TextBoxChangedListener listener) { - textAreas.forEach((textArea) -> { - textArea.getDocument().addDocumentListener(listener); - }); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - pnOrganization = new javax.swing.JPanel(); - lbOrganizationNameLabel = new javax.swing.JLabel(); - comboBoxOrgName = new javax.swing.JComboBox<>(); - lbPointOfContactNameLabel = new javax.swing.JLabel(); - lbPointOfContactEmailLabel = new javax.swing.JLabel(); - lbPointOfContactPhoneLabel = new javax.swing.JLabel(); - lbPointOfContactNameText = new javax.swing.JLabel(); - lbPointOfContactEmailText = new javax.swing.JLabel(); - lbPointOfContactPhoneText = new javax.swing.JLabel(); - bnNewOrganization = new javax.swing.JButton(); - pnExaminer = new javax.swing.JPanel(); - lbExaminerNameLabel = new javax.swing.JLabel(); - tfExaminerNameText = new javax.swing.JTextField(); - lbExaminerEmailLabel = new javax.swing.JLabel(); - tfExaminerEmailText = new javax.swing.JTextField(); - lbExaminerPhoneLabel = new javax.swing.JLabel(); - tfExaminerPhoneText = new javax.swing.JTextField(); - lbNotesLabel = new javax.swing.JLabel(); - jScrollPane2 = new javax.swing.JScrollPane(); - taNotesText = new javax.swing.JTextArea(); - - pnOrganization.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.pnOrganization.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbOrganizationNameLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbOrganizationNameLabel.text")); // NOI18N - - comboBoxOrgName.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - comboBoxOrgNameActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactNameLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbPointOfContactNameLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactEmailLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbPointOfContactEmailLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactPhoneLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbPointOfContactPhoneLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnNewOrganization, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.bnNewOrganization.text")); // NOI18N - bnNewOrganization.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnNewOrganizationActionPerformed(evt); - } - }); - - javax.swing.GroupLayout pnOrganizationLayout = new javax.swing.GroupLayout(pnOrganization); - pnOrganization.setLayout(pnOrganizationLayout); - pnOrganizationLayout.setHorizontalGroup( - pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnOrganizationLayout.createSequentialGroup() - .addGap(10, 10, 10) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbPointOfContactPhoneLabel) - .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(comboBoxOrgName, 0, 269, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(bnNewOrganization, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap()) - ); - pnOrganizationLayout.setVerticalGroup( - pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnOrganizationLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbOrganizationNameLabel) - .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(2, 2, 2) - .addComponent(bnNewOrganization) - .addGap(1, 1, 1) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(0, 0, 0)) - ); - - pnExaminer.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.pnExaminer.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbExaminerNameLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerNameLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbExaminerEmailLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerEmailLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbExaminerPhoneLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbExaminerPhoneLabel.text")); // NOI18N - - tfExaminerPhoneText.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - tfExaminerPhoneTextActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(lbNotesLabel, org.openide.util.NbBundle.getMessage(CentralRepoCaseOptionsPanel.class, "CentralRepoCaseOptionsPanel.lbNotesLabel.text")); // NOI18N - - taNotesText.setColumns(20); - taNotesText.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N - taNotesText.setLineWrap(true); - taNotesText.setRows(2); - taNotesText.setWrapStyleWord(true); - jScrollPane2.setViewportView(taNotesText); - - javax.swing.GroupLayout pnExaminerLayout = new javax.swing.GroupLayout(pnExaminer); - pnExaminer.setLayout(pnExaminerLayout); - pnExaminerLayout.setHorizontalGroup( - pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnExaminerLayout.createSequentialGroup() - .addGap(10, 10, 10) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(18, 18, 18) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tfExaminerEmailText) - .addComponent(tfExaminerPhoneText) - .addComponent(tfExaminerNameText) - .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 268, Short.MAX_VALUE)) - .addContainerGap()) - ); - pnExaminerLayout.setVerticalGroup( - pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnExaminerLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbExaminerNameLabel) - .addComponent(tfExaminerNameText)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(tfExaminerEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerEmailLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(tfExaminerPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerPhoneLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbNotesLabel) - .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(0, 0, 0)) - ); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pnOrganization, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnExaminer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(pnOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0) - .addComponent(pnExaminer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0)) - ); - }// //GEN-END:initComponents - - private void comboBoxOrgNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxOrgNameActionPerformed - JComboBox cb = (JComboBox) evt.getSource(); - String orgName = (String) cb.getSelectedItem(); - if (null == orgName || false == comboboxOrganizationActionListenerActive) { - return; - } - - if ("".equals(orgName)) { - selectedOrg = null; - lbPointOfContactNameText.setText(""); - lbPointOfContactEmailText.setText(""); - lbPointOfContactPhoneText.setText(""); - contentChanged = true; - return; - } - - for (EamOrganization org : orgs) { - if (org.getName().equals(orgName)) { - selectedOrg = org; - lbPointOfContactNameText.setText(selectedOrg.getPocName()); - lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); - lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); - contentChanged = true; - return; - } - } - }//GEN-LAST:event_comboBoxOrgNameActionPerformed - - private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnNewOrganizationActionPerformed - ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); - // update the combobox options and org data fields - if (dialog.isChanged()) { - eamCase.setOrg(dialog.getNewOrg()); - loadOrganizationData(); - updateDb(); - validate(); - repaint(); - } - }//GEN-LAST:event_bnNewOrganizationActionPerformed - - private void tfExaminerPhoneTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tfExaminerPhoneTextActionPerformed - // TODO add your handling code here: - }//GEN-LAST:event_tfExaminerPhoneTextActionPerformed - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton bnNewOrganization; - private javax.swing.JComboBox comboBoxOrgName; - private javax.swing.JScrollPane jScrollPane2; - private javax.swing.JLabel lbExaminerEmailLabel; - private javax.swing.JLabel lbExaminerNameLabel; - private javax.swing.JLabel lbExaminerPhoneLabel; - private javax.swing.JLabel lbNotesLabel; - private javax.swing.JLabel lbOrganizationNameLabel; - private javax.swing.JLabel lbPointOfContactEmailLabel; - private javax.swing.JLabel lbPointOfContactEmailText; - private javax.swing.JLabel lbPointOfContactNameLabel; - private javax.swing.JLabel lbPointOfContactNameText; - private javax.swing.JLabel lbPointOfContactPhoneLabel; - private javax.swing.JLabel lbPointOfContactPhoneText; - private javax.swing.JPanel pnExaminer; - private javax.swing.JPanel pnOrganization; - private javax.swing.JTextArea taNotesText; - private javax.swing.JTextField tfExaminerEmailText; - private javax.swing.JTextField tfExaminerNameText; - private javax.swing.JTextField tfExaminerPhoneText; - // End of variables declaration//GEN-END:variables - - private void loadExaminerData() { - tfExaminerNameText.setText(eamCase.getExaminerName()); - tfExaminerEmailText.setText(eamCase.getExaminerEmail()); - tfExaminerPhoneText.setText(eamCase.getExaminerPhone()); - taNotesText.setText(eamCase.getNotes()); - } - - public void saveChanges(){ - updateEamCase(); - updateDb(); - } - - private void loadOrganizationData() { - comboboxOrganizationActionListenerActive = false; // don't fire action listener while loading combobox content - comboBoxOrgName.removeAllItems(); - try { - orgs = dbManager.getOrganizations(); - comboBoxOrgName.addItem(""); // for when a case has a null Org - orgs.forEach((org) -> { - comboBoxOrgName.addItem(org.getName()); - }); - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Failure populating combobox with organizations.", ex); - } - comboboxOrganizationActionListenerActive = true; - - if (!orgs.isEmpty() && null != eamCase.getOrg()) { - selectedOrg = eamCase.getOrg(); - comboBoxOrgName.setSelectedItem(selectedOrg.getName()); - lbPointOfContactNameText.setText(selectedOrg.getPocName()); - lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); - lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); - } else { - comboBoxOrgName.setSelectedItem(""); - lbPointOfContactNameText.setText(""); - lbPointOfContactEmailText.setText(""); - lbPointOfContactPhoneText.setText(""); - } - } - - private void loadData() { - loadExaminerData(); - loadOrganizationData(); - } - - /** - * Save changed value from text fields and text areas into the EamCase - * object. - */ - private void updateEamCase() { - eamCase.setOrg(selectedOrg); - eamCase.setExaminerName(tfExaminerNameText.getText()); - eamCase.setExaminerEmail(tfExaminerEmailText.getText()); - eamCase.setExaminerPhone(tfExaminerPhoneText.getText()); - eamCase.setNotes(taNotesText.getText()); - } - - private void updateDb() { - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - - if (!EamDb.isEnabled()) { - LOGGER.log(Level.SEVERE, "Central repository database not enabled"); // NON-NLS - return; - } - - try { - dbManager.updateCase(eamCase); - } catch (IllegalArgumentException | EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error connecting to central repository database", ex); // NON-NLS - } finally { - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - } - - /** - * Used to listen for changes in text areas/boxes. Let the panel know text - * content has changed. - */ - private class TextBoxChangedListener implements DocumentListener { - - @Override - public void changedUpdate(DocumentEvent e) { - setChanged(); - } - - @Override - public void insertUpdate(DocumentEvent e) { - setChanged(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - setChanged(); - } - - private void setChanged() { - contentChanged = true; - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form index c9c19a90ff..49d525511b 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.form @@ -25,17 +25,13 @@ + - - - - - - - + + @@ -56,9 +52,12 @@ + + +
@@ -312,9 +311,6 @@ - - - @@ -415,5 +411,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index 77b9a63288..37dd9ff5b0 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -105,6 +105,10 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i correlationPropertiesScrollPane = new javax.swing.JScrollPane(); correlationPropertiesTextArea = new javax.swing.JTextArea(); lbCentralRepository = new javax.swing.JLabel(); + organizationPanel = new javax.swing.JPanel(); + manageOrganizationButton = new javax.swing.JButton(); + organizationScrollPane = new javax.swing.JScrollPane(); + organizationTextArea = new javax.swing.JTextArea(); setName(""); // NOI18N @@ -234,11 +238,6 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i tbOops.setFont(tbOops.getFont().deriveFont(tbOops.getFont().getStyle() | java.awt.Font.BOLD, 12)); tbOops.setText(org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.tbOops.text")); // NOI18N tbOops.setBorder(null); - tbOops.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - tbOopsActionPerformed(evt); - } - }); pnCorrelationProperties.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.pnCorrelationProperties.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N pnCorrelationProperties.setPreferredSize(new java.awt.Dimension(674, 93)); @@ -289,6 +288,51 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i org.openide.awt.Mnemonics.setLocalizedText(lbCentralRepository, org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.lbCentralRepository.text")); // NOI18N + organizationPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.organizationPanel.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(manageOrganizationButton, org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.manageOrganizationButton.text")); // NOI18N + manageOrganizationButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + manageOrganizationButtonActionPerformed(evt); + } + }); + + organizationScrollPane.setBorder(null); + + organizationTextArea.setEditable(false); + organizationTextArea.setBackground(new java.awt.Color(240, 240, 240)); + organizationTextArea.setColumns(20); + organizationTextArea.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N + organizationTextArea.setLineWrap(true); + organizationTextArea.setRows(2); + organizationTextArea.setText(org.openide.util.NbBundle.getMessage(GlobalSettingsPanel.class, "GlobalSettingsPanel.organizationTextArea.text")); // NOI18N + organizationTextArea.setWrapStyleWord(true); + organizationTextArea.setBorder(null); + organizationScrollPane.setViewportView(organizationTextArea); + + javax.swing.GroupLayout organizationPanelLayout = new javax.swing.GroupLayout(organizationPanel); + organizationPanel.setLayout(organizationPanelLayout); + organizationPanelLayout.setHorizontalGroup( + organizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(organizationPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(organizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(organizationScrollPane) + .addGroup(organizationPanelLayout.createSequentialGroup() + .addComponent(manageOrganizationButton) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + organizationPanelLayout.setVerticalGroup( + organizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, organizationPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(organizationScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(manageOrganizationButton) + .addGap(8, 8, 8)) + ); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -299,15 +343,13 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i .addComponent(tbOops, javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(organizationPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbCentralRepository, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(pnCorrelationProperties, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(pnTagManagement, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(pnDatabaseConfiguration, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(cbUseCentralRepo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(bnImportDatabase, javax.swing.GroupLayout.Alignment.LEADING)) - .addGap(0, 0, Short.MAX_VALUE))) + .addComponent(cbUseCentralRepo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(bnImportDatabase, javax.swing.GroupLayout.Alignment.LEADING)) .addContainerGap()))) ); layout.setVerticalGroup( @@ -323,9 +365,12 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i .addGap(0, 0, 0) .addComponent(pnCorrelationProperties, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) + .addComponent(organizationPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) .addComponent(tbOops, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) - .addComponent(bnImportDatabase)) + .addComponent(bnImportDatabase) + .addContainerGap()) ); pnTagManagement.getAccessibleContext().setAccessibleName(""); @@ -366,9 +411,9 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); }//GEN-LAST:event_cbUseCentralRepoActionPerformed - private void tbOopsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tbOopsActionPerformed - // TODO add your handling code here: - }//GEN-LAST:event_tbOopsActionPerformed + private void manageOrganizationButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_manageOrganizationButtonActionPerformed + ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); + }//GEN-LAST:event_manageOrganizationButtonActionPerformed @Override @Messages({"GlobalSettingsPanel.validationerrMsg.mustConfigure=Configure the database to enable this module."}) @@ -519,6 +564,9 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i bnManageTags.setEnabled(enable && !ingestRunning); manageTagsTextArea.setEnabled(enable && !ingestRunning); correlationPropertiesTextArea.setEnabled(enable && !ingestRunning); + organizationPanel.setEnabled(enable && !ingestRunning); + organizationTextArea.setEnabled(enable && !ingestRunning); + manageOrganizationButton.setEnabled(enable && !ingestRunning); return true; } @@ -537,8 +585,12 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i private javax.swing.JLabel lbDbNameValue; private javax.swing.JLabel lbDbPlatformTypeLabel; private javax.swing.JLabel lbDbPlatformValue; + private javax.swing.JButton manageOrganizationButton; private javax.swing.JScrollPane manageTagsScrollPane; private javax.swing.JTextArea manageTagsTextArea; + private javax.swing.JPanel organizationPanel; + private javax.swing.JScrollPane organizationScrollPane; + private javax.swing.JTextArea organizationTextArea; private javax.swing.JPanel pnCorrelationProperties; private javax.swing.JPanel pnDatabaseConfiguration; private javax.swing.JPanel pnTagManagement; From c5ec3c7c0190cc2d295858a17369a6b036945aa1 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 13 Oct 2017 15:51:37 -0400 Subject: [PATCH 07/46] 2774 - OptionalCasePropertiesDialog now remembers correct organization by default --- .../casemodule/CaseInformationPanel.java | 12 ++- .../casemodule/CasePropertiesPanel.java | 49 ++++++++++- .../EditOptionalCasePropertiesPanel.form | 3 - .../EditOptionalCasePropertiesPanel.java | 13 +-- .../casemodule/NewCaseWizardPanel2.java | 4 +- .../OptionalCasePropertiesPanel.java | 81 ++++++++++--------- .../ManageOrganizationsDialog.java | 4 +- 7 files changed, 105 insertions(+), 61 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java index 4a26158d7b..0729458103 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java @@ -140,15 +140,18 @@ class CaseInformationPanel extends javax.swing.JPanel { private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed JDialog editCasePropertiesDialog = new JDialog(WindowManager.getDefault().getMainWindow(), "Edit Case Details", true); - EditOptionalCasePropertiesPanel casePropertiesPanel = new EditOptionalCasePropertiesPanel(); - casePropertiesPanel.addCancelButtonAction((ActionEvent e) -> { + EditOptionalCasePropertiesPanel editCasePropertiesPanel = new EditOptionalCasePropertiesPanel(); + editCasePropertiesPanel.addCancelButtonAction((ActionEvent e) -> { editCasePropertiesDialog.setVisible(false); }); - casePropertiesPanel.addSaveButtonAction((ActionEvent e) -> { + editCasePropertiesPanel.addSaveButtonAction((ActionEvent e) -> { editCasePropertiesDialog.setVisible(false); + editCasePropertiesPanel.saveProperties(); + propertiesPanel.updateCaseInfo(); + }); - editCasePropertiesDialog.add(casePropertiesPanel); + editCasePropertiesDialog.add(editCasePropertiesPanel); editCasePropertiesDialog.setResizable(true); editCasePropertiesDialog.pack(); @@ -158,6 +161,7 @@ class CaseInformationPanel extends javax.swing.JPanel { editCasePropertiesDialog.setLocation((int) ((screenDimension.getWidth() - w) / 2), (int) ((screenDimension.getHeight() - h) / 2)); editCasePropertiesDialog.setVisible(true); editCasePropertiesDialog.toFront(); + propertiesPanel.updateCaseInfo(); }//GEN-LAST:event_jButton1ActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index 3c0c82564f..71b2810908 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -19,13 +19,18 @@ package org.sleuthkit.autopsy.casemodule; import java.nio.file.Paths; +import org.openide.util.Exceptions; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; import org.sleuthkit.autopsy.coreutils.Logger; /** * A panel that allows the user to view various properties of a case and change * the display name of the case. */ -class CasePropertiesPanel extends javax.swing.JPanel { +final class CasePropertiesPanel extends javax.swing.JPanel { private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(CasePropertiesPanel.class.getName()); @@ -39,10 +44,10 @@ class CasePropertiesPanel extends javax.swing.JPanel { */ CasePropertiesPanel(Case caseInfo) { initComponents(); - updateCaseInfo(caseInfo); + updateCaseInfo(); } - void updateCaseInfo(Case caseInfo) { + void updateCaseInfo() { theCase = Case.getCurrentCase(); lbCaseNameText.setText(theCase.getDisplayName()); lbCaseNumberText.setText(theCase.getNumber()); @@ -57,12 +62,48 @@ class CasePropertiesPanel extends javax.swing.JPanel { } else { dbNameField.setText(theCase.getMetadata().getCaseDatabaseName()); } + boolean cREnabled = EamDb.isEnabled(); + lbOrganizationNameLabel1.setEnabled(cREnabled); + lbOrganizationNameText.setEnabled(cREnabled); + lbPointOfContactEmailLabel1.setEnabled(cREnabled); + lbPointOfContactEmailText1.setEnabled(cREnabled); + lbPointOfContactNameLabel1.setEnabled(cREnabled); + lbPointOfContactNameText1.setEnabled(cREnabled); + lbPointOfContactPhoneLabel1.setEnabled(cREnabled); + lbPointOfContactPhoneText1.setEnabled(cREnabled); + pnOrganization1.setEnabled(cREnabled); + EamOrganization currentOrg = null; + if (cREnabled) { + try { + EamDb dbManager = EamDb.getInstance(); + if (dbManager != null) { + CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + if (null == correlationCase) { + dbManager.newCase(Case.getCurrentCase()); + correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + } + currentOrg = correlationCase.getOrg(); + } + } catch (EamDbException ex) { + Exceptions.printStackTrace(ex); + } + } + if (currentOrg != null) { + lbOrganizationNameText.setText(currentOrg.getName()); + lbPointOfContactNameText1.setText(currentOrg.getPocName()); + lbPointOfContactPhoneText1.setText(currentOrg.getPocPhone()); + lbPointOfContactEmailText1.setText(currentOrg.getPocEmail()); + } else { + lbOrganizationNameText.setText(""); + lbPointOfContactNameText1.setText(""); + lbPointOfContactPhoneText1.setText(""); + lbPointOfContactEmailText1.setText(""); + } Case.CaseType caseType = theCase.getCaseType(); caseTypeField.setText(caseType.getLocalizedDisplayName()); lbCaseUIDText.setText(theCase.getName()); validate(); repaint(); - System.out.println("repainged CASE PROPS"); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form index a19cf1605f..11278e9ad4 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form @@ -65,9 +65,6 @@ - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java index 08ca101536..e18649fdb2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java @@ -37,6 +37,7 @@ class EditOptionalCasePropertiesPanel extends javax.swing.JPanel { EditOptionalCasePropertiesPanel() { initComponents(); propertiesPanel = new OptionalCasePropertiesPanel(true); + optionsPanel.add(propertiesPanel); optionsPanel.setVisible(true); propertiesPanel.setVisible(true); @@ -60,11 +61,6 @@ class EditOptionalCasePropertiesPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(EditOptionalCasePropertiesPanel.class, "EditOptionalCasePropertiesPanel.cancelButton.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(saveButton, org.openide.util.NbBundle.getMessage(EditOptionalCasePropertiesPanel.class, "EditOptionalCasePropertiesPanel.saveButton.text")); // NOI18N - saveButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - saveButtonActionPerformed(evt); - } - }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -97,10 +93,9 @@ class EditOptionalCasePropertiesPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents - private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed - this.propertiesPanel.saveUpdatedCaseDetails(); - }//GEN-LAST:event_saveButtonActionPerformed - + void saveProperties(){ + this.propertiesPanel.saveUpdatedCaseDetails(); + } /** * Adds an action listener to the Save button of the panel. * diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index 13d2105271..290a10551f 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -46,8 +46,10 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel orgs = null; - private EamDb dbManager; /** * Creates new form OptionalCasePropertiesPanel @@ -50,6 +49,7 @@ class OptionalCasePropertiesPanel extends javax.swing.JPanel { initComponents(); caseDisplayNameLabel.setVisible(false); caseDisplayNameTextField.setVisible(false); + setUpCentralRepoFields(); } OptionalCasePropertiesPanel(boolean editCurrentCase) { @@ -61,26 +61,38 @@ class OptionalCasePropertiesPanel extends javax.swing.JPanel { tfExaminerEmailText.setText(Case.getCurrentCase().getExaminerEmail()); tfExaminerPhoneText.setText(Case.getCurrentCase().getExaminerPhone()); taNotesText.setText(Case.getCurrentCase().getExaminerNotes()); - try { - this.dbManager = EamDb.getInstance(); - if (dbManager != null) { - selectedOrg = dbManager.getCaseByUUID(Case.getCurrentCase().getName()).getOrg(); - } - } catch (EamDbException ex) { - dbManager = null; - } - + setUpOrganizationData(); + } else { + caseDisplayNameLabel.setVisible(false); + caseDisplayNameTextField.setVisible(false); } + setUpCentralRepoFields(); + } + private void setUpOrganizationData() { + if (EamDb.isEnabled()) { + loadOrganizationData(); + Case currentCase = Case.getCurrentCase(); + if (currentCase != null) { + try { + EamDb dbManager = EamDb.getInstance(); + selectedOrg = dbManager.getCaseByUUID(currentCase.getName()).getOrg(); + } catch (EamDbException ex) { + System.out.println("THOWING ON CURRENT CASE " + ex.toString()); + } + } + if (selectedOrg != null) { + System.out.println("SET CURRNETLY SELECTED"); + setCurrentlySelectedOrganization(selectedOrg.getName()); + } else { + System.out.println("CLEAR 1"); + clearOrganization(); + } + } } void setUpCentralRepoFields() { - try { - this.dbManager = EamDb.getInstance(); - } catch (EamDbException ex) { - dbManager = null; - } - boolean cREnabled = (dbManager != null); + boolean cREnabled = EamDb.isEnabled(); comboBoxOrgName.setEnabled(cREnabled); bnNewOrganization.setEnabled(cREnabled); lbPointOfContactNameText.setEnabled(cREnabled); @@ -91,40 +103,29 @@ class OptionalCasePropertiesPanel extends javax.swing.JPanel { lbPointOfContactEmailLabel.setEnabled(cREnabled); lbPointOfContactPhoneLabel.setEnabled(cREnabled); orgainizationPanel.setEnabled(cREnabled); - - if (cREnabled) { - loadOrganizationData(); - } else { - selectedOrg = null; + if (!cREnabled) { + System.out.println("CLEAR 2"); clearOrganization(); } + } private void loadOrganizationData() { - comboBoxOrgName.removeAllItems(); try { - orgs = dbManager.getOrganizations(); comboBoxOrgName.addItem(""); // for when a case has a null Org + EamDb dbManager = EamDb.getInstance(); + orgs = dbManager.getOrganizations(); orgs.forEach((org) -> { comboBoxOrgName.addItem(org.getName()); }); } catch (EamDbException ex) { - selectedOrg = null; - } - - if (null != selectedOrg) { - comboBoxOrgName.setSelectedItem(selectedOrg.getName()); - lbPointOfContactNameText.setText(selectedOrg.getPocName()); - lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); - lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); - } else { - clearOrganization(); + System.out.println("CATCH WHATS?"); } } private void clearOrganization() { - comboBoxOrgName.setSelectedItem(""); + selectedOrg = null; lbPointOfContactNameText.setText(""); lbPointOfContactEmailText.setText(""); lbPointOfContactPhoneText.setText(""); @@ -420,12 +421,10 @@ class OptionalCasePropertiesPanel extends javax.swing.JPanel { if (null == orgName) { return; } - if ("".equals(orgName)) { clearOrganization(); return; } - for (EamOrganization org : orgs) { if (org.getName().equals(orgName)) { selectedOrg = org; @@ -441,8 +440,9 @@ class OptionalCasePropertiesPanel extends javax.swing.JPanel { ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); // update the combobox options and org data fields if (dialog.isChanged()) { - selectedOrg = dialog.getNewOrg(); loadOrganizationData(); + selectedOrg = dialog.getNewOrg(); + setCurrentlySelectedOrganization(dialog.getNewOrg().getName()); validate(); repaint(); } @@ -456,6 +456,10 @@ class OptionalCasePropertiesPanel extends javax.swing.JPanel { } } + void setCurrentlySelectedOrganization(String orgName) { + comboBoxOrgName.setSelectedItem(orgName); + } + void saveUpdatedCaseDetails() { updateCaseName(); updateCaseNumber(); @@ -490,6 +494,7 @@ class OptionalCasePropertiesPanel extends javax.swing.JPanel { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (EamDb.isEnabled()) { try { + EamDb dbManager = EamDb.getInstance(); CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); if (caseDisplayNameTextField.isVisible()) { correlationCase.setDisplayName(caseDisplayNameTextField.getText()); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java index ab1c033e54..763d358889 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java @@ -27,6 +27,8 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; */ public class ManageOrganizationsDialog extends JDialog { + private static final long serialVersionUID = 1L; + private EamDb dbManager; private EamOrganization newOrg; private final DefaultListModel rulesListModel = new DefaultListModel<>(); @@ -43,7 +45,6 @@ public class ManageOrganizationsDialog extends JDialog { this.dbManager = EamDb.getInstance(); jList1.setCellRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = 1L; - @Override public Component getListCellRendererComponent(javax.swing.JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); @@ -58,7 +59,6 @@ public class ManageOrganizationsDialog extends JDialog { } catch (EamDbException ex) { Exceptions.printStackTrace(ex); } - display(); } From 560fb28dce93f8c761f1e6fb19aa85261b6cec59 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 13 Oct 2017 17:26:32 -0400 Subject: [PATCH 08/46] 2774 combine examiner details, case number, and display name into caseDetails --- .../sleuthkit/autopsy/casemodule/Case.java | 74 +++++---------- .../autopsy/casemodule/CaseDetails.java | 94 +++++++++++++++++++ .../autopsy/casemodule/CaseMetadata.java | 90 +++++++----------- .../autopsy/casemodule/Examiner.java | 72 -------------- .../casemodule/NewCaseVisualPanel2.java | 16 +++- .../casemodule/NewCaseWizardAction.java | 7 +- .../casemodule/NewCaseWizardPanel2.java | 5 +- .../OptionalCasePropertiesPanel.java | 46 +++++---- .../casemodule/SingleUserCaseConverter.java | 7 +- .../SampleExecutableIngestModuleFactory.java | 79 ---------------- .../ingest/IngestModuleFactoryLoader.java | 5 +- 11 files changed, 205 insertions(+), 290 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java delete mode 100644 Core/src/org/sleuthkit/autopsy/casemodule/Examiner.java delete mode 100755 Core/src/org/sleuthkit/autopsy/examples/SampleExecutableIngestModuleFactory.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index a9f7187f0c..29b0718139 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -479,7 +479,7 @@ public class Case { * @throws CaseActionCancelledException If creating the case is cancelled. */ public static void createAsCurrentCase(String caseDir, String caseDisplayName, String caseNumber, String examiner, CaseType caseType) throws CaseActionException, CaseActionCancelledException { - createAsCurrentCase(caseDir, caseDisplayName, caseNumber, new Examiner(examiner, "", "", ""), caseType); + createAsCurrentCase(caseDir, new CaseDetails(caseDisplayName, caseNumber, examiner, "", "", ""), caseType); } /** @@ -488,15 +488,14 @@ public class Case { * IMPORTANT: This method should not be called in the event dispatch thread * (EDT). * - * @param caseDir The full path of the case directory. The directory - * will be created if it doesn't already exist; if it - * exists, it is ASSUMED it was created by calling - * createCaseDirectory. - * @param caseDisplayName The display name of case, which may be changed - * later by the user. - * @param caseNumber The case number, can be the empty string. - * @param examiner The examiner to associate with the case. - * @param caseType The type of case (single-user or multi-user). + * @param caseDir The full path of the case directory. The directory + * will be created if it doesn't already exist; if it + * exists, it is ASSUMED it was created by calling + * createCaseDirectory. + * @param caseDetails Contains the modifiable details of the case such as + * the case display name, the case number, and the + * examiner related data. + * @param caseType The type of case (single-user or multi-user). * * @throws CaseActionException If there is a problem creating the * case. @@ -506,14 +505,14 @@ public class Case { "Case.exceptionMessage.emptyCaseName=Must specify a case name.", "Case.exceptionMessage.emptyCaseDir=Must specify a case directory path." }) - public static void createAsCurrentCase(String caseDir, String caseDisplayName, String caseNumber, Examiner examiner, CaseType caseType) throws CaseActionException, CaseActionCancelledException { - if (caseDisplayName.isEmpty()) { + public static void createAsCurrentCase(String caseDir, CaseDetails caseDetails, CaseType caseType) throws CaseActionException, CaseActionCancelledException { + if (caseDetails.getCaseDisplayName().isEmpty()) { throw new CaseActionException(Bundle.Case_exceptionMessage_emptyCaseName()); } if (caseDir.isEmpty()) { throw new CaseActionException(Bundle.Case_exceptionMessage_emptyCaseDir()); } - openAsCurrentCase(new Case(caseType, caseDir, caseDisplayName, caseNumber, examiner), true); + openAsCurrentCase(new Case(caseType, caseDir, caseDetails), true); } /** @@ -1188,7 +1187,7 @@ public class Case { * @return The examiner name. */ public String getExaminer() { - return metadata.getExaminer().getName(); + return metadata.getExaminer(); } /** @@ -1197,7 +1196,7 @@ public class Case { * @return The examiner phone number. */ public String getExaminerPhone() { - return metadata.getExaminer().getPhone(); + return metadata.getExaminerPhone(); } /** @@ -1206,7 +1205,7 @@ public class Case { * @return The examiner email address. */ public String getExaminerEmail() { - return metadata.getExaminer().getEmail(); + return metadata.getExaminerEmail(); } /** @@ -1215,7 +1214,7 @@ public class Case { * @return The examiner notes. */ public String getExaminerNotes() { - return metadata.getExaminer().getNotes(); + return metadata.getExaminerNotes(); } /** @@ -1542,21 +1541,21 @@ public class Case { * @throws org.sleuthkit.autopsy.casemodule.CaseActionException */ @Messages({ - "Case.exceptionMessage.metadataUpdateError=Failed to update case metadata, cannot change case display name." + "Case.exceptionMessage.metadataUpdateError=Failed to update case metadata" }) - void updateDisplayName(String newDisplayName) throws CaseActionException { + void updateCaseDetails(CaseDetails caseDetails) throws CaseActionException { String oldDisplayName = metadata.getCaseDisplayName(); try { - metadata.setCaseDisplayName(newDisplayName); + metadata.setCaseDetails(caseDetails); } catch (CaseMetadataException ex) { - throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError()); + throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError(), ex); } - eventPublisher.publish(new AutopsyEvent(Events.NAME.toString(), oldDisplayName, newDisplayName)); + eventPublisher.publish(new AutopsyEvent(Events.NAME.toString(), oldDisplayName, caseDetails.getCaseDisplayName())); if (RuntimeProperties.runningWithGUI()) { SwingUtilities.invokeLater(() -> { - mainFrame.setTitle(newDisplayName + " - " + UserPreferences.getAppName()); + mainFrame.setTitle(caseDetails.getCaseDisplayName() + " - " + UserPreferences.getAppName()); try { - RecentCases.getInstance().updateRecentCase(oldDisplayName, metadata.getFilePath().toString(), newDisplayName, metadata.getFilePath().toString()); + RecentCases.getInstance().updateRecentCase(oldDisplayName, metadata.getFilePath().toString(), caseDetails.getCaseDisplayName(), metadata.getFilePath().toString()); } catch (Exception ex) { logger.log(Level.SEVERE, "Error updating case name in UI", ex); //NON-NLS } @@ -1564,30 +1563,7 @@ public class Case { } } - void updateCaseNumber(String newCaseNumber) throws CaseActionException { - String oldCaseNumber = metadata.getCaseNumber(); - try { - metadata.setCaseNumber(newCaseNumber); - } catch (CaseMetadataException ex) { - throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError()); - } - } - /** - * Update the examiner details associated with the case. - * - * @param newExaminer the new examiner for the case - * - * @throws CaseActionException - */ - void updateExaminer(Examiner newExaminer) throws CaseActionException { - Examiner oldExaminer = metadata.getExaminer(); - try { - metadata.setExaminer(newExaminer); - } catch (CaseMetadataException ex) { - throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError()); - } - } /** * Constructs a Case object for a new Autopsy case. @@ -1603,8 +1579,8 @@ public class Case { * @param examiner The examiner to associate with the case, can be * the empty string. */ - private Case(CaseType caseType, String caseDir, String caseDisplayName, String caseNumber, Examiner examiner) { - metadata = new CaseMetadata(caseDir, caseType, displayNameToUniqueName(caseDisplayName), caseDisplayName, caseNumber, examiner); + private Case(CaseType caseType, String caseDir, CaseDetails caseDetails) { + metadata = new CaseMetadata(caseDir, caseType, displayNameToUniqueName(caseDetails.getCaseDisplayName()), caseDetails); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java new file mode 100644 index 0000000000..fdef671c5c --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java @@ -0,0 +1,94 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.casemodule; + +/** + * Wrapper to contain the modifiable details of a case, such as case display + * name, case number, and examiner related fields. + */ +class CaseDetails { + + private final String caseDisplayName; + private final String caseNumber; + private final String examinerName; + private final String examinerPhone; + private final String examinerEmail; + private final String examinerNotes; + + CaseDetails(String displayName, String number, String exName, String exPhone, String exEmail, String exNotes) { + caseDisplayName = displayName; + caseNumber = number; + examinerName = exName; + examinerPhone = exPhone; + examinerEmail = exEmail; + examinerNotes = exNotes; + } + + /** + * Get the case display name + * @return caseDisplayName - the display name of the case + */ + String getCaseDisplayName(){ + return caseDisplayName; + } + + /** + * Get the case number + * @return caseNumber - the optional number assiciated with the case + */ + String getCaseNumber(){ + return caseNumber; + } + + /** + * Get the examiner name + * + * @return name - the name associated with the examiner + */ + String getExaminerName() { + return examinerName; + } + + /** + * Get the examiner phone number + * + * @return phone - the phone number associated with the examiner + */ + String getExaminerPhone() { + return examinerPhone; + } + + /** + * Get the examiner email address + * + * @return email - the email address associated with the examiner + */ + String getExaminerEmail() { + return examinerEmail; + } + + /** + * Get the examiner notes + * + * @return notes - the note asssociated with the examiner + */ + String getExaminerNotes() { + return examinerNotes; + } +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java index a7c21c4830..0755caa08f 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java @@ -99,9 +99,7 @@ public final class CaseMetadata { private final Path metadataFilePath; private Case.CaseType caseType; private String caseName; - private String caseDisplayName; - private String caseNumber; - private Examiner examiner; + private CaseDetails caseDetails; private String caseDatabaseName; private String caseDatabasePath; // Legacy private String textIndexName; // Legacy @@ -130,13 +128,11 @@ public final class CaseMetadata { * @param caseNumber The case number. * @param examiner The name of the case examiner. */ - CaseMetadata(String caseDirectory, Case.CaseType caseType, String caseName, String caseDisplayName, String caseNumber, Examiner examiner) { - metadataFilePath = Paths.get(caseDirectory, caseDisplayName + FILE_EXTENSION); + CaseMetadata(String caseDirectory, Case.CaseType caseType, String caseName, CaseDetails caseDetails) { + metadataFilePath = Paths.get(caseDirectory, caseDetails.getCaseDisplayName() + FILE_EXTENSION); this.caseType = caseType; this.caseName = caseName; - this.caseDisplayName = caseDisplayName; - this.caseNumber = caseNumber; - this.examiner = examiner; + this.caseDetails = caseDetails; caseDatabaseName = ""; caseDatabasePath = ""; textIndexName = ""; @@ -200,26 +196,20 @@ public final class CaseMetadata { * @return The case display name. */ public String getCaseDisplayName() { - return caseDisplayName; + return caseDetails.getCaseDisplayName(); } - /** - * Sets the case display name. - * - * @param caseDisplayName A case display name. - * - * @throws CaseMetadataException If the operation fails. - */ - void setCaseDisplayName(String caseDisplayName) throws CaseMetadataException { - String oldCaseDisplayName = this.caseDisplayName; - this.caseDisplayName = caseDisplayName; + void setCaseDetails(CaseDetails newCaseDetails) throws CaseMetadataException{ + CaseDetails oldCaseDetails = this.caseDetails; + this.caseDetails = newCaseDetails; try { - writeToFile(); + writeToFile(); } catch (CaseMetadataException ex) { - this.caseDisplayName = oldCaseDisplayName; + this.caseDetails = oldCaseDetails; throw ex; } } + /** * Gets the case number. @@ -227,18 +217,7 @@ public final class CaseMetadata { * @return The case number, may be empty. */ public String getCaseNumber() { - return caseNumber; - } - - void setCaseNumber(String newCaseNumber) throws CaseMetadataException { - String oldCaseNumber = this.caseNumber; - this.caseNumber = newCaseNumber; - try { - writeToFile(); - } catch (CaseMetadataException ex) { - this.caseNumber = oldCaseNumber; - throw ex; - } + return caseDetails.getCaseNumber(); } /** @@ -246,19 +225,20 @@ public final class CaseMetadata { * * @return The examiner, may be empty. */ - public Examiner getExaminer() { - return examiner; + public String getExaminer() { + return caseDetails.getExaminerName(); } - void setExaminer(Examiner newExaminer) throws CaseMetadataException { - Examiner oldExaminer = this.examiner; - this.examiner = newExaminer; - try { - writeToFile(); - } catch (CaseMetadataException ex) { - this.examiner = oldExaminer; - throw ex; - } + public String getExaminerPhone() { + return caseDetails.getExaminerPhone(); + } + + public String getExaminerEmail() { + return caseDetails.getExaminerEmail(); + } + + public String getExaminerNotes() { + return caseDetails.getExaminerNotes(); } /** @@ -414,12 +394,12 @@ public final class CaseMetadata { * Create the children of the case element. */ createChildElement(doc, caseElement, CASE_NAME_ELEMENT_NAME, caseName); - createChildElement(doc, caseElement, CASE_DISPLAY_NAME_ELEMENT_NAME, caseDisplayName); - createChildElement(doc, caseElement, CASE_NUMBER_ELEMENT_NAME, caseNumber); - createChildElement(doc, caseElement, EXAMINER_ELEMENT_NAME, examiner.getName()); - createChildElement(doc, caseElement, EXAMINER_ELEMENT_PHONE, examiner.getPhone()); - createChildElement(doc, caseElement, EXAMINER_ELEMENT_EMAIL, examiner.getEmail()); - createChildElement(doc, caseElement, EXAMINER_ELEMENT_NOTES, examiner.getNotes()); + createChildElement(doc, caseElement, CASE_DISPLAY_NAME_ELEMENT_NAME, caseDetails.getCaseDisplayName()); + createChildElement(doc, caseElement, CASE_NUMBER_ELEMENT_NAME, caseDetails.getCaseNumber()); + createChildElement(doc, caseElement, EXAMINER_ELEMENT_NAME, caseDetails.getExaminerName()); + createChildElement(doc, caseElement, EXAMINER_ELEMENT_PHONE, caseDetails.getExaminerPhone()); + createChildElement(doc, caseElement, EXAMINER_ELEMENT_EMAIL, caseDetails.getExaminerEmail()); + createChildElement(doc, caseElement, EXAMINER_ELEMENT_NOTES, caseDetails.getExaminerNotes()); createChildElement(doc, caseElement, CASE_TYPE_ELEMENT_NAME, caseType.toString()); createChildElement(doc, caseElement, CASE_DB_ABSOLUTE_PATH_ELEMENT_NAME, caseDatabasePath); createChildElement(doc, caseElement, CASE_DB_NAME_RELATIVE_ELEMENT_NAME, caseDatabaseName); @@ -480,12 +460,14 @@ public final class CaseMetadata { } Element caseElement = (Element) caseElements.item(0); this.caseName = getElementTextContent(caseElement, CASE_NAME_ELEMENT_NAME, true); + String caseDisplayName; + String caseNumber; if (schemaVersion.equals(SCHEMA_VERSION_ONE) || schemaVersion.equals(SCHEMA_VERSION_TWO)) { - this.caseDisplayName = caseName; + caseDisplayName = caseName; } else { - this.caseDisplayName = getElementTextContent(caseElement, CASE_DISPLAY_NAME_ELEMENT_NAME, true); + caseDisplayName = getElementTextContent(caseElement, CASE_DISPLAY_NAME_ELEMENT_NAME, true); } - this.caseNumber = getElementTextContent(caseElement, CASE_NUMBER_ELEMENT_NAME, false); + caseNumber = getElementTextContent(caseElement, CASE_NUMBER_ELEMENT_NAME, false); String examinerName = getElementTextContent(caseElement, EXAMINER_ELEMENT_NAME, false); String examinerPhone; String examinerEmail; @@ -499,7 +481,7 @@ public final class CaseMetadata { examinerEmail = ""; examinerNotes = ""; } - this.examiner = new Examiner(examinerName, examinerPhone, examinerEmail, examinerNotes); + this.caseDetails = new CaseDetails(caseDisplayName, caseNumber, examinerName, examinerPhone, examinerEmail, examinerNotes); this.caseType = Case.CaseType.fromString(getElementTextContent(caseElement, CASE_TYPE_ELEMENT_NAME, true)); if (null == this.caseType) { throw new CaseMetadataException("Case metadata file corrupted"); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Examiner.java b/Core/src/org/sleuthkit/autopsy/casemodule/Examiner.java deleted file mode 100644 index 97d53f340c..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Examiner.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2017 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.casemodule; - -/** - * Wrapper to contain the details associated with an Examiner - */ -class Examiner { - private final String name; - private final String phone; - private final String email; - private final String notes; - - Examiner(String exName, String exPhone, String exEmail, String exNotes){ - name = exName; - phone = exPhone; - email = exEmail; - notes = exNotes; - } - - /** - * Get the examiner name - * - * @return name - the name associated with the examiner - */ - String getName() { - return name; - } - - /** - * Get the examiner phone number - * - * @return phone - the phone number associated with the examiner - */ - String getPhone() { - return phone; - } - - /** - * Get the examiner email address - * - * @return email - the email address associated with the examiner - */ - String getEmail() { - return email; - } - - /** - * Get the examiner notes - * - * @return notes - the note asssociated with the examiner - */ - String getNotes() { - return notes; - } -} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index 6009b20cee..f5467c7f35 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -107,8 +107,20 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { return propertiesPanel.getCaseNumber(); } - Examiner getExaminer() { - return propertiesPanel.getExaminer(); + String getExaminerName() { + return propertiesPanel.getExaminerName(); + } + + String getExaminerPhone() { + return propertiesPanel.getExaminerPhone(); + } + + String getExaminerEmail() { + return propertiesPanel.getExaminerEmail(); + } + + String getExaminerNotes() { + return propertiesPanel.getExaminerNotes(); } String getOrganization() { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index f21b40b092..554295b497 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -79,12 +79,15 @@ final class NewCaseWizardAction extends CallableSystemAction { @Override protected Void doInBackground() throws Exception { String caseNumber = (String) wizardDescriptor.getProperty("caseNumber"); //NON-NLS - Examiner examiner = (Examiner) wizardDescriptor.getProperty("caseExaminer"); //NON-NLS + String examinerName = (String) wizardDescriptor.getProperty("caseExaminerName"); //NON-NLS + String examinerPhone = (String) wizardDescriptor.getProperty("caseExaminerPhone"); //NON-NLS + String examinerEmail = (String) wizardDescriptor.getProperty("caseExaminerEmail"); //NON-NLS + String examinerNotes = (String) wizardDescriptor.getProperty("caseExaminerNotes"); //NON-NLS String organizationName = (String) wizardDescriptor.getProperty("caseOrganization"); //NON-NLS final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS CaseType caseType = CaseType.values()[(int) wizardDescriptor.getProperty("caseType")]; //NON-NLS - Case.createAsCurrentCase(createdDirectory, caseName, caseNumber, examiner, caseType); + Case.createAsCurrentCase(createdDirectory, new CaseDetails(caseName, caseNumber, examinerName, examinerPhone, examinerEmail, examinerNotes), caseType); if (EamDb.isEnabled()) { try { EamDb dbManager = EamDb.getInstance(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index 290a10551f..f16ddbdba6 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -141,7 +141,10 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel sleuthkit [dot] org] - * - * This is free and unencumbered software released into the public domain. - * - * Anyone is free to copy, modify, publish, use, compile, sell, or - * distribute this software, either in source code form or as a compiled - * binary, for any purpose, commercial or non-commercial, and by any - * means. - * - * In jurisdictions that recognize copyright laws, the author or authors - * of this software dedicate any and all copyright interest in the - * software to the public domain. We make this dedication for the benefit - * of the public at large and to the detriment of our heirs and - * successors. We intend this dedication to be an overt act of - * relinquishment in perpetuity of all present and future rights to this - * software under copyright law. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ -package org.sleuthkit.autopsy.examples; - -import org.openide.util.NbBundle; -import org.openide.util.lookup.ServiceProvider; -import static org.sleuthkit.autopsy.examples.SampleIngestModuleFactory.getModuleName; -import org.sleuthkit.autopsy.ingest.DataSourceIngestModule; -import org.sleuthkit.autopsy.ingest.IngestModuleFactory; -import org.sleuthkit.autopsy.ingest.IngestModuleFactoryAdapter; -import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; - -/** - * A factory that creates sample executable data source ingest modules. - */ -@ServiceProvider(service = IngestModuleFactory.class) // Sample is discarded at runtime -public class SampleExecutableIngestModuleFactory extends IngestModuleFactoryAdapter { - - private static final String VERSION_NUMBER = "1.0.0"; - - // This class method allows the ingest module instances created by this - // factory to use the same display name that is provided to the Autopsy - // ingest framework by the factory. - static String getModuleName() { - return NbBundle.getMessage(SampleIngestModuleFactory.class, "SampleExecutableIngestModuleFactory.moduleName"); - } - - @Override - public String getModuleDisplayName() { - return getModuleName(); - } - - @Override - public String getModuleDescription() { - return NbBundle.getMessage(SampleIngestModuleFactory.class, "SampleExecutableIngestModuleFactory.moduleDescription"); - } - - @Override - public String getModuleVersionNumber() { - return VERSION_NUMBER; - } - - @Override - public boolean isDataSourceIngestModuleFactory() { - return true; - } - - @Override - public DataSourceIngestModule createDataSourceIngestModule(IngestModuleIngestJobSettings ingestOptions) { - return new SampleExecutableDataSourceIngestModule(); - } -} diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java index e338b79805..3d2c66deb9 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryLoader.java @@ -29,7 +29,6 @@ import org.openide.NotifyDescriptor; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.examples.SampleExecutableIngestModuleFactory; import org.sleuthkit.autopsy.examples.SampleIngestModuleFactory; import org.sleuthkit.autopsy.modules.e01verify.E01VerifierModuleFactory; import org.sleuthkit.autopsy.modules.exif.ExifParserModuleFactory; @@ -48,7 +47,6 @@ final class IngestModuleFactoryLoader { private static final Logger logger = Logger.getLogger(IngestModuleFactoryLoader.class.getName()); private static final String SAMPLE_MODULE_FACTORY_CLASS_NAME = SampleIngestModuleFactory.class.getCanonicalName(); - private static final String SAMPLE_EXECUTABLE_MODULE_FACTORY_CLASS_NAME = SampleExecutableIngestModuleFactory.class.getCanonicalName(); private static final ArrayList coreModuleOrdering = new ArrayList() { { // The ordering of the core ingest module factories implemented @@ -141,8 +139,7 @@ final class IngestModuleFactoryLoader { private static void addFactory(IngestModuleFactory factory, HashSet moduleDisplayNames, HashMap javaFactoriesByClass) { // Ignore the sample ingest module factories implemented in Java. String className = factory.getClass().getCanonicalName(); - if (className.equals(IngestModuleFactoryLoader.SAMPLE_MODULE_FACTORY_CLASS_NAME) - || className.equals(IngestModuleFactoryLoader.SAMPLE_EXECUTABLE_MODULE_FACTORY_CLASS_NAME)) { + if (className.equals(IngestModuleFactoryLoader.SAMPLE_MODULE_FACTORY_CLASS_NAME)) { return; } From a2c448c06f41599c07e2cfac0af66a9921ffe24d Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 16 Oct 2017 13:32:38 -0400 Subject: [PATCH 09/46] 2774 changed all new static text for managing organizations to @messages --- .../autopsy/casemodule/Bundle.properties | 42 -- .../autopsy/casemodule/CaseDetails.java | 2 +- .../casemodule/CaseInformationPanel.form | 16 +- .../casemodule/CaseInformationPanel.java | 36 +- .../casemodule/CasePropertiesAction.java | 1 - .../casemodule/CasePropertiesPanel.form | 93 +-- .../casemodule/CasePropertiesPanel.java | 236 +++---- .../EditOptionalCasePropertiesPanel.form | 4 +- .../EditOptionalCasePropertiesPanel.java | 15 +- .../casemodule/NewCaseWizardAction.java | 6 +- .../OptionalCasePropertiesPanel.form | 27 +- .../OptionalCasePropertiesPanel.java | 54 +- .../actions/Bundle.properties | 37 -- .../actions/EamCaseEditDetailsDialog.form | 456 ------------- .../actions/EamCaseEditDetailsDialog.java | 602 ------------------ .../datamodel/AbstractSqlEamDb.java | 1 - .../eventlisteners/CaseEventListener.java | 71 --- .../eventlisteners/Installer.java | 1 - .../AddNewOrganizationDialog.java | 1 + .../optionspanel/Bundle.properties | 32 +- .../optionspanel/GlobalSettingsPanel.java | 18 +- .../ManageOrganizationsDialog.form | 136 ++-- .../ManageOrganizationsDialog.java | 347 +++++----- 23 files changed, 482 insertions(+), 1752 deletions(-) delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 2728c1cd2a..58c1aeacee 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -212,48 +212,6 @@ CasePropertiesPanel.lbDbName.text=Database Name: CasePropertiesPanel.lbDbType.text=Case Type: CasePropertiesPanel.caseNumberLabel.text=Case Number: LocalDiskPanel.changeDatabasePathCheckbox.text=Update case to use VHD file upon completion -CasePropertiesPanel.lbCaseUUIDLabel.text=Case UUID: -CentralRepoCaseOptionsPanel.pnOrganization.border.title=Organization -CentralRepoCaseOptionsPanel.pnExaminer.border.title=Examiner Details -CentralRepoCaseOptionsPanel.bnNewOrganization.text=Manage Organizations -CentralRepoCaseOptionsPanel.lbNotesLabel.text=Notes: -CentralRepoCaseOptionsPanel.lbPointOfContactPhoneLabel.text=Phone: -CentralRepoCaseOptionsPanel.lbExaminerPhoneLabel.text=Phone: -CentralRepoCaseOptionsPanel.lbPointOfContactEmailLabel.text=Email: -CentralRepoCaseOptionsPanel.lbPointOfContactNameLabel.text=Point of Contact: -CentralRepoCaseOptionsPanel.lbExaminerEmailLabel.text=Email: -CentralRepoCaseOptionsPanel.lbOrganizationNameLabel.text=Organization Name: -CentralRepoCaseOptionsPanel.lbExaminerNameLabel.text=Name: -CasePropertiesPanel.casePanel.border.title=Case -CasePropertiesPanel.examinerLabel.text=Name: -CasePropertiesPanel.lbExaminerPhoneLabel.text=Phone: -CasePropertiesPanel.lbExaminerEmailLabel.text=Email: -CasePropertiesPanel.lbNotesLabel.text=Notes: -CasePropertiesPanel.examinerPanel.border.title=Examiner -CasePropertiesPanel.lbOrganizationNameLabel1.text=Name: -CasePropertiesPanel.pnOrganization1.border.title=Organization -CasePropertiesPanel.lbPointOfContactPhoneLabel1.text=Phone: -CasePropertiesPanel.lbPointOfContactEmailLabel1.text=Email: -CasePropertiesPanel.lbPointOfContactNameLabel1.text=Point of Contact: -CaseInformationPanel.jButton1.text=Edit -OptionalCasePropertiesPanel.lbPointOfContactEmailLabel.text=Email: -OptionalCasePropertiesPanel.lbOrganizationNameLabel.text=Name: -OptionalCasePropertiesPanel.bnNewOrganization.text=Manage Organizations -OptionalCasePropertiesPanel.lbPointOfContactNameLabel.text=Point of Contact: -OptionalCasePropertiesPanel.lbPointOfContactPhoneLabel.text=Phone: -OptionalCasePropertiesPanel.orgainizationPanel.border.title=Organization -OptionalCasePropertiesPanel.lbNotesLabel.text=Notes: -OptionalCasePropertiesPanel.examinerLabel.text=Name: -OptionalCasePropertiesPanel.lbExaminerEmailLabel.text=Email: -OptionalCasePropertiesPanel.examinerTextField.text= -OptionalCasePropertiesPanel.lbExaminerPhoneLabel.text=Phone: -OptionalCasePropertiesPanel.examinerPanel.border.title=Examiner -OptionalCasePropertiesPanel.caseNumberTextField.text= -OptionalCasePropertiesPanel.caseNumberLabel.text=Number: -OptionalCasePropertiesPanel.casePanel.border.title=Case -EditOptionalCasePropertiesPanel.saveButton.text=Save -EditOptionalCasePropertiesPanel.cancelButton.text=Cancel -OptionalCasePropertiesPanel.caseDisplayNameLabel.text=Name: CueBannerPanel.openAutoIngestCaseButton.text= CueBannerPanel.openExistingCaseButton.text= CueBannerPanel.openRecentCaseButton.text= diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java index fdef671c5c..2ea2639b8d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java @@ -22,7 +22,7 @@ package org.sleuthkit.autopsy.casemodule; * Wrapper to contain the modifiable details of a case, such as case display * name, case number, and examiner related fields. */ -class CaseDetails { +final class CaseDetails { private final String caseDisplayName; private final String caseNumber; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form index 58550c6604..5594196e1b 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form @@ -36,12 +36,10 @@ - + + - - - - + @@ -52,7 +50,7 @@ - + @@ -76,14 +74,14 @@ - + - + - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java index 0729458103..36e389da16 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java @@ -47,8 +47,10 @@ class CaseInformationPanel extends javax.swing.JPanel { } @Messages({ - "CaseInformationPanel.caseDetails.header=Case Details", - "CaseInformationPanel.ingestJobInfo.header=Ingest History" + "CaseInformationPanel.caseDetails.header=Details", + "CaseInformationPanel.ingestJobInfo.header=Ingest History", + "CaseInformationPanel.editDetailsButton.text=Edit Details", + "CaseInformationPanel.editDetailsDialog.title=Edit Case Details" }) private void customizeComponents() { propertiesPanel = new CasePropertiesPanel(Case.getCurrentCase()); @@ -84,16 +86,16 @@ class CaseInformationPanel extends javax.swing.JPanel { outerDetailsPanel = new javax.swing.JPanel(); tabbedPane = new javax.swing.JTabbedPane(); closeButton = new javax.swing.JButton(); - jButton1 = new javax.swing.JButton(); + editDetailsButton = new javax.swing.JButton(); tabbedPane.setPreferredSize(new java.awt.Dimension(420, 200)); org.openide.awt.Mnemonics.setLocalizedText(closeButton, org.openide.util.NbBundle.getMessage(CaseInformationPanel.class, "CaseInformationPanel.closeButton.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(CaseInformationPanel.class, "CaseInformationPanel.jButton1.text")); // NOI18N - jButton1.addActionListener(new java.awt.event.ActionListener() { + org.openide.awt.Mnemonics.setLocalizedText(editDetailsButton, org.openide.util.NbBundle.getMessage(CaseInformationPanel.class, "CaseInformationPanel.editDetailsButton.text")); // NOI18N + editDetailsButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton1ActionPerformed(evt); + editDetailsButtonActionPerformed(evt); } }); @@ -102,15 +104,13 @@ class CaseInformationPanel extends javax.swing.JPanel { outerDetailsPanelLayout.setHorizontalGroup( outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 709, Short.MAX_VALUE) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, outerDetailsPanelLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(closeButton) - .addGap(5, 5, 5)) + .addGroup(outerDetailsPanelLayout.createSequentialGroup() + .addComponent(editDetailsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(closeButton)) ); - outerDetailsPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {closeButton, jButton1}); + outerDetailsPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {closeButton, editDetailsButton}); outerDetailsPanelLayout.setVerticalGroup( outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -119,7 +119,7 @@ class CaseInformationPanel extends javax.swing.JPanel { .addGap(0, 0, 0) .addGroup(outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(closeButton) - .addComponent(jButton1)) + .addComponent(editDetailsButton)) .addGap(5, 5, 5)) ); @@ -138,8 +138,8 @@ class CaseInformationPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents - private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed - JDialog editCasePropertiesDialog = new JDialog(WindowManager.getDefault().getMainWindow(), "Edit Case Details", true); + private void editDetailsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editDetailsButtonActionPerformed + JDialog editCasePropertiesDialog = new JDialog(WindowManager.getDefault().getMainWindow(), Bundle.CaseInformationPanel_editDetailsDialog_title(), true); EditOptionalCasePropertiesPanel editCasePropertiesPanel = new EditOptionalCasePropertiesPanel(); editCasePropertiesPanel.addCancelButtonAction((ActionEvent e) -> { editCasePropertiesDialog.setVisible(false); @@ -162,11 +162,11 @@ class CaseInformationPanel extends javax.swing.JPanel { editCasePropertiesDialog.setVisible(true); editCasePropertiesDialog.toFront(); propertiesPanel.updateCaseInfo(); - }//GEN-LAST:event_jButton1ActionPerformed + }//GEN-LAST:event_editDetailsButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton closeButton; - private javax.swing.JButton jButton1; + private javax.swing.JButton editDetailsButton; private javax.swing.JPanel outerDetailsPanel; private javax.swing.JTabbedPane tabbedPane; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java index dd4a39c70d..886ea011b7 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesAction.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.casemodule; -import java.awt.Dialog; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form index 50f83be13c..af33a55a3b 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form @@ -61,7 +61,7 @@ - + @@ -74,7 +74,7 @@ - + @@ -416,13 +416,13 @@ - - + + - - + + @@ -544,12 +544,12 @@ - + - + @@ -559,24 +559,31 @@ - - + + - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - @@ -585,23 +592,23 @@ - + - - - - - - - + + - - + + + + + + + @@ -609,10 +616,10 @@ - + - + @@ -625,17 +632,17 @@ - + - + - + - + @@ -648,10 +655,10 @@ - + - + @@ -664,11 +671,11 @@ - + - + - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index 71b2810908..c90a0d939c 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.casemodule; import java.nio.file.Paths; import org.openide.util.Exceptions; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; @@ -63,15 +64,15 @@ final class CasePropertiesPanel extends javax.swing.JPanel { dbNameField.setText(theCase.getMetadata().getCaseDatabaseName()); } boolean cREnabled = EamDb.isEnabled(); - lbOrganizationNameLabel1.setEnabled(cREnabled); + lbOrganizationNameLabel.setEnabled(cREnabled); lbOrganizationNameText.setEnabled(cREnabled); - lbPointOfContactEmailLabel1.setEnabled(cREnabled); - lbPointOfContactEmailText1.setEnabled(cREnabled); - lbPointOfContactNameLabel1.setEnabled(cREnabled); - lbPointOfContactNameText1.setEnabled(cREnabled); - lbPointOfContactPhoneLabel1.setEnabled(cREnabled); - lbPointOfContactPhoneText1.setEnabled(cREnabled); - pnOrganization1.setEnabled(cREnabled); + lbPointOfContactEmailLabel.setEnabled(cREnabled); + lbPointOfContactEmailText.setEnabled(cREnabled); + lbPointOfContactNameLabel.setEnabled(cREnabled); + lbPointOfContactNameText.setEnabled(cREnabled); + lbPointOfContactPhoneLabel.setEnabled(cREnabled); + lbPointOfContactPhoneText.setEnabled(cREnabled); + pnOrganization.setEnabled(cREnabled); EamOrganization currentOrg = null; if (cREnabled) { try { @@ -85,19 +86,20 @@ final class CasePropertiesPanel extends javax.swing.JPanel { currentOrg = correlationCase.getOrg(); } } catch (EamDbException ex) { + //WJS-TODO handle exception Exceptions.printStackTrace(ex); } } if (currentOrg != null) { lbOrganizationNameText.setText(currentOrg.getName()); - lbPointOfContactNameText1.setText(currentOrg.getPocName()); - lbPointOfContactPhoneText1.setText(currentOrg.getPocPhone()); - lbPointOfContactEmailText1.setText(currentOrg.getPocEmail()); + lbPointOfContactNameText.setText(currentOrg.getPocName()); + lbPointOfContactPhoneText.setText(currentOrg.getPocPhone()); + lbPointOfContactEmailText.setText(currentOrg.getPocEmail()); } else { lbOrganizationNameText.setText(""); - lbPointOfContactNameText1.setText(""); - lbPointOfContactPhoneText1.setText(""); - lbPointOfContactEmailText1.setText(""); + lbPointOfContactNameText.setText(""); + lbPointOfContactPhoneText.setText(""); + lbPointOfContactEmailText.setText(""); } Case.CaseType caseType = theCase.getCaseType(); caseTypeField.setText(caseType.getLocalizedDisplayName()); @@ -106,6 +108,19 @@ final class CasePropertiesPanel extends javax.swing.JPanel { repaint(); } + @Messages({"CasePropertiesPanel.casePanel.border.title=Case", + "CasePropertiesPanel.lbCaseUUIDLabel.text=Case UUID:", + "CasePropertiesPanel.examinerPanel.border.title=Examiner", + "CasePropertiesPanel.examinerLabel.text=Name:", + "CasePropertiesPanel.lbExaminerPhoneLable.text=Phone:", + "CasePropertiesPanel.lbExaminerEmailLabel.text=Email:", + "CasePropertiesPanel.lbNotesLabel.text=Notes:", + "CasePropertiesPanel.organizationPanel.border.title=Organization", + "CasePropertiesPanel.lbOrganizationNameLabel.text=Name:", + "CasePropertiesPanel.lbPointOfContactNameLabel.text=Point of Contact:", + "CasePropertiesPanel.lbPointOfContactPhoneLabel.text=Phone:", + "CasePropertiesPanel.lbPointOfContactEmailLabel.text=Email:"}) + /** * In this generated code below, there are 2 strings "Path" and "Remove" * that are table column headers in the DefaultTableModel. When this model @@ -152,14 +167,14 @@ final class CasePropertiesPanel extends javax.swing.JPanel { lbExaminerPhoneLabel = new javax.swing.JLabel(); lbExaminerPhoneText = new javax.swing.JLabel(); lbExaminerEmailText = new javax.swing.JLabel(); - pnOrganization1 = new javax.swing.JPanel(); - lbOrganizationNameLabel1 = new javax.swing.JLabel(); - lbPointOfContactNameLabel1 = new javax.swing.JLabel(); - lbPointOfContactEmailLabel1 = new javax.swing.JLabel(); - lbPointOfContactPhoneLabel1 = new javax.swing.JLabel(); - lbPointOfContactNameText1 = new javax.swing.JLabel(); - lbPointOfContactEmailText1 = new javax.swing.JLabel(); - lbPointOfContactPhoneText1 = new javax.swing.JLabel(); + pnOrganization = new javax.swing.JPanel(); + lbOrganizationNameLabel = new javax.swing.JLabel(); + lbPointOfContactNameLabel = new javax.swing.JLabel(); + lbPointOfContactEmailLabel = new javax.swing.JLabel(); + lbPointOfContactPhoneLabel = new javax.swing.JLabel(); + lbPointOfContactNameText = new javax.swing.JLabel(); + lbPointOfContactEmailText = new javax.swing.JLabel(); + lbPointOfContactPhoneText = new javax.swing.JLabel(); lbOrganizationNameText = new javax.swing.JLabel(); jTextArea1.setColumns(20); @@ -354,12 +369,12 @@ final class CasePropertiesPanel extends javax.swing.JPanel { .addComponent(lbExaminerNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbExaminerEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbExaminerPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbExaminerPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbExaminerEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -367,64 +382,68 @@ final class CasePropertiesPanel extends javax.swing.JPanel { .addGap(6, 6, 6)) ); - pnOrganization1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.pnOrganization1.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N + pnOrganization.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.pnOrganization.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N - lbOrganizationNameLabel1.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbOrganizationNameLabel1.text")); // NOI18N - lbOrganizationNameLabel1.setMaximumSize(new java.awt.Dimension(82, 14)); - lbOrganizationNameLabel1.setMinimumSize(new java.awt.Dimension(82, 14)); - lbOrganizationNameLabel1.setPreferredSize(new java.awt.Dimension(82, 14)); + lbOrganizationNameLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbOrganizationNameLabel.text")); // NOI18N + lbOrganizationNameLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbOrganizationNameLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbOrganizationNameLabel.setPreferredSize(new java.awt.Dimension(82, 14)); - lbPointOfContactNameLabel1.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactNameLabel1.text")); // NOI18N + lbPointOfContactNameLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactNameLabel.text")); // NOI18N - lbPointOfContactEmailLabel1.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactEmailLabel1.text")); // NOI18N - lbPointOfContactEmailLabel1.setMaximumSize(new java.awt.Dimension(82, 14)); - lbPointOfContactEmailLabel1.setMinimumSize(new java.awt.Dimension(82, 14)); - lbPointOfContactEmailLabel1.setPreferredSize(new java.awt.Dimension(82, 14)); + lbPointOfContactEmailLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactEmailLabel.text")); // NOI18N + lbPointOfContactEmailLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactEmailLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactEmailLabel.setPreferredSize(new java.awt.Dimension(82, 14)); - lbPointOfContactPhoneLabel1.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactPhoneLabel1.text")); // NOI18N - lbPointOfContactPhoneLabel1.setMaximumSize(new java.awt.Dimension(82, 14)); - lbPointOfContactPhoneLabel1.setMinimumSize(new java.awt.Dimension(82, 14)); - lbPointOfContactPhoneLabel1.setPreferredSize(new java.awt.Dimension(82, 14)); + lbPointOfContactPhoneLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbPointOfContactPhoneLabel.text")); // NOI18N + lbPointOfContactPhoneLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactPhoneLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactPhoneLabel.setPreferredSize(new java.awt.Dimension(82, 14)); - javax.swing.GroupLayout pnOrganization1Layout = new javax.swing.GroupLayout(pnOrganization1); - pnOrganization1.setLayout(pnOrganization1Layout); - pnOrganization1Layout.setHorizontalGroup( - pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnOrganization1Layout.createSequentialGroup() + javax.swing.GroupLayout pnOrganizationLayout = new javax.swing.GroupLayout(pnOrganization); + pnOrganization.setLayout(pnOrganizationLayout); + pnOrganizationLayout.setHorizontalGroup( + pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganizationLayout.createSequentialGroup() .addContainerGap() - .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactEmailLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbPointOfContactPhoneLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbPointOfContactNameLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addComponent(lbOrganizationNameLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(lbPointOfContactNameText1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbOrganizationNameText, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganizationLayout.createSequentialGroup() + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE) + .addComponent(lbOrganizationNameText, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(pnOrganizationLayout.createSequentialGroup() + .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); - pnOrganization1Layout.setVerticalGroup( - pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnOrganization1Layout.createSequentialGroup() + pnOrganizationLayout.setVerticalGroup( + pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnOrganizationLayout.createSequentialGroup() .addContainerGap() - .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbOrganizationNameLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbOrganizationNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactNameLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactNameText1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactEmailLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganization1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbPointOfContactPhoneLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbPointOfContactPhoneText1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(6, 6, 6)) ); @@ -437,7 +456,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(casePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(examinerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnOrganization1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(pnOrganization, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); detailsPanelLayout.setVerticalGroup( @@ -447,7 +466,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { .addGap(0, 0, 0) .addComponent(examinerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) - .addComponent(pnOrganization1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(pnOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); @@ -469,15 +488,11 @@ final class CasePropertiesPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents +//WJS-TODO ensure case not saved with empty name // @NbBundle.Messages({ // "CasePropertiesPanel.errorDialog.emptyCaseNameMessage=No case name entered.", // "CasePropertiesPanel.errorDialog.invalidCaseNameMessage=Case names cannot include the following symbols: \\, /, :, *, ?, \", <, >, |" // }) -// void saveChanges() { -// saveCaseName(); -// saveCaseNumber(); -// saveExaminerName(); -// } // private void saveCaseName() { // String newCaseDisplayName = caseNameTextField.getText(); // @@ -502,54 +517,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { // LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS // } // } -// private void saveCaseNumber() { -// String newCaseNumber = caseNumberTextField.getText(); -// -// if (newCaseNumber.equals(theCase.getNumber())) { -// return; -// } -// -// if (newCaseNumber.trim().isEmpty()) { -// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); -// return; -// } -// -// if (!Case.isValidName(newCaseNumber)) { -// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); -// return; -// } -// -// try { -// theCase.updateCaseNumber(newCaseNumber); -// } catch (CaseActionException ex) { -// MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); -// LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS -// } -// } -// private void saveExaminerName() { -// String newExaminerName = examinerTextField.getText(); -// -// if (newExaminerName.equals(theCase.getExaminer())) { -// return; -// } -// -// if (newExaminerName.trim().isEmpty()) { -// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); -// return; -// } -// -// if (!Case.isValidName(newExaminerName)) { -// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); -// return; -// } -// -// try { -// theCase.updateExaminer(newExaminerName); -// } catch (CaseActionException ex) { -// MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); -// LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS -// } -// } + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel caseDirField; private javax.swing.JLabel caseDirLabel; @@ -578,15 +546,15 @@ final class CasePropertiesPanel extends javax.swing.JPanel { private javax.swing.JLabel lbExaminerPhoneLabel; private javax.swing.JLabel lbExaminerPhoneText; private javax.swing.JLabel lbNotesLabel; - private javax.swing.JLabel lbOrganizationNameLabel1; + private javax.swing.JLabel lbOrganizationNameLabel; private javax.swing.JLabel lbOrganizationNameText; - private javax.swing.JLabel lbPointOfContactEmailLabel1; - private javax.swing.JLabel lbPointOfContactEmailText1; - private javax.swing.JLabel lbPointOfContactNameLabel1; - private javax.swing.JLabel lbPointOfContactNameText1; - private javax.swing.JLabel lbPointOfContactPhoneLabel1; - private javax.swing.JLabel lbPointOfContactPhoneText1; - private javax.swing.JPanel pnOrganization1; + private javax.swing.JLabel lbPointOfContactEmailLabel; + private javax.swing.JLabel lbPointOfContactEmailText; + private javax.swing.JLabel lbPointOfContactNameLabel; + private javax.swing.JLabel lbPointOfContactNameText; + private javax.swing.JLabel lbPointOfContactPhoneLabel; + private javax.swing.JLabel lbPointOfContactPhoneText; + private javax.swing.JPanel pnOrganization; private javax.swing.JTextArea taNotesText; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form index 11278e9ad4..c9f71e0b0e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.form @@ -18,10 +18,10 @@ - - + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java index e18649fdb2..d1c726d3eb 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/EditOptionalCasePropertiesPanel.java @@ -16,10 +16,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.sleuthkit.autopsy.casemodule; import java.awt.event.ActionListener; +import org.openide.util.NbBundle.Messages; /** * @@ -43,6 +43,10 @@ class EditOptionalCasePropertiesPanel extends javax.swing.JPanel { propertiesPanel.setVisible(true); } + @Messages({ + "EditOptionalCasePropertiesPanel.saveButton.text=Save", + "EditOptionalCasePropertiesPanel.cancelButton.text=Cancel" + }) /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -68,9 +72,9 @@ class EditOptionalCasePropertiesPanel extends javax.swing.JPanel { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(254, Short.MAX_VALUE) - .addComponent(cancelButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(saveButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cancelButton) .addContainerGap()) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(optionsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) @@ -93,9 +97,10 @@ class EditOptionalCasePropertiesPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents - void saveProperties(){ - this.propertiesPanel.saveUpdatedCaseDetails(); + void saveProperties() { + this.propertiesPanel.saveUpdatedCaseDetails(); } + /** * Adds an action listener to the Save button of the panel. * diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 554295b497..99845f6e48 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -88,7 +88,7 @@ final class NewCaseWizardAction extends CallableSystemAction { String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS CaseType caseType = CaseType.values()[(int) wizardDescriptor.getProperty("caseType")]; //NON-NLS Case.createAsCurrentCase(createdDirectory, new CaseDetails(caseName, caseNumber, examinerName, examinerPhone, examinerEmail, examinerNotes), caseType); - if (EamDb.isEnabled()) { + if (EamDb.isEnabled()) { //if the eam is enabled we need to save the case organization information now try { EamDb dbManager = EamDb.getInstance(); if (dbManager != null) { @@ -147,10 +147,6 @@ final class NewCaseWizardAction extends CallableSystemAction { } } - private void updateCentralRepoCase() { - - } - private void doFailedCaseCleanup(WizardDescriptor wizardDescriptor) { String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS if (createdDirectory != null) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form index bbb9b4be88..f8d10c7cfd 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form @@ -32,7 +32,7 @@ - + @@ -115,9 +115,6 @@ - - - @@ -148,6 +145,9 @@ + + + @@ -206,13 +206,13 @@ - - + + - - + + @@ -282,9 +282,6 @@ - - - @@ -400,13 +397,13 @@ - - + + - - + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index 32dfeccb06..aef8aac171 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -22,22 +22,21 @@ import java.awt.Cursor; import java.util.logging.Level; import javax.swing.JComboBox; import org.openide.util.Exceptions; -import org.sleuthkit.autopsy.centralrepository.actions.EamCaseEditDetailsDialog; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; import org.sleuthkit.autopsy.centralrepository.optionspanel.ManageOrganizationsDialog; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; /** - * - * @author wschaefer + * Panel which allows for editing and setting of the case details which are + * optional or otherwise able to be edited. */ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { - private final static Logger LOGGER = Logger.getLogger(EamCaseEditDetailsDialog.class.getName()); + private final static Logger LOGGER = Logger.getLogger(OptionalCasePropertiesPanel.class.getName()); private static final long serialVersionUID = 1L; private EamOrganization selectedOrg = null; private java.util.List orgs = null; @@ -78,14 +77,12 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { EamDb dbManager = EamDb.getInstance(); selectedOrg = dbManager.getCaseByUUID(currentCase.getName()).getOrg(); } catch (EamDbException ex) { - System.out.println("THOWING ON CURRENT CASE " + ex.toString()); + //WJS-TODO HANDLE } } if (selectedOrg != null) { - System.out.println("SET CURRNETLY SELECTED"); setCurrentlySelectedOrganization(selectedOrg.getName()); } else { - System.out.println("CLEAR 1"); clearOrganization(); } } @@ -104,7 +101,6 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { lbPointOfContactPhoneLabel.setEnabled(cREnabled); orgainizationPanel.setEnabled(cREnabled); if (!cREnabled) { - System.out.println("CLEAR 2"); clearOrganization(); } @@ -120,7 +116,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { comboBoxOrgName.addItem(org.getName()); }); } catch (EamDbException ex) { - System.out.println("CATCH WHATS?"); + //WJS-TODO HANDLE EXCEPT } } @@ -159,6 +155,21 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { } } + @Messages({"OptionalCasePropertiesPanel.caseDisplayNameLabel.text=Name:", + "OptionalCasePropertiesPanel.lbPointOfContactEmailLabel.text=Email:", + "OptionalCasePropertiesPanel.lbOrganizationNameLabel.text=Name:", + "OptionalCasePropertiesPanel.bnNewOrganization.text=Manage Organizations", + "OptionalCasePropertiesPanel.lbPointOfContactNameLabel.text=Point of Contact:", + "OptionalCasePropertiesPanel.lbPointOfContactPhoneLabel.text=Phone:", + "OptionalCasePropertiesPanel.orgainizationPanel.border.title=Organization", + "OptionalCasePropertiesPanel.lbNotesLabel.text=Notes:", + "OptionalCasePropertiesPanel.examinerLabel.text=Name:", + "OptionalCasePropertiesPanel.lbExaminerEmailLabel.text=Email:", + "OptionalCasePropertiesPanel.lbExaminerPhoneLabel.text=Phone:", + "OptionalCasePropertiesPanel.examinerPanel.border.title=Examiner", + "OptionalCasePropertiesPanel.caseNumberLabel.text=Number:", + "OptionalCasePropertiesPanel.casePanel.border.title=Case" + }) /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -200,7 +211,6 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(caseNumberLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseNumberLabel.text")); // NOI18N caseNumberTextField.setFont(caseNumberTextField.getFont().deriveFont(caseNumberTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - caseNumberTextField.setText(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseNumberTextField.text")); // NOI18N caseDisplayNameLabel.setFont(caseDisplayNameLabel.getFont().deriveFont(caseDisplayNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(caseDisplayNameLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseDisplayNameLabel.text")); // NOI18N @@ -209,6 +219,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { caseDisplayNameLabel.setPreferredSize(new java.awt.Dimension(41, 14)); caseDisplayNameTextField.setFont(caseDisplayNameTextField.getFont().deriveFont(caseDisplayNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + caseDisplayNameTextField.setText(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseDisplayNameTextField.text")); // NOI18N javax.swing.GroupLayout casePanelLayout = new javax.swing.GroupLayout(casePanel); casePanel.setLayout(casePanelLayout); @@ -257,7 +268,6 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { examinerNotesScrollPane.setViewportView(taNotesText); examinerTextField.setFont(examinerTextField.getFont().deriveFont(examinerTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - examinerTextField.setText(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.examinerTextField.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbExaminerEmailLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbExaminerEmailLabel.text")); // NOI18N lbExaminerEmailLabel.setMaximumSize(new java.awt.Dimension(41, 14)); @@ -308,14 +318,14 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addComponent(examinerLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(examinerTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(tfExaminerEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(tfExaminerPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(tfExaminerEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) @@ -387,13 +397,13 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); @@ -413,7 +423,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 413, Short.MAX_VALUE) + .addGap(0, 439, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() @@ -481,7 +491,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { } } } - + /** * Save changed value from text fields and text areas into the EamCase * object. diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties deleted file mode 100755 index 51bcbbd01c..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/Bundle.properties +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Enterprise Artifacts Manager - * - * Copyright 2015-2017 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -EamCaseEditDetailsDialog.lbExaminerEmailLabel.text=Email: -EamCaseEditDetailsDialog.lbExaminerNameLabel.text=Name: -EamCaseEditDetailsDialog.bnOk.text=OK -EamCaseEditDetailsDialog.bnNewOrganization.text=Manage Organizations -EamCaseEditDetailsDialog.lbPointOfContactPhoneLabel.text=Phone: -EamCaseEditDetailsDialog.lbPointOfContactEmailLabel.text=Email: -EamCaseEditDetailsDialog.lbPointOfContactNameLabel.text=Name: -EamCaseEditDetailsDialog.lbPointOfContactGroupLabel.text=Point of Contact: -EamCaseEditDetailsDialog.lbOrganizationNameLabel.text=Organization Name: -EamCaseEditDetailsDialog.lbNotesLabel.text=Notes: -EamCaseEditDetailsDialog.lbExaminerPhoneLabel.text=Phone: -EamCaseEditDetailsDialog.pnCaseMetadata.title=Case Metadata -EamCaseEditDetailsDialog.pnOrganization.title=Organization -EamCaseEditDetailsDialog.pnExaminer.title=Examiner -EamCaseEditDetailsDialog.lbCaseNameLabel.text=Case Name: -EamCaseEditDetailsDialog.bnClose.text=Close -EamCaseEditDetailsDialog.lbCaseUUIDLabel.text=Case UUID: -EamCaseEditDetailsDialog.lbCaseNumberLabel.text=Case Number: -EamCaseEditDetailsDialog.lbCreationDateLabel.text=Creation Date: diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form deleted file mode 100755 index 0ef78a860c..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.form +++ /dev/null @@ -1,456 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java deleted file mode 100755 index 3e34bf9dd2..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/actions/EamCaseEditDetailsDialog.java +++ /dev/null @@ -1,602 +0,0 @@ -/* - * Central Repository - * - * Copyright 2015-2017 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.centralrepository.actions; - -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.logging.Level; -import javax.swing.JComboBox; -import org.sleuthkit.autopsy.coreutils.Logger; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import org.openide.util.NbBundle.Messages; -import org.openide.windows.WindowManager; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; -import org.sleuthkit.autopsy.centralrepository.optionspanel.AddNewOrganizationDialog; - -/** - * Handle editing details of cases within the central repository - */ -public class EamCaseEditDetailsDialog extends JDialog { - - private final static Logger LOGGER = Logger.getLogger(EamCaseEditDetailsDialog.class.getName()); - private CorrelationCase eamCase; - private EamDb dbManager; - private Boolean contentChanged = false; - private final Collection textBoxes = new ArrayList<>(); - private final Collection textAreas = new ArrayList<>(); - private final TextBoxChangedListener textBoxChangedListener = new TextBoxChangedListener(); - private EamOrganization selectedOrg = null; - private List orgs = null; - private boolean comboboxOrganizationActionListenerActive; - - /** - * Creates new EamCaseEditDetailsDialog form - */ - @Messages({"EamCaseEditDetailsDialog.window.title=Central Repository Case Properties"}) - public EamCaseEditDetailsDialog() { - super((JFrame) WindowManager.getDefault().getMainWindow(), - Bundle.EamCaseEditDetailsDialog_window_title(), - true); // NON-NLS - - try { - this.dbManager = EamDb.getInstance(); - this.eamCase = this.dbManager.getCaseByUUID(Case.getCurrentCase().getName()); - if(this.eamCase == null){ - this.eamCase = dbManager.newCase(Case.getCurrentCase()); - } - initComponents(); - loadData(); - customizeComponents(); - display(); - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error getting current case.", ex); - } - } - - private void customizeComponents() { - setTextBoxListeners(); - setTextAreaListeners(); - } - - private void setTextBoxListeners() { - // Register for notifications when the text boxes get updated. - textBoxes.add(tfExaminerNameText); - textBoxes.add(tfExaminerEmailText); - textBoxes.add(tfExaminerPhoneText); - addTextFieldDocumentListeners(textBoxes, textBoxChangedListener); - } - - private void setTextAreaListeners() { - // Register for notifications when the text areas get updated. - textAreas.add(taNotesText); - addTextAreaDocumentListeners(textAreas, textBoxChangedListener); - } - - /** - * Adds a change listener to a collection of text fields. - * - * @param textFields The text fields. - * @param listener The change listener. - */ - private static void addTextFieldDocumentListeners(Collection textFields, TextBoxChangedListener listener) { - textFields.forEach((textField) -> { - textField.getDocument().addDocumentListener(listener); - }); - } - - /** - * Adds a change listener to a collection of text areas. - * - * @param textAreas The text areas. - * @param listener The change listener. - */ - private static void addTextAreaDocumentListeners(Collection textAreas, TextBoxChangedListener listener) { - textAreas.forEach((textArea) -> { - textArea.getDocument().addDocumentListener(listener); - }); - } - - private void display() { - pack(); - Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); - setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2); - setVisible(true); - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - bnClose = new javax.swing.JButton(); - bnOk = new javax.swing.JButton(); - pnCaseMetadata = new javax.swing.JPanel(); - lbCaseNameLabel = new javax.swing.JLabel(); - lbCreationDateLabel = new javax.swing.JLabel(); - lbCaseNumberLabel = new javax.swing.JLabel(); - lbCaseUUIDLabel = new javax.swing.JLabel(); - lbCaseUUIDText = new javax.swing.JLabel(); - lbCaseNameText = new javax.swing.JLabel(); - lbCeationDateText = new javax.swing.JLabel(); - lbCaseNumberText = new javax.swing.JLabel(); - pnOrganization = new javax.swing.JPanel(); - lbOrganizationNameLabel = new javax.swing.JLabel(); - comboBoxOrgName = new javax.swing.JComboBox<>(); - lbPointOfContactGroupLabel = new javax.swing.JLabel(); - lbPointOfContactNameLabel = new javax.swing.JLabel(); - lbPointOfContactEmailLabel = new javax.swing.JLabel(); - lbPointOfContactPhoneLabel = new javax.swing.JLabel(); - lbPointOfContactNameText = new javax.swing.JLabel(); - lbPointOfContactEmailText = new javax.swing.JLabel(); - lbPointOfContactPhoneText = new javax.swing.JLabel(); - bnNewOrganization = new javax.swing.JButton(); - pnExaminer = new javax.swing.JPanel(); - lbExaminerNameLabel = new javax.swing.JLabel(); - tfExaminerNameText = new javax.swing.JTextField(); - lbExaminerEmailLabel = new javax.swing.JLabel(); - tfExaminerEmailText = new javax.swing.JTextField(); - lbExaminerPhoneLabel = new javax.swing.JLabel(); - tfExaminerPhoneText = new javax.swing.JTextField(); - lbNotesLabel = new javax.swing.JLabel(); - jScrollPane2 = new javax.swing.JScrollPane(); - taNotesText = new javax.swing.JTextArea(); - - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - - org.openide.awt.Mnemonics.setLocalizedText(bnClose, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.bnClose.text")); // NOI18N - bnClose.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnCloseActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(bnOk, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.bnOk.text")); // NOI18N - bnOk.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnOkActionPerformed(evt); - } - }); - - pnCaseMetadata.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.pnCaseMetadata.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbCaseNameLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbCaseNameLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbCreationDateLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbCreationDateLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbCaseNumberLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbCaseNumberLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbCaseUUIDLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbCaseUUIDLabel.text")); // NOI18N - - javax.swing.GroupLayout pnCaseMetadataLayout = new javax.swing.GroupLayout(pnCaseMetadata); - pnCaseMetadata.setLayout(pnCaseMetadataLayout); - pnCaseMetadataLayout.setHorizontalGroup( - pnCaseMetadataLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnCaseMetadataLayout.createSequentialGroup() - .addGap(25, 25, 25) - .addGroup(pnCaseMetadataLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(lbCaseNumberLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbCreationDateLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbCaseNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbCaseUUIDLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnCaseMetadataLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbCaseNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbCeationDateText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbCaseNumberText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbCaseUUIDText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap()) - ); - pnCaseMetadataLayout.setVerticalGroup( - pnCaseMetadataLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnCaseMetadataLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnCaseMetadataLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbCaseUUIDLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbCaseUUIDText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnCaseMetadataLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbCaseNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbCaseNameText, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnCaseMetadataLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbCreationDateLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbCeationDateText, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(pnCaseMetadataLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbCaseNumberLabel) - .addComponent(lbCaseNumberText, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(26, 26, 26)) - ); - - pnOrganization.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.pnOrganization.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbOrganizationNameLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbOrganizationNameLabel.text")); // NOI18N - - comboBoxOrgName.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - comboBoxOrgNameActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactGroupLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbPointOfContactGroupLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactNameLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbPointOfContactNameLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactEmailLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbPointOfContactEmailLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactPhoneLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbPointOfContactPhoneLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(bnNewOrganization, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.bnNewOrganization.text")); // NOI18N - bnNewOrganization.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - bnNewOrganizationActionPerformed(evt); - } - }); - - javax.swing.GroupLayout pnOrganizationLayout = new javax.swing.GroupLayout(pnOrganization); - pnOrganization.setLayout(pnOrganizationLayout); - pnOrganizationLayout.setHorizontalGroup( - pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnOrganizationLayout.createSequentialGroup() - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnOrganizationLayout.createSequentialGroup() - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, pnOrganizationLayout.createSequentialGroup() - .addGap(25, 25, 25) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactGroupLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGroup(pnOrganizationLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) - .addGap(18, 18, 18) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboBoxOrgName, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnOrganizationLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(bnNewOrganization))) - .addContainerGap()) - ); - pnOrganizationLayout.setVerticalGroup( - pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnOrganizationLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbOrganizationNameLabel) - .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(lbPointOfContactGroupLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnOrganizationLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnNewOrganization) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - pnExaminer.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.pnExaminer.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbExaminerNameLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbExaminerNameLabel.text")); // NOI18N - - tfExaminerNameText.setEditable(false); - - org.openide.awt.Mnemonics.setLocalizedText(lbExaminerEmailLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbExaminerEmailLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbExaminerPhoneLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbExaminerPhoneLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(lbNotesLabel, org.openide.util.NbBundle.getMessage(EamCaseEditDetailsDialog.class, "EamCaseEditDetailsDialog.lbNotesLabel.text")); // NOI18N - - taNotesText.setColumns(20); - taNotesText.setRows(5); - jScrollPane2.setViewportView(taNotesText); - - javax.swing.GroupLayout pnExaminerLayout = new javax.swing.GroupLayout(pnExaminer); - pnExaminer.setLayout(pnExaminerLayout); - pnExaminerLayout.setHorizontalGroup( - pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnExaminerLayout.createSequentialGroup() - .addGap(28, 28, 28) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(25, 25, 25) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tfExaminerEmailText) - .addComponent(tfExaminerPhoneText) - .addComponent(tfExaminerNameText) - .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE)) - .addContainerGap()) - ); - pnExaminerLayout.setVerticalGroup( - pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnExaminerLayout.createSequentialGroup() - .addContainerGap() - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbExaminerNameLabel) - .addComponent(tfExaminerNameText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(tfExaminerEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerEmailLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(tfExaminerPhoneText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbExaminerPhoneLabel)) - .addGap(24, 24, 24) - .addGroup(pnExaminerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbNotesLabel) - .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(bnOk, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnClose)) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pnCaseMetadata, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnOrganization, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(pnExaminer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(23, 23, 23) - .addComponent(pnCaseMetadata, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pnOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pnExaminer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnOk) - .addComponent(bnClose)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - }// //GEN-END:initComponents - - private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOkActionPerformed - if (contentChanged) { - updateEamCase(); - updateDb(); - } - dispose(); - }//GEN-LAST:event_bnOkActionPerformed - - private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnNewOrganizationActionPerformed - AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(); - // update the combobox options and org data fields - if (dialogO.isChanged()) { - loadOrganizationData(); - } - }//GEN-LAST:event_bnNewOrganizationActionPerformed - - @SuppressWarnings({"unchecked"}) - private void comboBoxOrgNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxOrgNameActionPerformed - JComboBox cb = (JComboBox) evt.getSource(); - String orgName = (String) cb.getSelectedItem(); - if (null == orgName || false == comboboxOrganizationActionListenerActive) { - return; - } - - if ("".equals(orgName)) { - selectedOrg = null; - lbPointOfContactNameText.setText(""); - lbPointOfContactEmailText.setText(""); - lbPointOfContactPhoneText.setText(""); - contentChanged = true; - return; - } - - for (EamOrganization org : orgs) { - if (org.getName().equals(orgName)) { - selectedOrg = org; - lbPointOfContactNameText.setText(selectedOrg.getPocName()); - lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); - lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); - contentChanged = true; - return; - } - } - }//GEN-LAST:event_comboBoxOrgNameActionPerformed - - private void bnCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCloseActionPerformed - dispose(); - }//GEN-LAST:event_bnCloseActionPerformed - - private void loadCaseMetaData() { - lbCaseUUIDText.setText(eamCase.getCaseUUID()); - lbCaseNameText.setText(eamCase.getDisplayName()); - lbCeationDateText.setText(eamCase.getCreationDate()); - lbCaseNumberText.setText(eamCase.getCaseNumber()); - } - - private void loadExaminerData() { - tfExaminerNameText.setText(eamCase.getExaminerName()); - tfExaminerEmailText.setText(eamCase.getExaminerEmail()); - tfExaminerPhoneText.setText(eamCase.getExaminerPhone()); - taNotesText.setText(eamCase.getNotes()); - } - - private void loadOrganizationData() { - comboboxOrganizationActionListenerActive = false; // don't fire action listener while loading combobox content - comboBoxOrgName.removeAllItems(); - try { - orgs = dbManager.getOrganizations(); - comboBoxOrgName.addItem(""); // for when a case has a null Org - orgs.forEach((org) -> { - comboBoxOrgName.addItem(org.getName()); - }); - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Failure populating combobox with organizations.", ex); - } - comboboxOrganizationActionListenerActive = true; - - if (!orgs.isEmpty() && null != eamCase.getOrg()) { - selectedOrg = eamCase.getOrg(); - comboBoxOrgName.setSelectedItem(selectedOrg.getName()); - lbPointOfContactNameText.setText(selectedOrg.getPocName()); - lbPointOfContactEmailText.setText(selectedOrg.getPocEmail()); - lbPointOfContactPhoneText.setText(selectedOrg.getPocPhone()); - } else { - comboBoxOrgName.setSelectedItem(""); - lbPointOfContactNameText.setText(""); - lbPointOfContactEmailText.setText(""); - lbPointOfContactPhoneText.setText(""); - } - } - - private void loadData() { - loadCaseMetaData(); - loadExaminerData(); - loadOrganizationData(); - } - - /** - * Save changed value from text fields and text areas into the EamCase - * object. - */ - private void updateEamCase() { - eamCase.setOrg(selectedOrg); - eamCase.setExaminerName(tfExaminerNameText.getText()); - eamCase.setExaminerEmail(tfExaminerEmailText.getText()); - eamCase.setExaminerPhone(tfExaminerPhoneText.getText()); - eamCase.setNotes(taNotesText.getText()); - } - - private void updateDb() { - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - - if (!EamDb.isEnabled()) { - LOGGER.log(Level.SEVERE, "Central repository database not enabled"); // NON-NLS - return; - } - - try { - dbManager.updateCase(eamCase); - } catch (IllegalArgumentException | EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error connecting to central repository database", ex); // NON-NLS - } finally { - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - } - - /** - * Used to listen for changes in text areas/boxes. Let the panel know text - * content has changed. - */ - private class TextBoxChangedListener implements DocumentListener { - - @Override - public void changedUpdate(DocumentEvent e) { - setChanged(); - } - - @Override - public void insertUpdate(DocumentEvent e) { - setChanged(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - setChanged(); - } - - private void setChanged() { - contentChanged = true; - } - } - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton bnClose; - private javax.swing.JButton bnNewOrganization; - private javax.swing.JButton bnOk; - private javax.swing.JComboBox comboBoxOrgName; - private javax.swing.JScrollPane jScrollPane2; - private javax.swing.JLabel lbCaseNameLabel; - private javax.swing.JLabel lbCaseNameText; - private javax.swing.JLabel lbCaseNumberLabel; - private javax.swing.JLabel lbCaseNumberText; - private javax.swing.JLabel lbCaseUUIDLabel; - private javax.swing.JLabel lbCaseUUIDText; - private javax.swing.JLabel lbCeationDateText; - private javax.swing.JLabel lbCreationDateLabel; - private javax.swing.JLabel lbExaminerEmailLabel; - private javax.swing.JLabel lbExaminerNameLabel; - private javax.swing.JLabel lbExaminerPhoneLabel; - private javax.swing.JLabel lbNotesLabel; - private javax.swing.JLabel lbOrganizationNameLabel; - private javax.swing.JLabel lbPointOfContactEmailLabel; - private javax.swing.JLabel lbPointOfContactEmailText; - private javax.swing.JLabel lbPointOfContactGroupLabel; - private javax.swing.JLabel lbPointOfContactNameLabel; - private javax.swing.JLabel lbPointOfContactNameText; - private javax.swing.JLabel lbPointOfContactPhoneLabel; - private javax.swing.JLabel lbPointOfContactPhoneText; - private javax.swing.JPanel pnCaseMetadata; - private javax.swing.JPanel pnExaminer; - private javax.swing.JPanel pnOrganization; - private javax.swing.JTextArea taNotesText; - private javax.swing.JTextField tfExaminerEmailText; - private javax.swing.JTextField tfExaminerNameText; - private javax.swing.JTextField tfExaminerPhoneText; - // End of variables declaration//GEN-END:variables -} diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 98f80f96aa..ef3e90d066 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -34,7 +34,6 @@ import java.time.LocalDate; import java.util.HashMap; import java.util.Map; import java.util.Set; -import org.openide.util.Exceptions; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 9c4c971f51..2785bd6bfb 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -313,77 +313,6 @@ public class CaseEventListener implements PropertyChangeListener { } } } // CURRENT_CASE -// break; -// -// case NAME: { -// // The display name of the case has been changed -// -// if (!EamDb.isEnabled()) { -// break; -// } -// -// if (evt.getNewValue() instanceof String) { -// String newName = (String) evt.getNewValue(); -// try { -// // See if the case is in the database. If it is, update the display name. -// CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); -// -// if (null != existingCase) { -// existingCase.setDisplayName(newName); -// dbManager.updateCase(existingCase); -// } -// } catch (EamDbException ex) { -// LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS -// } -// } -// } // NAME -// break; -// case NUMBER: { -// // The display name of the case has been changed -// -// if (!EamDb.isEnabled()) { -// break; -// } -// -// if (evt.getNewValue() instanceof String) { -// String newNumber = (String) evt.getNewValue(); -// try { -// // See if the case is in the database. If it is, update the display name. -// CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); -// -// if (null != existingCase) { -// existingCase.setCaseNumber(newNumber); -// dbManager.updateCase(existingCase); -// } -// } catch (EamDbException ex) { -// LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS -// } -// } -// } // NUMBER -// break; -// case EXAMINER: { -// // The display name of the case has been changed -// -// if (!EamDb.isEnabled()) { -// break; -// } -// -// if (evt.getNewValue() instanceof String) { -// String newExaminerName = (String) evt.getNewValue(); -// try { -// // See if the case is in the database. If it is, update the display name. -// CorrelationCase existingCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); -// -// if (null != existingCase) { -// existingCase.setExaminerName(newExaminerName); -// dbManager.updateCase(existingCase); -// } -// } catch (EamDbException ex) { -// LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS -// } -// } -// } // EXAMINER -// break; } } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java index cb4fe16925..0a59200a1e 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.centralrepository.eventlisteners; import java.beans.PropertyChangeListener; import org.openide.modules.ModuleInstall; -import org.openide.util.actions.CallableSystemAction; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java index eacbc51e6d..db26739a9c 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/AddNewOrganizationDialog.java @@ -41,6 +41,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; public class AddNewOrganizationDialog extends javax.swing.JDialog { private static final Logger LOGGER = Logger.getLogger(AddNewOrganizationDialog.class.getName()); + private static final long serialVersionUID = 1L; private final Collection textBoxes; private final TextBoxChangedListener textBoxChangedListener; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties index 2477bcd683..7ab2c9b2e4 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties @@ -75,34 +75,4 @@ ImportHashDatabaseDialog.lbInstructions.text=Choose an .idx file to import into ImportHashDatabaseDialog.lbFilePath.text=File Path: ImportHashDatabaseDialog.tfFilePath.text= EamDbSettingsDialog.lbDatabaseDesc.text=Database File: -EamDbSettingsDialog.lbFullDbPath.text=jLabel2 -CaseOrganizationPanel.bnNewOrganization.text=Manage Organizations -CaseOrganizationPanel.lbPointOfContactPhoneLabel.text=Phone: -CaseOrganizationPanel.lbPointOfContactEmailLabel.text=Email: -CaseOrganizationPanel.lbPointOfContactNameLabel.text=Name: -CaseOrganizationPanel.lbPointOfContactGroupLabel.text=Point of Contact: -CaseOrganizationPanel.lbOrganizationNameLabel.text=Organization Name: -ExaminerDetailsPanel.lbExaminerNameLabel.text=Name: -ExaminerDetailsPanel.lbNotesLabel.text=Notes: -ExaminerDetailsPanel.lbExaminerPhoneLabel.text=Phone: -ExaminerDetailsPanel.lbExaminerEmailLabel.text=Email: -ManageOrganizationsDialog.jLabel2.text=Point of Contact Name: -ManageOrganizationsDialog.jLabel1.text=Organizations -ManageOrganizationsDialog.jButton3.text=Close -ManageOrganizationsDialog.jLabel8.text=Organization Name: -ManageOrganizationsDialog.jButton2.text=Delete -ManageOrganizationsDialog.jButton1.text=New -ManageOrganizationsDialog.jLabel6.text=Point of Contact Email: -ManageOrganizationsDialog.jLabel4.text=Point of Contact Phone: -ManageOrganizationsDialog.jTextArea1.text=Organizations are used to provide additional contact information for the content they are associated with. -ManageOrganizationsDialog.jButton4.text=Edit -ManageOrganizationsDialog.jLabel3.text=Organization Details -ManageOrganizationsDialog.pocNameTextField.text= -GlobalSettingsPanel.organizationPanel.border.title=Organizations -GlobalSettingsPanel.manageOrganizationButton.text=Manage Organizations -GlobalSettingsPanel.organizationTextArea.text=Organization information can be tracked in the central repository. -ExaminerDetailsPanel.lbNotesLabel.text_1=Notes: -ExaminerDetailsPanel.lbExaminerPhoneLabel.text_1=Phone: -ExaminerDetailsPanel.lbExaminerEmailLabel.text_1=Email: -ExaminerDetailsPanel.lbExaminerNameLabel.text_1=Name: -ExaminerDetailsPanel.pnExaminer.border.title=Examiner Details +EamDbSettingsDialog.lbFullDbPath.text= diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index 37dd9ff5b0..412f6afa54 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -41,7 +41,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(GlobalSettingsPanel.class.getName()); - + private final IngestJobEventPropertyChangeListener ingestJobEventListener; /** @@ -61,12 +61,17 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i "GlobalSettingsPanel.pnCorrelationProperties.border.title=Correlation Properties", "GlobalSettingsPanel.lbCentralRepository.text=A central repository allows you to correlate files and results between cases.", "GlobalSettingsPanel.manageTagsTextArea.text=Configure which tag names are associated with notable items. " - + "When these tags are used, the file or result will be recorded in the central repository. " - + "If that file or result is seen again in future cases, it will be flagged.", - "GlobalSettingsPanel.correlationPropertiesTextArea.text=Choose which file and result properties to store in the central repository for later correlation."}) + + "When these tags are used, the file or result will be recorded in the central repository. " + + "If that file or result is seen again in future cases, it will be flagged.", + "GlobalSettingsPanel.correlationPropertiesTextArea.text=Choose which file and result properties to store in the central repository for later correlation.", + "GlobalSettingsPanel.organizationPanel.border.title=Organizations", + "GlobalSettingsPanel.manageOrganizationButton.text=Manage Organizations", + "GlobalSettingsPanel.organizationTextArea.text=Organization information can be tracked in the central repository" + }) + private void customizeComponents() { setName(Bundle.GlobalSettingsPanel_title()); - + // The hash set functions of central repo are not being included in the current release. bnImportDatabase.setVisible(false); } @@ -472,6 +477,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i protected void finalize() throws Throwable { IngestManager.getInstance().removeIngestJobEventListener(ingestJobEventListener); super.finalize(); + } /** @@ -556,7 +562,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i * @return True */ private boolean enableButtonSubComponents(Boolean enable) { - boolean ingestRunning = IngestManager.getInstance().isIngestRunning(); + boolean ingestRunning = IngestManager.getInstance().isIngestRunning(); pnCorrelationProperties.setEnabled(enable && !ingestRunning); pnTagManagement.setEnabled(enable && !ingestRunning); bnManageTypes.setEnabled(enable && !ingestRunning); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form index 6ca8920ecd..67bdfb9da6 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form @@ -2,15 +2,9 @@
- - - - - - @@ -32,7 +26,7 @@ - + @@ -40,13 +34,13 @@ - + - + @@ -58,11 +52,8 @@ - + - - - @@ -74,16 +65,16 @@ - - + + - + - + - + - + @@ -91,20 +82,20 @@ - - + + - - - - + + + + - + @@ -115,7 +106,7 @@ - + @@ -128,42 +119,42 @@ - + - + - + - + - + - + - + - + - + - - - + + + @@ -173,14 +164,14 @@ - + - + @@ -193,11 +184,11 @@ - + - + @@ -210,53 +201,53 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -265,31 +256,31 @@ - + - + - + - + - + - + - + - + @@ -297,16 +288,10 @@ - - - - - - @@ -318,24 +303,21 @@ - - - - + - + - + - + - + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java index 763d358889..2b65ad6f06 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java @@ -1,7 +1,20 @@ /* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. + * Central Repository + * + * Copyright 2015-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.sleuthkit.autopsy.centralrepository.optionspanel; @@ -16,35 +29,33 @@ import javax.swing.JFrame; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openide.util.Exceptions; +import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; -/** - * - * @author wschaefer - */ -public class ManageOrganizationsDialog extends JDialog { +public final class ManageOrganizationsDialog extends JDialog { private static final long serialVersionUID = 1L; private EamDb dbManager; private EamOrganization newOrg; private final DefaultListModel rulesListModel = new DefaultListModel<>(); - + @Messages({"ManageOrganizationsDialog.title.text=Manage Organizations"}) /** * Creates new form ManageOrganizationsPanel */ public ManageOrganizationsDialog() { super((JFrame) WindowManager.getDefault().getMainWindow(), - "Manage Organizations Dialog", + Bundle.ManageOrganizationsDialog_title_text(), true); // NON-NLS initComponents(); try { this.dbManager = EamDb.getInstance(); - jList1.setCellRenderer(new DefaultListCellRenderer() { + organizationList.setCellRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = 1L; + @Override public Component getListCellRendererComponent(javax.swing.JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); @@ -52,8 +63,8 @@ public class ManageOrganizationsDialog extends JDialog { return c; } }); - jList1.setModel(rulesListModel); - jList1.addListSelectionListener(new OrganizationListSelectionListener()); + organizationList.setModel(rulesListModel); + organizationList.addListSelectionListener(new OrganizationListSelectionListener()); populateList(); newOrg = null; } catch (EamDbException ex) { @@ -81,20 +92,31 @@ public class ManageOrganizationsDialog extends JDialog { } } if (orgs.contains(selected)) { - jList1.setSelectedValue(selected, true); + organizationList.setSelectedValue(selected, true); } else { - jList1.setSelectedIndex(0); + organizationList.setSelectedIndex(0); } - jList1.validate(); - jList1.repaint(); + organizationList.validate(); + organizationList.repaint(); } } private void populateList() throws EamDbException { - EamOrganization selected = jList1.getSelectedValue(); + EamOrganization selected = organizationList.getSelectedValue(); populateListAndSelect(selected); } + @Messages({"ManageOrganizationsDialog.pocNameLabel.text=Point of Contact Name:", + "ManageOrganizationsDialog.deleteButton.text=Delete", + "ManageOrganizationsDialog.newButton.text=New", + "ManageOrganizationsDialog.closeButton.text=Close", + "ManageOrganizationsDialog.orgNameLabel.text=Organization Name:", + "ManageOrganizationsDialog.pocEmailLabel.text=Point of Contact Email:", + "ManageOrganizationsDialog.editButton.text=Edit", + "ManageOrganizationsDialog.pocPhoneLabel.text=Point of Contact Phone:", + "ManageOrganizationsDialog.orgDescriptionTextArea.text=Organizations are used to provide additional contact information for the content they are associated with.", + "ManageOrganizationsDialog.orgListLabel.text=Organizations", + "ManageOrganizationsDialog.orgDetailsLabel.text=Organization Details"}) /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -104,200 +126,187 @@ public class ManageOrganizationsDialog extends JDialog { // //GEN-BEGIN:initComponents private void initComponents() { - jScrollPane1 = new javax.swing.JScrollPane(); - jPanel1 = new javax.swing.JPanel(); - jScrollPane2 = new javax.swing.JScrollPane(); - jList1 = new javax.swing.JList<>(); - jScrollPane4 = new javax.swing.JScrollPane(); - jTextArea1 = new javax.swing.JTextArea(); - jButton1 = new javax.swing.JButton(); - jButton2 = new javax.swing.JButton(); - jButton3 = new javax.swing.JButton(); - jLabel1 = new javax.swing.JLabel(); + manageOrganizationsScrollPane = new javax.swing.JScrollPane(); + manageOrganizationsPanel = new javax.swing.JPanel(); + orgListScrollPane = new javax.swing.JScrollPane(); + organizationList = new javax.swing.JList<>(); + orgDescriptionScrollPane = new javax.swing.JScrollPane(); + orgDescriptionTextArea = new javax.swing.JTextArea(); + newButton = new javax.swing.JButton(); + deleteButton = new javax.swing.JButton(); + closeButton = new javax.swing.JButton(); + orgListLabel = new javax.swing.JLabel(); jSeparator1 = new javax.swing.JSeparator(); - jLabel2 = new javax.swing.JLabel(); - jLabel4 = new javax.swing.JLabel(); - jLabel6 = new javax.swing.JLabel(); - jLabel8 = new javax.swing.JLabel(); + pocNameLabel = new javax.swing.JLabel(); + pocPhoneLabel = new javax.swing.JLabel(); + pocEmailLabel = new javax.swing.JLabel(); + orgNameLabel = new javax.swing.JLabel(); orgNameTextField = new javax.swing.JTextField(); pocNameTextField = new javax.swing.JTextField(); pocPhoneTextField = new javax.swing.JTextField(); pocEmailTextField = new javax.swing.JTextField(); - jButton4 = new javax.swing.JButton(); - jLabel3 = new javax.swing.JLabel(); + editButton = new javax.swing.JButton(); + orgDetailsLabel = new javax.swing.JLabel(); setMinimumSize(new java.awt.Dimension(545, 450)); - setPreferredSize(new java.awt.Dimension(545, 450)); - jScrollPane1.setMinimumSize(null); - jScrollPane1.setPreferredSize(new java.awt.Dimension(535, 415)); + manageOrganizationsScrollPane.setMinimumSize(null); + manageOrganizationsScrollPane.setPreferredSize(new java.awt.Dimension(535, 415)); - jPanel1.setMinimumSize(null); - jPanel1.setPreferredSize(new java.awt.Dimension(527, 407)); + manageOrganizationsPanel.setPreferredSize(new java.awt.Dimension(527, 407)); - jList1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - jScrollPane2.setViewportView(jList1); + organizationList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + orgListScrollPane.setViewportView(organizationList); - jTextArea1.setEditable(false); - jTextArea1.setBackground(new java.awt.Color(240, 240, 240)); - jTextArea1.setColumns(20); - jTextArea1.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N - jTextArea1.setLineWrap(true); - jTextArea1.setRows(3); - jTextArea1.setText(org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jTextArea1.text")); // NOI18N - jTextArea1.setWrapStyleWord(true); - jScrollPane4.setViewportView(jTextArea1); + orgDescriptionTextArea.setEditable(false); + orgDescriptionTextArea.setBackground(new java.awt.Color(240, 240, 240)); + orgDescriptionTextArea.setColumns(20); + orgDescriptionTextArea.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N + orgDescriptionTextArea.setLineWrap(true); + orgDescriptionTextArea.setRows(3); + orgDescriptionTextArea.setText(org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.orgDescriptionTextArea.text")); // NOI18N + orgDescriptionTextArea.setWrapStyleWord(true); + orgDescriptionScrollPane.setViewportView(orgDescriptionTextArea); - org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jButton1.text")); // NOI18N - jButton1.setMargin(new java.awt.Insets(2, 6, 2, 6)); - jButton1.addActionListener(new java.awt.event.ActionListener() { + org.openide.awt.Mnemonics.setLocalizedText(newButton, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.newButton.text")); // NOI18N + newButton.setMargin(new java.awt.Insets(2, 6, 2, 6)); + newButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton1ActionPerformed(evt); + newButtonActionPerformed(evt); } }); - org.openide.awt.Mnemonics.setLocalizedText(jButton2, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jButton2.text")); // NOI18N - jButton2.setMargin(new java.awt.Insets(2, 6, 2, 6)); - jButton2.addActionListener(new java.awt.event.ActionListener() { + org.openide.awt.Mnemonics.setLocalizedText(deleteButton, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.deleteButton.text")); // NOI18N + deleteButton.setMargin(new java.awt.Insets(2, 6, 2, 6)); + deleteButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton2ActionPerformed(evt); + deleteButtonActionPerformed(evt); } }); - org.openide.awt.Mnemonics.setLocalizedText(jButton3, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jButton3.text")); // NOI18N - jButton3.addActionListener(new java.awt.event.ActionListener() { + org.openide.awt.Mnemonics.setLocalizedText(closeButton, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.closeButton.text")); // NOI18N + closeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton3ActionPerformed(evt); + closeButtonActionPerformed(evt); } }); - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel1.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(orgListLabel, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.orgListLabel.text")); // NOI18N jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL); - org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel2.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(pocNameLabel, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.pocNameLabel.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel4.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(pocPhoneLabel, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.pocPhoneLabel.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel6.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(pocEmailLabel, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.pocEmailLabel.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel8, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel8.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(orgNameLabel, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.orgNameLabel.text")); // NOI18N orgNameTextField.setEditable(false); - orgNameTextField.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - orgNameTextFieldActionPerformed(evt); - } - }); pocNameTextField.setEditable(false); - pocNameTextField.setText(org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.pocNameTextField.text")); // NOI18N pocPhoneTextField.setEditable(false); pocEmailTextField.setEditable(false); - pocEmailTextField.addActionListener(new java.awt.event.ActionListener() { + + org.openide.awt.Mnemonics.setLocalizedText(editButton, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.editButton.text")); // NOI18N + editButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - pocEmailTextFieldActionPerformed(evt); + editButtonActionPerformed(evt); } }); - org.openide.awt.Mnemonics.setLocalizedText(jButton4, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jButton4.text")); // NOI18N - jButton4.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton4ActionPerformed(evt); - } - }); + org.openide.awt.Mnemonics.setLocalizedText(orgDetailsLabel, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.orgDetailsLabel.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.jLabel3.text")); // NOI18N - - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() + javax.swing.GroupLayout manageOrganizationsPanelLayout = new javax.swing.GroupLayout(manageOrganizationsPanel); + manageOrganizationsPanel.setLayout(manageOrganizationsPanelLayout); + manageOrganizationsPanelLayout.setHorizontalGroup( + manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() .addContainerGap() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(orgDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(orgListLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() + .addComponent(newButton, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jButton4) + .addComponent(editButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jButton2)) - .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(deleteButton)) + .addComponent(orgListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, 217, Short.MAX_VALUE) - .addComponent(jButton3)) - .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(closeButton)) + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() .addGap(29, 29, 29) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(pocNameLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(orgNameLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pocPhoneLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pocEmailLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(pocNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(pocNameTextField) .addComponent(pocPhoneTextField) .addComponent(pocEmailTextField, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(orgNameTextField)))) .addContainerGap()) - .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(orgDetailsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) ); - jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jButton1, jButton2, jButton4}); + manageOrganizationsPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deleteButton, editButton, newButton}); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() + manageOrganizationsPanelLayout.setVerticalGroup( + manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() .addContainerGap() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(jLabel3) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() + .addComponent(orgDetailsLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel8) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(orgNameLabel) .addComponent(orgNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(pocNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel2)) + .addComponent(pocNameLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(pocPhoneTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel4)) + .addComponent(pocPhoneLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(pocEmailTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(pocEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 235, Short.MAX_VALUE) - .addComponent(jButton3)) + .addComponent(closeButton)) .addComponent(jSeparator1) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() + .addComponent(orgDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel1) + .addComponent(orgListLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 288, Short.MAX_VALUE) + .addComponent(orgListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 288, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jButton1) - .addComponent(jButton2) - .addComponent(jButton4)))) + .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(newButton) + .addComponent(deleteButton) + .addComponent(editButton)))) .addContainerGap()) ); - jScrollPane1.setViewportView(jPanel1); + manageOrganizationsScrollPane.setViewportView(manageOrganizationsPanel); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); @@ -305,29 +314,25 @@ public class ManageOrganizationsDialog extends JDialog { layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, 0) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(manageOrganizationsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, 0) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(manageOrganizationsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// //GEN-END:initComponents - private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed - // TODO add your handling code here: - }//GEN-LAST:event_jButton2ActionPerformed + private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed + //WJS-TODO implement delete + }//GEN-LAST:event_deleteButtonActionPerformed - private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed + private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed dispose(); - }//GEN-LAST:event_jButton3ActionPerformed + }//GEN-LAST:event_closeButtonActionPerformed - private void pocEmailTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pocEmailTextFieldActionPerformed - // TODO add your handling code here: - }//GEN-LAST:event_pocEmailTextFieldActionPerformed - - private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + private void newButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newButtonActionPerformed AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(); if (dialogO.isChanged()) { try { @@ -337,14 +342,10 @@ public class ManageOrganizationsDialog extends JDialog { } } - }//GEN-LAST:event_jButton1ActionPerformed + }//GEN-LAST:event_newButtonActionPerformed - private void orgNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_orgNameTextFieldActionPerformed - // TODO add your handling code here: - }//GEN-LAST:event_orgNameTextFieldActionPerformed - - private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed - EamOrganization orgToEdit = jList1.getSelectedValue(); + private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed + EamOrganization orgToEdit = organizationList.getSelectedValue(); AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(orgToEdit); if (dialogO.isChanged()) { try { @@ -354,30 +355,30 @@ public class ManageOrganizationsDialog extends JDialog { } } - }//GEN-LAST:event_jButton4ActionPerformed + }//GEN-LAST:event_editButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton jButton1; - private javax.swing.JButton jButton2; - private javax.swing.JButton jButton3; - private javax.swing.JButton jButton4; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel4; - private javax.swing.JLabel jLabel6; - private javax.swing.JLabel jLabel8; - private javax.swing.JList jList1; - private javax.swing.JPanel jPanel1; - private javax.swing.JScrollPane jScrollPane1; - private javax.swing.JScrollPane jScrollPane2; - private javax.swing.JScrollPane jScrollPane4; + private javax.swing.JButton closeButton; + private javax.swing.JButton deleteButton; + private javax.swing.JButton editButton; private javax.swing.JSeparator jSeparator1; - private javax.swing.JTextArea jTextArea1; + private javax.swing.JPanel manageOrganizationsPanel; + private javax.swing.JScrollPane manageOrganizationsScrollPane; + private javax.swing.JButton newButton; + private javax.swing.JScrollPane orgDescriptionScrollPane; + private javax.swing.JTextArea orgDescriptionTextArea; + private javax.swing.JLabel orgDetailsLabel; + private javax.swing.JLabel orgListLabel; + private javax.swing.JScrollPane orgListScrollPane; + private javax.swing.JLabel orgNameLabel; private javax.swing.JTextField orgNameTextField; + private javax.swing.JList organizationList; + private javax.swing.JLabel pocEmailLabel; private javax.swing.JTextField pocEmailTextField; + private javax.swing.JLabel pocNameLabel; private javax.swing.JTextField pocNameTextField; + private javax.swing.JLabel pocPhoneLabel; private javax.swing.JTextField pocPhoneTextField; // End of variables declaration//GEN-END:variables public boolean isChanged() { @@ -402,7 +403,7 @@ public class ManageOrganizationsDialog extends JDialog { if (newOrg != null) { selected = newOrg; } else { - selected = jList1.getSelectedValue(); + selected = organizationList.getSelectedValue(); } if (selected != null) { orgNameTextField.setText(selected.getName()); From 6ba111ed5b2f81b062ef33731c9f0ee29417ce95 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 16 Oct 2017 14:53:31 -0400 Subject: [PATCH 10/46] 2774 fix minor issues with @messages for managing organizations --- .../autopsy/casemodule/Bundle.properties | 2 +- .../casemodule/CaseInformationPanel.form | 10 +-- .../casemodule/CaseInformationPanel.java | 8 ++- .../casemodule/CasePropertiesPanel.form | 6 +- .../casemodule/CasePropertiesPanel.java | 4 +- .../OptionalCasePropertiesPanel.form | 68 ++++++++++++++----- .../OptionalCasePropertiesPanel.java | 38 +++++++---- .../ManageOrganizationsDialog.java | 3 +- 8 files changed, 95 insertions(+), 44 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index 58c1aeacee..a176ee9465 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -154,7 +154,7 @@ NewCaseVisualPanel1.badCredentials.text=Bad multi-user settings (see Tools, Opti NewCaseVisualPanel2.getName.text=Optional Information NewCaseWizardAction.newCase.windowTitle.text=New Case Information NewCaseWizardAction.getName.text=New Case Wizard -NewCaseWizardAction.databaseProblem1.text=Cannot open database. Canceling case creation. +NewCaseWizardAction.databaseProblem1.text=Cannot open database. Cancelling case creation. NewCaseWizardAction.databaseProblem2.text=Error NewCaseWizardPanel1.validate.errMsg.invalidSymbols=The Case Name cannot contain any of the following symbols\: \\ / \: * ? " < > | NewCaseWizardPanel1.validate.errMsg.dirExists=Case directory ''{0}'' already exists. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form index 5594196e1b..932f370478 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.form @@ -25,7 +25,7 @@ - + @@ -36,23 +36,25 @@ - + + + - + - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java index 36e389da16..b03a17920e 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseInformationPanel.java @@ -105,9 +105,11 @@ class CaseInformationPanel extends javax.swing.JPanel { outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 709, Short.MAX_VALUE) .addGroup(outerDetailsPanelLayout.createSequentialGroup() + .addContainerGap() .addComponent(editDetailsButton, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(closeButton)) + .addComponent(closeButton) + .addContainerGap()) ); outerDetailsPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {closeButton, editDetailsButton}); @@ -115,12 +117,12 @@ class CaseInformationPanel extends javax.swing.JPanel { outerDetailsPanelLayout.setVerticalGroup( outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(outerDetailsPanelLayout.createSequentialGroup() - .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE) + .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 228, Short.MAX_VALUE) .addGap(0, 0, 0) .addGroup(outerDetailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(closeButton) .addComponent(editDetailsButton)) - .addGap(5, 5, 5)) + .addContainerGap()) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form index af33a55a3b..c2be91ec45 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form @@ -85,7 +85,7 @@ - + @@ -365,7 +365,7 @@ - + @@ -548,7 +548,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index c90a0d939c..c56a5e0683 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -112,10 +112,10 @@ final class CasePropertiesPanel extends javax.swing.JPanel { "CasePropertiesPanel.lbCaseUUIDLabel.text=Case UUID:", "CasePropertiesPanel.examinerPanel.border.title=Examiner", "CasePropertiesPanel.examinerLabel.text=Name:", - "CasePropertiesPanel.lbExaminerPhoneLable.text=Phone:", + "CasePropertiesPanel.lbExaminerPhoneLabel.text=Phone:", "CasePropertiesPanel.lbExaminerEmailLabel.text=Email:", "CasePropertiesPanel.lbNotesLabel.text=Notes:", - "CasePropertiesPanel.organizationPanel.border.title=Organization", + "CasePropertiesPanel.pnOrganization.border.title=Organization", "CasePropertiesPanel.lbOrganizationNameLabel.text=Name:", "CasePropertiesPanel.lbPointOfContactNameLabel.text=Point of Contact:", "CasePropertiesPanel.lbPointOfContactPhoneLabel.text=Phone:", diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form index f8d10c7cfd..5a87a367f4 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form @@ -16,7 +16,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -64,14 +64,14 @@ - - - + + + - + @@ -106,6 +106,15 @@ + + + + + + + + + @@ -136,6 +145,7 @@ + @@ -145,9 +155,6 @@ - - - @@ -156,7 +163,7 @@ - + @@ -343,7 +350,7 @@ - + @@ -359,12 +366,12 @@ - - - - + + + + - + @@ -372,7 +379,7 @@ - + @@ -416,6 +423,15 @@ + + + + + + + + + @@ -436,6 +452,15 @@ + + + + + + + + + @@ -476,6 +501,15 @@ + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index aef8aac171..fd739a2558 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -209,6 +209,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { caseNumberLabel.setFont(caseNumberLabel.getFont().deriveFont(caseNumberLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(caseNumberLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseNumberLabel.text")); // NOI18N + caseNumberLabel.setMaximumSize(new java.awt.Dimension(41, 14)); + caseNumberLabel.setMinimumSize(new java.awt.Dimension(41, 14)); + caseNumberLabel.setPreferredSize(new java.awt.Dimension(41, 14)); caseNumberTextField.setFont(caseNumberTextField.getFont().deriveFont(caseNumberTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); @@ -217,9 +220,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { caseDisplayNameLabel.setMaximumSize(new java.awt.Dimension(41, 14)); caseDisplayNameLabel.setMinimumSize(new java.awt.Dimension(41, 14)); caseDisplayNameLabel.setPreferredSize(new java.awt.Dimension(41, 14)); + caseDisplayNameLabel.setVerifyInputWhenFocusTarget(false); caseDisplayNameTextField.setFont(caseDisplayNameTextField.getFont().deriveFont(caseDisplayNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - caseDisplayNameTextField.setText(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.caseDisplayNameTextField.text")); // NOI18N javax.swing.GroupLayout casePanelLayout = new javax.swing.GroupLayout(casePanel); casePanel.setLayout(casePanelLayout); @@ -227,13 +230,13 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(casePanelLayout.createSequentialGroup() .addContainerGap() - .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(caseNumberLabel) - .addComponent(caseDisplayNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(caseDisplayNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(caseNumberLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(caseDisplayNameTextField) - .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE)) + .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 684, Short.MAX_VALUE)) .addContainerGap()) ); casePanelLayout.setVerticalGroup( @@ -245,7 +248,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addComponent(caseDisplayNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(caseNumberLabel) + .addComponent(caseNumberLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(caseNumberTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); @@ -335,6 +338,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { orgainizationPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.orgainizationPanel.border.title"))); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactPhoneLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbPointOfContactPhoneLabel.text")); // NOI18N + lbPointOfContactPhoneLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactPhoneLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactPhoneLabel.setPreferredSize(new java.awt.Dimension(82, 14)); comboBoxOrgName.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -343,6 +349,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { }); org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactNameLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbPointOfContactNameLabel.text")); // NOI18N + lbPointOfContactNameLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactNameLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactNameLabel.setPreferredSize(new java.awt.Dimension(82, 14)); org.openide.awt.Mnemonics.setLocalizedText(bnNewOrganization, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.bnNewOrganization.text")); // NOI18N bnNewOrganization.setMargin(new java.awt.Insets(2, 6, 2, 6)); @@ -358,6 +367,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { lbOrganizationNameLabel.setPreferredSize(new java.awt.Dimension(41, 14)); org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactEmailLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbPointOfContactEmailLabel.text")); // NOI18N + lbPointOfContactEmailLabel.setMaximumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactEmailLabel.setMinimumSize(new java.awt.Dimension(82, 14)); + lbPointOfContactEmailLabel.setPreferredSize(new java.awt.Dimension(82, 14)); javax.swing.GroupLayout orgainizationPanelLayout = new javax.swing.GroupLayout(orgainizationPanel); orgainizationPanel.setLayout(orgainizationPanelLayout); @@ -369,17 +381,17 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(orgainizationPanelLayout.createSequentialGroup() - .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbPointOfContactPhoneLabel) - .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(lbPointOfContactNameLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(orgainizationPanelLayout.createSequentialGroup() - .addComponent(comboBoxOrgName, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboBoxOrgName, 0, 385, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(bnNewOrganization))) .addContainerGap()) @@ -411,7 +423,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 561, Short.MAX_VALUE) + .addGap(0, 787, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java index 2b65ad6f06..43471cbda2 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java @@ -55,7 +55,8 @@ public final class ManageOrganizationsDialog extends JDialog { this.dbManager = EamDb.getInstance(); organizationList.setCellRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = 1L; - + + @SuppressWarnings("rawtypes") @Override public Component getListCellRendererComponent(javax.swing.JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); From 10e087caf67d9d05f0f3ad98413590df47391b6d Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 16 Oct 2017 15:09:17 -0400 Subject: [PATCH 11/46] 2774 handle exceptions regarding failure to access organization data --- .../org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java | 4 ++-- .../autopsy/casemodule/OptionalCasePropertiesPanel.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index c56a5e0683..78b1e7e3e2 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.casemodule; import java.nio.file.Paths; +import java.util.logging.Level; import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; @@ -86,8 +87,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { currentOrg = correlationCase.getOrg(); } } catch (EamDbException ex) { - //WJS-TODO handle exception - Exceptions.printStackTrace(ex); + LOGGER.log(Level.SEVERE, "Unable to access Correlation Case when Central Repo is enabled", ex); } } if (currentOrg != null) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index fd739a2558..6c1854338f 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -77,7 +77,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { EamDb dbManager = EamDb.getInstance(); selectedOrg = dbManager.getCaseByUUID(currentCase.getName()).getOrg(); } catch (EamDbException ex) { - //WJS-TODO HANDLE + LOGGER.log(Level.SEVERE, "Unable to get Organization associated with the case from Central Repo", ex); } } if (selectedOrg != null) { @@ -116,7 +116,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { comboBoxOrgName.addItem(org.getName()); }); } catch (EamDbException ex) { - //WJS-TODO HANDLE EXCEPT + LOGGER.log(Level.WARNING, "Unable to populate list of Organizations from Central Repo", ex); } } From dfe67722e2a79234329b90c93592422a5de0cd07 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 16 Oct 2017 17:11:56 -0400 Subject: [PATCH 12/46] 2774 Delete org method added to Eamdb for organization management --- .../casemodule/NewCaseVisualPanel1.form | 2 +- .../casemodule/NewCaseVisualPanel1.java | 2 +- .../OptionalCasePropertiesPanel.form | 82 +++++++++---------- .../OptionalCasePropertiesPanel.java | 58 ++++++------- .../datamodel/AbstractSqlEamDb.java | 32 +++++++- .../centralrepository/datamodel/EamDb.java | 10 +++ .../ManageOrganizationsDialog.form | 35 +++++++- .../ManageOrganizationsDialog.java | 55 ++++++++++--- 8 files changed, 181 insertions(+), 95 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form index 72b0a6cb9b..f6ed4838c7 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form @@ -97,7 +97,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java index d3f19f872c..a4f21126de 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java @@ -334,7 +334,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { .addComponent(caseDirTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(27, 27, 27) .addComponent(caseParentDirWarningLabel) - .addContainerGap(21, Short.MAX_VALUE)) + .addContainerGap(169, Short.MAX_VALUE)) ); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form index 5a87a367f4..2c5fee55f4 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form @@ -16,33 +16,27 @@ - - - - - - - - - - + + + + + + + - - - - - - - - - - - + + + + + + + + @@ -63,17 +57,17 @@ - + - + - + - + @@ -90,7 +84,7 @@ - + @@ -174,7 +168,7 @@ - + @@ -183,8 +177,8 @@ - - + + @@ -192,14 +186,14 @@ - + - - + + - + @@ -226,7 +220,7 @@ - + @@ -361,11 +355,11 @@ - + - + - + @@ -373,18 +367,18 @@ - + - - - - + + + + - + @@ -412,7 +406,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index 6c1854338f..d8b7e306c0 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -236,7 +236,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(caseDisplayNameTextField) - .addComponent(caseNumberTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 684, Short.MAX_VALUE)) + .addComponent(caseNumberTextField)) .addContainerGap()) ); casePanelLayout.setVerticalGroup( @@ -250,7 +250,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addGroup(casePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(caseNumberLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(caseNumberTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) + .addGap(6, 6, 6)) ); examinerPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.examinerPanel.border.title"))); // NOI18N @@ -301,17 +301,17 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(10, 10, 10) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tfExaminerPhoneText) - .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE))) + .addComponent(examinerNotesScrollPane) + .addComponent(tfExaminerPhoneText))) .addGroup(examinerPanelLayout.createSequentialGroup() .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(examinerLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(examinerTextField) + .addComponent(examinerTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE) .addComponent(tfExaminerEmailText)))) - .addContainerGap()) + .addGap(11, 11, 11)) ); examinerPanelLayout.setVerticalGroup( examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -332,7 +332,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) + .addGap(6, 6, 6)) ); orgainizationPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.orgainizationPanel.border.title"))); // NOI18N @@ -387,13 +387,13 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(orgainizationPanelLayout.createSequentialGroup() - .addComponent(comboBoxOrgName, 0, 385, Short.MAX_VALUE) + .addComponent(comboBoxOrgName, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnNewOrganization))) + .addComponent(bnNewOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, 1, Short.MAX_VALUE))) .addContainerGap()) ); orgainizationPanelLayout.setVerticalGroup( @@ -416,35 +416,31 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) + .addGap(6, 6, 6)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 787, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(orgainizationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(examinerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(casePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap())) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(casePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(examinerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(orgainizationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(10, 10, 10)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 439, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(casePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(examinerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(orgainizationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap())) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(casePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(examinerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(orgainizationPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0)) ); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index ef3e90d066..26c90c6bb4 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1422,7 +1422,37 @@ public abstract class AbstractSqlEamDb implements EamDb { EamDbUtil.closeConnection(conn); } } - + +@Override + public void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException { + Connection conn = connect(); + PreparedStatement checkIfUsedStatement = null; + ResultSet resultSet = null; + String checkIfUsedSql = "SELECT count(*) FROM cases, reference_sets WHERE cases.org_id=? OR reference_sets.org_id=?"; + PreparedStatement deleteOrgStatement = null; + String deleteOrgSql = "DELETE FROM organizations WHERE id=?"; + try { + checkIfUsedStatement = conn.prepareStatement(checkIfUsedSql); + checkIfUsedStatement.setInt(1, organizationToDelete.getOrgID()); + checkIfUsedStatement.setInt(2, organizationToDelete.getOrgID()); + resultSet = checkIfUsedStatement.executeQuery(); + resultSet.next(); + if (resultSet.getLong(1) > 0) { + throw new EamDbException("Can not delete organization which is currently a case in the central repo"); + } + deleteOrgStatement = conn.prepareStatement(deleteOrgSql); + deleteOrgStatement.setInt(1, organizationToDelete.getOrgID()); + deleteOrgStatement.executeUpdate(); + } catch (SQLException ex) { + throw new EamDbException("Error deleting organization by id.", ex); // NON-NLS + } finally { + EamDbUtil.closePreparedStatement(checkIfUsedStatement); + EamDbUtil.closePreparedStatement(deleteOrgStatement); + EamDbUtil.closeResultSet(resultSet); + EamDbUtil.closeConnection(conn); + } + } + /** * Add a new Global Set * diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index 8e4a6bf16e..70ab104fa4 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -404,6 +404,16 @@ public interface EamDb { */ void updateOrganization(EamOrganization updatedOrganization) throws EamDbException; + /** + * Delete an organization if it is not being used by any case. + * + * @param organizationToDelete the organization to be deleted + * + * @throws EamDbException + */ + void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException; + + /** * Add a new Global Set * diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form index 67bdfb9da6..0655ced314 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.form @@ -68,11 +68,11 @@ - + - - - + + + @@ -216,6 +216,15 @@ + + + + + + + + + @@ -229,6 +238,15 @@ + + + + + + + + + @@ -309,6 +327,15 @@ + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java index 43471cbda2..89651017d4 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java @@ -22,10 +22,12 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.Toolkit; import java.util.List; +import java.util.logging.Level; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JDialog; import javax.swing.JFrame; +import javax.swing.JOptionPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openide.util.Exceptions; @@ -34,6 +36,7 @@ import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; +import org.sleuthkit.autopsy.coreutils.Logger; public final class ManageOrganizationsDialog extends JDialog { @@ -42,6 +45,8 @@ public final class ManageOrganizationsDialog extends JDialog { private EamDb dbManager; private EamOrganization newOrg; private final DefaultListModel rulesListModel = new DefaultListModel<>(); + private final static Logger LOGGER = Logger.getLogger(ManageOrganizationsDialog.class.getName()); + @Messages({"ManageOrganizationsDialog.title.text=Manage Organizations"}) /** * Creates new form ManageOrganizationsPanel @@ -55,7 +60,7 @@ public final class ManageOrganizationsDialog extends JDialog { this.dbManager = EamDb.getInstance(); organizationList.setCellRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = 1L; - + @SuppressWarnings("rawtypes") @Override public Component getListCellRendererComponent(javax.swing.JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { @@ -117,7 +122,11 @@ public final class ManageOrganizationsDialog extends JDialog { "ManageOrganizationsDialog.pocPhoneLabel.text=Point of Contact Phone:", "ManageOrganizationsDialog.orgDescriptionTextArea.text=Organizations are used to provide additional contact information for the content they are associated with.", "ManageOrganizationsDialog.orgListLabel.text=Organizations", - "ManageOrganizationsDialog.orgDetailsLabel.text=Organization Details"}) + "ManageOrganizationsDialog.orgDetailsLabel.text=Organization Details", + "ManageOrganizationsDialog.confirmDeletion.title=Confirm Deletion", + "ManageOrganizationsDialog.confirmDeletion.message=Are you sure you want to delete the selected organization from the central repo?", + "ManageOrganizationsDialog.unableToDeleteOrg.title=Unable to Delete", + "ManageOrganizationsDialog.unableToDeleteOrg.message=Unable to delete selected organizaiton."}) /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -171,6 +180,9 @@ public final class ManageOrganizationsDialog extends JDialog { org.openide.awt.Mnemonics.setLocalizedText(newButton, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.newButton.text")); // NOI18N newButton.setMargin(new java.awt.Insets(2, 6, 2, 6)); + newButton.setMaximumSize(new java.awt.Dimension(70, 23)); + newButton.setMinimumSize(new java.awt.Dimension(70, 23)); + newButton.setPreferredSize(new java.awt.Dimension(70, 23)); newButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newButtonActionPerformed(evt); @@ -179,6 +191,9 @@ public final class ManageOrganizationsDialog extends JDialog { org.openide.awt.Mnemonics.setLocalizedText(deleteButton, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.deleteButton.text")); // NOI18N deleteButton.setMargin(new java.awt.Insets(2, 6, 2, 6)); + deleteButton.setMaximumSize(new java.awt.Dimension(70, 23)); + deleteButton.setMinimumSize(new java.awt.Dimension(70, 23)); + deleteButton.setPreferredSize(new java.awt.Dimension(70, 23)); deleteButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deleteButtonActionPerformed(evt); @@ -213,6 +228,9 @@ public final class ManageOrganizationsDialog extends JDialog { pocEmailTextField.setEditable(false); org.openide.awt.Mnemonics.setLocalizedText(editButton, org.openide.util.NbBundle.getMessage(ManageOrganizationsDialog.class, "ManageOrganizationsDialog.editButton.text")); // NOI18N + editButton.setMaximumSize(new java.awt.Dimension(70, 23)); + editButton.setMinimumSize(new java.awt.Dimension(70, 23)); + editButton.setPreferredSize(new java.awt.Dimension(70, 23)); editButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editButtonActionPerformed(evt); @@ -231,11 +249,11 @@ public final class ManageOrganizationsDialog extends JDialog { .addComponent(orgDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(orgListLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() - .addComponent(newButton, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(newButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(editButton) + .addComponent(editButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(deleteButton)) + .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(orgListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -264,9 +282,6 @@ public final class ManageOrganizationsDialog extends JDialog { .addComponent(orgDetailsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) ); - - manageOrganizationsPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deleteButton, editButton, newButton}); - manageOrganizationsPanelLayout.setVerticalGroup( manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(manageOrganizationsPanelLayout.createSequentialGroup() @@ -301,9 +316,9 @@ public final class ManageOrganizationsDialog extends JDialog { .addComponent(orgListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 288, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(manageOrganizationsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(newButton) - .addComponent(deleteButton) - .addComponent(editButton)))) + .addComponent(newButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(editButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addContainerGap()) ); @@ -326,7 +341,18 @@ public final class ManageOrganizationsDialog extends JDialog { }// //GEN-END:initComponents private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed - //WJS-TODO implement delete + if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(), + Bundle.ManageOrganizationsDialog_confirmDeletion_message(), + Bundle.ManageOrganizationsDialog_confirmDeletion_title(), + JOptionPane.YES_NO_OPTION)) { + try { + EamDb.getInstance().deleteOrganization(organizationList.getSelectedValue()); //WJS-TODO implement delete + } catch (EamDbException ex) { + JOptionPane.showMessageDialog(null, + Bundle.ManageOrganizationsDialog_unableToDeleteOrg_message(), Bundle.ManageOrganizationsDialog_unableToDeleteOrg_title(), JOptionPane.WARNING_MESSAGE); + LOGGER.log(Level.INFO, "Was unable to delete organization from central repository", ex); + } + } }//GEN-LAST:event_deleteButtonActionPerformed private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed @@ -406,7 +432,8 @@ public final class ManageOrganizationsDialog extends JDialog { } else { selected = organizationList.getSelectedValue(); } - if (selected != null) { + boolean isSelected = (selected != null); + if (isSelected) { orgNameTextField.setText(selected.getName()); pocNameTextField.setText(selected.getPocName()); pocPhoneTextField.setText(selected.getPocPhone()); @@ -417,6 +444,8 @@ public final class ManageOrganizationsDialog extends JDialog { pocPhoneTextField.setText(""); pocEmailTextField.setText(""); } + newButton.setEnabled(isSelected); + deleteButton.setEnabled(isSelected); } } From 20725202e55d6cf25b9f4bec26ff01d59290b2ab Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 16 Oct 2017 17:54:31 -0400 Subject: [PATCH 13/46] 2774 prevent in use organizations from being deleted from CR --- .../autopsy/casemodule/OptionalCasePropertiesPanel.form | 4 ++-- .../autopsy/casemodule/OptionalCasePropertiesPanel.java | 2 +- .../centralrepository/datamodel/AbstractSqlEamDb.java | 7 +++++-- .../optionspanel/ManageOrganizationsDialog.java | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form index 2c5fee55f4..a30f114af4 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form @@ -374,8 +374,8 @@ - - + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index d8b7e306c0..1aec814da1 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -393,7 +393,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addGroup(orgainizationPanelLayout.createSequentialGroup() .addComponent(comboBoxOrgName, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnNewOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, 1, Short.MAX_VALUE))) + .addComponent(bnNewOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) ); orgainizationPanelLayout.setVerticalGroup( diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 26c90c6bb4..23de162487 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1428,7 +1428,7 @@ public abstract class AbstractSqlEamDb implements EamDb { Connection conn = connect(); PreparedStatement checkIfUsedStatement = null; ResultSet resultSet = null; - String checkIfUsedSql = "SELECT count(*) FROM cases, reference_sets WHERE cases.org_id=? OR reference_sets.org_id=?"; + String checkIfUsedSql = "SELECT (select count(*) FROM cases WHERE org_id=?) + (select count(*) FROM reference_sets WHERE org_id=?)"; PreparedStatement deleteOrgStatement = null; String deleteOrgSql = "DELETE FROM organizations WHERE id=?"; try { @@ -1436,8 +1436,11 @@ public abstract class AbstractSqlEamDb implements EamDb { checkIfUsedStatement.setInt(1, organizationToDelete.getOrgID()); checkIfUsedStatement.setInt(2, organizationToDelete.getOrgID()); resultSet = checkIfUsedStatement.executeQuery(); + System.out.println(checkIfUsedStatement.toString()); resultSet.next(); - if (resultSet.getLong(1) > 0) { + long count = resultSet.getLong(1); + System.out.println("COUNT OF RESULTS: "+ count); + if (count > 0) { throw new EamDbException("Can not delete organization which is currently a case in the central repo"); } deleteOrgStatement = conn.prepareStatement(deleteOrgSql); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java index 89651017d4..271281060b 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java @@ -346,7 +346,8 @@ public final class ManageOrganizationsDialog extends JDialog { Bundle.ManageOrganizationsDialog_confirmDeletion_title(), JOptionPane.YES_NO_OPTION)) { try { - EamDb.getInstance().deleteOrganization(organizationList.getSelectedValue()); //WJS-TODO implement delete + EamDb.getInstance().deleteOrganization(organizationList.getSelectedValue()); + populateList(); } catch (EamDbException ex) { JOptionPane.showMessageDialog(null, Bundle.ManageOrganizationsDialog_unableToDeleteOrg_message(), Bundle.ManageOrganizationsDialog_unableToDeleteOrg_title(), JOptionPane.WARNING_MESSAGE); From c1fad4beb8bcd422edbc25a249dd8aad8240adfd Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 16 Oct 2017 18:05:27 -0400 Subject: [PATCH 14/46] 2774 enforce case naming rules when renaming a display name --- .../casemodule/CasePropertiesPanel.java | 30 ------------------- .../OptionalCasePropertiesPanel.java | 13 ++++++++ .../datamodel/AbstractSqlEamDb.java | 7 ++--- 3 files changed, 15 insertions(+), 35 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index 78b1e7e3e2..f2ade38fe4 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -488,36 +488,6 @@ final class CasePropertiesPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents -//WJS-TODO ensure case not saved with empty name -// @NbBundle.Messages({ -// "CasePropertiesPanel.errorDialog.emptyCaseNameMessage=No case name entered.", -// "CasePropertiesPanel.errorDialog.invalidCaseNameMessage=Case names cannot include the following symbols: \\, /, :, *, ?, \", <, >, |" -// }) -// private void saveCaseName() { -// String newCaseDisplayName = caseNameTextField.getText(); -// -// if (newCaseDisplayName.equals(theCase.getDisplayName())) { -// return; -// } -// -// if (newCaseDisplayName.trim().isEmpty()) { -// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_emptyCaseNameMessage()); -// return; -// } -// -// if (!Case.isValidName(newCaseDisplayName)) { -// MessageNotifyUtil.Message.error(Bundle.CasePropertiesPanel_errorDialog_invalidCaseNameMessage()); -// return; -// } -// -// try { -// theCase.updateDisplayName(newCaseDisplayName); -// } catch (CaseActionException ex) { -// MessageNotifyUtil.Message.error(ex.getLocalizedMessage()); -// LOGGER.log(Level.SEVERE, "Failed to update case display name", ex); //NON-NLS -// } -// } - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel caseDirField; private javax.swing.JLabel caseDirLabel; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index 1aec814da1..a745a2e949 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -29,6 +29,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; import org.sleuthkit.autopsy.centralrepository.optionspanel.ManageOrganizationsDialog; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; /** * Panel which allows for editing and setting of the case details which are @@ -500,6 +501,10 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { } } + @Messages({ + "OptionalCasePropertiesPanel.errorDialog.emptyCaseNameMessage=No case name entered.", + "OptionalCasePropertiesPanel.errorDialog.invalidCaseNameMessage=Case names cannot include the following symbols: \\, /, :, *, ?, \", <, >, |" + }) /** * Save changed value from text fields and text areas into the EamCase * object. @@ -508,6 +513,14 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (EamDb.isEnabled()) { try { + if (caseDisplayNameTextField.getText().trim().isEmpty()) { + MessageNotifyUtil.Message.error(Bundle.OptionalCasePropertiesPanel_errorDialog_emptyCaseNameMessage()); + return; + } + if (!Case.isValidName(caseDisplayNameTextField.getText())) { + MessageNotifyUtil.Message.error(Bundle.OptionalCasePropertiesPanel_errorDialog_invalidCaseNameMessage()); + return; + } EamDb dbManager = EamDb.getInstance(); CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); if (caseDisplayNameTextField.isVisible()) { diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 23de162487..f72a4de399 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1436,12 +1436,9 @@ public abstract class AbstractSqlEamDb implements EamDb { checkIfUsedStatement.setInt(1, organizationToDelete.getOrgID()); checkIfUsedStatement.setInt(2, organizationToDelete.getOrgID()); resultSet = checkIfUsedStatement.executeQuery(); - System.out.println(checkIfUsedStatement.toString()); resultSet.next(); - long count = resultSet.getLong(1); - System.out.println("COUNT OF RESULTS: "+ count); - if (count > 0) { - throw new EamDbException("Can not delete organization which is currently a case in the central repo"); + if (resultSet.getLong(1) > 0) { + throw new EamDbException("Can not delete organization which is currently in use by a case or reference set in the central repo"); } deleteOrgStatement = conn.prepareStatement(deleteOrgSql); deleteOrgStatement.setInt(1, organizationToDelete.getOrgID()); From 01284392b4685d5092fa7c82fa7a4f14214d0b73 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 16 Oct 2017 18:17:34 -0400 Subject: [PATCH 15/46] 2774 fix case display name checking before applying changes --- .../OptionalCasePropertiesPanel.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index a745a2e949..688de0dfc7 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -483,7 +483,19 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { comboBoxOrgName.setSelectedItem(orgName); } + @Messages({ + "OptionalCasePropertiesPanel.errorDialog.emptyCaseNameMessage=No case name entered.", + "OptionalCasePropertiesPanel.errorDialog.invalidCaseNameMessage=Case names cannot include the following symbols: \\, /, :, *, ?, \", <, >, |" + }) void saveUpdatedCaseDetails() { + if (caseDisplayNameTextField.getText().trim().isEmpty()) { + MessageNotifyUtil.Message.error(Bundle.OptionalCasePropertiesPanel_errorDialog_emptyCaseNameMessage()); + return; + } + if (!Case.isValidName(caseDisplayNameTextField.getText())) { + MessageNotifyUtil.Message.error(Bundle.OptionalCasePropertiesPanel_errorDialog_invalidCaseNameMessage()); + return; + } updateCaseDetails(); updateCorrelationCase(); } @@ -501,10 +513,6 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { } } - @Messages({ - "OptionalCasePropertiesPanel.errorDialog.emptyCaseNameMessage=No case name entered.", - "OptionalCasePropertiesPanel.errorDialog.invalidCaseNameMessage=Case names cannot include the following symbols: \\, /, :, *, ?, \", <, >, |" - }) /** * Save changed value from text fields and text areas into the EamCase * object. @@ -513,14 +521,6 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); if (EamDb.isEnabled()) { try { - if (caseDisplayNameTextField.getText().trim().isEmpty()) { - MessageNotifyUtil.Message.error(Bundle.OptionalCasePropertiesPanel_errorDialog_emptyCaseNameMessage()); - return; - } - if (!Case.isValidName(caseDisplayNameTextField.getText())) { - MessageNotifyUtil.Message.error(Bundle.OptionalCasePropertiesPanel_errorDialog_invalidCaseNameMessage()); - return; - } EamDb dbManager = EamDb.getInstance(); CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); if (caseDisplayNameTextField.isVisible()) { From 424d2cf7f83ce08db53886736f962c427c761a95 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 17 Oct 2017 11:51:56 -0400 Subject: [PATCH 16/46] 2774 fix Event listener for enabling and disabling org management buttons --- .../ManageOrganizationsDialog.java | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java index 271281060b..ca558bb90d 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java @@ -72,6 +72,7 @@ public final class ManageOrganizationsDialog extends JDialog { organizationList.setModel(rulesListModel); organizationList.addListSelectionListener(new OrganizationListSelectionListener()); populateList(); + setButtonsEnabled(organizationList.getSelectedValue() != null); newOrg = null; } catch (EamDbException ex) { Exceptions.printStackTrace(ex); @@ -87,8 +88,6 @@ public final class ManageOrganizationsDialog extends JDialog { private void populateListAndSelect(EamOrganization selected) throws EamDbException { rulesListModel.clear(); - if (selected != null) { - } List orgs = dbManager.getOrganizations(); if (orgs.size() > 0) { for (EamOrganization org : orgs) { @@ -341,17 +340,20 @@ public final class ManageOrganizationsDialog extends JDialog { }// //GEN-END:initComponents private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed - if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(), - Bundle.ManageOrganizationsDialog_confirmDeletion_message(), - Bundle.ManageOrganizationsDialog_confirmDeletion_title(), - JOptionPane.YES_NO_OPTION)) { - try { - EamDb.getInstance().deleteOrganization(organizationList.getSelectedValue()); - populateList(); - } catch (EamDbException ex) { - JOptionPane.showMessageDialog(null, - Bundle.ManageOrganizationsDialog_unableToDeleteOrg_message(), Bundle.ManageOrganizationsDialog_unableToDeleteOrg_title(), JOptionPane.WARNING_MESSAGE); - LOGGER.log(Level.INFO, "Was unable to delete organization from central repository", ex); + EamOrganization orgToDelete = organizationList.getSelectedValue(); + if (orgToDelete != null) { + if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(), + Bundle.ManageOrganizationsDialog_confirmDeletion_message(), + Bundle.ManageOrganizationsDialog_confirmDeletion_title(), + JOptionPane.YES_NO_OPTION)) { + try { + EamDb.getInstance().deleteOrganization(orgToDelete); + populateList(); + } catch (EamDbException ex) { + JOptionPane.showMessageDialog(null, + Bundle.ManageOrganizationsDialog_unableToDeleteOrg_message(), Bundle.ManageOrganizationsDialog_unableToDeleteOrg_title(), JOptionPane.WARNING_MESSAGE); + LOGGER.log(Level.INFO, "Was unable to delete organization from central repository", ex); + } } } }//GEN-LAST:event_deleteButtonActionPerformed @@ -365,7 +367,7 @@ public final class ManageOrganizationsDialog extends JDialog { if (dialogO.isChanged()) { try { newOrg = dialogO.getNewOrg(); - populateListAndSelect(newOrg); + populateListAndSelect(dialogO.getNewOrg()); } catch (EamDbException ex) { } @@ -374,13 +376,15 @@ public final class ManageOrganizationsDialog extends JDialog { private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed EamOrganization orgToEdit = organizationList.getSelectedValue(); - AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(orgToEdit); - if (dialogO.isChanged()) { - try { - newOrg = dialogO.getNewOrg(); - populateListAndSelect(newOrg); - } catch (EamDbException ex) { + if (orgToEdit != null) { + AddNewOrganizationDialog dialogO = new AddNewOrganizationDialog(orgToEdit); + if (dialogO.isChanged()) { + try { + newOrg = dialogO.getNewOrg(); + populateListAndSelect(dialogO.getNewOrg()); + } catch (EamDbException ex) { + } } } }//GEN-LAST:event_editButtonActionPerformed @@ -417,6 +421,11 @@ public final class ManageOrganizationsDialog extends JDialog { return newOrg; } + private void setButtonsEnabled(boolean isSelected) { + editButton.setEnabled(isSelected); + deleteButton.setEnabled(isSelected); + } + /** * A list events listener for the interesting files sets list component. */ @@ -427,14 +436,10 @@ public final class ManageOrganizationsDialog extends JDialog { if (e.getValueIsAdjusting()) { return; } - EamOrganization selected; - if (newOrg != null) { - selected = newOrg; - } else { - selected = organizationList.getSelectedValue(); - } + EamOrganization selected = organizationList.getSelectedValue(); boolean isSelected = (selected != null); - if (isSelected) { + setButtonsEnabled(isSelected); + if (selected != null) { orgNameTextField.setText(selected.getName()); pocNameTextField.setText(selected.getPocName()); pocPhoneTextField.setText(selected.getPocPhone()); @@ -445,9 +450,7 @@ public final class ManageOrganizationsDialog extends JDialog { pocPhoneTextField.setText(""); pocEmailTextField.setText(""); } - newButton.setEnabled(isSelected); - deleteButton.setEnabled(isSelected); } - } + } From dc8ae5818a04b2747822d884487b2ca09a00f133 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 17 Oct 2017 16:29:28 -0400 Subject: [PATCH 17/46] 2774 fixed populating of Org combobox and sizing of manage org button --- .../casemodule/OptionalCasePropertiesPanel.form | 6 +++--- .../casemodule/OptionalCasePropertiesPanel.java | 15 ++++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form index a30f114af4..af8b72ab4a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form @@ -188,7 +188,7 @@ - + @@ -373,9 +373,9 @@ - + - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index 688de0dfc7..4f2d25b089 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -61,17 +61,18 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { tfExaminerEmailText.setText(Case.getCurrentCase().getExaminerEmail()); tfExaminerPhoneText.setText(Case.getCurrentCase().getExaminerPhone()); taNotesText.setText(Case.getCurrentCase().getExaminerNotes()); + setUpCentralRepoFields(); setUpOrganizationData(); } else { caseDisplayNameLabel.setVisible(false); caseDisplayNameTextField.setVisible(false); + setUpCentralRepoFields(); } - setUpCentralRepoFields(); + } private void setUpOrganizationData() { if (EamDb.isEnabled()) { - loadOrganizationData(); Case currentCase = Case.getCurrentCase(); if (currentCase != null) { try { @@ -103,11 +104,14 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { orgainizationPanel.setEnabled(cREnabled); if (!cREnabled) { clearOrganization(); + } else { + loadOrganizationData(); } } private void loadOrganizationData() { + Object selectedBeforeLoad = comboBoxOrgName.getSelectedItem(); comboBoxOrgName.removeAllItems(); try { comboBoxOrgName.addItem(""); // for when a case has a null Org @@ -116,6 +120,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { orgs.forEach((org) -> { comboBoxOrgName.addItem(org.getName()); }); + comboBoxOrgName.setSelectedItem(selectedBeforeLoad); } catch (EamDbException ex) { LOGGER.log(Level.WARNING, "Unable to populate list of Organizations from Central Repo", ex); } @@ -310,7 +315,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addComponent(examinerLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(examinerTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE) + .addComponent(examinerTextField) .addComponent(tfExaminerEmailText)))) .addGap(11, 11, 11)) ); @@ -392,9 +397,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(orgainizationPanelLayout.createSequentialGroup() - .addComponent(comboBoxOrgName, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnNewOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(bnNewOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) ); orgainizationPanelLayout.setVerticalGroup( From 288c889bfe385033d6c7e8e6adda90f57079eef2 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 17 Oct 2017 16:55:36 -0400 Subject: [PATCH 18/46] 2774 make messages for failure to delete Organization more informative --- .../autopsy/centralrepository/datamodel/AbstractSqlEamDb.java | 4 ++-- .../optionspanel/ManageOrganizationsDialog.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index f72a4de399..842d7fb64c 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1438,13 +1438,13 @@ public abstract class AbstractSqlEamDb implements EamDb { resultSet = checkIfUsedStatement.executeQuery(); resultSet.next(); if (resultSet.getLong(1) > 0) { - throw new EamDbException("Can not delete organization which is currently in use by a case or reference set in the central repo"); + throw new EamDbException("Can not delete organization which is currently in use by a case or reference set in the central repo."); } deleteOrgStatement = conn.prepareStatement(deleteOrgSql); deleteOrgStatement.setInt(1, organizationToDelete.getOrgID()); deleteOrgStatement.executeUpdate(); } catch (SQLException ex) { - throw new EamDbException("Error deleting organization by id.", ex); // NON-NLS + throw new EamDbException("Error executing query when attempting to delete organization by id.", ex); // NON-NLS } finally { EamDbUtil.closePreparedStatement(checkIfUsedStatement); EamDbUtil.closePreparedStatement(deleteOrgStatement); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java index ca558bb90d..ad6c26e4d8 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ManageOrganizationsDialog.java @@ -351,7 +351,7 @@ public final class ManageOrganizationsDialog extends JDialog { populateList(); } catch (EamDbException ex) { JOptionPane.showMessageDialog(null, - Bundle.ManageOrganizationsDialog_unableToDeleteOrg_message(), Bundle.ManageOrganizationsDialog_unableToDeleteOrg_title(), JOptionPane.WARNING_MESSAGE); + ex.getMessage(), Bundle.ManageOrganizationsDialog_unableToDeleteOrg_title(), JOptionPane.WARNING_MESSAGE); LOGGER.log(Level.INFO, "Was unable to delete organization from central repository", ex); } } From 347dcb5578b582165a2585eb6b21b869706fed61 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 17 Oct 2017 17:16:42 -0400 Subject: [PATCH 19/46] 2774 aquire lock for editing and deleting of orgs when using sqllite --- .../datamodel/SqliteEamDb.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java index 40ecc8cb37..5890dd2a67 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/SqliteEamDb.java @@ -706,8 +706,27 @@ public class SqliteEamDb extends AbstractSqlEamDb { } finally { releaseSharedLock(); } - } + } + @Override + public void updateOrganization(EamOrganization updatedOrganization) throws EamDbException { + try{ + acquireExclusiveLock(); + super.updateOrganization(updatedOrganization); + } finally { + releaseExclusiveLock(); + } + } + + @Override + public void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException { + try{ + acquireExclusiveLock(); + super.deleteOrganization(organizationToDelete); + } finally { + releaseExclusiveLock(); + } + } /** * Add a new Global Set * From 466e5661efd882142f882fd1a9506cb850a9fb03 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 17 Oct 2017 17:29:24 -0400 Subject: [PATCH 20/46] 2774 changed exception messages for failure to delete orgs to be @messages --- .../datamodel/AbstractSqlEamDb.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 842d7fb64c..4a3324843a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -34,6 +34,8 @@ import java.time.LocalDate; import java.util.HashMap; import java.util.Map; import java.util.Set; +import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; @@ -1315,11 +1317,11 @@ public abstract class AbstractSqlEamDb implements EamDb { preparedStatement.executeUpdate(); ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); - if (generatedKeys.next()) { - return generatedKeys.getLong(1); - } else { - throw new SQLException("Creating user failed, no ID obtained."); - } + if (generatedKeys.next()) { + return generatedKeys.getLong(1); + } else { + throw new SQLException("Creating user failed, no ID obtained."); + } } catch (SQLException ex) { throw new EamDbException("Error inserting new organization.", ex); // NON-NLS } finally { @@ -1422,8 +1424,11 @@ public abstract class AbstractSqlEamDb implements EamDb { EamDbUtil.closeConnection(conn); } } - -@Override + + @Messages({"AbstractSqlEamDb.deleteOrganization.inUseException.message=Can not delete organization " + + "which is currently in use by a case or reference set in the central repository.", + "AbstractSqlEamDb.deleteOrganization.errorDeleting.message=Error executing query when attempting to delete organization by id."}) + @Override public void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException { Connection conn = connect(); PreparedStatement checkIfUsedStatement = null; @@ -1438,13 +1443,13 @@ public abstract class AbstractSqlEamDb implements EamDb { resultSet = checkIfUsedStatement.executeQuery(); resultSet.next(); if (resultSet.getLong(1) > 0) { - throw new EamDbException("Can not delete organization which is currently in use by a case or reference set in the central repo."); + throw new EamDbException(Bundle.AbstractSqlEamDb_deleteOrganization_inUseException_message()); } deleteOrgStatement = conn.prepareStatement(deleteOrgSql); deleteOrgStatement.setInt(1, organizationToDelete.getOrgID()); deleteOrgStatement.executeUpdate(); } catch (SQLException ex) { - throw new EamDbException("Error executing query when attempting to delete organization by id.", ex); // NON-NLS + throw new EamDbException(Bundle.AbstractSqlEamDb_deleteOrganization_errorDeleting_message(), ex); // NON-NLS } finally { EamDbUtil.closePreparedStatement(checkIfUsedStatement); EamDbUtil.closePreparedStatement(deleteOrgStatement); @@ -1452,7 +1457,7 @@ public abstract class AbstractSqlEamDb implements EamDb { EamDbUtil.closeConnection(conn); } } - + /** * Add a new Global Set * From 971e9cc31e3c774964e3491e6b833b0db0395422 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 17 Oct 2017 17:58:24 -0400 Subject: [PATCH 21/46] 2774 fixed updating of org list upon org deletion --- .../autopsy/casemodule/OptionalCasePropertiesPanel.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index 4f2d25b089..bd381424ef 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -68,7 +68,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { caseDisplayNameTextField.setVisible(false); setUpCentralRepoFields(); } - + } private void setUpOrganizationData() { @@ -475,13 +475,13 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { private void bnNewOrganizationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnNewOrganizationActionPerformed ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); // update the combobox options and org data fields + loadOrganizationData(); if (dialog.isChanged()) { - loadOrganizationData(); selectedOrg = dialog.getNewOrg(); setCurrentlySelectedOrganization(dialog.getNewOrg().getName()); - validate(); - repaint(); } + validate(); + repaint(); }//GEN-LAST:event_bnNewOrganizationActionPerformed void setCurrentlySelectedOrganization(String orgName) { From 30ebd546633452a594e55ca578b3c571b356e2e1 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 18 Oct 2017 12:54:41 -0400 Subject: [PATCH 22/46] 2774 ensure result set from generated keys is closed correctly --- .../centralrepository/datamodel/AbstractSqlEamDb.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 4a3324843a..97d18af6a8 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -1304,7 +1304,7 @@ public abstract class AbstractSqlEamDb implements EamDb { @Override public long newOrganization(EamOrganization eamOrg) throws EamDbException { Connection conn = connect(); - + ResultSet generatedKeys = null; PreparedStatement preparedStatement = null; String sql = "INSERT INTO organizations(org_name, poc_name, poc_email, poc_phone) VALUES (?, ?, ?, ?)"; @@ -1316,7 +1316,7 @@ public abstract class AbstractSqlEamDb implements EamDb { preparedStatement.setString(4, eamOrg.getPocPhone()); preparedStatement.executeUpdate(); - ResultSet generatedKeys = preparedStatement.getGeneratedKeys(); + generatedKeys = preparedStatement.getGeneratedKeys(); if (generatedKeys.next()) { return generatedKeys.getLong(1); } else { @@ -1326,6 +1326,7 @@ public abstract class AbstractSqlEamDb implements EamDb { throw new EamDbException("Error inserting new organization.", ex); // NON-NLS } finally { EamDbUtil.closePreparedStatement(preparedStatement); + EamDbUtil.closeResultSet(generatedKeys); EamDbUtil.closeConnection(conn); } } From 2fb71f2ff0d52287b2f5594b20dfad531cdd0ee4 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 18 Oct 2017 14:36:44 -0400 Subject: [PATCH 23/46] 3080 Moved all actions as a result of CaseEventLister to background thread pool --- .../sleuthkit/autopsy/casemodule/Case.java | 48 +- .../eventlisteners/CaseEventListener.java | 550 ++++++++++-------- .../eventlisteners/Installer.java | 4 +- .../KnownStatusChangeRunner.java | 58 -- .../sleuthkit/autopsy/coreutils/ExecUtil.java | 35 ++ 5 files changed, 359 insertions(+), 336 deletions(-) delete mode 100755 Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/KnownStatusChangeRunner.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index afcf23ed57..55c0db7724 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -85,6 +85,7 @@ import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.core.UserPreferencesException; import org.sleuthkit.autopsy.corecomponentinterfaces.CoreComponentControl; import org.sleuthkit.autopsy.coreutils.DriveUtils; +import org.sleuthkit.autopsy.coreutils.ExecUtil; import org.sleuthkit.autopsy.coreutils.FileUtil; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; @@ -1645,7 +1646,7 @@ public class Case { } else { future.cancel(true); } - Case.shutDownTaskExecutor(caseLockingExecutor); + ExecUtil.shutDownTaskExecutor(caseLockingExecutor); } catch (CancellationException discarded) { /* * The create/open task has been cancelled. Wait for it to finish, @@ -1654,7 +1655,7 @@ public class Case { * will have been closed and the case directory lock released will * have been released. */ - Case.shutDownTaskExecutor(caseLockingExecutor); + ExecUtil.shutDownTaskExecutor(caseLockingExecutor); throw new CaseActionCancelledException(Bundle.Case_exceptionMessage_cancelledByUser()); } catch (ExecutionException ex) { /* @@ -1664,7 +1665,7 @@ public class Case { * case will have been closed and the case directory lock released * will have been released. */ - Case.shutDownTaskExecutor(caseLockingExecutor); + ExecUtil.shutDownTaskExecutor(caseLockingExecutor); throw new CaseActionException(Bundle.Case_exceptionMessage_execExceptionWrapperMessage(ex.getCause().getLocalizedMessage()), ex); } finally { progressIndicator.finish(); @@ -1992,7 +1993,7 @@ public class Case { * would be possible to start the next task before the current * task responded to a cancellation request. */ - shutDownTaskExecutor(executor); + ExecUtil.shutDownTaskExecutor(executor); progressIndicator.finish(); } @@ -2063,7 +2064,7 @@ public class Case { } catch (ExecutionException ex) { throw new CaseActionException(Bundle.Case_exceptionMessage_execExceptionWrapperMessage(ex.getCause().getMessage()), ex); } finally { - shutDownTaskExecutor(caseLockingExecutor); + ExecUtil.shutDownTaskExecutor(caseLockingExecutor); progressIndicator.finish(); } } @@ -2174,7 +2175,7 @@ public class Case { Bundle.Case_servicesException_serviceResourcesCloseError(service.getServiceName(), ex.getLocalizedMessage()))); } } finally { - shutDownTaskExecutor(executor); + ExecUtil.shutDownTaskExecutor(executor); progressIndicator.finish(); } } @@ -2231,41 +2232,6 @@ public class Case { } - /** - * Shuts down a task executor service, waiting until all tasks are - * terminated. The current policy is to wait for the tasks to finish so that - * the case for which the executor is running can be left in a consistent - * state. - * - * @param executor The executor. - */ - private static void shutDownTaskExecutor(ExecutorService executor) { - executor.shutdown(); - boolean taskCompleted = false; - while (!taskCompleted) { - try { - taskCompleted = executor.awaitTermination(EXECUTOR_AWAIT_TIMEOUT_SECS, TimeUnit.SECONDS); - } catch (InterruptedException ignored) { - /* - * The current policy is to wait for the task to finish so that - * the case can be left in a consistent state. - * - * For a specific example of the motivation for this policy, - * note that a application service (Solr search service) - * experienced an error condition when opening case resources - * that left the service blocked uninterruptibly on a socket - * read. This eventually led to a mysterious "freeze" as the - * user-cancelled service task continued to run holdiong a lock - * that a UI thread soon tried to acquire. Thus it has been - * deemed better to make the "freeze" happen in a more - * informative way, i.e., with the progress indicator for the - * unfinished task on the screen, if a similar error condition - * arises again. - */ - } - } - } - /** * A case operation Cancel button listener for use with a * ModalDialogProgressIndicator when running with a GUI. diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 7f4f97d08a..0f8c8512af 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -18,9 +18,12 @@ */ package org.sleuthkit.autopsy.centralrepository.eventlisteners; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.stream.Collectors; import org.openide.util.NbBundle.Messages; @@ -39,6 +42,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationDataSource; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; +import org.sleuthkit.autopsy.coreutils.ExecUtil; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifactTag; @@ -53,9 +57,19 @@ import org.sleuthkit.datamodel.TskDataException; * accordingly */ @Messages({"caseeventlistener.evidencetag=Evidence"}) -public class CaseEventListener implements PropertyChangeListener { +final class CaseEventListener implements PropertyChangeListener { private static final Logger LOGGER = Logger.getLogger(CaseEventListener.class.getName()); + private final ExecutorService jobProcessingExecutor; + private static final String CASE_EVENT_THREAD_NAME = "Case-Event-Listener-%d"; + + CaseEventListener() { + jobProcessingExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(CASE_EVENT_THREAD_NAME).build()); + } + + void shutdown() { + ExecUtil.shutDownTaskExecutor(jobProcessingExecutor); + } @Override public void propertyChange(PropertyChangeEvent evt) { @@ -69,250 +83,24 @@ public class CaseEventListener implements PropertyChangeListener { switch (Case.Events.valueOf(evt.getPropertyName())) { case CONTENT_TAG_ADDED: case CONTENT_TAG_DELETED: { - if (!EamDb.isEnabled()) { - return; - } - - AbstractFile af; - TskData.FileKnown knownStatus; - String comment; - if (Case.Events.valueOf(evt.getPropertyName()) == Case.Events.CONTENT_TAG_ADDED) { - // For added tags, we want to change the known status to BAD if the - // tag that was just added is in the list of central repo tags. - final ContentTagAddedEvent tagAddedEvent = (ContentTagAddedEvent) evt; - final ContentTag tagAdded = tagAddedEvent.getAddedTag(); - - if (dbManager.getBadTags().contains(tagAdded.getName().getDisplayName())) { - if (tagAdded.getContent() instanceof AbstractFile) { - af = (AbstractFile) tagAdded.getContent(); - knownStatus = TskData.FileKnown.BAD; - comment = tagAdded.getComment(); - } else { - LOGGER.log(Level.WARNING, "Error updating non-file object"); - return; - } - } else { - // The added tag isn't flagged as bad in central repo, so do nothing - return; - } - } else { // CONTENT_TAG_DELETED - // For deleted tags, we want to set the file status to UNKNOWN if: - // - The tag that was just removed is notable in central repo - // - There are no remaining tags that are notable - final ContentTagDeletedEvent tagDeletedEvent = (ContentTagDeletedEvent) evt; - long contentID = tagDeletedEvent.getDeletedTagInfo().getContentID(); - - String tagName = tagDeletedEvent.getDeletedTagInfo().getName().getDisplayName(); - if (!dbManager.getBadTags().contains(tagName)) { - // If the tag that got removed isn't on the list of central repo tags, do nothing - return; - } - - try { - // Get the remaining tags on the content object - Content content = Case.getCurrentCase().getSleuthkitCase().getContentById(contentID); - TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager(); - List tags = tagsManager.getContentTagsByContent(content); - - if (tags.stream() - .map(tag -> tag.getName().getDisplayName()) - .filter(dbManager.getBadTags()::contains) - .collect(Collectors.toList()) - .isEmpty()) { - - // There are no more bad tags on the object - if (content instanceof AbstractFile) { - af = (AbstractFile) content; - knownStatus = TskData.FileKnown.UNKNOWN; - comment = ""; - } else { - LOGGER.log(Level.WARNING, "Error updating non-file object"); - return; - } - } else { - // There's still at least one bad tag, so leave the known status as is - return; - } - } catch (TskCoreException ex) { - LOGGER.log(Level.SEVERE, "Failed to find content", ex); - return; - } - } - - final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(af, - knownStatus, comment); - - if (eamArtifact != null) { - // send update to Central Repository db - Runnable r = new KnownStatusChangeRunner(eamArtifact, knownStatus); - // TODO: send r into a thread pool instead - Thread t = new Thread(r); - t.start(); - } - } // CONTENT_TAG_ADDED, CONTENT_TAG_DELETED + jobProcessingExecutor.submit(new ContentTagTask(dbManager, evt)); + } break; case BLACKBOARD_ARTIFACT_TAG_DELETED: case BLACKBOARD_ARTIFACT_TAG_ADDED: { - if (!EamDb.isEnabled()) { - return; - } - - Content content; - BlackboardArtifact bbArtifact; - TskData.FileKnown knownStatus; - String comment; - if (Case.Events.valueOf(evt.getPropertyName()) == Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED) { - // For added tags, we want to change the known status to BAD if the - // tag that was just added is in the list of central repo tags. - final BlackBoardArtifactTagAddedEvent tagAddedEvent = (BlackBoardArtifactTagAddedEvent) evt; - final BlackboardArtifactTag tagAdded = tagAddedEvent.getAddedTag(); - - if (dbManager.getBadTags().contains(tagAdded.getName().getDisplayName())) { - content = tagAdded.getContent(); - bbArtifact = tagAdded.getArtifact(); - knownStatus = TskData.FileKnown.BAD; - comment = tagAdded.getComment(); - } else { - // The added tag isn't flagged as bad in central repo, so do nothing - return; - } - } else { //BLACKBOARD_ARTIFACT_TAG_DELETED - // For deleted tags, we want to set the file status to UNKNOWN if: - // - The tag that was just removed is notable in central repo - // - There are no remaining tags that are notable - final BlackBoardArtifactTagDeletedEvent tagDeletedEvent = (BlackBoardArtifactTagDeletedEvent) evt; - long contentID = tagDeletedEvent.getDeletedTagInfo().getContentID(); - long artifactID = tagDeletedEvent.getDeletedTagInfo().getArtifactID(); - - String tagName = tagDeletedEvent.getDeletedTagInfo().getName().getDisplayName(); - if (!dbManager.getBadTags().contains(tagName)) { - // If the tag that got removed isn't on the list of central repo tags, do nothing - return; - } - - try { - // Get the remaining tags on the artifact - content = Case.getCurrentCase().getSleuthkitCase().getContentById(contentID); - bbArtifact = Case.getCurrentCase().getSleuthkitCase().getBlackboardArtifact(artifactID); - TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager(); - List tags = tagsManager.getBlackboardArtifactTagsByArtifact(bbArtifact); - - if (tags.stream() - .map(tag -> tag.getName().getDisplayName()) - .filter(dbManager.getBadTags()::contains) - .collect(Collectors.toList()) - .isEmpty()) { - - // There are no more bad tags on the object - knownStatus = TskData.FileKnown.UNKNOWN; - comment = ""; - - } else { - // There's still at least one bad tag, so leave the known status as is - return; - } - } catch (TskCoreException ex) { - LOGGER.log(Level.SEVERE, "Failed to find content", ex); - return; - } - } - - if ((content instanceof AbstractFile) && (((AbstractFile) content).getKnown() == TskData.FileKnown.KNOWN)) { - return; - } - - List convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbArtifact, true, true); - for (CorrelationAttribute eamArtifact : convertedArtifacts) { - eamArtifact.getInstances().get(0).setComment(comment); - Runnable r = new KnownStatusChangeRunner(eamArtifact, knownStatus); - // TODO: send r into a thread pool instead - Thread t = new Thread(r); - t.start(); - } - - } // BLACKBOARD_ARTIFACT_TAG_ADDED, BLACKBOARD_ARTIFACT_TAG_DELETED + jobProcessingExecutor.submit(new BlackboardTagTask(dbManager, evt)); + } break; case DATA_SOURCE_ADDED: { - if (!EamDb.isEnabled()) { - break; - } - - final DataSourceAddedEvent dataSourceAddedEvent = (DataSourceAddedEvent) evt; - Content newDataSource = dataSourceAddedEvent.getDataSource(); - - try { - String deviceId = Case.getCurrentCase().getSleuthkitCase().getDataSource(newDataSource.getId()).getDeviceId(); - CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); - if (null == correlationCase) { - dbManager.newCase(Case.getCurrentCase()); - correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); - } - if (null == dbManager.getDataSourceDetails(correlationCase, deviceId)) { - dbManager.newDataSource(CorrelationDataSource.fromTSKDataSource(correlationCase, newDataSource)); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS - } catch (TskCoreException | TskDataException ex) { - LOGGER.log(Level.SEVERE, "Error getting data source from DATA_SOURCE_ADDED event content.", ex); //NON-NLS - } - } // DATA_SOURCE_ADDED + jobProcessingExecutor.submit(new DataSourceAddedTask(dbManager, evt)); + } break; case CURRENT_CASE: { - /* - * A case has been opened if evt.getOldValue() is null and - * evt.getNewValue() is a valid Case. - */ - if ((null == evt.getOldValue()) && (evt.getNewValue() instanceof Case)) { - Case curCase = (Case) evt.getNewValue(); - IngestEventsListener.resetCeModuleInstanceCount(); - try { - // only add default evidence tag if case is open and it doesn't already exist in the tags list. - if (Case.isCaseOpen() - && Case.getCurrentCase().getServices().getTagsManager().getAllTagNames().stream() - .map(tag -> tag.getDisplayName()) - .filter(tagName -> Bundle.caseeventlistener_evidencetag().equals(tagName)) - .collect(Collectors.toList()) - .isEmpty()) { - curCase.getServices().getTagsManager().addTagName(Bundle.caseeventlistener_evidencetag()); - } - } catch (TagsManager.TagNameAlreadyExistsException ex) { - LOGGER.info("Evidence tag already exists"); // NON-NLS - } catch (TskCoreException ex) { - LOGGER.log(Level.SEVERE, "Error adding tag.", ex); // NON-NLS - } - - CorrelationCase curCeCase = new CorrelationCase( - -1, - curCase.getName(), // unique case ID - EamOrganization.getDefault(), - curCase.getDisplayName(), - curCase.getCreatedDate(), - curCase.getNumber(), - curCase.getExaminer(), - null, - null, - null); - - if (!EamDb.isEnabled()) { - break; - } - - try { - // NOTE: Cannot determine if the opened case is a new case or a reopened case, - // so check for existing name in DB and insert if missing. - CorrelationCase existingCase = dbManager.getCaseByUUID(curCeCase.getCaseUUID()); - - if (null == existingCase) { - dbManager.newCase(curCeCase); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS - } - } - } // CURRENT_CASE + jobProcessingExecutor.submit(new CurrentCaseTask(dbManager, evt)); + } break; case NAME: { @@ -340,4 +128,296 @@ public class CaseEventListener implements PropertyChangeListener { break; } } + + private final class ContentTagTask implements Runnable { + + private final EamDb dbManager; + private final PropertyChangeEvent event; + + private ContentTagTask(EamDb db, PropertyChangeEvent evt) { + dbManager = db; + event = evt; + } + + @Override + public void run() { + if (!EamDb.isEnabled()) { + return; + } + + AbstractFile af; + TskData.FileKnown knownStatus; + String comment; + if (Case.Events.valueOf(event.getPropertyName()) == Case.Events.CONTENT_TAG_ADDED) { + // For added tags, we want to change the known status to BAD if the + // tag that was just added is in the list of central repo tags. + final ContentTagAddedEvent tagAddedEvent = (ContentTagAddedEvent) event; + final ContentTag tagAdded = tagAddedEvent.getAddedTag(); + + if (dbManager.getBadTags().contains(tagAdded.getName().getDisplayName())) { + if (tagAdded.getContent() instanceof AbstractFile) { + af = (AbstractFile) tagAdded.getContent(); + knownStatus = TskData.FileKnown.BAD; + comment = tagAdded.getComment(); + } else { + LOGGER.log(Level.WARNING, "Error updating non-file object"); + return; + } + } else { + // The added tag isn't flagged as bad in central repo, so do nothing + return; + } + } else { // CONTENT_TAG_DELETED + // For deleted tags, we want to set the file status to UNKNOWN if: + // - The tag that was just removed is notable in central repo + // - There are no remaining tags that are notable + final ContentTagDeletedEvent tagDeletedEvent = (ContentTagDeletedEvent) event; + long contentID = tagDeletedEvent.getDeletedTagInfo().getContentID(); + + String tagName = tagDeletedEvent.getDeletedTagInfo().getName().getDisplayName(); + if (!dbManager.getBadTags().contains(tagName)) { + // If the tag that got removed isn't on the list of central repo tags, do nothing + return; + } + + try { + // Get the remaining tags on the content object + Content content = Case.getCurrentCase().getSleuthkitCase().getContentById(contentID); + TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager(); + List tags = tagsManager.getContentTagsByContent(content); + + if (tags.stream() + .map(tag -> tag.getName().getDisplayName()) + .filter(dbManager.getBadTags()::contains) + .collect(Collectors.toList()) + .isEmpty()) { + + // There are no more bad tags on the object + if (content instanceof AbstractFile) { + af = (AbstractFile) content; + knownStatus = TskData.FileKnown.UNKNOWN; + comment = ""; + } else { + LOGGER.log(Level.WARNING, "Error updating non-file object"); + return; + } + } else { + // There's still at least one bad tag, so leave the known status as is + return; + } + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Failed to find content", ex); + return; + } + } + + final CorrelationAttribute eamArtifact = EamArtifactUtil.getEamArtifactFromContent(af, + knownStatus, comment); + + if (eamArtifact != null) { + // send update to Central Repository db + try { + dbManager.setArtifactInstanceKnownStatus(eamArtifact, knownStatus); + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database while setting artifact known status.", ex); //NON-NLS + } + } + } // CONTENT_TAG_ADDED, CONTENT_TAG_DELETED + } + + private final class BlackboardTagTask implements Runnable { + + private final EamDb dbManager; + private final PropertyChangeEvent event; + + private BlackboardTagTask(EamDb db, PropertyChangeEvent evt) { + dbManager = db; + event = evt; + } + + @Override + public void run() { + if (!EamDb.isEnabled()) { + return; + } + + Content content; + BlackboardArtifact bbArtifact; + TskData.FileKnown knownStatus; + String comment; + if (Case.Events.valueOf(event.getPropertyName()) == Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED) { + // For added tags, we want to change the known status to BAD if the + // tag that was just added is in the list of central repo tags. + final BlackBoardArtifactTagAddedEvent tagAddedEvent = (BlackBoardArtifactTagAddedEvent) event; + final BlackboardArtifactTag tagAdded = tagAddedEvent.getAddedTag(); + + if (dbManager.getBadTags().contains(tagAdded.getName().getDisplayName())) { + content = tagAdded.getContent(); + bbArtifact = tagAdded.getArtifact(); + knownStatus = TskData.FileKnown.BAD; + comment = tagAdded.getComment(); + } else { + // The added tag isn't flagged as bad in central repo, so do nothing + return; + } + } else { //BLACKBOARD_ARTIFACT_TAG_DELETED + // For deleted tags, we want to set the file status to UNKNOWN if: + // - The tag that was just removed is notable in central repo + // - There are no remaining tags that are notable + final BlackBoardArtifactTagDeletedEvent tagDeletedEvent = (BlackBoardArtifactTagDeletedEvent) event; + long contentID = tagDeletedEvent.getDeletedTagInfo().getContentID(); + long artifactID = tagDeletedEvent.getDeletedTagInfo().getArtifactID(); + + String tagName = tagDeletedEvent.getDeletedTagInfo().getName().getDisplayName(); + if (!dbManager.getBadTags().contains(tagName)) { + // If the tag that got removed isn't on the list of central repo tags, do nothing + return; + } + + try { + // Get the remaining tags on the artifact + content = Case.getCurrentCase().getSleuthkitCase().getContentById(contentID); + bbArtifact = Case.getCurrentCase().getSleuthkitCase().getBlackboardArtifact(artifactID); + TagsManager tagsManager = Case.getCurrentCase().getServices().getTagsManager(); + List tags = tagsManager.getBlackboardArtifactTagsByArtifact(bbArtifact); + + if (tags.stream() + .map(tag -> tag.getName().getDisplayName()) + .filter(dbManager.getBadTags()::contains) + .collect(Collectors.toList()) + .isEmpty()) { + + // There are no more bad tags on the object + knownStatus = TskData.FileKnown.UNKNOWN; + comment = ""; + + } else { + // There's still at least one bad tag, so leave the known status as is + return; + } + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Failed to find content", ex); + return; + } + } + + if ((content instanceof AbstractFile) && (((AbstractFile) content).getKnown() == TskData.FileKnown.KNOWN)) { + return; + } + + List convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbArtifact, true, true); + for (CorrelationAttribute eamArtifact : convertedArtifacts) { + eamArtifact.getInstances().get(0).setComment(comment); + try { + dbManager.setArtifactInstanceKnownStatus(eamArtifact, knownStatus); + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database while setting artifact known status.", ex); //NON-NLS + } + } + } // BLACKBOARD_ARTIFACT_TAG_ADDED, BLACKBOARD_ARTIFACT_TAG_DELETED + + } + + private final class DataSourceAddedTask implements Runnable { + + private final EamDb dbManager; + private final PropertyChangeEvent event; + + private DataSourceAddedTask(EamDb db, PropertyChangeEvent evt) { + dbManager = db; + event = evt; + } + + @Override + public void run() { + if (!EamDb.isEnabled()) { + return; + } + + final DataSourceAddedEvent dataSourceAddedEvent = (DataSourceAddedEvent) event; + Content newDataSource = dataSourceAddedEvent.getDataSource(); + + try { + String deviceId = Case.getCurrentCase().getSleuthkitCase().getDataSource(newDataSource.getId()).getDeviceId(); + CorrelationCase correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + if (null == correlationCase) { + dbManager.newCase(Case.getCurrentCase()); + correlationCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); + } + if (null == dbManager.getDataSourceDetails(correlationCase, deviceId)) { + dbManager.newDataSource(CorrelationDataSource.fromTSKDataSource(correlationCase, newDataSource)); + } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS + } catch (TskCoreException | TskDataException ex) { + LOGGER.log(Level.SEVERE, "Error getting data source from DATA_SOURCE_ADDED event content.", ex); //NON-NLS + } + } // DATA_SOURCE_ADDED + } + + private final class CurrentCaseTask implements Runnable { + + private final EamDb dbManager; + private final PropertyChangeEvent event; + + private CurrentCaseTask(EamDb db, PropertyChangeEvent evt) { + dbManager = db; + event = evt; + } + + @Override + public void run() { + /* + * A case has been opened if evt.getOldValue() is null and + * evt.getNewValue() is a valid Case. + */ + if ((null == event.getOldValue()) && (event.getNewValue() instanceof Case)) { + Case curCase = (Case) event.getNewValue(); + IngestEventsListener.resetCeModuleInstanceCount(); + try { + // only add default evidence tag if case is open and it doesn't already exist in the tags list. + if (Case.isCaseOpen() + && Case.getCurrentCase().getServices().getTagsManager().getAllTagNames().stream() + .map(tag -> tag.getDisplayName()) + .filter(tagName -> Bundle.caseeventlistener_evidencetag().equals(tagName)) + .collect(Collectors.toList()) + .isEmpty()) { + curCase.getServices().getTagsManager().addTagName(Bundle.caseeventlistener_evidencetag()); + } + } catch (TagsManager.TagNameAlreadyExistsException ex) { + LOGGER.info("Evidence tag already exists"); // NON-NLS + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Error adding tag.", ex); // NON-NLS + } + + CorrelationCase curCeCase = new CorrelationCase( + -1, + curCase.getName(), // unique case ID + EamOrganization.getDefault(), + curCase.getDisplayName(), + curCase.getCreatedDate(), + curCase.getNumber(), + curCase.getExaminer(), + null, + null, + null); + + if (!EamDb.isEnabled()) { + return; + } + + try { + // NOTE: Cannot determine if the opened case is a new case or a reopened case, + // so check for existing name in DB and insert if missing. + CorrelationCase existingCase = dbManager.getCaseByUUID(curCeCase.getCaseUUID()); + + if (null == existingCase) { + dbManager.newCase(curCeCase); + } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS + } + } + } // CURRENT_CASE + } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java index d2b1beebbb..29fdd331ca 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.autopsy.centralrepository.eventlisteners; -import java.beans.PropertyChangeListener; import org.openide.modules.ModuleInstall; import org.openide.util.actions.CallableSystemAction; import org.sleuthkit.autopsy.casemodule.Case; @@ -32,7 +31,7 @@ public class Installer extends ModuleInstall { private static final Logger LOGGER = Logger.getLogger(Installer.class.getName()); private static final long serialVersionUID = 1L; - private final PropertyChangeListener pcl = new CaseEventListener(); + private final CaseEventListener pcl = new CaseEventListener(); private final IngestEventsListener ieListener = new IngestEventsListener(); private static Installer instance; @@ -71,6 +70,7 @@ public class Installer extends ModuleInstall { //module is being unloaded Case.removePropertyChangeListener(pcl); + pcl.shutdown(); ieListener.uninstallListeners(); // TODO: remove thread pool diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/KnownStatusChangeRunner.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/KnownStatusChangeRunner.java deleted file mode 100755 index 4761f77370..0000000000 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/KnownStatusChangeRunner.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Central Repository - * - * Copyright 2015-2017 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.centralrepository.eventlisteners; - -import java.util.logging.Level; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; -import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; -import org.sleuthkit.datamodel.TskData.FileKnown; - -/** - * Thread to send info to remote DB that tags a file as known, unknown, or notable. - */ -public class KnownStatusChangeRunner implements Runnable { - - private static final Logger LOGGER = Logger.getLogger(KnownStatusChangeRunner.class.getName()); - private static final long serialVersionUID = 1L; - - private final CorrelationAttribute artifact; - private final FileKnown knownStatus; - - public KnownStatusChangeRunner(CorrelationAttribute artifact, FileKnown knownStatus) { - this.artifact = artifact; - this.knownStatus = knownStatus; - } - - @Override - public void run() { - if (!EamDb.isEnabled()) { - LOGGER.log(Level.WARNING, "Central Repository database not configured"); // NON-NLS - return; - } - - try { - EamDb dbManager = EamDb.getInstance(); - dbManager.setArtifactInstanceKnownStatus(this.artifact, this.knownStatus); - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java index 753ccd598a..51163e502c 100755 --- a/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java @@ -26,6 +26,7 @@ import java.io.InputStreamReader; import java.io.Writer; import java.util.Date; import java.util.List; +import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.sleuthkit.autopsy.core.UserPreferences; @@ -212,6 +213,40 @@ public final class ExecUtil { } } + /** + * Shuts down a task executor service, waiting until all tasks are + * terminated. The current policy is to wait for the tasks to finish so that + * the case for which the executor is running can be left in a consistent + * state. + * + * @param executor The executor. + */ + public static void shutDownTaskExecutor(ExecutorService executor) { + executor.shutdown(); + boolean taskCompleted = false; + while (!taskCompleted) { + try { + taskCompleted = executor.awaitTermination(DEFAULT_TIMEOUT, DEFAULT_TIMEOUT_UNITS); + } catch (InterruptedException ignored) { + /* + * The current policy is to wait for the task to finish so that + * the case can be left in a consistent state. + * + * For a specific example of the motivation for this policy, + * note that a application service (Solr search service) + * experienced an error condition when opening case resources + * that left the service blocked uninterruptibly on a socket + * read. This eventually led to a mysterious "freeze" as the + * user-cancelled service task continued to run holdiong a lock + * that a UI thread soon tried to acquire. Thus it has been + * deemed better to make the "freeze" happen in a more + * informative way, i.e., with the progress indicator for the + * unfinished task on the screen, if a similar error condition + * arises again. + */ + } + } + } /** * EVERYTHING FOLLOWING THIS LINE IS DEPRECATED AND SLATED FOR REMOVAL */ From 906beb4d3e32a0b01dd01215d1c0306446e672bd Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 19 Oct 2017 14:14:34 -0400 Subject: [PATCH 24/46] 3126 IngestEventsListener events now handled by single threaded executor --- .../eventlisteners/IngestEventsListener.java | 204 +++++++++++------- .../eventlisteners/Installer.java | 1 + 2 files changed, 123 insertions(+), 82 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java index 496dbe2f33..1ddfcb40b8 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.centralrepository.eventlisteners; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import static java.lang.Boolean.FALSE; @@ -25,6 +26,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.stream.Collectors; import org.openide.util.NbBundle; @@ -42,6 +45,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.coreutils.ExecUtil; /** * Listen for ingest events and update entries in the Central Repository @@ -53,9 +57,19 @@ public class IngestEventsListener { final Collection recentlyAddedCeArtifacts = new LinkedHashSet<>(); private static int ceModuleInstanceCount = 0; + private final ExecutorService jobProcessingExecutor; + private static final String INGEST_EVENT_THREAD_NAME = "Ingest-Event-Listener-%d"; private final PropertyChangeListener pcl1 = new IngestModuleEventListener(); private final PropertyChangeListener pcl2 = new IngestJobEventListener(); + IngestEventsListener() { + jobProcessingExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(INGEST_EVENT_THREAD_NAME).build()); + } + + void shutdown() { + ExecUtil.shutDownTaskExecutor(jobProcessingExecutor); + } + /* * Add all of our Ingest Event Listeners to the IngestManager Instance. */ @@ -86,7 +100,7 @@ public class IngestEventsListener { * Engine. */ public synchronized static void decrementCorrelationEngineModuleCount() { - if (getCeModuleInstanceCount()>0) { //prevent it ingestJobCounter from going negative + if (getCeModuleInstanceCount() > 0) { //prevent it ingestJobCounter from going negative ceModuleInstanceCount--; //Should be called once in the Correlation Engine module's shutdown method. } } @@ -109,89 +123,10 @@ public class IngestEventsListener { return ceModuleInstanceCount; } - private class IngestModuleEventListener implements PropertyChangeListener { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (getCeModuleInstanceCount() > 0) { - EamDb dbManager; - try { - dbManager = EamDb.getInstance(); - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Failed to connect to Central Repository database.", ex); - return; - } - switch (IngestManager.IngestModuleEvent.valueOf(evt.getPropertyName())) { - case DATA_ADDED: { - if (!EamDb.isEnabled()) { - return; - } - final ModuleDataEvent mde = (ModuleDataEvent) evt.getOldValue(); - Collection bbArtifacts = mde.getArtifacts(); - if (null == bbArtifacts) { //the ModuleDataEvents don't always have a collection of artifacts set - return; - } - List eamArtifacts = new ArrayList<>(); - - for (BlackboardArtifact bbArtifact : bbArtifacts) { - // eamArtifact will be null OR a EamArtifact containing one EamArtifactInstance. - List convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbArtifact, true, true); - for (CorrelationAttribute eamArtifact : convertedArtifacts) { - try { - // Only do something with this artifact if it's unique within the job - if (recentlyAddedCeArtifacts.add(eamArtifact.toString())) { - // Was it previously marked as bad? - // query db for artifact instances having this TYPE/VALUE and knownStatus = "Bad". - // if gettKnownStatus() is "Unknown" and this artifact instance was marked bad in a previous case, - // create TSK_INTERESTING_ARTIFACT_HIT artifact on BB. - List caseDisplayNames = dbManager.getListCasesHavingArtifactInstancesKnownBad(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue()); - if (!caseDisplayNames.isEmpty()) { - postCorrelatedBadArtifactToBlackboard(bbArtifact, - caseDisplayNames); - } - eamArtifacts.add(eamArtifact); - } - } catch (EamDbException ex) { - LOGGER.log(Level.SEVERE, "Error counting notable artifacts.", ex); - } - } - } - - if (FALSE == eamArtifacts.isEmpty()) { - // send update to entperirse artifact manager db - Runnable r = new NewArtifactsRunner(eamArtifacts); - // TODO: send r into a thread pool instead - Thread t = new Thread(r); - t.start(); - } // DATA_ADDED - break; - } - } - } - } - } - - private class IngestJobEventListener implements PropertyChangeListener { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - switch (IngestManager.IngestJobEvent.valueOf(evt.getPropertyName())) { - case DATA_SOURCE_ANALYSIS_COMPLETED: { - // clear the tracker to reduce memory usage - if (getCeModuleInstanceCount() == 0) { - recentlyAddedCeArtifacts.clear(); - } - //else another instance of the Correlation Engine Module is still being run. - } // DATA_SOURCE_ANALYSIS_COMPLETED - break; - } - } - } - @NbBundle.Messages({"IngestEventsListener.prevTaggedSet.text=Previously Tagged As Notable (Central Repository)", - "IngestEventsListener.prevCaseComment.text=Previous Case: ", + "IngestEventsListener.prevCaseComment.text=Previous Case: ", "IngestEventsListener.ingestmodule.name=Correlation Engine"}) - private void postCorrelatedBadArtifactToBlackboard(BlackboardArtifact bbArtifact, List caseDisplayNames) { + static private void postCorrelatedBadArtifactToBlackboard(BlackboardArtifact bbArtifact, List caseDisplayNames) { try { AbstractFile af = bbArtifact.getSleuthkitCase().getAbstractFileById(bbArtifact.getObjectID()); @@ -222,4 +157,109 @@ public class IngestEventsListener { LOGGER.log(Level.SEVERE, "Failed to create BlackboardAttribute.", ex); // NON-NLS } } + + private class IngestModuleEventListener implements PropertyChangeListener { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (getCeModuleInstanceCount() > 0) { + EamDb dbManager; + try { + dbManager = EamDb.getInstance(); + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Failed to connect to Central Repository database.", ex); + return; + } + switch (IngestManager.IngestModuleEvent.valueOf(evt.getPropertyName())) { + case DATA_ADDED: { + jobProcessingExecutor.submit(new DataAddedTask(dbManager, evt)); + break; + } + } + } + } + } + + private class IngestJobEventListener implements PropertyChangeListener { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + switch (IngestManager.IngestJobEvent.valueOf(evt.getPropertyName())) { + case DATA_SOURCE_ANALYSIS_COMPLETED: { + jobProcessingExecutor.submit(new AnalysisCompleteTask()); + break; + } + } + } + + } + + private final class AnalysisCompleteTask implements Runnable { + + @Override + public void run() { + // clear the tracker to reduce memory usage + if (getCeModuleInstanceCount() == 0) { + recentlyAddedCeArtifacts.clear(); + } + //else another instance of the Correlation Engine Module is still being run. + } // DATA_SOURCE_ANALYSIS_COMPLETED + } + + private final class DataAddedTask implements Runnable { + + private final EamDb dbManager; + private final PropertyChangeEvent event; + + private DataAddedTask(EamDb db, PropertyChangeEvent evt) { + dbManager = db; + event = evt; + } + + @Override + public void run() { + if (!EamDb.isEnabled()) { + return; + } + final ModuleDataEvent mde = (ModuleDataEvent) event.getOldValue(); + Collection bbArtifacts = mde.getArtifacts(); + if (null == bbArtifacts) { //the ModuleDataEvents don't always have a collection of artifacts set + return; + } + List eamArtifacts = new ArrayList<>(); + + for (BlackboardArtifact bbArtifact : bbArtifacts) { + // eamArtifact will be null OR a EamArtifact containing one EamArtifactInstance. + List convertedArtifacts = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbArtifact, true, true); + for (CorrelationAttribute eamArtifact : convertedArtifacts) { + try { + // Only do something with this artifact if it's unique within the job + if (recentlyAddedCeArtifacts.add(eamArtifact.toString())) { + // Was it previously marked as bad? + // query db for artifact instances having this TYPE/VALUE and knownStatus = "Bad". + // if gettKnownStatus() is "Unknown" and this artifact instance was marked bad in a previous case, + // create TSK_INTERESTING_ARTIFACT_HIT artifact on BB. + List caseDisplayNames = dbManager.getListCasesHavingArtifactInstancesKnownBad(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue()); + if (!caseDisplayNames.isEmpty()) { + postCorrelatedBadArtifactToBlackboard(bbArtifact, + caseDisplayNames); + } + eamArtifacts.add(eamArtifact); + } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error counting notable artifacts.", ex); + } + } + } + if (FALSE == eamArtifacts.isEmpty()) { + try { + for (CorrelationAttribute eamArtifact : eamArtifacts) { + dbManager.addArtifact(eamArtifact); + } + } catch (EamDbException ex) { + LOGGER.log(Level.SEVERE, "Error connecting to Central Repository database.", ex); //NON-NLS + } + } // DATA_ADDED + } + } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java index 29fdd331ca..4c98a4d749 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/Installer.java @@ -71,6 +71,7 @@ public class Installer extends ModuleInstall { Case.removePropertyChangeListener(pcl); pcl.shutdown(); + ieListener.shutdown(); ieListener.uninstallListeners(); // TODO: remove thread pool From 59101e710453ba74b44d168bea1bdf94637fbe9b Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 19 Oct 2017 17:34:42 -0400 Subject: [PATCH 25/46] 2774 slim down Wizard panel to support low resolution monitors --- .../autopsy/casemodule/Bundle.properties | 4 +- .../autopsy/casemodule/Bundle_ja.properties | 3 -- .../casemodule/NewCaseVisualPanel1.form | 24 ++-------- .../casemodule/NewCaseVisualPanel1.java | 16 ++----- .../casemodule/NewCaseVisualPanel2.form | 47 +----------------- .../casemodule/NewCaseVisualPanel2.java | 35 +------------- .../OptionalCasePropertiesPanel.form | 44 ++++++++++------- .../OptionalCasePropertiesPanel.java | 48 ++++++++++++------- 8 files changed, 70 insertions(+), 151 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties index a176ee9465..25b43a423a 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties @@ -8,7 +8,6 @@ CTL_OpenAction=Open Case... Menu/Case/OpenRecentCase=Open Recent Case CTL_CaseDeleteAction=Delete Case OpenIDE-Module-Name=Case -NewCaseVisualPanel1.jLabel1.text_1=Enter New Case Information: NewCaseVisualPanel1.caseNameLabel.text_1=Case Name: NewCaseVisualPanel1.caseDirLabel.text=Base Directory: NewCaseVisualPanel1.caseDirBrowseButton.text=Browse @@ -20,7 +19,6 @@ CueBannerPanel.autopsyLogo.text= CueBannerPanel.closeButton.text=Close OpenRecentCasePanel.cancelButton.text=Cancel OpenRecentCasePanel.jLabel1.text=Recent Cases -NewCaseVisualPanel2.optionalLabel.text=Enter Optional Information: AddImageErrorsDialog.title=Add Image Log AddImageErrorsDialog.copyButton.toolTipText=Copy errors to clipboard AddImageErrorsDialog.copyButton.text=Copy @@ -219,4 +217,4 @@ CueBannerPanel.createNewCaseButton.text= CueBannerPanel.createNewCaseLabel.text=Create New Case CueBannerPanel.openRecentCaseLabel.text=Open Recent Case CueBannerPanel.openExistingCaseLabel.text=Open Existing Case -CueBannerPanel.openAutoIngestCaseLabel.text=Open Auto Ingest Case +CueBannerPanel.openAutoIngestCaseLabel.text=Open Auto Ingest Case \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties index b4625c4aae..e212a125e9 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle_ja.properties @@ -7,7 +7,6 @@ CTL_OpenAction=\u30b1\u30fc\u30b9\u3092\u958b\u304f... Menu/Case/OpenRecentCase=\u6700\u8fd1\u958b\u3044\u305f\u30b1\u30fc\u30b9\u3092\u958b\u304f CTL_CaseDeleteAction=\u30b1\u30fc\u30b9\u3092\u524a\u9664 OpenIDE-Module-Name=\u30b1\u30fc\u30b9 -NewCaseVisualPanel1.jLabel1.text_1=\u65b0\u898f\u30b1\u30fc\u30b9\u60c5\u5831\u3092\u5165\u529b\uff1a NewCaseVisualPanel1.caseNameLabel.text_1=\u30b1\u30fc\u30b9\u540d\uff1a NewCaseVisualPanel1.caseDirLabel.text=\u30d9\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff1a NewCaseVisualPanel1.caseDirBrowseButton.text=\u95b2\u89a7 @@ -15,7 +14,6 @@ NewCaseVisualPanel1.jLabel2.text_1=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u306f\u6 CueBannerPanel.closeButton.text=\u9589\u3058\u308b OpenRecentCasePanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb OpenRecentCasePanel.jLabel1.text=\u6700\u8fd1\u958b\u3044\u305f\u30d5\u30a1\u30a4\u30eb -NewCaseVisualPanel2.optionalLabel.text=\u30aa\u30d7\u30b7\u30e7\u30ca\u30eb\uff1a\u30b1\u30fc\u30b9\u756a\u53f7\u304a\u3088\u3073\u8abf\u67fb\u62c5\u5f53\u8005\u3092\u8a2d\u5b9a AddImageErrorsDialog.title=\u30a4\u30e1\u30fc\u30b8\u30ed\u30b0\u3092\u8ffd\u52a0 AddImageErrorsDialog.copyButton.toolTipText=\u30a8\u30e9\u30fc\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059 AddImageErrorsDialog.copyButton.text=\u30b3\u30d4\u30fc @@ -190,7 +188,6 @@ CasePropertiesPanel.lbDbName.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u540d\uff CasePropertiesPanel.lbDbType.text=\u30b1\u30fc\u30b9\u30bf\u30a4\u30d7\uff1a CasePropertiesPanel.caseNumberLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a CasePropertiesPanel.examinerLabel.text=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a -OptionalCasePropertiesPanel.caseNumberLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a OptionalCasePropertiesPanel.examinerLabel.text=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a OptionalCasePropertiesPanel.caseDisplayNameLabel.text=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a CueBannerPanel.createNewCaseLabel.text=\u65b0\u898f\u30b1\u30fc\u30b9\u3092\u4f5c\u6210 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form index f6ed4838c7..5eb64d5756 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.form @@ -29,10 +29,6 @@ - - - - @@ -49,7 +45,7 @@ - + @@ -72,9 +68,7 @@ - - - + @@ -97,24 +91,12 @@ - + - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java index a4f21126de..d736aae980 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel1.java @@ -202,7 +202,6 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { private void initComponents() { caseTypeButtonGroup = new javax.swing.ButtonGroup(); - jLabel1 = new javax.swing.JLabel(); caseNameLabel = new javax.swing.JLabel(); caseDirLabel = new javax.swing.JLabel(); caseNameTextField = new javax.swing.JTextField(); @@ -215,9 +214,6 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { caseParentDirWarningLabel = new javax.swing.JLabel(); caseTypeLabel = new javax.swing.JLabel(); - jLabel1.setFont(jLabel1.getFont().deriveFont(jLabel1.getFont().getStyle() | java.awt.Font.BOLD, 14)); - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(NewCaseVisualPanel1.class, "NewCaseVisualPanel1.jLabel1.text_1")); // NOI18N - caseNameLabel.setFont(caseNameLabel.getFont().deriveFont(caseNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(caseNameLabel, org.openide.util.NbBundle.getMessage(NewCaseVisualPanel1.class, "NewCaseVisualPanel1.caseNameLabel.text_1")); // NOI18N @@ -283,9 +279,6 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(caseDirTextField, javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addComponent(jLabel1) - .addGap(0, 227, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(caseNameLabel) .addGap(26, 26, 26) @@ -300,7 +293,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { .addComponent(singleUserCaseRadioButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(multiUserCaseRadioButton) - .addGap(0, 0, Short.MAX_VALUE)) + .addGap(0, 192, Short.MAX_VALUE)) .addComponent(caseParentDirTextField)))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(caseDirBrowseButton))) @@ -312,9 +305,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addGap(31, 31, 31) - .addComponent(jLabel1) - .addGap(18, 18, 18) + .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(caseNameLabel) .addComponent(caseNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) @@ -334,7 +325,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { .addComponent(caseDirTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(27, 27, 27) .addComponent(caseParentDirWarningLabel) - .addContainerGap(169, Short.MAX_VALUE)) + .addContainerGap(115, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -377,7 +368,6 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener { private javax.swing.JLabel caseParentDirWarningLabel; private javax.swing.ButtonGroup caseTypeButtonGroup; private javax.swing.JLabel caseTypeLabel; - private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JRadioButton multiUserCaseRadioButton; private javax.swing.JRadioButton singleUserCaseRadioButton; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form index 73c1406f93..1acb2b02db 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.form @@ -11,51 +11,8 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index f5467c7f35..4f4fff08b1 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -39,8 +39,7 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { public NewCaseVisualPanel2() { initComponents(); propertiesPanel = new OptionalCasePropertiesPanel(); - optionalPanel.add(propertiesPanel); - optionalPanel.setVisible(true); + this.add(propertiesPanel); propertiesPanel.setVisible(true); } @@ -67,40 +66,10 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - optionalLabel = new javax.swing.JLabel(); - optionalPanel = new javax.swing.JPanel(); - - optionalLabel.setFont(optionalLabel.getFont().deriveFont(optionalLabel.getFont().getStyle() | java.awt.Font.BOLD, 14)); - optionalLabel.setText(org.openide.util.NbBundle.getMessage(NewCaseVisualPanel2.class, "NewCaseVisualPanel2.optionalLabel.text")); // NOI18N - - optionalPanel.setLayout(new java.awt.BorderLayout()); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(optionalLabel) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(optionalPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()))) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(optionalLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(optionalPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); + setLayout(new java.awt.BorderLayout()); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel optionalLabel; - private javax.swing.JPanel optionalPanel; // End of variables declaration//GEN-END:variables String getCaseNumber() { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form index af8b72ab4a..bd2826d921 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.form @@ -17,13 +17,13 @@ - + - + @@ -355,27 +355,28 @@ - - - - + + - + - - - + + + - - - - + + + + + + + @@ -465,6 +466,15 @@ + + + + + + + + + @@ -480,13 +490,13 @@ - + - + - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index bd381424ef..393554617d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -49,6 +49,12 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { initComponents(); caseDisplayNameLabel.setVisible(false); caseDisplayNameTextField.setVisible(false); + lbPointOfContactNameLabel.setVisible(false); + lbPointOfContactNameText.setVisible(false); + lbPointOfContactPhoneLabel.setVisible(false); + lbPointOfContactPhoneText.setVisible(false); + lbPointOfContactEmailLabel.setVisible(false); + lbPointOfContactEmailText.setVisible(false); setUpCentralRepoFields(); } @@ -66,6 +72,12 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { } else { caseDisplayNameLabel.setVisible(false); caseDisplayNameTextField.setVisible(false); + lbPointOfContactNameLabel.setVisible(false); + lbPointOfContactNameText.setVisible(false); + lbPointOfContactPhoneLabel.setVisible(false); + lbPointOfContactPhoneText.setVisible(false); + lbPointOfContactEmailLabel.setVisible(false); + lbPointOfContactEmailText.setVisible(false); setUpCentralRepoFields(); } @@ -163,7 +175,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { @Messages({"OptionalCasePropertiesPanel.caseDisplayNameLabel.text=Name:", "OptionalCasePropertiesPanel.lbPointOfContactEmailLabel.text=Email:", - "OptionalCasePropertiesPanel.lbOrganizationNameLabel.text=Name:", + "OptionalCasePropertiesPanel.lbOrganizationNameLabel.text=Organization analysis is being done for:", "OptionalCasePropertiesPanel.bnNewOrganization.text=Manage Organizations", "OptionalCasePropertiesPanel.lbPointOfContactNameLabel.text=Point of Contact:", "OptionalCasePropertiesPanel.lbPointOfContactPhoneLabel.text=Phone:", @@ -361,6 +373,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(bnNewOrganization, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.bnNewOrganization.text")); // NOI18N bnNewOrganization.setMargin(new java.awt.Insets(2, 6, 2, 6)); + bnNewOrganization.setMaximumSize(new java.awt.Dimension(123, 23)); + bnNewOrganization.setMinimumSize(new java.awt.Dimension(123, 23)); + bnNewOrganization.setPreferredSize(new java.awt.Dimension(123, 23)); bnNewOrganization.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bnNewOrganizationActionPerformed(evt); @@ -368,9 +383,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { }); org.openide.awt.Mnemonics.setLocalizedText(lbOrganizationNameLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbOrganizationNameLabel.text")); // NOI18N - lbOrganizationNameLabel.setMaximumSize(new java.awt.Dimension(41, 14)); - lbOrganizationNameLabel.setMinimumSize(new java.awt.Dimension(41, 14)); - lbOrganizationNameLabel.setPreferredSize(new java.awt.Dimension(41, 14)); + lbOrganizationNameLabel.setMaximumSize(new java.awt.Dimension(189, 14)); + lbOrganizationNameLabel.setMinimumSize(new java.awt.Dimension(189, 14)); + lbOrganizationNameLabel.setPreferredSize(new java.awt.Dimension(189, 14)); org.openide.awt.Mnemonics.setLocalizedText(lbPointOfContactEmailLabel, org.openide.util.NbBundle.getMessage(OptionalCasePropertiesPanel.class, "OptionalCasePropertiesPanel.lbPointOfContactEmailLabel.text")); // NOI18N lbPointOfContactEmailLabel.setMaximumSize(new java.awt.Dimension(82, 14)); @@ -382,24 +397,25 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { orgainizationPanelLayout.setHorizontalGroup( orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(orgainizationPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(orgainizationPanelLayout.createSequentialGroup() + .addGap(106, 106, 106) .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbPointOfContactPhoneLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lbPointOfContactEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGap(15, 15, 15) .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addComponent(lbPointOfContactPhoneText, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactNameText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbPointOfContactEmailText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(orgainizationPanelLayout.createSequentialGroup() - .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, 238, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap() + .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnNewOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(comboBoxOrgName, 0, 161, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnNewOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) ); orgainizationPanelLayout.setVerticalGroup( @@ -409,7 +425,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lbOrganizationNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(comboBoxOrgName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(bnNewOrganization)) + .addComponent(bnNewOrganization, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(orgainizationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(lbPointOfContactNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -430,12 +446,12 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap() + .addGap(6, 6, 6) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(casePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(examinerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(orgainizationPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(10, 10, 10)) + .addGap(6, 6, 6)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) From 36108f0b54ba6d505906d4f9f4448ec88b38ce06 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 19 Oct 2017 19:00:57 -0400 Subject: [PATCH 26/46] 2774 save previous examiner details and org name to prop file --- .../casemodule/NewCaseVisualPanel2.java | 52 ++++++++++++++----- .../casemodule/NewCaseWizardPanel2.java | 30 +++++++++++ .../OptionalCasePropertiesPanel.java | 24 +++++++-- 3 files changed, 89 insertions(+), 17 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index 4f4fff08b1..ef2ce512c1 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -30,18 +30,21 @@ import org.openide.util.NbBundle; * * @author dfickling */ -class NewCaseVisualPanel2 extends javax.swing.JPanel { +final class NewCaseVisualPanel2 extends javax.swing.JPanel { + + private static final long serialVersionUID = 1L; + + private final OptionalCasePropertiesPanel propertiesPanel; - OptionalCasePropertiesPanel propertiesPanel; /** * Creates new form NewCaseVisualPanel2 */ - public NewCaseVisualPanel2() { + NewCaseVisualPanel2() { initComponents(); propertiesPanel = new OptionalCasePropertiesPanel(); this.add(propertiesPanel); propertiesPanel.setVisible(true); - + } /** @@ -55,8 +58,6 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { return NbBundle.getMessage(this.getClass(), "NewCaseVisualPanel2.getName.text"); } - - /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -68,10 +69,9 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { setLayout(new java.awt.BorderLayout()); }// //GEN-END:initComponents - + // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables - String getCaseNumber() { return propertiesPanel.getCaseNumber(); } @@ -79,25 +79,49 @@ class NewCaseVisualPanel2 extends javax.swing.JPanel { String getExaminerName() { return propertiesPanel.getExaminerName(); } - + String getExaminerPhone() { return propertiesPanel.getExaminerPhone(); } - + String getExaminerEmail() { return propertiesPanel.getExaminerEmail(); } - + String getExaminerNotes() { return propertiesPanel.getExaminerNotes(); } - + String getOrganization() { - return propertiesPanel.getOrganization(); + return propertiesPanel.getOrganization(); + } + + void setCaseNumber(String caseNumber) { + propertiesPanel.setCaseNumberField(caseNumber); + } + + void setExaminerName(String examinerName) { + propertiesPanel.setExaminerNameField(examinerName); + } + + void setExaminerPhone(String examinerPhone) { + propertiesPanel.setExaminerPhoneField(examinerPhone); + } + + void setExaminerEmail(String examinerEmail) { + propertiesPanel.setExaminerEmailField(examinerEmail); + } + + void setExaminerNotes(String examinerNotes) { + propertiesPanel.setExaminerNotesField(examinerNotes); + } + + void setOrganization(String organizationName) { + propertiesPanel.setCurrentlySelectedOrganization(organizationName); } void refreshCentralRepoFields() { - propertiesPanel.setUpCentralRepoFields(); + propertiesPanel.setUpCentralRepoFields(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index f16ddbdba6..5c99a3e16a 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -28,12 +28,21 @@ import org.openide.WizardValidationException; import org.openide.util.HelpCtx; import org.openide.windows.WindowManager; import java.awt.Cursor; +import java.util.logging.Level; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.ModuleSettings; /** * The second panel of the New Case wizard. */ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel { + private static final Logger logger = Logger.getLogger(NewCaseWizardPanel2.class.getName()); + private static final String PROP_EXAMINER_NAME = "LBL_EXAMINER_NAME"; //NON-NLS + private static final String PROP_EXAMINER_PHONE = "LBL_EXAMINER_PHONE"; //NON-NLS + private static final String PROP_EXAMINER_EMAIL = "LBL_EXAMINER_EMAIL"; //NON-NLS + private static final String PROP_EXAMINER_NOTES = "LBL_EXAMINER_NOTES"; //NON-NLS + private static final String PROP_ORGANIZATION_NAME = "LBL_ORGANIZATION_NAME"; //NON-NLS private NewCaseVisualPanel2 component; private final Set listeners = new HashSet<>(1); @@ -127,6 +136,22 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel Date: Thu, 19 Oct 2017 19:28:34 -0400 Subject: [PATCH 27/46] 2774 Saved organization only selected when central repo enabled --- .../org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index 5c99a3e16a..5a1e96f0b6 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -29,6 +29,7 @@ import org.openide.util.HelpCtx; import org.openide.windows.WindowManager; import java.awt.Cursor; import java.util.logging.Level; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; @@ -147,7 +148,7 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel Date: Fri, 20 Oct 2017 11:32:18 -0400 Subject: [PATCH 28/46] 2774 Notes association corrected to be with case not examiner in names and comments --- .../sleuthkit/autopsy/casemodule/Case.java | 8 ++-- .../autopsy/casemodule/CaseDetails.java | 14 +++---- .../autopsy/casemodule/CaseMetadata.java | 37 ++++++++++--------- .../casemodule/CasePropertiesPanel.form | 6 +-- .../casemodule/CasePropertiesPanel.java | 15 ++++---- .../casemodule/NewCaseVisualPanel2.java | 8 ++-- .../casemodule/NewCaseWizardAction.java | 4 +- .../casemodule/NewCaseWizardPanel2.java | 10 ++--- .../OptionalCasePropertiesPanel.form | 6 +-- .../OptionalCasePropertiesPanel.java | 20 +++++----- .../casemodule/SingleUserCaseConverter.java | 2 +- .../datamodel/AbstractSqlEamDb.java | 2 +- .../eventlisteners/CaseEventListener.java | 2 +- .../ingestmodule/IngestModule.java | 2 +- 14 files changed, 69 insertions(+), 67 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 29b0718139..e3d1171c91 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1209,12 +1209,12 @@ public class Case { } /** - * Gets the examiner notes. + * Gets the case notes. * - * @return The examiner notes. + * @return The case notes. */ - public String getExaminerNotes() { - return metadata.getExaminerNotes(); + public String getCaseNotes() { + return metadata.getCaseNotes(); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java index 2ea2639b8d..c462288315 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java @@ -29,15 +29,15 @@ final class CaseDetails { private final String examinerName; private final String examinerPhone; private final String examinerEmail; - private final String examinerNotes; + private final String caseNotes; - CaseDetails(String displayName, String number, String exName, String exPhone, String exEmail, String exNotes) { + CaseDetails(String displayName, String number, String exName, String exPhone, String exEmail, String notes) { caseDisplayName = displayName; caseNumber = number; examinerName = exName; examinerPhone = exPhone; examinerEmail = exEmail; - examinerNotes = exNotes; + caseNotes = notes; } /** @@ -84,11 +84,11 @@ final class CaseDetails { } /** - * Get the examiner notes + * Get the case notes * - * @return notes - the note asssociated with the examiner + * @return notes - the note asssociated with the case */ - String getExaminerNotes() { - return examinerNotes; + String getCaseNotes() { + return caseNotes; } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java index 0755caa08f..0ce3629a70 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java @@ -66,9 +66,6 @@ public final class CaseMetadata { private final static String CASE_NAME_ELEMENT_NAME = "Name"; //NON-NLS private final static String CASE_NUMBER_ELEMENT_NAME = "Number"; //NON-NLS private final static String EXAMINER_ELEMENT_NAME = "Examiner"; //NON-NLS - private final static String EXAMINER_ELEMENT_PHONE = "ExaminerPhone"; //NON-NLS - private final static String EXAMINER_ELEMENT_EMAIL = "ExaminerEmail"; //NON-NLS - private final static String EXAMINER_ELEMENT_NOTES = "ExaminerNotes"; //NON-NLS private final static String CASE_TYPE_ELEMENT_NAME = "CaseType"; //NON-NLS private final static String CASE_DATABASE_NAME_ELEMENT_NAME = "DatabaseName"; //NON-NLS private final static String TEXT_INDEX_NAME_ELEMENT = "TextIndexName"; //NON-NLS @@ -84,17 +81,24 @@ public final class CaseMetadata { /* * Fields from schema version 3 */ - private static final String SCHEMA_VERSION_THREE = "3.0"; + private static final String SCHEMA_VERSION_THREE = "3.0"; private final static String CASE_DISPLAY_NAME_ELEMENT_NAME = "DisplayName"; //NON-NLS private final static String CASE_DB_NAME_RELATIVE_ELEMENT_NAME = "CaseDatabase"; //NON-NLS + /* + * Fields from schema version 4 + */ + private static final String SCHEMA_VERSION_FOUR = "4.0"; + private final static String EXAMINER_ELEMENT_PHONE = "ExaminerPhone"; //NON-NLS + private final static String EXAMINER_ELEMENT_EMAIL = "ExaminerEmail"; //NON-NLS + private final static String CASE_ELEMENT_NOTES = "CaseNotes"; //NON-NLS /* * Unread fields, regenerated on save. */ private final static String MODIFIED_DATE_ELEMENT_NAME = "ModifiedDate"; //NON-NLS private final static String AUTOPSY_SAVED_BY_ELEMENT_NAME = "SavedByAutopsyVersion"; //NON-NLS - private final static String CURRENT_SCHEMA_VERSION = SCHEMA_VERSION_THREE; + private final static String CURRENT_SCHEMA_VERSION = SCHEMA_VERSION_FOUR; private final Path metadataFilePath; private Case.CaseType caseType; @@ -199,17 +203,16 @@ public final class CaseMetadata { return caseDetails.getCaseDisplayName(); } - void setCaseDetails(CaseDetails newCaseDetails) throws CaseMetadataException{ + void setCaseDetails(CaseDetails newCaseDetails) throws CaseMetadataException { CaseDetails oldCaseDetails = this.caseDetails; this.caseDetails = newCaseDetails; try { - writeToFile(); + writeToFile(); } catch (CaseMetadataException ex) { this.caseDetails = oldCaseDetails; throw ex; } } - /** * Gets the case number. @@ -232,13 +235,13 @@ public final class CaseMetadata { public String getExaminerPhone() { return caseDetails.getExaminerPhone(); } - + public String getExaminerEmail() { return caseDetails.getExaminerEmail(); } - - public String getExaminerNotes() { - return caseDetails.getExaminerNotes(); + + public String getCaseNotes() { + return caseDetails.getCaseNotes(); } /** @@ -399,7 +402,7 @@ public final class CaseMetadata { createChildElement(doc, caseElement, EXAMINER_ELEMENT_NAME, caseDetails.getExaminerName()); createChildElement(doc, caseElement, EXAMINER_ELEMENT_PHONE, caseDetails.getExaminerPhone()); createChildElement(doc, caseElement, EXAMINER_ELEMENT_EMAIL, caseDetails.getExaminerEmail()); - createChildElement(doc, caseElement, EXAMINER_ELEMENT_NOTES, caseDetails.getExaminerNotes()); + createChildElement(doc, caseElement, CASE_ELEMENT_NOTES, caseDetails.getCaseNotes()); createChildElement(doc, caseElement, CASE_TYPE_ELEMENT_NAME, caseType.toString()); createChildElement(doc, caseElement, CASE_DB_ABSOLUTE_PATH_ELEMENT_NAME, caseDatabasePath); createChildElement(doc, caseElement, CASE_DB_NAME_RELATIVE_ELEMENT_NAME, caseDatabaseName); @@ -471,17 +474,17 @@ public final class CaseMetadata { String examinerName = getElementTextContent(caseElement, EXAMINER_ELEMENT_NAME, false); String examinerPhone; String examinerEmail; - String examinerNotes; + String caseNotes; try { examinerPhone = getElementTextContent(caseElement, EXAMINER_ELEMENT_PHONE, false); examinerEmail = getElementTextContent(caseElement, EXAMINER_ELEMENT_EMAIL, false); - examinerNotes = getElementTextContent(caseElement, EXAMINER_ELEMENT_NOTES, false); + caseNotes = getElementTextContent(caseElement, CASE_ELEMENT_NOTES, false); } catch (CaseMetadataException ex) { examinerPhone = ""; //case had metadata file written before additional examiner details were included examinerEmail = ""; - examinerNotes = ""; + caseNotes = ""; } - this.caseDetails = new CaseDetails(caseDisplayName, caseNumber, examinerName, examinerPhone, examinerEmail, examinerNotes); + this.caseDetails = new CaseDetails(caseDisplayName, caseNumber, examinerName, examinerPhone, examinerEmail, caseNotes); this.caseType = Case.CaseType.fromString(getElementTextContent(caseElement, CASE_TYPE_ELEMENT_NAME, true)); if (null == this.caseType) { throw new CaseMetadataException("Case metadata file corrupted"); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form index c2be91ec45..9d9c3caa11 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form @@ -387,7 +387,7 @@ - + @@ -427,7 +427,7 @@ - + @@ -475,7 +475,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index f2ade38fe4..4dd71cd473 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.casemodule; import java.nio.file.Paths; import java.util.logging.Level; -import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; @@ -56,7 +55,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { lbExaminerNameText.setText(theCase.getExaminer()); lbExaminerPhoneText.setText(theCase.getExaminerPhone()); lbExaminerEmailText.setText(theCase.getExaminerEmail()); - taNotesText.setText(theCase.getExaminerNotes()); + taNotesText.setText(theCase.getCaseNotes()); crDateField.setText(theCase.getCreatedDate()); caseDirField.setText(theCase.getCaseDirectory()); if (Case.CaseType.SINGLE_USER_CASE == theCase.getCaseType()) { @@ -161,7 +160,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { lbExaminerNameText = new javax.swing.JLabel(); lbNotesLabel = new javax.swing.JLabel(); examinerLabel = new javax.swing.JLabel(); - examinerNotesScrollPane = new javax.swing.JScrollPane(); + caseNotesScrollPane = new javax.swing.JScrollPane(); taNotesText = new javax.swing.JTextArea(); lbExaminerEmailLabel = new javax.swing.JLabel(); lbExaminerPhoneLabel = new javax.swing.JLabel(); @@ -314,7 +313,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { examinerLabel.setMinimumSize(new java.awt.Dimension(82, 14)); examinerLabel.setPreferredSize(new java.awt.Dimension(82, 14)); - examinerNotesScrollPane.setBorder(null); + caseNotesScrollPane.setBorder(null); taNotesText.setBackground(new java.awt.Color(240, 240, 240)); taNotesText.setColumns(20); @@ -323,7 +322,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { taNotesText.setRows(2); taNotesText.setWrapStyleWord(true); taNotesText.setBorder(null); - examinerNotesScrollPane.setViewportView(taNotesText); + caseNotesScrollPane.setViewportView(taNotesText); lbExaminerEmailLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbExaminerEmailLabel.text")); // NOI18N lbExaminerEmailLabel.setMaximumSize(new java.awt.Dimension(82, 14)); @@ -349,7 +348,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbExaminerPhoneText, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE))) + .addComponent(caseNotesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE))) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, examinerPanelLayout.createSequentialGroup() .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(lbExaminerEmailLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -378,7 +377,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(caseNotesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(6, 6, 6)) ); @@ -492,6 +491,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { private javax.swing.JLabel caseDirField; private javax.swing.JLabel caseDirLabel; private javax.swing.JLabel caseNameLabel; + private javax.swing.JScrollPane caseNotesScrollPane; private javax.swing.JLabel caseNumberLabel; private javax.swing.JPanel casePanel; private javax.swing.JLabel caseTypeField; @@ -500,7 +500,6 @@ final class CasePropertiesPanel extends javax.swing.JPanel { private javax.swing.JLabel dbNameField; private javax.swing.JPanel detailsPanel; private javax.swing.JLabel examinerLabel; - private javax.swing.JScrollPane examinerNotesScrollPane; private javax.swing.JPanel examinerPanel; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea jTextArea1; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index ef2ce512c1..467142daa2 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -88,8 +88,8 @@ final class NewCaseVisualPanel2 extends javax.swing.JPanel { return propertiesPanel.getExaminerEmail(); } - String getExaminerNotes() { - return propertiesPanel.getExaminerNotes(); + String getCaseNotes() { + return propertiesPanel.getCaseNotes(); } String getOrganization() { @@ -112,8 +112,8 @@ final class NewCaseVisualPanel2 extends javax.swing.JPanel { propertiesPanel.setExaminerEmailField(examinerEmail); } - void setExaminerNotes(String examinerNotes) { - propertiesPanel.setExaminerNotesField(examinerNotes); + void setCaseNotes(String caseNotes) { + propertiesPanel.setCaseNotesField(caseNotes); } void setOrganization(String organizationName) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 99845f6e48..15193ab2cf 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -82,12 +82,12 @@ final class NewCaseWizardAction extends CallableSystemAction { String examinerName = (String) wizardDescriptor.getProperty("caseExaminerName"); //NON-NLS String examinerPhone = (String) wizardDescriptor.getProperty("caseExaminerPhone"); //NON-NLS String examinerEmail = (String) wizardDescriptor.getProperty("caseExaminerEmail"); //NON-NLS - String examinerNotes = (String) wizardDescriptor.getProperty("caseExaminerNotes"); //NON-NLS + String caseNotes = (String) wizardDescriptor.getProperty("caseNotes"); //NON-NLS String organizationName = (String) wizardDescriptor.getProperty("caseOrganization"); //NON-NLS final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS CaseType caseType = CaseType.values()[(int) wizardDescriptor.getProperty("caseType")]; //NON-NLS - Case.createAsCurrentCase(createdDirectory, new CaseDetails(caseName, caseNumber, examinerName, examinerPhone, examinerEmail, examinerNotes), caseType); + Case.createAsCurrentCase(createdDirectory, new CaseDetails(caseName, caseNumber, examinerName, examinerPhone, examinerEmail, caseNotes), caseType); if (EamDb.isEnabled()) { //if the eam is enabled we need to save the case organization information now try { EamDb dbManager = EamDb.getInstance(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index 5a1e96f0b6..61aefc8f22 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -42,7 +42,7 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel listeners = new HashSet<>(1); @@ -142,12 +142,12 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel - + @@ -218,7 +218,7 @@ - + @@ -244,7 +244,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java index a04ea27bdd..141f076888 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/OptionalCasePropertiesPanel.java @@ -66,7 +66,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { examinerTextField.setText(Case.getCurrentCase().getExaminer()); tfExaminerEmailText.setText(Case.getCurrentCase().getExaminerEmail()); tfExaminerPhoneText.setText(Case.getCurrentCase().getExaminerPhone()); - taNotesText.setText(Case.getCurrentCase().getExaminerNotes()); + taNotesText.setText(Case.getCurrentCase().getCaseNotes()); setUpCentralRepoFields(); setUpOrganizationData(); } else { @@ -159,7 +159,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { return tfExaminerEmailText.getText(); } - String getExaminerNotes() { + String getCaseNotes() { return taNotesText.getText(); } @@ -187,8 +187,8 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { tfExaminerEmailText.setText(examinerEmail == null ? "" : examinerEmail); } - void setExaminerNotesField(String examinerNotes) { - taNotesText.setText(examinerNotes == null ? "" : examinerNotes); + void setCaseNotesField(String caseNotes) { + taNotesText.setText(caseNotes == null ? "" : caseNotes); } @Messages({"OptionalCasePropertiesPanel.caseDisplayNameLabel.text=Name:", @@ -223,7 +223,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { examinerPanel = new javax.swing.JPanel(); tfExaminerPhoneText = new javax.swing.JTextField(); lbExaminerPhoneLabel = new javax.swing.JLabel(); - examinerNotesScrollPane = new javax.swing.JScrollPane(); + caseNotesScrollPane = new javax.swing.JScrollPane(); taNotesText = new javax.swing.JTextArea(); tfExaminerEmailText = new javax.swing.JTextField(); examinerTextField = new javax.swing.JTextField(); @@ -296,7 +296,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { lbExaminerPhoneLabel.setMinimumSize(new java.awt.Dimension(41, 14)); lbExaminerPhoneLabel.setPreferredSize(new java.awt.Dimension(41, 14)); - examinerNotesScrollPane.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + caseNotesScrollPane.setBorder(javax.swing.BorderFactory.createEtchedBorder()); taNotesText.setColumns(20); taNotesText.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N @@ -304,7 +304,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { taNotesText.setRows(2); taNotesText.setWrapStyleWord(true); taNotesText.setBorder(null); - examinerNotesScrollPane.setViewportView(taNotesText); + caseNotesScrollPane.setViewportView(taNotesText); examinerTextField.setFont(examinerTextField.getFont().deriveFont(examinerTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); @@ -337,7 +337,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addComponent(lbExaminerPhoneLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(10, 10, 10) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(examinerNotesScrollPane) + .addComponent(caseNotesScrollPane) .addComponent(tfExaminerPhoneText))) .addGroup(examinerPanelLayout.createSequentialGroup() .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) @@ -367,7 +367,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(examinerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbNotesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(examinerNotesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(caseNotesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(6, 6, 6)) ); @@ -583,12 +583,12 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel { private javax.swing.JButton bnNewOrganization; private javax.swing.JLabel caseDisplayNameLabel; private javax.swing.JTextField caseDisplayNameTextField; + private javax.swing.JScrollPane caseNotesScrollPane; private javax.swing.JLabel caseNumberLabel; private javax.swing.JTextField caseNumberTextField; private javax.swing.JPanel casePanel; private javax.swing.JComboBox comboBoxOrgName; private javax.swing.JLabel examinerLabel; - private javax.swing.JScrollPane examinerNotesScrollPane; private javax.swing.JPanel examinerPanel; private javax.swing.JTextField examinerTextField; private javax.swing.JLabel lbExaminerEmailLabel; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java index b256897c05..8529ea5261 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java @@ -207,7 +207,7 @@ public class SingleUserCaseConverter { oldCaseMetadata.getExaminer(), oldCaseMetadata.getExaminerPhone(), oldCaseMetadata.getExaminerEmail(), - oldCaseMetadata.getExaminerNotes())); + oldCaseMetadata.getCaseNotes())); newCaseMetadata.setCaseDatabaseName(dbName); // Set created date. This calls writefile, no need to call it again newCaseMetadata.setCreatedDate(oldCaseMetadata.getCreatedDate()); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java index 97d18af6a8..b16589c3dd 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/AbstractSqlEamDb.java @@ -277,7 +277,7 @@ public abstract class AbstractSqlEamDb implements EamDb { autopsyCase.getExaminer(), autopsyCase.getExaminerEmail(), autopsyCase.getExaminerPhone(), - autopsyCase.getExaminerNotes()); + autopsyCase.getCaseNotes()); newCase(curCeCase); return curCeCase; } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 2785bd6bfb..c849bcf7de 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -294,7 +294,7 @@ public class CaseEventListener implements PropertyChangeListener { curCase.getExaminer(), curCase.getExaminerEmail(), curCase.getExaminerPhone(), - curCase.getExaminerNotes()); + curCase.getCaseNotes()); if (!EamDb.isEnabled()) { break; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java index 5c61ef74d8..31d989d74a 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/IngestModule.java @@ -243,7 +243,7 @@ class IngestModule implements FileIngestModule { curCase.getExaminer(), curCase.getExaminerEmail(), curCase.getExaminerPhone(), - curCase.getExaminerNotes()); + curCase.getCaseNotes()); try { dbManager.newCase(curCeCase); eamCase = dbManager.getCaseByUUID(curCase.getName()); From 02cdf53d7430e4d891b38c1a530f93a75958f32e Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 25 Oct 2017 14:31:45 -0400 Subject: [PATCH 29/46] 3080 moved shutDownTaskExecutor to new ThreadUtils class --- .../sleuthkit/autopsy/casemodule/Case.java | 15 ++--- .../eventlisteners/CaseEventListener.java | 4 +- .../sleuthkit/autopsy/coreutils/ExecUtil.java | 37 +--------- .../autopsy/coreutils/ThreadUtils.java | 67 +++++++++++++++++++ 4 files changed, 77 insertions(+), 46 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/coreutils/ThreadUtils.java diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 55c0db7724..69d1efb0c4 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -85,12 +85,12 @@ import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.core.UserPreferencesException; import org.sleuthkit.autopsy.corecomponentinterfaces.CoreComponentControl; import org.sleuthkit.autopsy.coreutils.DriveUtils; -import org.sleuthkit.autopsy.coreutils.ExecUtil; import org.sleuthkit.autopsy.coreutils.FileUtil; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.NetworkUtils; import org.sleuthkit.autopsy.coreutils.PlatformUtil; +import org.sleuthkit.autopsy.coreutils.ThreadUtils; import org.sleuthkit.autopsy.coreutils.TimeZoneUtils; import org.sleuthkit.autopsy.coreutils.Version; import org.sleuthkit.autopsy.events.AutopsyEvent; @@ -129,7 +129,6 @@ public class Case { private static final String REPORTS_FOLDER = "Reports"; //NON-NLS private static final String TEMP_FOLDER = "Temp"; //NON-NLS private static final String MODULE_FOLDER = "ModuleOutput"; //NON-NLS - private static final long EXECUTOR_AWAIT_TIMEOUT_SECS = 5; private static final String CASE_ACTION_THREAD_NAME = "%s-case-action"; private static final String CASE_RESOURCES_THREAD_NAME = "%s-manage-case-resources"; private static final Logger logger = Logger.getLogger(Case.class.getName()); @@ -1646,7 +1645,7 @@ public class Case { } else { future.cancel(true); } - ExecUtil.shutDownTaskExecutor(caseLockingExecutor); + ThreadUtils.shutDownTaskExecutor(caseLockingExecutor); } catch (CancellationException discarded) { /* * The create/open task has been cancelled. Wait for it to finish, @@ -1655,7 +1654,7 @@ public class Case { * will have been closed and the case directory lock released will * have been released. */ - ExecUtil.shutDownTaskExecutor(caseLockingExecutor); + ThreadUtils.shutDownTaskExecutor(caseLockingExecutor); throw new CaseActionCancelledException(Bundle.Case_exceptionMessage_cancelledByUser()); } catch (ExecutionException ex) { /* @@ -1665,7 +1664,7 @@ public class Case { * case will have been closed and the case directory lock released * will have been released. */ - ExecUtil.shutDownTaskExecutor(caseLockingExecutor); + ThreadUtils.shutDownTaskExecutor(caseLockingExecutor); throw new CaseActionException(Bundle.Case_exceptionMessage_execExceptionWrapperMessage(ex.getCause().getLocalizedMessage()), ex); } finally { progressIndicator.finish(); @@ -1993,7 +1992,7 @@ public class Case { * would be possible to start the next task before the current * task responded to a cancellation request. */ - ExecUtil.shutDownTaskExecutor(executor); + ThreadUtils.shutDownTaskExecutor(executor); progressIndicator.finish(); } @@ -2064,7 +2063,7 @@ public class Case { } catch (ExecutionException ex) { throw new CaseActionException(Bundle.Case_exceptionMessage_execExceptionWrapperMessage(ex.getCause().getMessage()), ex); } finally { - ExecUtil.shutDownTaskExecutor(caseLockingExecutor); + ThreadUtils.shutDownTaskExecutor(caseLockingExecutor); progressIndicator.finish(); } } @@ -2175,7 +2174,7 @@ public class Case { Bundle.Case_servicesException_serviceResourcesCloseError(service.getServiceName(), ex.getLocalizedMessage()))); } } finally { - ExecUtil.shutDownTaskExecutor(executor); + ThreadUtils.shutDownTaskExecutor(executor); progressIndicator.finish(); } } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java index 0f8c8512af..05f971a853 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/CaseEventListener.java @@ -42,7 +42,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationDataSource; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; -import org.sleuthkit.autopsy.coreutils.ExecUtil; +import org.sleuthkit.autopsy.coreutils.ThreadUtils; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifactTag; @@ -68,7 +68,7 @@ final class CaseEventListener implements PropertyChangeListener { } void shutdown() { - ExecUtil.shutDownTaskExecutor(jobProcessingExecutor); + ThreadUtils.shutDownTaskExecutor(jobProcessingExecutor); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java b/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java index 51163e502c..4c7c022871 100755 --- a/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/ExecUtil.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2016 Basis Technology Corp. + * Copyright 2011-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,7 +26,6 @@ import java.io.InputStreamReader; import java.io.Writer; import java.util.Date; import java.util.List; -import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.sleuthkit.autopsy.core.UserPreferences; @@ -213,40 +212,6 @@ public final class ExecUtil { } } - /** - * Shuts down a task executor service, waiting until all tasks are - * terminated. The current policy is to wait for the tasks to finish so that - * the case for which the executor is running can be left in a consistent - * state. - * - * @param executor The executor. - */ - public static void shutDownTaskExecutor(ExecutorService executor) { - executor.shutdown(); - boolean taskCompleted = false; - while (!taskCompleted) { - try { - taskCompleted = executor.awaitTermination(DEFAULT_TIMEOUT, DEFAULT_TIMEOUT_UNITS); - } catch (InterruptedException ignored) { - /* - * The current policy is to wait for the task to finish so that - * the case can be left in a consistent state. - * - * For a specific example of the motivation for this policy, - * note that a application service (Solr search service) - * experienced an error condition when opening case resources - * that left the service blocked uninterruptibly on a socket - * read. This eventually led to a mysterious "freeze" as the - * user-cancelled service task continued to run holdiong a lock - * that a UI thread soon tried to acquire. Thus it has been - * deemed better to make the "freeze" happen in a more - * informative way, i.e., with the progress indicator for the - * unfinished task on the screen, if a similar error condition - * arises again. - */ - } - } - } /** * EVERYTHING FOLLOWING THIS LINE IS DEPRECATED AND SLATED FOR REMOVAL */ diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ThreadUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/ThreadUtils.java new file mode 100644 index 0000000000..80f0467781 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/coreutils/ThreadUtils.java @@ -0,0 +1,67 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.coreutils; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; + +/* + * General purpose actions which can be performed on Threads. + */ +final public class ThreadUtils { + + private static final long DEFAULT_TIMEOUT = 5; + private static final TimeUnit DEFAULT_TIMEOUT_UNITS = TimeUnit.SECONDS; + + /** + * Shuts down a task executor service, waiting until all tasks are + * terminated. + * + * @param executor The executor. + */ + public static void shutDownTaskExecutor(ExecutorService executor) { + executor.shutdown(); + boolean taskCompleted = false; + while (!taskCompleted) { + try { + taskCompleted = executor.awaitTermination(DEFAULT_TIMEOUT, DEFAULT_TIMEOUT_UNITS); + } catch (InterruptedException ignored) { + /* + * The current policy is to wait for the task to finish so that + * the case can be left in a consistent state. + * + * For a specific example of the motivation for this policy, + * note that a application service (Solr search service) + * experienced an error condition when opening case resources + * that left the service blocked uninterruptibly on a socket + * read. This eventually led to a mysterious "freeze" as the + * user-cancelled service task continued to run holdiong a lock + * that a UI thread soon tried to acquire. Thus it has been + * deemed better to make the "freeze" happen in a more + * informative way, i.e., with the progress indicator for the + * unfinished task on the screen, if a similar error condition + * arises again. + */ + } + } + } + + private ThreadUtils() { + } +} From f4afca6846c2ae915d301a6071cabfacc3c2981a Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 25 Oct 2017 14:36:26 -0400 Subject: [PATCH 30/46] 3126 merged changes from 3080 from moving shutDownTaskExecutor --- .../eventlisteners/IngestEventsListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java index 1ddfcb40b8..02d64904a4 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java @@ -45,7 +45,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; -import org.sleuthkit.autopsy.coreutils.ExecUtil; +import org.sleuthkit.autopsy.coreutils.ThreadUtils; /** * Listen for ingest events and update entries in the Central Repository @@ -67,7 +67,7 @@ public class IngestEventsListener { } void shutdown() { - ExecUtil.shutDownTaskExecutor(jobProcessingExecutor); + ThreadUtils.shutDownTaskExecutor(jobProcessingExecutor); } /* From 2a26f2651de70055db388de8c1314241882a8c88 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 25 Oct 2017 15:03:28 -0400 Subject: [PATCH 31/46] 2774 - save changes to CR settings prior to opening Manage Organizations Dialog --- .../centralrepository/optionspanel/GlobalSettingsPanel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java index 412f6afa54..58eb9fbe40 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/GlobalSettingsPanel.java @@ -417,6 +417,7 @@ public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel i }//GEN-LAST:event_cbUseCentralRepoActionPerformed private void manageOrganizationButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_manageOrganizationButtonActionPerformed + store(); ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); }//GEN-LAST:event_manageOrganizationButtonActionPerformed From 1f4419f928c8b4f5aca150dd9a116b2eb23bf016 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Thu, 26 Oct 2017 10:02:12 -0400 Subject: [PATCH 32/46] 2969: More validation on File Search By Attributes --- .../autopsy/filesearch/DateSearchFilter.java | 98 ++++++++++++------- .../autopsy/filesearch/DateSearchPanel.java | 18 ++++ .../autopsy/filesearch/HashSearchFilter.java | 4 +- .../autopsy/filesearch/SizeSearchFilter.java | 24 +++++ 4 files changed, 108 insertions(+), 36 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java index 205db56998..8cabb1e9cc 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java @@ -40,8 +40,12 @@ import javax.swing.JSeparator; import javax.swing.ListCellRenderer; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; +import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; /** * Filters file date properties (modified/created/etc.. times) @@ -79,25 +83,10 @@ class DateSearchFilter extends AbstractFileSearchFilter { String query = "NULL"; DateSearchPanel panel = this.getComponent(); - // first, get the selected timeZone from the dropdown list - String tz = this.getComponent().getTimeZoneComboBox().getSelectedItem().toString(); - String tzID = tz.substring(tz.indexOf(" ") + 1); // 1 index after the space is the ID - TimeZone selectedTZ = TimeZone.getTimeZone(tzID); // - // convert the date from the selected timezone to get the GMT long fromDate = 0; String startDateValue = panel.getDateFromTextField().getText(); - Calendar startDate = null; - try { - DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); - sdf.setTimeZone(selectedTZ); // get the time in the selected timezone - Date temp = sdf.parse(startDateValue); - - startDate = Calendar.getInstance(new SimpleTimeZone(0, "GMT")); //NON-NLS - startDate.setTime(temp); // convert to GMT - } catch (ParseException ex) { - // for now, no need to show the error message to the user here - } + Calendar startDate = getCalendarDate(startDateValue); if (!startDateValue.isEmpty()) { if (startDate != null) { fromDate = startDate.getTimeInMillis() / 1000; // divided by 1000 because we want to get the seconds, not miliseconds @@ -106,31 +95,13 @@ class DateSearchFilter extends AbstractFileSearchFilter { long toDate = 0; String endDateValue = panel.getDateToTextField().getText(); - Calendar endDate = null; - try { - DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); - sdf.setTimeZone(selectedTZ); // get the time in the selected timezone - Date temp2 = sdf.parse(endDateValue); - - endDate = Calendar.getInstance(new SimpleTimeZone(0, "GMT")); //NON-NLS - endDate.setTime(temp2); // convert to GMT - endDate.set(Calendar.HOUR, endDate.get(Calendar.HOUR) + 24); // get the next 24 hours - } catch (ParseException ex) { - // for now, no need to show the error message to the user here - } + Calendar endDate = getCalendarDate(endDateValue); if (!endDateValue.isEmpty()) { if (endDate != null) { toDate = endDate.getTimeInMillis() / 1000; // divided by 1000 because we want to get the seconds, not miliseconds } } - // If they put the dates in backwards, help them out. - if (fromDate > toDate) { - long temp = toDate; - toDate = fromDate; - fromDate = temp; - } - final boolean modifiedChecked = panel.getModifiedCheckBox().isSelected(); final boolean changedChecked = panel.getChangedCheckBox().isSelected(); final boolean accessedChecked = panel.getAccessedCheckBox().isSelected(); @@ -206,13 +177,70 @@ class DateSearchFilter extends AbstractFileSearchFilter { return timeZones; } + private TimeZone getSelectedTimeZone() { + String tz = this.getComponent().getTimeZoneComboBox().getSelectedItem().toString(); + String tzID = tz.substring(tz.indexOf(" ") + 1); // 1 index after the space is the ID + TimeZone selectedTZ = TimeZone.getTimeZone(tzID); // + return selectedTZ; + } + + private Calendar getCalendarDate(String dateValue) { + TimeZone selectedTZ = getSelectedTimeZone(); + Calendar inputDate = null; + try { + DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); + sdf.setTimeZone(selectedTZ); // get the time in the selected timezone + Date temp = sdf.parse(dateValue); + + inputDate = Calendar.getInstance(new SimpleTimeZone(0, "GMT")); //NON-NLS + inputDate.setTime(temp); // convert to GMT + } catch (ParseException ex) { + // for now, no need to show the error message to the user here + } + return inputDate; + } + @Override public void addActionListener(ActionListener l) { getComponent().addActionListener(l); } @Override + @Messages ({ + "End_Date_Before_Start_Date=The end date should be after the start date." + }) public boolean isValid() { + + final DateSearchPanel panel = this.getComponent(); + + panel.getDateFromTextField().addCaretListener(new CaretListener() { + @Override + public void caretUpdate(CaretEvent ce) { + String startDateValue = panel.getDateFromTextField().getText(); + Calendar startDate = getCalendarDate(startDateValue); + String endDateValue = panel.getDateToTextField().getText(); + Calendar endDate = getCalendarDate(endDateValue); + + if (startDate != null && startDate.after(endDate)) { + MessageNotifyUtil.Message.warn(Bundle.End_Date_Before_Start_Date()); + } + } + }); + + panel.getDateToTextField().addCaretListener(new CaretListener() { + @Override + public void caretUpdate(CaretEvent ce) { + String startDateValue = panel.getDateFromTextField().getText(); + Calendar startDate = getCalendarDate(startDateValue); + String endDateValue = panel.getDateToTextField().getText(); + Calendar endDate = getCalendarDate(endDateValue); + + if (endDate != null && endDate.before(startDate)) { + MessageNotifyUtil.Message.warn(Bundle.End_Date_Before_Start_Date()); + } + } + }); + return this.getComponent().isValidSearch(); } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java index 7867a5ebd6..82c51d78b1 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java @@ -20,6 +20,8 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; @@ -50,6 +52,20 @@ class DateSearchPanel extends javax.swing.JPanel { dateFromTextField.setComponentPopupMenu(rightClickMenu); dateToTextField.setComponentPopupMenu(rightClickMenu); + //Block or disable user input to date time field + dateFromTextField.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + e.consume(); // ignore event + } + }); + dateToTextField.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + e.consume(); // ignore event + } + }); + ActionListener actList = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -365,6 +381,7 @@ class DateSearchPanel extends javax.swing.JPanel { if (evt.getNewValue() instanceof Date) { setToDate((Date) evt.getNewValue()); } + }//GEN-LAST:event_dateToPopupChanged private void dateCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dateCheckBoxActionPerformed @@ -399,6 +416,7 @@ class DateSearchPanel extends javax.swing.JPanel { if (date != null) { dateStringResult = dateFormat.format(date); } + dateFromTextField.setText(dateStringResult); dateFromButtonCalendar.setTargetDate(date); } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java index 951f4b206e..6bbb732a16 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionListener; +import javax.swing.JTextField; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.filesearch.FileSearchFilter.FilterValidationException; @@ -61,6 +62,7 @@ class HashSearchFilter extends AbstractFileSearchFilter { @Override public boolean isValid() { - return !this.getComponent().getSearchTextField().getText().isEmpty(); + JTextField inputHashData = this.getComponent().getSearchTextField(); + return !inputHashData.getText().isEmpty() || inputHashData.getText().length() == 32 || inputHashData.getText().matches("[0-9a-fA-F]+"); } } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java index ca43dac7e0..d045f486c3 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java @@ -19,8 +19,12 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionListener; +import javax.swing.InputVerifier; import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JFormattedTextField; import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.filesearch.FileSearchFilter.FilterValidationException; /** @@ -74,7 +78,27 @@ class SizeSearchFilter extends AbstractFileSearchFilter { } @Override + @NbBundle.Messages ({ + "Non_Negative_Number=Please input a non negative number." + }) public boolean isValid() { + this.getComponent().getSizeTextField().setInputVerifier(new InputVerifier() { + @Override + public boolean verify(JComponent input) { + String inputText = ((JFormattedTextField) input).getText(); + try { + int inputInt = Integer.parseInt(inputText); + if (inputInt < 0) { + MessageNotifyUtil.Message.warn(Bundle.Non_Negative_Number()); + return false; + } + } catch (NumberFormatException | NullPointerException e) { + MessageNotifyUtil.Message.warn(Bundle.Non_Negative_Number()); + return false; + } + return true; + } + }); return true; } } From db1b35a4dd89014d664e3156e0981f51f7b1b06e Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Thu, 26 Oct 2017 10:15:45 -0400 Subject: [PATCH 33/46] Simply turn the textfield to non editable to block user input for data time --- .../autopsy/filesearch/DateSearchPanel.form | 2 ++ .../autopsy/filesearch/DateSearchPanel.java | 15 ++------------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.form index e92d57fdd9..59082745da 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.form @@ -149,6 +149,7 @@ + @@ -208,6 +209,7 @@ + diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java index 82c51d78b1..b67f076c6d 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java @@ -52,19 +52,6 @@ class DateSearchPanel extends javax.swing.JPanel { dateFromTextField.setComponentPopupMenu(rightClickMenu); dateToTextField.setComponentPopupMenu(rightClickMenu); - //Block or disable user input to date time field - dateFromTextField.addKeyListener(new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - e.consume(); // ignore event - } - }); - dateToTextField.addKeyListener(new KeyAdapter() { - @Override - public void keyTyped(KeyEvent e) { - e.consume(); // ignore event - } - }); ActionListener actList = new ActionListener() { @Override @@ -192,6 +179,7 @@ class DateSearchPanel extends javax.swing.JPanel { selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(DateSearchPanel.class, "DateSearchPanel.selectAllMenuItem.text")); // NOI18N rightClickMenu.add(selectAllMenuItem); + dateToTextField.setEditable(false); dateToTextField.setText(org.openide.util.NbBundle.getMessage(DateSearchPanel.class, "DateSearchPanel.dateToTextField.text")); // NOI18N dateToTextField.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { @@ -213,6 +201,7 @@ class DateSearchPanel extends javax.swing.JPanel { jLabel3.setFont(new java.awt.Font("Tahoma", 0, 10)); // NOI18N jLabel3.setText(org.openide.util.NbBundle.getMessage(DateSearchPanel.class, "DateSearchPanel.jLabel3.text")); // NOI18N + dateFromTextField.setEditable(false); dateFromTextField.setText(org.openide.util.NbBundle.getMessage(DateSearchPanel.class, "DateSearchPanel.dateFromTextField.text")); // NOI18N dateFromTextField.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { From 9f637c8be4fbf6089bc5b833248d7d95258fca29 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Fri, 27 Oct 2017 09:22:38 -0400 Subject: [PATCH 34/46] 2969: Verify the input data is valid from isValid() in the filter class --- .../autopsy/filesearch/DateSearchFilter.java | 48 ++++++------------- .../autopsy/filesearch/DateSearchPanel.java | 39 ++++++++++++++- .../autopsy/filesearch/FileSearchPanel.java | 1 - .../autopsy/filesearch/HashSearchFilter.java | 23 +++++++-- .../autopsy/filesearch/SizeSearchFilter.java | 35 ++++++-------- .../autopsy/filesearch/SizeSearchPanel.java | 20 ++++++++ 6 files changed, 106 insertions(+), 60 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java index 8cabb1e9cc..0f06839b50 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java @@ -40,12 +40,9 @@ import javax.swing.JSeparator; import javax.swing.ListCellRenderer; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; import org.openide.util.NbBundle.Messages; -import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; /** * Filters file date properties (modified/created/etc.. times) @@ -207,41 +204,26 @@ class DateSearchFilter extends AbstractFileSearchFilter { @Override @Messages ({ - "End_Date_Before_Start_Date=The end date should be after the start date." + "End.date.before.start.date=The end date should be after the start date.", + "No.checkbox.selected=Non of the date search checkbox is selected." }) public boolean isValid() { - final DateSearchPanel panel = this.getComponent(); + DateSearchPanel panel = this.getComponent(); + Calendar startDate = getCalendarDate(panel.getDateFromTextField().getText()); + Calendar endDate = getCalendarDate(panel.getDateToTextField().getText()); - panel.getDateFromTextField().addCaretListener(new CaretListener() { - @Override - public void caretUpdate(CaretEvent ce) { - String startDateValue = panel.getDateFromTextField().getText(); - Calendar startDate = getCalendarDate(startDateValue); - String endDateValue = panel.getDateToTextField().getText(); - Calendar endDate = getCalendarDate(endDateValue); - - if (startDate != null && startDate.after(endDate)) { - MessageNotifyUtil.Message.warn(Bundle.End_Date_Before_Start_Date()); - } - } - }); + if ((startDate != null && startDate.after(endDate)) || (endDate != null && endDate.before(startDate))) { + setLastError(Bundle.End_date_before_start_date()); + return false; + } - panel.getDateToTextField().addCaretListener(new CaretListener() { - @Override - public void caretUpdate(CaretEvent ce) { - String startDateValue = panel.getDateFromTextField().getText(); - Calendar startDate = getCalendarDate(startDateValue); - String endDateValue = panel.getDateToTextField().getText(); - Calendar endDate = getCalendarDate(endDateValue); - - if (endDate != null && endDate.before(startDate)) { - MessageNotifyUtil.Message.warn(Bundle.End_Date_Before_Start_Date()); - } - } - }); - - return this.getComponent().isValidSearch(); + if (!panel.isValidSearch()) { + setLastError(Bundle.No_checkbox_selected()); + return false; + } + + return true; } /** diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java index b67f076c6d..b9f490041b 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchPanel.java @@ -20,8 +20,6 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; @@ -31,6 +29,8 @@ import javax.swing.JComboBox; import javax.swing.JFormattedTextField; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; /** * Subpanel with controls for file data filtering. @@ -77,6 +77,41 @@ class DateSearchPanel extends javax.swing.JPanel { copyMenuItem.addActionListener(actList); pasteMenuItem.addActionListener(actList); selectAllMenuItem.addActionListener(actList); + this.dateFromTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + + @Override + public void removeUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + + @Override + public void changedUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + }); + + this.dateToTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + + @Override + public void removeUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + + @Override + public void changedUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + }); + + this.setComponentsEnabled(); } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java index 2a27be8297..f6c72df611 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/FileSearchPanel.java @@ -27,7 +27,6 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java index 6bbb732a16..c760ec8f52 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java @@ -19,8 +19,8 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionListener; -import javax.swing.JTextField; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.filesearch.FileSearchFilter.FilterValidationException; /** @@ -61,8 +61,25 @@ class HashSearchFilter extends AbstractFileSearchFilter { } @Override + @Messages({ + "Empty.hash=Hash data is empty.", + "# {0} - hash data length", "Wrong.length=Input lenght({0}), doesn't match the MD5 length(32).", + "Wrong.character=Input data is an invalid MD5 hex data." + }) public boolean isValid() { - JTextField inputHashData = this.getComponent().getSearchTextField(); - return !inputHashData.getText().isEmpty() || inputHashData.getText().length() == 32 || inputHashData.getText().matches("[0-9a-fA-F]+"); + String inputHashData = this.getComponent().getSearchTextField().getText(); + if (inputHashData.isEmpty()) { + setLastError(Bundle.Empty_hash()); + return false; + } + if (inputHashData.length() != 32) { + setLastError(Bundle.Wrong_length(inputHashData.length())); + return false; + } + if (!inputHashData.matches("[0-9a-fA-F]+")) { + setLastError(Bundle.Wrong_character()); + return false; + } + return true; } } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java index d045f486c3..22643c6868 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java @@ -19,12 +19,9 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionListener; -import javax.swing.InputVerifier; import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JFormattedTextField; import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.filesearch.FileSearchFilter.FilterValidationException; /** @@ -78,27 +75,23 @@ class SizeSearchFilter extends AbstractFileSearchFilter { } @Override - @NbBundle.Messages ({ - "Non_Negative_Number=Please input a non negative number." + @Messages ({ + "Non.negative.number=Input size data is a negative number.", + "Not.a.number=Input size data is not a number." }) public boolean isValid() { - this.getComponent().getSizeTextField().setInputVerifier(new InputVerifier() { - @Override - public boolean verify(JComponent input) { - String inputText = ((JFormattedTextField) input).getText(); - try { - int inputInt = Integer.parseInt(inputText); - if (inputInt < 0) { - MessageNotifyUtil.Message.warn(Bundle.Non_Negative_Number()); - return false; - } - } catch (NumberFormatException | NullPointerException e) { - MessageNotifyUtil.Message.warn(Bundle.Non_Negative_Number()); + String input = this.getComponent().getSizeTextField().getText(); + + try { + int inputInt = Integer.parseInt(input); + if (inputInt < 0) { + setLastError(Bundle.Non_negative_number()); return false; } - return true; - } - }); + } catch (NumberFormatException | NullPointerException e) { + setLastError(Bundle.Not_a_number()); + return false; + } return true; } } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.java index 3add979247..51aa688619 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchPanel.java @@ -25,6 +25,8 @@ import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFormattedTextField; import javax.swing.JMenuItem; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; /** * @@ -65,6 +67,24 @@ class SizeSearchPanel extends javax.swing.JPanel { copyMenuItem.addActionListener(actList); pasteMenuItem.addActionListener(actList); selectAllMenuItem.addActionListener(actList); + this.sizeTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + + @Override + public void removeUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + + @Override + public void changedUpdate(DocumentEvent e) { + firePropertyChange(FileSearchPanel.EVENT.CHECKED.toString(), null, null); + } + }); + + } From a9caa221410f7864be772ca4248c5963ad76a90b Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Fri, 27 Oct 2017 09:49:39 -0400 Subject: [PATCH 35/46] 2969: update the Messages by using classname.messeges format --- .../autopsy/filesearch/DateSearchFilter.java | 8 ++++---- .../autopsy/filesearch/HashSearchFilter.java | 12 ++++++------ .../autopsy/filesearch/SizeSearchFilter.java | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java index 0f06839b50..a8e9724342 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java @@ -204,8 +204,8 @@ class DateSearchFilter extends AbstractFileSearchFilter { @Override @Messages ({ - "End.date.before.start.date=The end date should be after the start date.", - "No.checkbox.selected=Non of the date search checkbox is selected." + "DateSearchFilter.endDateBeforeStartDate=The end date should be after the start date.", + "DateSearchFilter.noCheckboxSelected=Non of the date search checkbox is selected." }) public boolean isValid() { @@ -214,12 +214,12 @@ class DateSearchFilter extends AbstractFileSearchFilter { Calendar endDate = getCalendarDate(panel.getDateToTextField().getText()); if ((startDate != null && startDate.after(endDate)) || (endDate != null && endDate.before(startDate))) { - setLastError(Bundle.End_date_before_start_date()); + setLastError(Bundle.DateSearchFilter_endDateBeforeStartDate()); return false; } if (!panel.isValidSearch()) { - setLastError(Bundle.No_checkbox_selected()); + setLastError(Bundle.DateSearchFilter_noCheckboxSelected()); return false; } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java index c760ec8f52..61d39c8de3 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java @@ -62,22 +62,22 @@ class HashSearchFilter extends AbstractFileSearchFilter { @Override @Messages({ - "Empty.hash=Hash data is empty.", - "# {0} - hash data length", "Wrong.length=Input lenght({0}), doesn't match the MD5 length(32).", - "Wrong.character=Input data is an invalid MD5 hex data." + "HashSearchFilter.emptyHash=Hash data is empty.", + "# {0} - hash data length", "HashSearchFilter.wrongLength=Input lenght({0}), doesn't match the MD5 length(32).", + "HashSearchFilter.wrongCharacter=Input data is an invalid MD5 hex data." }) public boolean isValid() { String inputHashData = this.getComponent().getSearchTextField().getText(); if (inputHashData.isEmpty()) { - setLastError(Bundle.Empty_hash()); + setLastError(Bundle.HashSearchFilter_emptyHash()); return false; } if (inputHashData.length() != 32) { - setLastError(Bundle.Wrong_length(inputHashData.length())); + setLastError(Bundle.HashSearchFilter_wrongLength(inputHashData.length())); return false; } if (!inputHashData.matches("[0-9a-fA-F]+")) { - setLastError(Bundle.Wrong_character()); + setLastError(Bundle.HashSearchFilter_wrongCharacter()); return false; } return true; diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java index 22643c6868..8377caf974 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java @@ -76,8 +76,8 @@ class SizeSearchFilter extends AbstractFileSearchFilter { @Override @Messages ({ - "Non.negative.number=Input size data is a negative number.", - "Not.a.number=Input size data is not a number." + "SizeSearchFilter.nonNegativeNumber=Input size data is a negative number.", + "SizeSearchFilter.notANumber=Input size data is not a number." }) public boolean isValid() { String input = this.getComponent().getSizeTextField().getText(); @@ -85,11 +85,11 @@ class SizeSearchFilter extends AbstractFileSearchFilter { try { int inputInt = Integer.parseInt(input); if (inputInt < 0) { - setLastError(Bundle.Non_negative_number()); + setLastError(Bundle.SizeSearchFilter_nonNegativeNumber()); return false; } } catch (NumberFormatException | NullPointerException e) { - setLastError(Bundle.Not_a_number()); + setLastError(Bundle.SizeSearchFilter_notANumber()); return false; } return true; From 40a9b58ac65cd51b6270e5085e31e682274376b1 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Fri, 27 Oct 2017 09:56:41 -0400 Subject: [PATCH 36/46] 2969: Adding one more step as classname.errorMessage.message --- .../autopsy/filesearch/DateSearchFilter.java | 8 ++++---- .../autopsy/filesearch/HashSearchFilter.java | 12 ++++++------ .../autopsy/filesearch/SizeSearchFilter.java | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java index a8e9724342..3279a81f3e 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java @@ -204,8 +204,8 @@ class DateSearchFilter extends AbstractFileSearchFilter { @Override @Messages ({ - "DateSearchFilter.endDateBeforeStartDate=The end date should be after the start date.", - "DateSearchFilter.noCheckboxSelected=Non of the date search checkbox is selected." + "DateSearchFilter.errorMessage.endDateBeforeStartDate=The end date should be after the start date.", + "DateSearchFilter.errorMessage.noCheckboxSelected=Non of the date search checkbox is selected." }) public boolean isValid() { @@ -214,12 +214,12 @@ class DateSearchFilter extends AbstractFileSearchFilter { Calendar endDate = getCalendarDate(panel.getDateToTextField().getText()); if ((startDate != null && startDate.after(endDate)) || (endDate != null && endDate.before(startDate))) { - setLastError(Bundle.DateSearchFilter_endDateBeforeStartDate()); + setLastError(Bundle.DateSearchFilter_errorMessage_endDateBeforeStartDate()); return false; } if (!panel.isValidSearch()) { - setLastError(Bundle.DateSearchFilter_noCheckboxSelected()); + setLastError(Bundle.DateSearchFilter_errorMessage_noCheckboxSelected()); return false; } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java index 61d39c8de3..6204109372 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java @@ -62,22 +62,22 @@ class HashSearchFilter extends AbstractFileSearchFilter { @Override @Messages({ - "HashSearchFilter.emptyHash=Hash data is empty.", - "# {0} - hash data length", "HashSearchFilter.wrongLength=Input lenght({0}), doesn't match the MD5 length(32).", - "HashSearchFilter.wrongCharacter=Input data is an invalid MD5 hex data." + "HashSearchFilter.errorMessage.emptyHash=Hash data is empty.", + "# {0} - hash data length", "HashSearchFilter.errorMessage.wrongLength=Input lenght({0}), doesn't match the MD5 length(32).", + "HashSearchFilter.errorMessage.wrongCharacter=Input data is an invalid MD5 hex data." }) public boolean isValid() { String inputHashData = this.getComponent().getSearchTextField().getText(); if (inputHashData.isEmpty()) { - setLastError(Bundle.HashSearchFilter_emptyHash()); + setLastError(Bundle.HashSearchFilter_errorMessage_emptyHash()); return false; } if (inputHashData.length() != 32) { - setLastError(Bundle.HashSearchFilter_wrongLength(inputHashData.length())); + setLastError(Bundle.HashSearchFilter_errorMessage_wrongLength(inputHashData.length())); return false; } if (!inputHashData.matches("[0-9a-fA-F]+")) { - setLastError(Bundle.HashSearchFilter_wrongCharacter()); + setLastError(Bundle.HashSearchFilter_errorMessage_wrongCharacter()); return false; } return true; diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java index 8377caf974..cf5d4f9e73 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/SizeSearchFilter.java @@ -76,8 +76,8 @@ class SizeSearchFilter extends AbstractFileSearchFilter { @Override @Messages ({ - "SizeSearchFilter.nonNegativeNumber=Input size data is a negative number.", - "SizeSearchFilter.notANumber=Input size data is not a number." + "SizeSearchFilter.errorMessage.nonNegativeNumber=Input size data is a negative number.", + "SizeSearchFilter.errorMessage.notANumber=Input size data is not a number." }) public boolean isValid() { String input = this.getComponent().getSizeTextField().getText(); @@ -85,11 +85,11 @@ class SizeSearchFilter extends AbstractFileSearchFilter { try { int inputInt = Integer.parseInt(input); if (inputInt < 0) { - setLastError(Bundle.SizeSearchFilter_nonNegativeNumber()); + setLastError(Bundle.SizeSearchFilter_errorMessage_nonNegativeNumber()); return false; } } catch (NumberFormatException | NullPointerException e) { - setLastError(Bundle.SizeSearchFilter_notANumber()); + setLastError(Bundle.SizeSearchFilter_errorMessage_notANumber()); return false; } return true; From 1fcc0caa6886976d06f7c79983630a1ae8740c8d Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Fri, 27 Oct 2017 11:36:59 -0400 Subject: [PATCH 37/46] 2969: Update the error message for no checkbox is selected error. --- Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java index 3279a81f3e..3291c5ae42 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/DateSearchFilter.java @@ -205,7 +205,7 @@ class DateSearchFilter extends AbstractFileSearchFilter { @Override @Messages ({ "DateSearchFilter.errorMessage.endDateBeforeStartDate=The end date should be after the start date.", - "DateSearchFilter.errorMessage.noCheckboxSelected=Non of the date search checkbox is selected." + "DateSearchFilter.errorMessage.noCheckboxSelected=At least one date type checkbox must be selected." }) public boolean isValid() { From 763c0fa03c610f92b99c288ed1e47a3d37eb42e6 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Fri, 27 Oct 2017 13:59:48 -0400 Subject: [PATCH 38/46] 2969: update MD5 error messages --- .../org/sleuthkit/autopsy/filesearch/HashSearchFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java index 6204109372..e63fce305e 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java @@ -63,8 +63,8 @@ class HashSearchFilter extends AbstractFileSearchFilter { @Override @Messages({ "HashSearchFilter.errorMessage.emptyHash=Hash data is empty.", - "# {0} - hash data length", "HashSearchFilter.errorMessage.wrongLength=Input lenght({0}), doesn't match the MD5 length(32).", - "HashSearchFilter.errorMessage.wrongCharacter=Input data is an invalid MD5 hex data." + "# {0} - hash data length", "HashSearchFilter.errorMessage.wrongLength=Input lenght({0}), doesn''t match the MD5 length(32).", + "HashSearchFilter.errorMessage.wrongCharacter=MD5 contains invalid hex characters." }) public boolean isValid() { String inputHashData = this.getComponent().getSearchTextField().getText(); From 450faba4190ef3ec72f6462556fd88defa7986a3 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Fri, 27 Oct 2017 17:57:56 -0400 Subject: [PATCH 39/46] Modified labels and titles for filters. --- Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.java | 5 ++++- .../autopsy/modules/interestingitems/Bundle.properties | 4 +--- .../modules/interestingitems/FilesSetDefsPanel.java | 9 ++++++--- .../autopsy/modules/interestingitems/FilesSetPanel.java | 4 ++-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.java b/Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.java index 3110947488..249ded2020 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/ProfilePanel.java @@ -33,7 +33,8 @@ import org.sleuthkit.autopsy.ingest.IngestProfiles.IngestProfile; */ class ProfilePanel extends IngestModuleGlobalSettingsPanel { - @NbBundle.Messages({"ProfilePanel.profileDescLabel.text=Description:", + @NbBundle.Messages({"ProfilePanel.title.text=Profile", + "ProfilePanel.profileDescLabel.text=Description:", "ProfilePanel.profileNameLabel.text=Profile Name:", "ProfilePanel.newProfileText=NewEmptyProfile", "ProfilePanel.messages.profilesMustBeNamed=Ingest profile must be named.", @@ -50,6 +51,7 @@ class ProfilePanel extends IngestModuleGlobalSettingsPanel { */ ProfilePanel() { initComponents(); + setName(org.openide.util.NbBundle.getMessage(ProfilePanel.class, "ProfilePanel.title.text")); settings = new IngestJobSettings(NEW_PROFILE_NAME); ingestSettingsPanel = new IngestJobSettingsPanel(settings); ingestSettingsPanel.setPastJobsButtonVisible(false); @@ -59,6 +61,7 @@ class ProfilePanel extends IngestModuleGlobalSettingsPanel { ProfilePanel(IngestProfile selectedProfile) { initComponents(); + setName(org.openide.util.NbBundle.getMessage(ProfilePanel.class, "ProfilePanel.title.text")); profile = selectedProfile; profileDescArea.setText(profile.getDescription()); profileNameField.setText(profile.getName()); diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties index df63e98d2e..f38bcbc815 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties @@ -4,8 +4,6 @@ OpenIDE-Module-Short-Description=Interesting Files Identifier ingest module. OpenIDE-Module-Name=Interesting Files Identifier OptionsCategory_Name_InterestingItemDefinitions=Interesting Files OptionsCategory_Keywords_InterestingItemDefinitions=InterestingItemDefinitions -OptionsCategory_Name_FileIngestFilterDefinitions=File Ingest Filter -OptionsCategory_Keywords_FileIngestFilterDefinitions=FileIngestFilterDefinitions InterestingItemsIdentifierIngestModule.moduleName=Interesting Files Identifier InterestingItemsIdentifierIngestModule.moduleDescription=Identifies interesting items as defined by interesting item rule sets. FilesSetPanel.interesting.title=Interesting Files Set @@ -45,7 +43,7 @@ FilesSetRulePanel.fileSizeCheck.text=File Size: FilesSetRulePanel.filesRadioButton.text=Files FilesSetRulePanel.dirsRadioButton.text=Directories FilesSetDefsPanel.interesting.setsListLabel.text=Rule Sets: -FilesSetDefsPanel.ingest.setsListLabel.text=File Ingest Filters: +FilesSetDefsPanel.ingest.setsListLabel.text=File Filters: FilesSetDefsPanel.interesting.jTextArea1.text=This module allows you to find files that match specified criteria. Each set has a list of rules, which will match on their chosen file characteristics. A file need only match one rule to be found. FilesSetDefsPanel.ingest.jTextArea1.text=Add rules so that only a subset of the files in a data source are analyzed. Rules are organized into sets and only one set can be used at a time. A file need only match one rule to be analyzed. FilesSetDefsPanel.interesting.editSetButton.text=Edit Set diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetDefsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetDefsPanel.java index f989d24971..c67051be97 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetDefsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetDefsPanel.java @@ -77,6 +77,7 @@ public final class FilesSetDefsPanel extends IngestModuleGlobalSettingsPanel imp private final JButton okButton = new JButton("OK"); private final JButton cancelButton = new JButton("Cancel"); private final PANEL_TYPE panelType; + private final String filterDialogTitle; private final String ruleDialogTitle; private boolean canBeEnabled = true; @@ -109,7 +110,8 @@ public final class FilesSetDefsPanel extends IngestModuleGlobalSettingsPanel imp this.jLabel7.setVisible(false); this.fileSizeUnitComboBox.setVisible(false); this.fileSizeSpinner.setVisible(false); - this.ruleDialogTitle = "FilesSetPanel.ingest.title"; + this.filterDialogTitle = "FilesSetPanel.filter.title"; + this.ruleDialogTitle = "FilesSetPanel.rule.title"; this.jLabel8.setVisible(false); this.equalitySignComboBox.setVisible(false); this.ignoreKnownFilesCheckbox.setVisible(false); @@ -124,13 +126,14 @@ public final class FilesSetDefsPanel extends IngestModuleGlobalSettingsPanel imp org.openide.awt.Mnemonics.setLocalizedText(deleteSetButton, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingest.deleteSetButton.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(FilesSetDefsPanel.class, "FilesSetDefsPanel.ingest.jLabel6.text")); // NOI18N } else { + this.filterDialogTitle = "FilesSetPanel.interesting.title"; this.ruleDialogTitle = "FilesSetPanel.interesting.title"; this.ingoreUnallocCheckbox.setVisible(false); } } @NbBundle.Messages({"FilesSetDefsPanel.Interesting.Title=Global Interesting Items Settings", - "FilesSetDefsPanel.Ingest.Title=File Ingest Filter Settings"}) + "FilesSetDefsPanel.Ingest.Title=File Filter Settings"}) private void customInit() { if (panelType == PANEL_TYPE.FILE_INGEST_FILTERS) { setName(Bundle.FilesSetDefsPanel_Ingest_Title()); @@ -408,7 +411,7 @@ public final class FilesSetDefsPanel extends IngestModuleGlobalSettingsPanel imp // feedback when isValidDefinition() is called. int option = JOptionPane.OK_OPTION; do { - option = JOptionPane.showConfirmDialog(null, panel, NbBundle.getMessage(FilesSetPanel.class, ruleDialogTitle), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + option = JOptionPane.showConfirmDialog(null, panel, NbBundle.getMessage(FilesSetPanel.class, filterDialogTitle), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); } while (option == JOptionPane.OK_OPTION && !panel.isValidDefinition()); // While adding new ruleset(selectedSet == null), if rule set with same name already exists, do not add to the filesSets hashMap. diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetPanel.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetPanel.java index 962c18c8e1..51539b5806 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetPanel.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2014-2016 Basis Technology Corp. + * Copyright 2014-2017 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -29,7 +29,7 @@ import org.sleuthkit.autopsy.modules.interestingitems.FilesSetDefsPanel.PANEL_TY */ public class FilesSetPanel extends javax.swing.JPanel { - @NbBundle.Messages({"FilesSetPanel.ingest.title=File Ingest Filter", "FilesSetPanel.ingest.createNewFilter=Create/edit file ingest filters...", "FilesSetPanel.ingest.messages.filtersMustBeNamed=File ingest filters must be named."}) + @NbBundle.Messages({"FilesSetPanel.filter.title=File Filter", "FilesSetPanel.rule.title=File Filter Rule", "FilesSetPanel.ingest.createNewFilter=Create/edit file ingest filters...", "FilesSetPanel.ingest.messages.filtersMustBeNamed=File ingest filters must be named."}) private static final String CREATE_NEW_FILE_INGEST_FILTER = Bundle.FilesSetPanel_ingest_createNewFilter(); private final String mustBeNamedErrorText; From 33fdb5899938a6f951c21a3c6a022e6e29f2ec98 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Mon, 30 Oct 2017 11:15:44 -0400 Subject: [PATCH 40/46] 2969: Add validation messages for Name, MIME type and known status --- .../autopsy/filesearch/KnownStatusSearchFilter.java | 10 +++++++++- .../sleuthkit/autopsy/filesearch/MimeTypeFilter.java | 10 +++++++++- .../sleuthkit/autopsy/filesearch/NameSearchFilter.java | 10 +++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchFilter.java index 5f52afa035..677f0116e9 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/KnownStatusSearchFilter.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionListener; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.datamodel.TskData.FileKnown; /** @@ -85,7 +86,14 @@ class KnownStatusSearchFilter extends AbstractFileSearchFilter { } @Override + @Messages ({ + "MimeTypeFilter.errorMessage.emptyMimeType=At least one MIME type must be selected." + }) public boolean isValid() { - return !this.getComponent().getMimeTypesSelected().isEmpty(); + if(this.getComponent().getMimeTypesSelected().isEmpty()){ + setLastError(Bundle.MimeTypeFilter_errorMessage_emptyMimeType()); + return false; + } + return true; } } diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchFilter.java index ee70ebd5e1..2b204c8ca8 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/NameSearchFilter.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.filesearch; import java.awt.event.ActionListener; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.filesearch.FileSearchFilter.FilterValidationException; /** @@ -64,7 +65,14 @@ class NameSearchFilter extends AbstractFileSearchFilter { } @Override + @Messages ({ + "NameSearchFilter.errorMessage.emtpyName=Please input a name to search." + }) public boolean isValid() { - return !this.getComponent().getSearchTextField().getText().isEmpty(); + if(this.getComponent().getSearchTextField().getText().isEmpty()) { + setLastError(Bundle.NameSearchFilter_errorMessage_emtpyName()); + return false; + } + return true; } } From adc3f3e635fbbcfec9187bed17d63ae15e78cf49 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Mon, 30 Oct 2017 15:44:43 -0400 Subject: [PATCH 41/46] 2969. fix typo --- Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java index e63fce305e..d77fe5826e 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java +++ b/Core/src/org/sleuthkit/autopsy/filesearch/HashSearchFilter.java @@ -63,7 +63,7 @@ class HashSearchFilter extends AbstractFileSearchFilter { @Override @Messages({ "HashSearchFilter.errorMessage.emptyHash=Hash data is empty.", - "# {0} - hash data length", "HashSearchFilter.errorMessage.wrongLength=Input lenght({0}), doesn''t match the MD5 length(32).", + "# {0} - hash data length", "HashSearchFilter.errorMessage.wrongLength=Input length({0}), doesn''t match the MD5 length(32).", "HashSearchFilter.errorMessage.wrongCharacter=MD5 contains invalid hex characters." }) public boolean isValid() { From 8bd8d145c4e0df2480b15dd6ceec4badc8532d28 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 30 Oct 2017 19:47:46 -0400 Subject: [PATCH 42/46] 2774 CaseDetails now public and CaseDetails event added --- .../sleuthkit/autopsy/casemodule/Case.java | 47 ++++++++++++---- .../autopsy/casemodule/CaseDetails.java | 53 ++++++++++++++----- .../autopsy/casemodule/CaseMetadata.java | 27 ++++++---- .../casemodule/NewCaseVisualPanel2.java | 4 +- .../casemodule/NewCaseWizardAction.java | 8 +-- .../casemodule/NewCaseWizardPanel2.java | 2 +- .../OptionalCasePropertiesPanel.java | 8 +-- 7 files changed, 104 insertions(+), 45 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index e3d1171c91..453b5421ee 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -249,19 +249,28 @@ public class Case { * The name of the current case has changed. The old value of the * PropertyChangeEvent is the old case name (type: String), the new * value is the new case name (type: String). + * + * @Deprecated CASE_DETAILS event should be used instead */ + @Deprecated NAME, /** * The number of the current case has changed. The old value of the * PropertyChangeEvent is the old case number (type: String), the new * value is the new case number (type: String). + * + * @Deprecated CASE_DETAILS event should be used instead */ + @Deprecated NUMBER, /** * The examiner associated with the current case has changed. The old * value of the PropertyChangeEvent is the old examiner (type: String), * the new value is the new examiner (type: String). + * + * @Deprecated CASE_DETAILS event should be used instead */ + @Deprecated EXAMINER, /** * An attempt to add a new data source to the current case is being @@ -346,7 +355,14 @@ public class Case { * The old value of the PropertyChangeEvent is is the tag info (type: * ContentTagDeletedEvent.DeletedContentTagInfo), the new value is null. */ - CONTENT_TAG_DELETED; + CONTENT_TAG_DELETED, + /** + * The case display name or an optional detail which can be provided + * regarding a case has been changed. The optional details include the + * case number, the examiner name, examiner phone, examiner email, and + * the case notes. + */ + CASE_DETAILS; }; /** @@ -477,9 +493,13 @@ public class Case { * @throws CaseActionException If there is a problem creating the * case. * @throws CaseActionCancelledException If creating the case is cancelled. + * + * @Deprecated use createAsCurrentCase(CaseType caseType, String caseDir, + * CaseDetails caseDetails) instead */ + @Deprecated public static void createAsCurrentCase(String caseDir, String caseDisplayName, String caseNumber, String examiner, CaseType caseType) throws CaseActionException, CaseActionCancelledException { - createAsCurrentCase(caseDir, new CaseDetails(caseDisplayName, caseNumber, examiner, "", "", ""), caseType); + createAsCurrentCase(caseType, caseDir, new CaseDetails(caseDisplayName, caseNumber, examiner, "", "", "")); } /** @@ -492,10 +512,10 @@ public class Case { * will be created if it doesn't already exist; if it * exists, it is ASSUMED it was created by calling * createCaseDirectory. + * @param caseType The type of case (single-user or multi-user). * @param caseDetails Contains the modifiable details of the case such as * the case display name, the case number, and the * examiner related data. - * @param caseType The type of case (single-user or multi-user). * * @throws CaseActionException If there is a problem creating the * case. @@ -505,7 +525,7 @@ public class Case { "Case.exceptionMessage.emptyCaseName=Must specify a case name.", "Case.exceptionMessage.emptyCaseDir=Must specify a case directory path." }) - public static void createAsCurrentCase(String caseDir, CaseDetails caseDetails, CaseType caseType) throws CaseActionException, CaseActionCancelledException { + public static void createAsCurrentCase(CaseType caseType, String caseDir, CaseDetails caseDetails) throws CaseActionException, CaseActionCancelledException { if (caseDetails.getCaseDisplayName().isEmpty()) { throw new CaseActionException(Bundle.Case_exceptionMessage_emptyCaseName()); } @@ -1544,18 +1564,27 @@ public class Case { "Case.exceptionMessage.metadataUpdateError=Failed to update case metadata" }) void updateCaseDetails(CaseDetails caseDetails) throws CaseActionException { - String oldDisplayName = metadata.getCaseDisplayName(); + CaseDetails oldCaseDetails = metadata.getCaseDetails(); try { metadata.setCaseDetails(caseDetails); } catch (CaseMetadataException ex) { throw new CaseActionException(Bundle.Case_exceptionMessage_metadataUpdateError(), ex); } - eventPublisher.publish(new AutopsyEvent(Events.NAME.toString(), oldDisplayName, caseDetails.getCaseDisplayName())); + if (!oldCaseDetails.getCaseNumber().equals(caseDetails.getCaseNumber())) { + eventPublisher.publish(new AutopsyEvent(Events.NUMBER.toString(), oldCaseDetails.getCaseNumber(), caseDetails.getCaseNumber())); + } + if (!oldCaseDetails.getExaminerName().equals(caseDetails.getExaminerName())) { + eventPublisher.publish(new AutopsyEvent(Events.NUMBER.toString(), oldCaseDetails.getExaminerName(), caseDetails.getExaminerName())); + } + if (!oldCaseDetails.getCaseDisplayName().equals(caseDetails.getCaseDisplayName())) { + eventPublisher.publish(new AutopsyEvent(Events.NAME.toString(), oldCaseDetails.getCaseDisplayName(), caseDetails.getCaseDisplayName())); + } + eventPublisher.publish(new AutopsyEvent(Events.CASE_DETAILS.toString(), oldCaseDetails, caseDetails)); if (RuntimeProperties.runningWithGUI()) { SwingUtilities.invokeLater(() -> { mainFrame.setTitle(caseDetails.getCaseDisplayName() + " - " + UserPreferences.getAppName()); try { - RecentCases.getInstance().updateRecentCase(oldDisplayName, metadata.getFilePath().toString(), caseDetails.getCaseDisplayName(), metadata.getFilePath().toString()); + RecentCases.getInstance().updateRecentCase(oldCaseDetails.getCaseDisplayName(), metadata.getFilePath().toString(), caseDetails.getCaseDisplayName(), metadata.getFilePath().toString()); } catch (Exception ex) { logger.log(Level.SEVERE, "Error updating case name in UI", ex); //NON-NLS } @@ -1563,8 +1592,6 @@ public class Case { } } - - /** * Constructs a Case object for a new Autopsy case. * @@ -1580,7 +1607,7 @@ public class Case { * the empty string. */ private Case(CaseType caseType, String caseDir, CaseDetails caseDetails) { - metadata = new CaseMetadata(caseDir, caseType, displayNameToUniqueName(caseDetails.getCaseDisplayName()), caseDetails); + metadata = new CaseMetadata(caseType, caseDir, displayNameToUniqueName(caseDetails.getCaseDisplayName()), caseDetails); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java index c462288315..d1cd8861eb 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseDetails.java @@ -22,7 +22,7 @@ package org.sleuthkit.autopsy.casemodule; * Wrapper to contain the modifiable details of a case, such as case display * name, case number, and examiner related fields. */ -final class CaseDetails { +public final class CaseDetails { private final String caseDisplayName; private final String caseNumber; @@ -31,7 +31,32 @@ final class CaseDetails { private final String examinerEmail; private final String caseNotes; - CaseDetails(String displayName, String number, String exName, String exPhone, String exEmail, String notes) { + /** + * Create a case details object with all optional fields set to default + * values. + * + * @param displayName the display name of the case + */ + public CaseDetails(String displayName) { + caseDisplayName = displayName; + caseNumber = ""; + examinerName = ""; + examinerPhone = ""; + examinerEmail = ""; + caseNotes = ""; + } + + /** + * Create a case details object with the specified values. + * + * @param displayName the display name of the case + * @param number the case number + * @param exName the examiner name + * @param exPhone the examiner phone number + * @param exEmail the examiner email address + * @param notes the case notes + */ + public CaseDetails(String displayName, String number, String exName, String exPhone, String exEmail, String notes) { caseDisplayName = displayName; caseNumber = number; examinerName = exName; @@ -41,27 +66,29 @@ final class CaseDetails { } /** - * Get the case display name - * @return caseDisplayName - the display name of the case + * Get the case display name + * + * @return caseDisplayName - the display name of the case */ - String getCaseDisplayName(){ + public String getCaseDisplayName() { return caseDisplayName; } - + /** - * Get the case number + * Get the case number + * * @return caseNumber - the optional number assiciated with the case */ - String getCaseNumber(){ + public String getCaseNumber() { return caseNumber; } - + /** * Get the examiner name * * @return name - the name associated with the examiner */ - String getExaminerName() { + public String getExaminerName() { return examinerName; } @@ -70,7 +97,7 @@ final class CaseDetails { * * @return phone - the phone number associated with the examiner */ - String getExaminerPhone() { + public String getExaminerPhone() { return examinerPhone; } @@ -79,7 +106,7 @@ final class CaseDetails { * * @return email - the email address associated with the examiner */ - String getExaminerEmail() { + public String getExaminerEmail() { return examinerEmail; } @@ -88,7 +115,7 @@ final class CaseDetails { * * @return notes - the note asssociated with the case */ - String getCaseNotes() { + public String getCaseNotes() { return caseNotes; } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java index 0ce3629a70..6e47363db5 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java @@ -81,14 +81,14 @@ public final class CaseMetadata { /* * Fields from schema version 3 */ - private static final String SCHEMA_VERSION_THREE = "3.0"; + private static final String SCHEMA_VERSION_THREE = "3.0"; private final static String CASE_DISPLAY_NAME_ELEMENT_NAME = "DisplayName"; //NON-NLS private final static String CASE_DB_NAME_RELATIVE_ELEMENT_NAME = "CaseDatabase"; //NON-NLS /* - * Fields from schema version 4 + * Fields from schema version 4 */ - private static final String SCHEMA_VERSION_FOUR = "4.0"; + private static final String SCHEMA_VERSION_FOUR = "4.0"; private final static String EXAMINER_ELEMENT_PHONE = "ExaminerPhone"; //NON-NLS private final static String EXAMINER_ELEMENT_EMAIL = "ExaminerEmail"; //NON-NLS private final static String CASE_ELEMENT_NOTES = "CaseNotes"; //NON-NLS @@ -132,7 +132,7 @@ public final class CaseMetadata { * @param caseNumber The case number. * @param examiner The name of the case examiner. */ - CaseMetadata(String caseDirectory, Case.CaseType caseType, String caseName, CaseDetails caseDetails) { + CaseMetadata(Case.CaseType caseType, String caseDirectory, String caseName, CaseDetails caseDetails) { metadataFilePath = Paths.get(caseDirectory, caseDetails.getCaseDisplayName() + FILE_EXTENSION); this.caseType = caseType; this.caseName = caseName; @@ -194,6 +194,15 @@ public final class CaseMetadata { return caseName; } + /** + * Get current values for the case details which are user modifiable. + * + * @return the case details + */ + public CaseDetails getCaseDetails() { + return caseDetails; + } + /** * Gets the case display name. * @@ -475,14 +484,14 @@ public final class CaseMetadata { String examinerPhone; String examinerEmail; String caseNotes; - try { - examinerPhone = getElementTextContent(caseElement, EXAMINER_ELEMENT_PHONE, false); - examinerEmail = getElementTextContent(caseElement, EXAMINER_ELEMENT_EMAIL, false); - caseNotes = getElementTextContent(caseElement, CASE_ELEMENT_NOTES, false); - } catch (CaseMetadataException ex) { + if (schemaVersion.equals(SCHEMA_VERSION_ONE) || schemaVersion.equals(SCHEMA_VERSION_TWO) || schemaVersion.equals(SCHEMA_VERSION_THREE)) { examinerPhone = ""; //case had metadata file written before additional examiner details were included examinerEmail = ""; caseNotes = ""; + } else { + examinerPhone = getElementTextContent(caseElement, EXAMINER_ELEMENT_PHONE, false); + examinerEmail = getElementTextContent(caseElement, EXAMINER_ELEMENT_EMAIL, false); + caseNotes = getElementTextContent(caseElement, CASE_ELEMENT_NOTES, false); } this.caseDetails = new CaseDetails(caseDisplayName, caseNumber, examinerName, examinerPhone, examinerEmail, caseNotes); this.caseType = Case.CaseType.fromString(getElementTextContent(caseElement, CASE_TYPE_ELEMENT_NAME, true)); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java index 467142daa2..2098fc91b3 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseVisualPanel2.java @@ -120,8 +120,8 @@ final class NewCaseVisualPanel2 extends javax.swing.JPanel { propertiesPanel.setCurrentlySelectedOrganization(organizationName); } - void refreshCentralRepoFields() { - propertiesPanel.setUpCentralRepoFields(); + void refreshCaseDetailsFields() { + propertiesPanel.setUpCaseDetailsFields(); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java index 15193ab2cf..7a4a1f7bf4 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardAction.java @@ -87,9 +87,8 @@ final class NewCaseWizardAction extends CallableSystemAction { final String caseName = (String) wizardDescriptor.getProperty("caseName"); //NON-NLS String createdDirectory = (String) wizardDescriptor.getProperty("createdDirectory"); //NON-NLS CaseType caseType = CaseType.values()[(int) wizardDescriptor.getProperty("caseType")]; //NON-NLS - Case.createAsCurrentCase(createdDirectory, new CaseDetails(caseName, caseNumber, examinerName, examinerPhone, examinerEmail, caseNotes), caseType); + Case.createAsCurrentCase(caseType, createdDirectory, new CaseDetails(caseName, caseNumber, examinerName, examinerPhone, examinerEmail, caseNotes)); if (EamDb.isEnabled()) { //if the eam is enabled we need to save the case organization information now - try { EamDb dbManager = EamDb.getInstance(); if (dbManager != null) { CorrelationCase cRCase = dbManager.getCaseByUUID(Case.getCurrentCase().getName()); @@ -105,10 +104,7 @@ final class NewCaseWizardAction extends CallableSystemAction { } } } - } catch (EamDbException ex) { - - } - } + } return null; } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java index 61aefc8f22..7752611202 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/NewCaseWizardPanel2.java @@ -57,7 +57,7 @@ class NewCaseWizardPanel2 implements WizardDescriptor.ValidatingPanel Date: Mon, 30 Oct 2017 19:51:12 -0400 Subject: [PATCH 43/46] 2774 fix refactor error with argument changes to casemetada --- .../sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java index 8529ea5261..46727fc570 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/SingleUserCaseConverter.java @@ -199,8 +199,8 @@ public class SingleUserCaseConverter { copyImages(icd); // Create new .aut file - CaseMetadata newCaseMetadata = new CaseMetadata(icd.getCaseOutputFolder().toString(), - CaseType.MULTI_USER_CASE, + CaseMetadata newCaseMetadata = new CaseMetadata(CaseType.MULTI_USER_CASE, + icd.getCaseOutputFolder().toString(), icd.getNewCaseName(), new CaseDetails(icd.getNewCaseName(), oldCaseMetadata.getCaseNumber(), From be88c9d5a4ad60ba9f35499dd37317b96115aa07 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 30 Oct 2017 19:57:10 -0400 Subject: [PATCH 44/46] 2774 disabling editing of case notes in case properties panel --- .../org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form | 2 ++ .../org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form index 9d9c3caa11..ab036f2e87 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.form @@ -489,6 +489,7 @@ + @@ -502,6 +503,7 @@ + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java index 4dd71cd473..23e9d0b1c8 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CasePropertiesPanel.java @@ -315,6 +315,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { caseNotesScrollPane.setBorder(null); + taNotesText.setEditable(false); taNotesText.setBackground(new java.awt.Color(240, 240, 240)); taNotesText.setColumns(20); taNotesText.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N @@ -322,6 +323,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel { taNotesText.setRows(2); taNotesText.setWrapStyleWord(true); taNotesText.setBorder(null); + taNotesText.setFocusable(false); caseNotesScrollPane.setViewportView(taNotesText); lbExaminerEmailLabel.setText(org.openide.util.NbBundle.getMessage(CasePropertiesPanel.class, "CasePropertiesPanel.lbExaminerEmailLabel.text")); // NOI18N From f3f28cd4f9989f6ba28128dc25cc37e07d2942ca Mon Sep 17 00:00:00 2001 From: "U-BASIS\\zhaohui" Date: Tue, 31 Oct 2017 10:55:25 -0400 Subject: [PATCH 45/46] 3176: The first Autopsy Core unit test skeleton --- Core/nbproject/project.xml | 11 +++- .../autopsy/ingest/IntestFileFiltersTest.java | 51 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100755 Core/test/unit/src/org/sleuthkit/autopsy/ingest/IntestFileFiltersTest.java diff --git a/Core/nbproject/project.xml b/Core/nbproject/project.xml index 0fa567cf00..25e17dd3eb 100755 --- a/Core/nbproject/project.xml +++ b/Core/nbproject/project.xml @@ -237,6 +237,15 @@ + + + unit + + org.netbeans.libs.junit4 + + + + net.sf.sevenzipjbinding net.sf.sevenzipjbinding.impl @@ -366,7 +375,7 @@ ext/commons-dbcp2-2.1.1.jar release\modules\ext\commons-dbcp2-2.1.1.jar - + ext/commons-pool2-2.4.2.jar release\modules\ext\commons-pool2-2.4.2.jar diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/ingest/IntestFileFiltersTest.java b/Core/test/unit/src/org/sleuthkit/autopsy/ingest/IntestFileFiltersTest.java new file mode 100755 index 0000000000..b952462de8 --- /dev/null +++ b/Core/test/unit/src/org/sleuthkit/autopsy/ingest/IntestFileFiltersTest.java @@ -0,0 +1,51 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */package org.sleuthkit.autopsy.ingest; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class IntestFileFiltersTest { + + public IntestFileFiltersTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Test + public void testFilters() { + System.out.println("Test filter"); + } +} From 59df3725072497ed149410895333eb4f31e73816 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Tue, 31 Oct 2017 17:23:21 -0400 Subject: [PATCH 46/46] Add unit test utilities to Autopsy-Core NBM --- .../testutils/UnitTestDspCallback.java | 109 ++++++++++++++++++ .../testutils/UnitTestDspProgressMonitor.java | 62 ++++++++++ 2 files changed, 171 insertions(+) create mode 100755 Core/test/unit/src/org/sleuthkit/autopsy/testutils/UnitTestDspCallback.java create mode 100755 Core/test/unit/src/org/sleuthkit/autopsy/testutils/UnitTestDspProgressMonitor.java diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/testutils/UnitTestDspCallback.java b/Core/test/unit/src/org/sleuthkit/autopsy/testutils/UnitTestDspCallback.java new file mode 100755 index 0000000000..c6adb1f24c --- /dev/null +++ b/Core/test/unit/src/org/sleuthkit/autopsy/testutils/UnitTestDspCallback.java @@ -0,0 +1,109 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.testutils; + +import java.util.ArrayList; +import java.util.List; +import javax.annotation.concurrent.Immutable; +import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback; +import org.sleuthkit.datamodel.Content; + +/** + * A data source processor "callback" for unit testing that collects the results + * of running a data source processor on a data source and unblocks the job + * processing thread when the data source processor finishes running in its own + * thread. + */ +@Immutable +public class UnitTestDspCallback extends DataSourceProcessorCallback { + + private final Object monitor; + private final List errorMessages = new ArrayList<>(); + private final List dataSourceContent = new ArrayList<>(); + + /** + * Constructs a data source processor "callback" for unit testing that + * collects the results of running a data source processor on a data source + * and unblocks the job processing thread when the data source processor + * finishes running in its own thread. + * + * @param monitor A monitor for the callback to signal when the data source + * processor completes its processing. + */ + UnitTestDspCallback(Object monitor) { + this.monitor = monitor; + } + + /** + * Called by the data source processor when it finishes running in its own + * thread. + * + * @param result The result code for the processing of the data + * source. + * @param errorMessages Any error messages generated during the + * processing of the data source. + * @param dataSourceContent The content produced by processing the data + * source. + */ + @Override + public void done(DataSourceProcessorCallback.DataSourceProcessorResult result, List errorMessages, List dataSourceContent) { + this.errorMessages.addAll(errorMessages); + this.dataSourceContent.addAll(dataSourceContent); + synchronized (monitor) { + monitor.notify(); + } + } + + /** + * Called by the data source processor when it finishes running in its own + * thread, if that thread is the AWT (Abstract Window Toolkit) event + * dispatch thread (EDT). + * + * @param result The result code for the processing of the data + * source. + * @param errorMessages Any error messages generated during the + * processing of the data source. + * @param dataSourceContent The content produced by processing the data + * source. + */ + @Override + public void doneEDT(DataSourceProcessorCallback.DataSourceProcessorResult result, List errorMessages, List dataSourceContent) { + done(result, errorMessages, dataSourceContent); + } + + /** + * Gets any error messages emitted by the data source processor. + * + * @return A list of error messages, possibly empty. + */ + public List getDspErrorMessages() { + return new ArrayList<>(this.errorMessages); + } + + /** + * Gets any data source content objects produced by the data source + * processor. + * + * @return A list of content objects, possibly empty. + */ + public List getDataSourceContent() { + return new ArrayList<>(this.dataSourceContent); + } + +} diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/testutils/UnitTestDspProgressMonitor.java b/Core/test/unit/src/org/sleuthkit/autopsy/testutils/UnitTestDspProgressMonitor.java new file mode 100755 index 0000000000..1f856e6500 --- /dev/null +++ b/Core/test/unit/src/org/sleuthkit/autopsy/testutils/UnitTestDspProgressMonitor.java @@ -0,0 +1,62 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2017 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.testutils; + +import javax.annotation.concurrent.Immutable; +import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor; + +/** + * A data source processor progress monitor for unit testing. + */ +@Immutable +public class UnitTestDspProgressMonitor implements DataSourceProcessorProgressMonitor { + + /** + * Switches the progress indicator to indeterminate mode (the total number + * of work units to be completed is unknown) or determinate mode (the total + * number of work units to be completed is unknown). + * + * @param indeterminate True for indeterminate mode, false for determinate + * mode. + */ + @Override + public void setIndeterminate(final boolean indeterminate) { + } + + /** + * Updates the progress indicator with the number of work units completed so + * far when in determinate mode (the total number of work units to be + * completed is known). + * + * @param workUnitsCompleted Number of work units completed so far. + */ + @Override + public void setProgress(final int workUnitsCompleted) { + } + + /** + * Updates the progress indicator with a progress message. + * + * @param message The progress message. + */ + @Override + public void setProgressText(final String message) { + } + +}