19 package org.sleuthkit.autopsy.casemodule;
 
   22 import java.util.HashSet;
 
   23 import java.util.Iterator;
 
   25 import java.util.logging.Level;
 
   26 import javax.swing.event.ChangeEvent;
 
   27 import javax.swing.event.ChangeListener;
 
   28 import org.openide.DialogDescriptor;
 
   29 import org.openide.DialogDisplayer;
 
   30 import org.openide.NotifyDescriptor;
 
   31 import org.openide.WizardDescriptor;
 
   32 import org.openide.WizardValidationException;
 
   33 import org.openide.util.HelpCtx;
 
   34 import org.openide.util.NbBundle;
 
   45 class NewCaseWizardPanel1 
implements WizardDescriptor.ValidatingPanel<WizardDescriptor> {
 
   51     private NewCaseVisualPanel1 component;
 
   52     private Boolean isFinish = 
false;
 
   53     private static String createdDirectory;
 
   54     private static final String PROP_BASECASE = 
"LBL_BaseCase_PATH"; 
 
   55     private static final Logger logger = Logger.getLogger(NewCaseWizardPanel1.class.getName());
 
   66     public NewCaseVisualPanel1 getComponent() {
 
   67         if (component == null) {
 
   68             component = 
new NewCaseVisualPanel1(
this);
 
   80     public HelpCtx getHelp() {
 
   82         return HelpCtx.DEFAULT_HELP;
 
   95     public boolean isValid() {
 
  104     private final Set<ChangeListener> listeners = 
new HashSet<>(1); 
 
  112     public final void addChangeListener(ChangeListener l) {
 
  113         synchronized (listeners) {
 
  124     public final void removeChangeListener(ChangeListener l) {
 
  125         synchronized (listeners) {
 
  134     protected final void fireChangeEvent() {
 
  135         Iterator<ChangeListener> it;
 
  136         synchronized (listeners) {
 
  137             it = 
new HashSet<>(listeners).iterator();
 
  139         ChangeEvent ev = 
new ChangeEvent(
this);
 
  140         while (it.hasNext()) {
 
  141             it.next().stateChanged(ev);
 
  151     public void setIsFinish(Boolean isFinish) {
 
  152         this.isFinish = isFinish;
 
  169     public void readSettings(WizardDescriptor settings) {
 
  170         NewCaseVisualPanel1 panel = getComponent();
 
  172             String lastBaseDirectory = ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, PROP_BASECASE);
 
  173             panel.setCaseParentDir(lastBaseDirectory);
 
  174             panel.readSettings();
 
  175             createdDirectory = (String) settings.getProperty(
"createdDirectory"); 
 
  176             if (createdDirectory != null && !createdDirectory.isEmpty()) {
 
  177                 logger.log(Level.INFO, 
"Deleting a case dir in readSettings(): {0}", createdDirectory); 
 
  178                 FileUtil.deleteDir(
new File(createdDirectory));
 
  180         } 
catch (Exception e) {
 
  181             logger.log(Level.WARNING, 
"Could not read wizard settings in NewCaseWizardPanel1, ", e); 
 
  195     public void storeSettings(WizardDescriptor settings) {
 
  196         CaseType caseType = getComponent().getCaseType();
 
  197         settings.putProperty(
"caseName", getComponent().getCaseName()); 
 
  198         settings.putProperty(
"caseParentDir", getComponent().getCaseParentDir()); 
 
  199         settings.putProperty(
"createdDirectory", createdDirectory); 
 
  200         settings.putProperty(
"caseType", caseType.ordinal()); 
 
  201         ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, ModuleSettings.CURRENT_CASE_TYPE, caseType.toString());
 
  202         ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, PROP_BASECASE, getComponent().getCaseParentDir());
 
  206     public void validate() throws WizardValidationException {
 
  212         String caseName = getComponent().getCaseName();
 
  213         if (!Case.isValidName(caseName)) {
 
  214             String errorMsg = NbBundle
 
  215                     .getMessage(this.getClass(), 
"NewCaseWizardPanel1.validate.errMsg.invalidSymbols");
 
  216             validationError(errorMsg);
 
  219             String caseParentDir = getComponent().getCaseParentDir();
 
  220             String caseDirPath = caseParentDir + caseName;
 
  223             if (
new File(caseDirPath).exists()) {
 
  225                 String errorMsg = NbBundle
 
  226                         .getMessage(this.getClass(), 
"NewCaseWizardPanel1.validate.errMsg.dirExists", caseDirPath);
 
  227                 validationError(errorMsg);
 
  230                 File baseDir = 
new File(caseParentDir);
 
  231                 if (baseDir.isAbsolute()) {
 
  233                     if (!baseDir.exists()) {
 
  235                         String confMsg = NbBundle
 
  236                                 .getMessage(this.getClass(), 
"NewCaseWizardPanel1.validate.confMsg.createDir.msg",
 
  238                         NotifyDescriptor d2 = 
new NotifyDescriptor.Confirmation(confMsg,
 
  239                                 NbBundle.getMessage(
this.getClass(),
 
  240                                         "NewCaseWizardPanel1.validate.confMsg.createDir.title"),
 
  241                                 NotifyDescriptor.YES_NO_OPTION, NotifyDescriptor.WARNING_MESSAGE);
 
  242                         d2.setValue(NotifyDescriptor.NO_OPTION);
 
  244                         Object res2 = DialogDisplayer.getDefault().notify(d2);
 
  245                         if (res2 != null && res2 == DialogDescriptor.YES_OPTION) {
 
  248                                 createDirectory(caseDirPath, getComponent().getCaseType());
 
  249                             } 
catch (WizardValidationException ex) {
 
  250                                 String errorMsg = NbBundle.getMessage(this.getClass(),
 
  251                                         "NewCaseWizardPanel1.validate.errMsg.cantCreateParDir.msg",
 
  253                                 logger.log(Level.WARNING, errorMsg, ex);
 
  254                                 validationError(errorMsg);
 
  257                         if (res2 != null && res2 == DialogDescriptor.NO_OPTION) {
 
  259                             validationError(NbBundle.getMessage(
this.getClass(),
 
  260                                     "NewCaseWizardPanel1.validate.errMsg.prevCreateBaseDir.msg",
 
  265                             createDirectory(caseDirPath, getComponent().getCaseType());
 
  266                         } 
catch (WizardValidationException ex) {
 
  267                             String errorMsg = NbBundle
 
  268                                     .getMessage(this.getClass(), 
"NewCaseWizardPanel1.validate.errMsg.cantCreateDir");
 
  269                             logger.log(Level.WARNING, errorMsg, ex);
 
  270                             validationError(errorMsg);
 
  275                     String errorMsg = NbBundle
 
  276                             .getMessage(this.getClass(), 
"NewCaseWizardPanel1.validate.errMsg.invalidBaseDir.msg");
 
  277                     validationError(errorMsg);
 
  283     private void validationError(String errorMsg) 
throws WizardValidationException {
 
  284         throw new WizardValidationException(this.getComponent(), errorMsg, null);
 
  290     private void createDirectory(
final String caseDirPath, CaseType caseType) 
throws WizardValidationException {
 
  292         boolean success = 
false;
 
  294             Case.createCaseDirectory(caseDirPath, caseType);
 
  296         } 
catch (CaseActionException ex) {
 
  297             logger.log(Level.SEVERE, 
"Could not createDirectory for the case, ", ex); 
 
  304             if (
new File(caseDirPath).exists()) {
 
  305                 FileUtil.deleteDir(
new File(caseDirPath));
 
  308             String errorMsg = NbBundle.getMessage(this.getClass(),
 
  309                     "NewCaseWizardPanel1.createDir.errMsg.cantCreateDir.msg");
 
  311             validationError(errorMsg);
 
  315             createdDirectory = caseDirPath;
 
  318                 StartupWindowProvider.getInstance().close();
 
  319             } 
catch (Exception ex) {
 
  320                 logger.log(Level.WARNING, 
"Startup window didn't close as expected.", ex);