/**
   * Save the configuration to the specified file. The file is created automatically if it doesn't
   * exist. This doesn't change the source of the configuration, use {@link #setFile} if you need
   * it.
   *
   * @param file the target file
   * @throws ConfigurationException if an error occurs during the save operation
   */
  public void save(File file) throws ConfigurationException {
    OutputStream out = null;

    try {
      // create the file if necessary
      createPath(file);
      out = new FileOutputStream(file);
      save(out);
    } catch (IOException e) {
      throw new ConfigurationException("Unable to save the configuration to the file " + file, e);
    } finally {
      closeSilent(out);
    }
  }
  /**
   * Save the configuration to the specified URL. This doesn't change the source of the
   * configuration, use setURL() if you need it.
   *
   * @param url the URL
   * @throws ConfigurationException if an error occurs during the save operation
   */
  public void save(URL url) throws ConfigurationException {
    // file URLs have to be converted to Files since FileURLConnection is
    // read only (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4191800)
    File file = ConfigurationUtils.fileFromURL(url);
    if (file != null) {
      save(file);
    } else {
      // for non file URLs save through an URLConnection
      OutputStream out = null;
      try {
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);

        // use the PUT method for http URLs
        if (connection instanceof HttpURLConnection) {
          HttpURLConnection conn = (HttpURLConnection) connection;
          conn.setRequestMethod("PUT");
        }

        out = connection.getOutputStream();
        save(out);

        // check the response code for http URLs and throw an exception if an error occured
        if (connection instanceof HttpURLConnection) {
          HttpURLConnection conn = (HttpURLConnection) connection;
          if (conn.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) {
            throw new IOException(
                "HTTP Error " + conn.getResponseCode() + " " + conn.getResponseMessage());
          }
        }
      } catch (IOException e) {
        throw new ConfigurationException("Could not save to URL " + url, e);
      } finally {
        closeSilent(out);
      }
    }
  }