Program: 23973
Project: 23973
Buggy source:
private void updateFromDefinition(ElementDefinition dest,ElementDefinition source,String pn,boolean trimDifferential,String purl) throws DefinitionException, FHIRException {
  ElementDefinition base=dest;
  ElementDefinition derived=source;
  derived.setUserData(DERIVATION_POINTER,base);
  if (derived != null) {
    boolean isExtension=checkExtensionDoco(base);
    if (derived.hasShortElement()) {
      if (!Base.compareDeep(derived.getShortElement(),base.getShortElement(),false))       base.setShortElement(derived.getShortElement().copy());
 else       if (trimDifferential)       derived.setShortElement(null);
 else       if (derived.hasShortElement())       derived.getShortElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasDefinitionElement()) {
      if (derived.getDefinition().startsWith("String_Node_Str"))       base.setDefinition(base.getDefinition() + "String_Node_Str" + derived.getDefinition().substring(3));
 else       if (!Base.compareDeep(derived.getDefinitionElement(),base.getDefinitionElement(),false))       base.setDefinitionElement(derived.getDefinitionElement().copy());
 else       if (trimDifferential)       derived.setDefinitionElement(null);
 else       if (derived.hasDefinitionElement())       derived.getDefinitionElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasCommentsElement()) {
      if (derived.getComments().startsWith("String_Node_Str"))       base.setComments(base.getComments() + "String_Node_Str" + derived.getComments().substring(3));
 else       if (!Base.compareDeep(derived.getCommentsElement(),base.getCommentsElement(),false))       base.setCommentsElement(derived.getCommentsElement().copy());
 else       if (trimDifferential)       base.setCommentsElement(derived.getCommentsElement().copy());
 else       if (derived.hasCommentsElement())       derived.getCommentsElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasLabelElement()) {
      if (derived.getLabel().startsWith("String_Node_Str"))       base.setLabel(base.getLabel() + "String_Node_Str" + derived.getLabel().substring(3));
 else       if (!Base.compareDeep(derived.getLabelElement(),base.getLabelElement(),false))       base.setLabelElement(derived.getLabelElement().copy());
 else       if (trimDifferential)       base.setLabelElement(derived.getLabelElement().copy());
 else       if (derived.hasLabelElement())       derived.getLabelElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasRequirementsElement()) {
      if (derived.getRequirements().startsWith("String_Node_Str"))       base.setRequirements(base.getRequirements() + "String_Node_Str" + derived.getRequirements().substring(3));
 else       if (!Base.compareDeep(derived.getRequirementsElement(),base.getRequirementsElement(),false))       base.setRequirementsElement(derived.getRequirementsElement().copy());
 else       if (trimDifferential)       base.setRequirementsElement(derived.getRequirementsElement().copy());
 else       if (derived.hasRequirementsElement())       derived.getRequirementsElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasRequirements() && !base.getPath().contains("String_Node_Str"))     derived.setRequirements(null);
    if (base.hasRequirements() && !base.getPath().contains("String_Node_Str"))     base.setRequirements(null);
    if (derived.hasAlias()) {
      if (!Base.compareDeep(derived.getAlias(),base.getAlias(),false))       for (      StringType s : derived.getAlias()) {
        if (!base.hasAlias(s.getValue()))         base.getAlias().add(s.copy());
      }
 else       if (trimDifferential)       derived.getAlias().clear();
 else       for (      StringType t : derived.getAlias())       t.setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMinElement()) {
      if (!Base.compareDeep(derived.getMinElement(),base.getMinElement(),false)) {
        if (derived.getMin() < base.getMin())         messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + derived.getPath(),"String_Node_Str" + Integer.toString(derived.getMin()) + "String_Node_Str"+ Integer.toString(base.getMin())+ "String_Node_Str",IssueSeverity.ERROR));
        base.setMinElement(derived.getMinElement().copy());
      }
 else       if (trimDifferential)       derived.setMinElement(null);
 else       derived.getMinElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMaxElement()) {
      if (!Base.compareDeep(derived.getMaxElement(),base.getMaxElement(),false)) {
        if (isLargerMax(derived.getMax(),base.getMax()))         messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + derived.getPath(),"String_Node_Str" + derived.getMax() + "String_Node_Str"+ base.getMax()+ "String_Node_Str",IssueSeverity.ERROR));
        base.setMaxElement(derived.getMaxElement().copy());
      }
 else       if (trimDifferential)       derived.setMaxElement(null);
 else       derived.getMaxElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasFixed()) {
      if (!Base.compareDeep(derived.getFixed(),base.getFixed(),true)) {
        base.setFixed(derived.getFixed().copy());
      }
 else       if (trimDifferential)       derived.setFixed(null);
 else       derived.getFixed().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasPattern()) {
      if (!Base.compareDeep(derived.getPattern(),base.getPattern(),false)) {
        base.setPattern(derived.getPattern().copy());
      }
 else       if (trimDifferential)       derived.setPattern(null);
 else       derived.getPattern().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasExample()) {
      if (!Base.compareDeep(derived.getExample(),base.getExample(),false))       base.setExample(derived.getExample().copy());
 else       if (trimDifferential)       derived.setExample(null);
 else       derived.getExample().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMaxLengthElement()) {
      if (!Base.compareDeep(derived.getMaxLengthElement(),base.getMaxLengthElement(),false))       base.setMaxLengthElement(derived.getMaxLengthElement().copy());
 else       if (trimDifferential)       derived.setMaxLengthElement(null);
 else       derived.getMaxLengthElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMustSupportElement()) {
      if (!Base.compareDeep(derived.getMustSupportElement(),base.getMustSupportElement(),false))       base.setMustSupportElement(derived.getMustSupportElement().copy());
 else       if (trimDifferential)       derived.setMustSupportElement(null);
 else       derived.getMustSupportElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (isExtension) {
      if (!Base.compareDeep(derived.getIsModifierElement(),base.getIsModifierElement(),false))       base.setIsModifierElement(derived.getIsModifierElement().copy());
 else       if (trimDifferential)       derived.setIsModifierElement(null);
 else       derived.getIsModifierElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasBinding()) {
      if (!Base.compareDeep(derived.getBinding(),base.getBinding(),false)) {
        if (base.hasBinding() && base.getBinding().getStrength() == BindingStrength.REQUIRED && derived.getBinding().getStrength() != BindingStrength.REQUIRED)         messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + derived.getPath(),"String_Node_Str" + base.getBinding().getStrength().toCode() + "String_Node_Str"+ derived.getBinding().getStrength().toCode(),IssueSeverity.ERROR));
 else         if (base.hasBinding() && derived.hasBinding() && base.getBinding().getStrength() == BindingStrength.REQUIRED && base.getBinding().hasValueSetReference() && derived.getBinding().hasValueSetReference()) {
          ValueSetExpansionOutcome expBase=context.expandVS(context.fetchResource(ValueSet.class,base.getBinding().getValueSetReference().getReference()),true);
          ValueSetExpansionOutcome expDerived=context.expandVS(context.fetchResource(ValueSet.class,derived.getBinding().getValueSetReference().getReference()),true);
          if (expBase.getValueset() == null)           messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + base.getPath(),"String_Node_Str" + base.getBinding().getValueSetReference().getReference() + "String_Node_Str",IssueSeverity.WARNING));
 else           if (expDerived.getValueset() == null)           messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + derived.getPath(),"String_Node_Str" + derived.getBinding().getValueSetReference().getReference() + "String_Node_Str",IssueSeverity.WARNING));
 else           if (!isSubset(expBase.getValueset(),expDerived.getValueset()))           messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + derived.getPath(),"String_Node_Str" + derived.getBinding().getValueSetReference().getReference() + "String_Node_Str"+ base.getBinding().getValueSetReference().getReference(),IssueSeverity.ERROR));
        }
        base.setBinding(derived.getBinding().copy());
      }
 else       if (trimDifferential)       derived.setBinding(null);
 else       derived.getBinding().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasIsSummaryElement()) {
      if (!Base.compareDeep(derived.getIsSummaryElement(),base.getIsSummaryElement(),false))       base.setIsSummaryElement(derived.getIsSummaryElement().copy());
 else       if (trimDifferential)       derived.setIsSummaryElement(null);
 else       derived.getIsSummaryElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasType()) {
      if (!Base.compareDeep(derived.getType(),base.getType(),false)) {
        if (base.hasType()) {
          for (          TypeRefComponent ts : derived.getType()) {
            boolean ok=false;
            CommaSeparatedStringBuilder b=new CommaSeparatedStringBuilder();
            for (            TypeRefComponent td : base.getType()) {
              b.append(td.getCode());
              if (td.hasCode() && (td.getCode().equals(ts.getCode()) || td.getCode().equals("String_Node_Str") || td.getCode().equals("String_Node_Str")|| td.getCode().equals("String_Node_Str")|| ((td.getCode().equals("String_Node_Str") || (td.getCode().equals("String_Node_Str")) && pkp.isResource(ts.getCode())))))               ok=true;
            }
            if (!ok)             throw new DefinitionException("String_Node_Str" + pn + "String_Node_Str"+ derived.getPath()+ "String_Node_Str"+ ts.getCode()+ "String_Node_Str"+ b.toString());
          }
        }
        base.getType().clear();
        for (        TypeRefComponent t : derived.getType()) {
          TypeRefComponent tt=t.copy();
          base.getType().add(tt);
        }
      }
 else       if (trimDifferential)       derived.getType().clear();
 else       for (      TypeRefComponent t : derived.getType())       t.setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMapping()) {
      if (!Base.compareDeep(derived.getMapping(),base.getMapping(),false)) {
        for (        ElementDefinitionMappingComponent s : derived.getMapping()) {
          boolean found=false;
          for (          ElementDefinitionMappingComponent d : base.getMapping()) {
            found=found || (d.getIdentity().equals(s.getIdentity()) && d.getMap().equals(s.getMap()));
          }
          if (!found)           base.getMapping().add(s);
        }
      }
 else       if (trimDifferential)       derived.getMapping().clear();
 else       for (      ElementDefinitionMappingComponent t : derived.getMapping())       t.setUserData(DERIVATION_EQUALS,true);
    }
    for (    ElementDefinitionConstraintComponent s : base.getConstraint())     s.setUserData(IS_DERIVED,true);
    if (derived.hasConstraint()) {
      for (      ElementDefinitionConstraintComponent s : derived.getConstraint()) {
        base.getConstraint().add(s.copy());
      }
    }
  }
}

