/**
   * Creates the static widgets for the current submitted data.
   *
   * <p>
   *
   * @throws Exception if something goes wrong
   */
  private void addStaticWidgets() throws Exception {

    // add the id widget
    CmsFormDataEditBean edit = new CmsFormDataEditBean(m_formData.getFormId(), null);
    addWidget(
        new CmsWidgetDialogParameter(
            edit,
            "value",
            key(Messages.GUI_COLUMN_FIELDS_ID_0),
            "",
            PAGES[0],
            new CmsDisplayWidget(),
            1,
            1));

    // add the created date widget
    edit =
        new CmsFormDataEditBean(
            Messages.get().getBundle().getDateTime(m_formData.getDateCreated()), null);
    addWidget(
        new CmsWidgetDialogParameter(
            edit,
            "value",
            key(Messages.GUI_COLUMN_FIELDS_DATE_0),
            "",
            PAGES[0],
            new CmsDisplayWidget(),
            1,
            1));

    // add the resource widget
    String path;
    try {
      path = getCms().readResource(m_formData.getResourceId()).getRootPath();
    } catch (Exception e) {
      path = m_formData.getResourceId().toString();
    }
    edit = new CmsFormDataEditBean(path, null);
    addWidget(
        new CmsWidgetDialogParameter(
            edit,
            "value",
            key(Messages.GUI_COLUMN_FIELDS_RESOURCE_0),
            "",
            PAGES[0],
            new CmsDisplayWidget(),
            1,
            1));
  }
  /**
   * Creates the dynamic widgets for the current submitted data for each field.
   *
   * <p>
   *
   * @throws Exception if something goes wrong
   */
  private void addDynamicWidgets() throws Exception {

    if (m_fields == null) {
      m_fields = new HashMap<String, CmsFormDataEditBean>();
    }

    // get the list of all fields
    List<String> columnNames =
        CmsFormDataAccess.getInstance().readFormFieldNames(m_paramFormid, 0, Long.MAX_VALUE);

    // determine if the columns can be edited by the current user
    boolean editable;
    try {
      CmsResource formFile = getCms().readResource(m_formData.getResourceId());
      editable =
          OpenCms.getRoleManager().hasRole(getCms(), CmsRole.DATABASE_MANAGER)
              || getCms()
                  .hasPermissions(
                      formFile, CmsPermissionSet.ACCESS_WRITE, false, CmsResourceFilter.ALL);
    } catch (CmsException e) {
      // error reading form resource, only check roles of current user
      editable = OpenCms.getRoleManager().hasRole(getCms(), CmsRole.DATABASE_MANAGER);
    }

    String uploadFolder =
        OpenCms.getModuleManager()
            .getModule(CmsForm.MODULE_NAME)
            .getParameter(CmsForm.MODULE_PARAM_UPLOADFOLDER, WEBFORM_UPLOADFOLDER_NONE);

    // for each column create a widget
    String column;
    String value;
    CmsFormDataEditBean edit;
    for (int i = 0; i < columnNames.size(); i++) {

      // get the entry and fill the columns
      column = columnNames.get(i);
      value = m_formData.getFieldValue(column);
      if (CmsStringUtil.isEmpty(value)) {
        value = "";
      }
      edit = createEditEntry(value, uploadFolder, editable);
      addWidget(
          new CmsWidgetDialogParameter(
              edit, "value", column, "", PAGES[0], edit.getWidget(), 0, 1));
      m_fields.put(column, edit);
    }
  }
  /** @see org.opencms.workplace.CmsWidgetDialog#actionCommit() */
  @Override
  public void actionCommit() {

    List<Exception> errors = new ArrayList<Exception>();
    try {
      // get the list of all fields
      List<String> columnNames =
          CmsFormDataAccess.getInstance().readFormFieldNames(m_paramFormid, 0, Long.MAX_VALUE);

      // for each field look if the value has changed and update the database
      String column = null;
      CmsFormDataEditBean data;
      String value = null;
      String orgValue;
      for (int i = 0; i < columnNames.size(); i++) {
        try {
          // get for the field the old and new value
          column = columnNames.get(i);
          data = m_fields.get(column);
          orgValue = m_formData.getFieldValue(column);
          value = data.getValue();
          if (LOG.isDebugEnabled()) {
            LOG.debug(
                Messages.get()
                    .getBundle()
                    .key(
                        Messages.LOG_COMPARE_FORM_FIELDS_4,
                        new String[] {column, value, orgValue, m_paramEntryid}));
          }

          // compares the old and new value and update the database if not identical
          if (!compareValues(orgValue, value)
              || ((value != null) && (value.trim().length() == 0))) {
            CmsFormDataAccess.getInstance()
                .updateFieldValue(Integer.parseInt(m_paramEntryid), column, value);
            if (LOG.isDebugEnabled()) {
              LOG.debug(
                  Messages.get()
                      .getBundle()
                      .key(Messages.LOG_WRITE_FORM_FIELDS_3, column, value, m_paramEntryid));
            }
          }
        } catch (Exception e) {
          if (LOG.isErrorEnabled()) {
            LOG.error(
                Messages.get()
                    .getBundle()
                    .key(Messages.ERR_WRITE_FORM_FIELDS_3, column, value, m_paramEntryid));
          }
          errors.add(
              new CmsException(
                  Messages.get()
                      .container(Messages.ERR_WRITE_FORM_FIELDS_3, column, value, m_paramEntryid)));
        }
      }
    } catch (Exception ex) {
      errors.add(ex);
    }
    // set the list of errors to display when saving failed
    setCommitErrors(errors);
  }