/**
  * (Re)generate the target {@linkplain Properties properties} file.
  *
  * @throws IOException If an exceptional situation arises while reading properties.
  */
 public void generate() throws IOException {
   // Force correct initialization order... sigh.
   AvailRuntime.nextHash();
   final File fileName =
       new File(
           String.format(
               "src/%s_%s.properties", baseName.replace('.', '/'), locale.getLanguage()));
   System.out.println(fileName.getAbsolutePath());
   final String[] components = baseName.split("\\.");
   final File tempFileName =
       new File(
           String.format(
               "%s/%s_%s.propertiesTEMP",
               System.getProperty("java.io.tmpdir"),
               components[components.length - 1],
               locale.getLanguage()));
   assert fileName.getPath().endsWith(".properties");
   final Properties properties = new Properties();
   try (final FileInputStream inputStream = new FileInputStream(fileName)) {
     try (final InputStreamReader reader =
         new InputStreamReader(inputStream, StandardCharsets.UTF_8)) {
       properties.load(reader);
     }
   } catch (final FileNotFoundException e) {
     // Ignore. It's okay if the file doesn't already exist.
   }
   final PrintWriter writer = new PrintWriter(tempFileName, "UTF-8");
   generatePreamble(writer);
   generateProperties(properties, writer);
   writer.close();
   // Now switch the new file in.  In the rare event of failure between
   // these steps, the complete content will still be available in the
   // corresponding *.propertiesTEMP file.
   boolean worked = fileName.delete();
   if (!worked) {
     System.err.println(
         String.format("deleting the original properties file failed: %s", fileName));
   }
   worked = tempFileName.renameTo(fileName);
   if (!worked) {
     throw new RuntimeException(
         String.format(
             "moving the temporary properties file failed: %s -> %s", tempFileName, fileName));
   }
 }
 /**
  * Generate the preamble for the properties file. This includes the copyright and machine
  * generation warnings.
  *
  * @param writer The {@linkplain PrintWriter output stream}.
  */
 protected void generatePreamble(final PrintWriter writer) {
   writer.println(
       MessageFormat.format(
           preambleBundle.getString(propertiesCopyright.name()),
           localName(baseName) + "_" + locale.getLanguage(),
           new Date()));
   writer.println(
       MessageFormat.format(
           preambleBundle.getString(generatedPropertiesNotice.name()),
           getClass().getName(),
           new Date()));
 }