Fixed version (ground truth):
private void updateFromDefinition(ElementDefinition dest,ElementDefinition source,String pn,boolean trimDifferential,String purl) throws DefinitionException, FHIRException {
  ElementDefinition base=dest;
  ElementDefinition derived=source;
  derived.setUserData(DERIVATION_POINTER,base);
  if (derived != null) {
    boolean isExtension=checkExtensionDoco(base);
    if (derived.hasShortElement()) {
      if (!Base.compareDeep(derived.getShortElement(),base.getShortElement(),false))       base.setShortElement(derived.getShortElement().copy());
 else       if (trimDifferential)       derived.setShortElement(null);
 else       if (derived.hasShortElement())       derived.getShortElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasDefinitionElement()) {
      if (derived.getDefinition().startsWith("String_Node_Str"))       base.setDefinition(base.getDefinition() + "String_Node_Str" + derived.getDefinition().substring(3));
 else       if (!Base.compareDeep(derived.getDefinitionElement(),base.getDefinitionElement(),false))       base.setDefinitionElement(derived.getDefinitionElement().copy());
 else       if (trimDifferential)       derived.setDefinitionElement(null);
 else       if (derived.hasDefinitionElement())       derived.getDefinitionElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasCommentsElement()) {
      if (derived.getComments().startsWith("String_Node_Str"))       base.setComments(base.getComments() + "String_Node_Str" + derived.getComments().substring(3));
 else       if (!Base.compareDeep(derived.getCommentsElement(),base.getCommentsElement(),false))       base.setCommentsElement(derived.getCommentsElement().copy());
 else       if (trimDifferential)       base.setCommentsElement(derived.getCommentsElement().copy());
 else       if (derived.hasCommentsElement())       derived.getCommentsElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasLabelElement()) {
      if (derived.getLabel().startsWith("String_Node_Str"))       base.setLabel(base.getLabel() + "String_Node_Str" + derived.getLabel().substring(3));
 else       if (!Base.compareDeep(derived.getLabelElement(),base.getLabelElement(),false))       base.setLabelElement(derived.getLabelElement().copy());
 else       if (trimDifferential)       base.setLabelElement(derived.getLabelElement().copy());
 else       if (derived.hasLabelElement())       derived.getLabelElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasRequirementsElement()) {
      if (derived.getRequirements().startsWith("String_Node_Str"))       base.setRequirements(base.getRequirements() + "String_Node_Str" + derived.getRequirements().substring(3));
 else       if (!Base.compareDeep(derived.getRequirementsElement(),base.getRequirementsElement(),false))       base.setRequirementsElement(derived.getRequirementsElement().copy());
 else       if (trimDifferential)       base.setRequirementsElement(derived.getRequirementsElement().copy());
 else       if (derived.hasRequirementsElement())       derived.getRequirementsElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasRequirements() && !base.getPath().contains("String_Node_Str"))     derived.setRequirements(null);
    if (base.hasRequirements() && !base.getPath().contains("String_Node_Str"))     base.setRequirements(null);
    if (derived.hasAlias()) {
      if (!Base.compareDeep(derived.getAlias(),base.getAlias(),false))       for (      StringType s : derived.getAlias()) {
        if (!base.hasAlias(s.getValue()))         base.getAlias().add(s.copy());
      }
 else       if (trimDifferential)       derived.getAlias().clear();
 else       for (      StringType t : derived.getAlias())       t.setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMinElement()) {
      if (!Base.compareDeep(derived.getMinElement(),base.getMinElement(),false)) {
        if (derived.getMin() < base.getMin())         messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + source.getPath(),"String_Node_Str" + Integer.toString(derived.getMin()) + "String_Node_Str"+ Integer.toString(base.getMin())+ "String_Node_Str",IssueSeverity.ERROR));
        base.setMinElement(derived.getMinElement().copy());
      }
 else       if (trimDifferential)       derived.setMinElement(null);
 else       derived.getMinElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMaxElement()) {
      if (!Base.compareDeep(derived.getMaxElement(),base.getMaxElement(),false)) {
        if (isLargerMax(derived.getMax(),base.getMax()))         messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + source.getPath(),"String_Node_Str" + derived.getMax() + "String_Node_Str"+ base.getMax()+ "String_Node_Str",IssueSeverity.ERROR));
        base.setMaxElement(derived.getMaxElement().copy());
      }
 else       if (trimDifferential)       derived.setMaxElement(null);
 else       derived.getMaxElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasFixed()) {
      if (!Base.compareDeep(derived.getFixed(),base.getFixed(),true)) {
        base.setFixed(derived.getFixed().copy());
      }
 else       if (trimDifferential)       derived.setFixed(null);
 else       derived.getFixed().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasPattern()) {
      if (!Base.compareDeep(derived.getPattern(),base.getPattern(),false)) {
        base.setPattern(derived.getPattern().copy());
      }
 else       if (trimDifferential)       derived.setPattern(null);
 else       derived.getPattern().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasExample()) {
      if (!Base.compareDeep(derived.getExample(),base.getExample(),false))       base.setExample(derived.getExample().copy());
 else       if (trimDifferential)       derived.setExample(null);
 else       derived.getExample().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMaxLengthElement()) {
      if (!Base.compareDeep(derived.getMaxLengthElement(),base.getMaxLengthElement(),false))       base.setMaxLengthElement(derived.getMaxLengthElement().copy());
 else       if (trimDifferential)       derived.setMaxLengthElement(null);
 else       derived.getMaxLengthElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMustSupportElement()) {
      if (!Base.compareDeep(derived.getMustSupportElement(),base.getMustSupportElement(),false))       base.setMustSupportElement(derived.getMustSupportElement().copy());
 else       if (trimDifferential)       derived.setMustSupportElement(null);
 else       derived.getMustSupportElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (isExtension) {
      if (!Base.compareDeep(derived.getIsModifierElement(),base.getIsModifierElement(),false))       base.setIsModifierElement(derived.getIsModifierElement().copy());
 else       if (trimDifferential)       derived.setIsModifierElement(null);
 else       derived.getIsModifierElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasBinding()) {
      if (!Base.compareDeep(derived.getBinding(),base.getBinding(),false)) {
        if (base.hasBinding() && base.getBinding().getStrength() == BindingStrength.REQUIRED && derived.getBinding().getStrength() != BindingStrength.REQUIRED)         messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + derived.getPath(),"String_Node_Str" + base.getBinding().getStrength().toCode() + "String_Node_Str"+ derived.getBinding().getStrength().toCode(),IssueSeverity.ERROR));
 else         if (base.hasBinding() && derived.hasBinding() && base.getBinding().getStrength() == BindingStrength.REQUIRED && base.getBinding().hasValueSetReference() && derived.getBinding().hasValueSetReference()) {
          ValueSetExpansionOutcome expBase=context.expandVS(context.fetchResource(ValueSet.class,base.getBinding().getValueSetReference().getReference()),true);
          ValueSetExpansionOutcome expDerived=context.expandVS(context.fetchResource(ValueSet.class,derived.getBinding().getValueSetReference().getReference()),true);
          if (expBase.getValueset() == null)           messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + base.getPath(),"String_Node_Str" + base.getBinding().getValueSetReference().getReference() + "String_Node_Str",IssueSeverity.WARNING));
 else           if (expDerived.getValueset() == null)           messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + derived.getPath(),"String_Node_Str" + derived.getBinding().getValueSetReference().getReference() + "String_Node_Str",IssueSeverity.WARNING));
 else           if (!isSubset(expBase.getValueset(),expDerived.getValueset()))           messages.add(new ValidationMessage(Source.ProfileValidator,IssueType.BUSINESSRULE,pn + "String_Node_Str" + derived.getPath(),"String_Node_Str" + derived.getBinding().getValueSetReference().getReference() + "String_Node_Str"+ base.getBinding().getValueSetReference().getReference(),IssueSeverity.ERROR));
        }
        base.setBinding(derived.getBinding().copy());
      }
 else       if (trimDifferential)       derived.setBinding(null);
 else       derived.getBinding().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasIsSummaryElement()) {
      if (!Base.compareDeep(derived.getIsSummaryElement(),base.getIsSummaryElement(),false))       base.setIsSummaryElement(derived.getIsSummaryElement().copy());
 else       if (trimDifferential)       derived.setIsSummaryElement(null);
 else       derived.getIsSummaryElement().setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasType()) {
      if (!Base.compareDeep(derived.getType(),base.getType(),false)) {
        if (base.hasType()) {
          for (          TypeRefComponent ts : derived.getType()) {
            boolean ok=false;
            CommaSeparatedStringBuilder b=new CommaSeparatedStringBuilder();
            for (            TypeRefComponent td : base.getType()) {
              b.append(td.getCode());
              if (td.hasCode() && (td.getCode().equals(ts.getCode()) || td.getCode().equals("String_Node_Str") || td.getCode().equals("String_Node_Str")|| td.getCode().equals("String_Node_Str")|| ((td.getCode().equals("String_Node_Str") || (td.getCode().equals("String_Node_Str")) && pkp.isResource(ts.getCode())))))               ok=true;
            }
            if (!ok)             throw new DefinitionException("String_Node_Str" + pn + "String_Node_Str"+ derived.getPath()+ "String_Node_Str"+ ts.getCode()+ "String_Node_Str"+ b.toString());
          }
        }
        base.getType().clear();
        for (        TypeRefComponent t : derived.getType()) {
          TypeRefComponent tt=t.copy();
          base.getType().add(tt);
        }
      }
 else       if (trimDifferential)       derived.getType().clear();
 else       for (      TypeRefComponent t : derived.getType())       t.setUserData(DERIVATION_EQUALS,true);
    }
    if (derived.hasMapping()) {
      if (!Base.compareDeep(derived.getMapping(),base.getMapping(),false)) {
        for (        ElementDefinitionMappingComponent s : derived.getMapping()) {
          boolean found=false;
          for (          ElementDefinitionMappingComponent d : base.getMapping()) {
            found=found || (d.getIdentity().equals(s.getIdentity()) && d.getMap().equals(s.getMap()));
          }
          if (!found)           base.getMapping().add(s);
        }
      }
 else       if (trimDifferential)       derived.getMapping().clear();
 else       for (      ElementDefinitionMappingComponent t : derived.getMapping())       t.setUserData(DERIVATION_EQUALS,true);
    }
    for (    ElementDefinitionConstraintComponent s : base.getConstraint())     s.setUserData(IS_DERIVED,true);
    if (derived.hasConstraint()) {
      for (      ElementDefinitionConstraintComponent s : derived.getConstraint()) {
        base.getConstraint().add(s.copy());
      }
    }
  }
}