public void updateAttributeFields(
      FormContainer formContainer, FormElement formElement, Attribute att) {
    FormElement fieldForAttribute = null;
    if (formContainer instanceof FormSearch) {
      fieldForAttribute = SearchInitialization.getSearchFieldForAttribute(att);
    } else if (formContainer instanceof FormClass || formContainer instanceof FormWorkflow) {
      fieldForAttribute = ClassDiagramUtils.getFieldForAttribute(att);
    }

    if (!fieldForAttribute.getClass().isInstance(formElement)) {
      // mismatch so we replace the Field
      FormGroup eContainer = (FormGroup) formElement.eContainer();
      boolean contains = eContainer.getChildren().contains(formElement);

      if (headless) {
        EList<FormElement> children = null;
        if (contains) {
          children = eContainer.getChildren();
        } else {
          children = eContainer.getDisabled();
        }
        // add the new Field
        children.add(fieldForAttribute);
        // remove
        children.remove(formElement);
      } else {
        if (contains) {
          cc.append(
              AddCommand.create(
                  domain,
                  eContainer,
                  FormPackage.eINSTANCE.getFormGroup_Children(),
                  fieldForAttribute));
        } else {
          cc.append(
              AddCommand.create(
                  domain,
                  eContainer,
                  FormPackage.eINSTANCE.getFormGroup_Disabled(),
                  fieldForAttribute));
        }
        Command rmCmd = RemoveCommand.create(domain, formElement);
        cc.append(rmCmd);
      }
    }
  }
  protected void synchronizeMissingAttributes(
      FormContainer o,
      List<FormElement> children,
      AbstractClass real_class,
      Set<FormGroup> groups,
      String filterNS) {

    List<Attribute> allAttributes = real_class.getAllAttributes();

    // get FormElement that miss
    ArrayList<Attribute> missAtt = new ArrayList<Attribute>();

    if (allAttributes != null) {
      missAtt.addAll(allAttributes);
    }

    for (FormElement formElement : children) {
      ModelElement ref = formElement.getRef();
      if (ref != null && ref instanceof Attribute) {
        // linked element is attribute so remove this attribute from the missing list
        missAtt.remove(ref);
      }
    }

    EList<FormGroup> allSubGroups = o.getAllSubGroups();
    groups.addAll(allSubGroups);

    // now we have the attribute missing list
    // initialize missing Field
    for (Attribute attribute : missAtt) {
      // Field or searchField
      FormElement fieldForAttribute = null;
      if (o instanceof FormSearch) {
        fieldForAttribute = SearchInitialization.getSearchFieldForAttribute(attribute);
      } else if (o instanceof FormClass || o instanceof FormWorkflow) {
        fieldForAttribute = ClassDiagramUtils.getFieldForAttribute(attribute);
      } else {
        System.out.println("SynchronizeWithClass.synchronizeMissingAttributes() o :" + o);
      }
      if (WorkflowInitialization.filterFormElement(filterNS, fieldForAttribute)) {

        // get where to add the field
        FormGroup parent = null;
        // mybe a group exist with ref to the attribute container
        AbstractClass eContainer = (AbstractClass) attribute.eContainer();
        // search for matching group

        for (FormGroup formGroup : groups) {
          ModelElement ref = formGroup.getRef();
          if (ref != null && ref.equals(eContainer)) {
            // matching group founded
            parent = formGroup;
            break;
          }
        }
        if (createMissingGroup && parent == null) {
          parent = ClassInitialization.createGroup(eContainer);
          groups.add(parent);
          addChild(o, parent);
        }
        if (parent == null) {
          parent = o;
        }

        // add new Field to the parent
        addChild(parent, fieldForAttribute);
      }
    }
  }