ExperimentDocumentFileChooser.java

package org.hammer;

import java.awt.Component;
import java.io.File;
import java.nio.file.Path;
import java.util.Locale;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.hammer.audio.experiment.document.ExperimentDocumentFormat;

/** Shared, extension-safe file chooser operations for portable experiment documents. */
final class ExperimentDocumentFileChooser {

  private ExperimentDocumentFileChooser() {
    // utility class
  }

  /** Select one existing experiment document, or return {@code null} when cancelled. */
  static Path chooseOpen(Component owner) {
    JFileChooser chooser = configuredChooser("Inspect portable experiment document");
    return chooser.showOpenDialog(owner) == JFileChooser.APPROVE_OPTION
        ? chooser.getSelectedFile().toPath()
        : null;
  }

  /** Select a distinct normalized-copy destination, or return {@code null} when cancelled. */
  static Path chooseSave(Component owner) {
    JFileChooser chooser = configuredChooser("Save normalized experiment document");
    chooser.setSelectedFile(new File("normalized." + ExperimentDocumentFormat.FILE_EXTENSION));
    return chooser.showSaveDialog(owner) == JFileChooser.APPROVE_OPTION
        ? ensureExtension(chooser.getSelectedFile()).toPath()
        : null;
  }

  private static JFileChooser configuredChooser(String title) {
    JFileChooser chooser = new JFileChooser();
    chooser.setDialogTitle(title);
    chooser.setFileFilter(
        new FileNameExtensionFilter(
            "Audio Analyzer experiment (*." + ExperimentDocumentFormat.FILE_EXTENSION + ")",
            ExperimentDocumentFormat.FILE_EXTENSION));
    return chooser;
  }

  private static File ensureExtension(File file) {
    String extension = "." + ExperimentDocumentFormat.FILE_EXTENSION;
    return file.getName().toLowerCase(Locale.ROOT).endsWith(extension)
        ? file
        : new File(file.getParentFile(), file.getName() + extension);
  }
}