Program: 117974
Project: 117974
Buggy source:
/** 
 * DOC ycbai Comment method "loadParametersFromForm". <p> Get element parameters of <code>element</code> from <code>form</code>.
 * @param node optional, used if there is a component setting up the properties
 * @param element
 * @param category
 * @param form
 * @return parameters list
 */
private static List<ElementParameter> getParametersFromForm(IElement element,boolean isInitializing,EComponentCategory category,ComponentProperties rootProperty,Properties compProperties,String parentPropertiesPath,Form form,Widget parentWidget,AtomicInteger lastRowNum){
  List<ElementParameter> elementParameters=new ArrayList<>();
  List<String> parameterNames=new ArrayList<>();
  EComponentCategory compCategory=category;
  if (compCategory == null) {
    compCategory=EComponentCategory.BASIC;
  }
  AtomicInteger lastRN=lastRowNum;
  if (lastRN == null) {
    lastRN=new AtomicInteger();
  }
  if (form == null) {
    return elementParameters;
  }
  Properties componentProperties=compProperties;
  if (componentProperties == null) {
    componentProperties=form.getProperties();
  }
  if (element instanceof INode) {
    INode node=(INode)element;
    if (node.getComponentProperties() == null) {
      node.setComponentProperties(rootProperty);
    }
  }
  Collection<Widget> formWidgets=form.getWidgets();
  for (  Widget widget : formWidgets) {
    NamedThing widgetProperty=widget.getContent();
    String propertiesPath=getPropertiesPath(parentPropertiesPath,null);
    if (widgetProperty instanceof Form) {
      Form subForm=(Form)widgetProperty;
      Properties subProperties=subForm.getProperties();
      if (!isSameComponentProperties(componentProperties,widgetProperty)) {
        propertiesPath=getPropertiesPath(parentPropertiesPath,subProperties.getName());
      }
      elementParameters.addAll(getParametersFromForm(element,isInitializing,compCategory,rootProperty,subProperties,propertiesPath,subForm,widget,lastRN));
      continue;
    }
    GenericElementParameter param=new GenericElementParameter(element,rootProperty,form,widget,getComponentService());
    String parameterName=propertiesPath.concat(param.getName());
    param.setName(parameterName);
    param.setCategory(compCategory);
    param.setShow(parentWidget == null ? !widget.isHidden() : !parentWidget.isHidden() && !widget.isHidden());
    int rowNum=0;
    if (widget.getOrder() != 1) {
      rowNum=lastRN.get();
    }
 else {
      rowNum=widget.getRow();
      if (parentWidget != null) {
        rowNum+=parentWidget.getRow();
      }
      rowNum=rowNum + lastRN.get();
    }
    param.setNumRow(rowNum);
    lastRN.set(rowNum);
    EParameterFieldType fieldType=getFieldType(widget,widgetProperty);
    param.setFieldType(fieldType != null ? fieldType : EParameterFieldType.TEXT);
    if (widgetProperty instanceof SchemaProperty) {
      boolean found=false;
      param.setContext(EConnectionType.FLOW_MAIN.getName());
      for (      Connector connector : rootProperty.getPossibleConnectors(true)) {
        if (!(((SchemaProperty)widgetProperty).getValue() instanceof Schema)) {
          continue;
        }
        if (connector instanceof PropertyPathConnector) {
          String linkedSchema=((PropertyPathConnector)connector).getPropertyPath() + "String_Node_Str";
          if (parameterName.equals(linkedSchema)) {
            found=true;
            param.setContext(connector.getName());
            IElementParameterDefaultValue defaultValue=new ElementParameterDefaultValue();
            Schema schema=((SchemaProperty)widgetProperty).getValue();
            defaultValue.setDefaultValue(new Schema.Parser().parse(schema.toString()));
            param.getDefaultValues().add(defaultValue);
          }
        }
      }
      if (!found) {
        for (        Connector connector : rootProperty.getPossibleConnectors(false)) {
          if (!(((SchemaProperty)widgetProperty).getValue() instanceof Schema)) {
            continue;
          }
          if (connector instanceof PropertyPathConnector) {
            String linkedSchema=((PropertyPathConnector)connector).getPropertyPath() + "String_Node_Str";
            if (parameterName.equals(linkedSchema)) {
              if (GenericNodeConnector.INPUT_CONNECTOR.equals(connector.getName())) {
                param.setContext(EConnectionType.FLOW_MAIN.getName());
              }
 else {
                param.setContext(connector.getName());
              }
              IElementParameterDefaultValue defaultValue=new ElementParameterDefaultValue();
              Schema schema=((SchemaProperty)widgetProperty).getValue();
              defaultValue.setDefaultValue(new Schema.Parser().parse(schema.toString()));
              param.getDefaultValues().add(defaultValue);
            }
          }
        }
      }
    }
    if (widgetProperty instanceof PresentationItem) {
      param.setValue(widgetProperty.getDisplayName());
    }
 else     if (widgetProperty instanceof Property) {
      Property property=(Property)widgetProperty;
      param.setRequired(property.isRequired());
      param.setValue(getParameterValue(element,property,fieldType,isInitializing));
      boolean isNameProperty=IGenericConstants.NAME_PROPERTY.equals(param.getParameterName());
      if (EParameterFieldType.NAME_SELECTION_AREA.equals(fieldType) || EParameterFieldType.JSON_TABLE.equals(fieldType) || EParameterFieldType.CLOSED_LIST.equals(fieldType)|| EParameterFieldType.CHECK.equals(fieldType)|| isNameProperty) {
        param.setSupportContext(false);
      }
 else {
        param.setSupportContext(isSupportContext(property));
      }
      property.setTaggedValue(IComponentConstants.SUPPORT_CONTEXT,param.isSupportContext());
      Object cmTV=property.getTaggedValue(IGenericConstants.IS_CONTEXT_MODE);
      param.setReadOnly(Boolean.valueOf(String.valueOf(cmTV)));
      boolean isDynamic=Boolean.valueOf(String.valueOf(property.getTaggedValue(IGenericConstants.IS_DYNAMIC)));
      param.setContextMode(isDynamic);
      List<?> values=property.getPossibleValues();
      if (values != null || EParameterFieldType.CLOSED_LIST.equals(fieldType)) {
        if (values == null) {
          values=Collections.emptyList();
        }
        param.setPossibleValues(values);
        List<String> possVals=new ArrayList<>();
        List<String> possValsDisplay=new ArrayList<>();
        for (        Object obj : values) {
          String value=null;
          String valueDisplay=null;
          if (obj instanceof NamedThing) {
            NamedThing nal=(NamedThing)obj;
            value=nal.getName();
            valueDisplay=nal.getDisplayName();
          }
 else {
            value=String.valueOf(obj);
            valueDisplay=String.valueOf(obj);
          }
          String pvDisplayName=property.getPossibleValuesDisplayName(obj);
          if (StringUtils.isNotBlank(pvDisplayName) && !"String_Node_Str".equals(pvDisplayName)) {
            valueDisplay=pvDisplayName;
          }
          possVals.add(value);
          possValsDisplay.add(valueDisplay);
        }
        param.setListItemsDisplayName(possValsDisplay.toArray(new String[0]));
        param.setListItemsDisplayCodeName(possValsDisplay.toArray(new String[0]));
        param.setListItemsValue(possVals.toArray(new String[0]));
      }
    }
 else     if (fieldType != null && fieldType.equals(EParameterFieldType.TABLE) && widgetProperty instanceof Properties) {
      Properties table=(Properties)widgetProperty;
      Form mainForm=table.getForm(Form.MAIN);
      param.setDisplayName(mainForm.getTitle());
      List<ElementParameter> parameters=getParametersFromForm(new FakeElement("String_Node_Str"),mainForm);
      param.setSupportContext(false);
      List<String> codeNames=new ArrayList<>();
      List<String> possValsDisplay=new ArrayList<>();
      for (      ElementParameter curParam : parameters) {
        curParam.setFilter(null);
        curParam.setContext(null);
        curParam.setShowIf(null);
        curParam.setNotShowIf(null);
        curParam.setReadOnlyIf(null);
        curParam.setNotReadOnlyIf(null);
        curParam.setNoContextAssist(false);
        curParam.setRaw(false);
        curParam.setReadOnly(false);
        fillDefaultValsForListType(curParam);
        codeNames.add(curParam.getName());
        possValsDisplay.add(curParam.getDisplayName());
      }
      param.setListItemsDisplayName(possValsDisplay.toArray(new String[0]));
      param.setListItemsDisplayCodeName(codeNames.toArray(new String[0]));
      param.setListItemsValue(parameters.toArray(new ElementParameter[0]));
      String[] listItemsShowIf=new String[parameters.size()];
      String[] listItemsNotShowIf=new String[parameters.size()];
      param.setListItemsShowIf(listItemsShowIf);
      param.setListItemsNotShowIf(listItemsNotShowIf);
      param.setValue(GenericTableUtils.getTableValues(table,param));
      param.setBasedOnSchema(Boolean.valueOf(String.valueOf(widget.getConfigurationValue(Widget.HIDE_TOOLBAR_WIDGET_CONF))));
    }
    if (!param.isReadOnly()) {
      param.setReadOnly(widget.isReadonly() || element.isReadOnly());
    }
    if (EParameterFieldType.COMPONENT_REFERENCE.equals(fieldType) && param.getNumRow() == 2 && EComponentCategory.BASIC.equals(compCategory)) {
      param.setNumRow(1);
    }
    param.setSerialized(true);
    param.setDynamicSettings(true);
    if (!parameterNames.contains(parameterName)) {
      elementParameters.add(param);
      parameterNames.add(parameterName);
    }
  }
  return elementParameters;
}

Fixed version (ground truth):
/** 
 * DOC ycbai Comment method "loadParametersFromForm". <p> Get element parameters of <code>element</code> from <code>form</code>.
 * @param node optional, used if there is a component setting up the properties
 * @param element
 * @param category
 * @param form
 * @return parameters list
 */
private static List<ElementParameter> getParametersFromForm(IElement element,boolean isInitializing,EComponentCategory category,ComponentProperties rootProperty,Properties compProperties,String parentPropertiesPath,Form form,Widget parentWidget,AtomicInteger lastRowNum){
  List<ElementParameter> elementParameters=new ArrayList<>();
  List<String> parameterNames=new ArrayList<>();
  EComponentCategory compCategory=category;
  if (compCategory == null) {
    compCategory=EComponentCategory.BASIC;
  }
  AtomicInteger lastRN=lastRowNum;
  if (lastRN == null) {
    lastRN=new AtomicInteger();
  }
  if (form == null) {
    return elementParameters;
  }
  Properties componentProperties=compProperties;
  if (componentProperties == null) {
    componentProperties=form.getProperties();
  }
  if (element instanceof INode) {
    INode node=(INode)element;
    if (node.getComponentProperties() == null) {
      node.setComponentProperties(rootProperty);
    }
  }
  Collection<Widget> formWidgets=form.getWidgets();
  for (  Widget widget : formWidgets) {
    NamedThing widgetProperty=widget.getContent();
    String propertiesPath=getPropertiesPath(parentPropertiesPath,null);
    if (widgetProperty instanceof Form) {
      Form subForm=(Form)widgetProperty;
      Properties subProperties=subForm.getProperties();
      if (!isSameComponentProperties(componentProperties,widgetProperty)) {
        propertiesPath=getPropertiesPath(parentPropertiesPath,subProperties.getName());
      }
      elementParameters.addAll(getParametersFromForm(element,isInitializing,compCategory,rootProperty,subProperties,propertiesPath,subForm,widget,lastRN));
      continue;
    }
    GenericElementParameter param=new GenericElementParameter(element,rootProperty,form,widget,getComponentService());
    String parameterName=propertiesPath.concat(param.getName());
    param.setName(parameterName);
    param.setCategory(compCategory);
    param.setShow(parentWidget == null ? !widget.isHidden() : !parentWidget.isHidden() && !widget.isHidden());
    int rowNum=0;
    if (widget.getOrder() != 1) {
      rowNum=lastRN.get();
    }
 else {
      rowNum=widget.getRow();
      if (parentWidget != null) {
        rowNum+=parentWidget.getRow();
      }
      rowNum=rowNum + lastRN.get();
    }
    param.setNumRow(rowNum);
    lastRN.set(rowNum);
    EParameterFieldType fieldType=getFieldType(widget,widgetProperty);
    param.setFieldType(fieldType != null ? fieldType : EParameterFieldType.TEXT);
    if (widgetProperty instanceof SchemaProperty) {
      boolean found=false;
      param.setContext(EConnectionType.FLOW_MAIN.getName());
      for (      Connector connector : rootProperty.getPossibleConnectors(true)) {
        if (!(((SchemaProperty)widgetProperty).getValue() instanceof Schema)) {
          continue;
        }
        if (connector instanceof PropertyPathConnector) {
          String linkedSchema=((PropertyPathConnector)connector).getPropertyPath() + "String_Node_Str";
          if (parameterName.equals(linkedSchema)) {
            found=true;
            param.setContext(connector.getName());
            IElementParameterDefaultValue defaultValue=new ElementParameterDefaultValue();
            Schema schema=((SchemaProperty)widgetProperty).getValue();
            defaultValue.setDefaultValue(new Schema.Parser().parse(schema.toString()));
            param.getDefaultValues().add(defaultValue);
          }
        }
      }
      if (!found) {
        for (        Connector connector : rootProperty.getPossibleConnectors(false)) {
          if (!(((SchemaProperty)widgetProperty).getValue() instanceof Schema)) {
            continue;
          }
          if (connector instanceof PropertyPathConnector) {
            String linkedSchema=((PropertyPathConnector)connector).getPropertyPath() + "String_Node_Str";
            if (parameterName.equals(linkedSchema)) {
              if (GenericNodeConnector.INPUT_CONNECTOR.equals(connector.getName())) {
                param.setContext(EConnectionType.FLOW_MAIN.getName());
              }
 else {
                param.setContext(connector.getName());
              }
              IElementParameterDefaultValue defaultValue=new ElementParameterDefaultValue();
              Schema schema=((SchemaProperty)widgetProperty).getValue();
              defaultValue.setDefaultValue(new Schema.Parser().parse(schema.toString()));
              param.getDefaultValues().add(defaultValue);
            }
          }
        }
      }
    }
    if (widgetProperty instanceof PresentationItem) {
      param.setValue(widgetProperty.getDisplayName());
    }
 else     if (widgetProperty instanceof Property) {
      Property property=(Property)widgetProperty;
      param.setRequired(property.isRequired());
      param.setValue(getParameterValue(element,property,fieldType));
      boolean isNameProperty=IGenericConstants.NAME_PROPERTY.equals(param.getParameterName());
      if (EParameterFieldType.NAME_SELECTION_AREA.equals(fieldType) || EParameterFieldType.JSON_TABLE.equals(fieldType) || EParameterFieldType.CLOSED_LIST.equals(fieldType)|| EParameterFieldType.CHECK.equals(fieldType)|| isNameProperty) {
        param.setSupportContext(false);
      }
 else {
        param.setSupportContext(isSupportContext(property));
      }
      property.setTaggedValue(IComponentConstants.SUPPORT_CONTEXT,param.isSupportContext());
      Object cmTV=property.getTaggedValue(IGenericConstants.IS_CONTEXT_MODE);
      param.setReadOnly(Boolean.valueOf(String.valueOf(cmTV)));
      boolean isDynamic=Boolean.valueOf(String.valueOf(property.getTaggedValue(IGenericConstants.IS_DYNAMIC)));
      param.setContextMode(isDynamic);
      List<?> values=property.getPossibleValues();
      if (values != null || EParameterFieldType.CLOSED_LIST.equals(fieldType)) {
        if (values == null) {
          values=Collections.emptyList();
        }
        param.setPossibleValues(values);
        List<String> possVals=new ArrayList<>();
        List<String> possValsDisplay=new ArrayList<>();
        for (        Object obj : values) {
          String value=null;
          String valueDisplay=null;
          if (obj instanceof NamedThing) {
            NamedThing nal=(NamedThing)obj;
            value=nal.getName();
            valueDisplay=nal.getDisplayName();
          }
 else {
            value=String.valueOf(obj);
            valueDisplay=String.valueOf(obj);
          }
          String pvDisplayName=property.getPossibleValuesDisplayName(obj);
          if (StringUtils.isNotBlank(pvDisplayName) && !"String_Node_Str".equals(pvDisplayName)) {
            valueDisplay=pvDisplayName;
          }
          possVals.add(value);
          possValsDisplay.add(valueDisplay);
        }
        param.setListItemsDisplayName(possValsDisplay.toArray(new String[0]));
        param.setListItemsDisplayCodeName(possValsDisplay.toArray(new String[0]));
        param.setListItemsValue(possVals.toArray(new String[0]));
      }
    }
 else     if (fieldType != null && fieldType.equals(EParameterFieldType.TABLE) && widgetProperty instanceof Properties) {
      Properties table=(Properties)widgetProperty;
      Form mainForm=table.getForm(Form.MAIN);
      param.setDisplayName(mainForm.getTitle());
      List<ElementParameter> parameters=getParametersFromForm(new FakeElement("String_Node_Str"),mainForm);
      param.setSupportContext(false);
      List<String> codeNames=new ArrayList<>();
      List<String> possValsDisplay=new ArrayList<>();
      for (      ElementParameter curParam : parameters) {
        curParam.setFilter(null);
        curParam.setContext(null);
        curParam.setShowIf(null);
        curParam.setNotShowIf(null);
        curParam.setReadOnlyIf(null);
        curParam.setNotReadOnlyIf(null);
        curParam.setNoContextAssist(false);
        curParam.setRaw(false);
        curParam.setReadOnly(false);
        fillDefaultValsForListType(curParam);
        codeNames.add(curParam.getName());
        possValsDisplay.add(curParam.getDisplayName());
      }
      param.setListItemsDisplayName(possValsDisplay.toArray(new String[0]));
      param.setListItemsDisplayCodeName(codeNames.toArray(new String[0]));
      param.setListItemsValue(parameters.toArray(new ElementParameter[0]));
      String[] listItemsShowIf=new String[parameters.size()];
      String[] listItemsNotShowIf=new String[parameters.size()];
      param.setListItemsShowIf(listItemsShowIf);
      param.setListItemsNotShowIf(listItemsNotShowIf);
      param.setValue(GenericTableUtils.getTableValues(table,param));
      param.setBasedOnSchema(Boolean.valueOf(String.valueOf(widget.getConfigurationValue(Widget.HIDE_TOOLBAR_WIDGET_CONF))));
    }
    if (!param.isReadOnly()) {
      param.setReadOnly(widget.isReadonly() || element.isReadOnly());
    }
    if (EParameterFieldType.COMPONENT_REFERENCE.equals(fieldType) && param.getNumRow() == 2 && EComponentCategory.BASIC.equals(compCategory)) {
      param.setNumRow(1);
    }
    param.setSerialized(true);
    param.setDynamicSettings(true);
    if (!parameterNames.contains(parameterName)) {
      elementParameters.add(param);
      parameterNames.add(parameterName);
    }
  }
  return elementParameters;
}