Program: 22976
Project: 22976
Buggy source:
/** 
 * given an element definition in a profile, what element contains the differentiating fixed  for the element, given the differentiating expresssion. The expression is only allowed to  use a subset of FHIRPath
 * @param profile
 * @param element
 * @return
 * @throws PathEngineException 
 * @throws DefinitionException 
 */
public ElementDefinition evaluateDefinition(ExpressionNode expr,StructureDefinition profile,ElementDefinition element) throws DefinitionException {
  StructureDefinition sd=profile;
  ElementDefinition focus=null;
  if (expr.getKind() == Kind.Name) {
    List<ElementDefinition> childDefinitions;
    childDefinitions=ProfileUtilities.getChildMap(sd,element);
    if (childDefinitions.isEmpty()) {
      sd=fetchStructureByType(element);
      if (sd == null)       throw new DefinitionException("String_Node_Str" + element.getType().get(0).getProfile() + "String_Node_Str"+ element.getId()+ "String_Node_Str");
      childDefinitions=ProfileUtilities.getChildMap(sd,sd.getSnapshot().getElementFirstRep());
    }
    for (    ElementDefinition t : childDefinitions) {
      if (tailMatches(t,expr.getName())) {
        focus=t;
        break;
      }
    }
  }
 else   if (expr.getKind() == Kind.Function) {
    if ("String_Node_Str".equals(expr.getName())) {
      if (!element.hasType())       throw new DefinitionException("String_Node_Str" + element.getId());
      if (element.getType().size() > 1)       throw new DefinitionException("String_Node_Str" + element.getId());
      if (!element.getType().get(0).hasTarget())       throw new DefinitionException("String_Node_Str" + element.getId() + "String_Node_Str"+ element.getType().get(0).getCode()+ "String_Node_Str");
      if (element.getType().get(0).getTargetProfile().size() > 1)       throw new DefinitionException("String_Node_Str" + element.getId());
      sd=worker.fetchResource(StructureDefinition.class,element.getType().get(0).getTargetProfile().get(0).getValue());
      if (sd == null)       throw new DefinitionException("String_Node_Str" + element.getType().get(0).getTargetProfile() + "String_Node_Str"+ element.getId()+ "String_Node_Str");
      focus=sd.getSnapshot().getElementFirstRep();
    }
 else     if ("String_Node_Str".equals(expr.getName())) {
      String targetUrl=expr.getParameters().get(0).getConstant().primitiveValue();
      targetUrl=targetUrl.substring(1,targetUrl.length() - 1);
      List<ElementDefinition> childDefinitions=ProfileUtilities.getChildMap(sd,element);
      for (      ElementDefinition t : childDefinitions) {
        if (t.getPath().endsWith("String_Node_Str") && t.hasSliceName()) {
          sd=worker.fetchResource(StructureDefinition.class,t.getType().get(0).getProfile().get(0).getValue());
          while (sd != null && !sd.getBaseDefinition().equals("String_Node_Str"))           sd=worker.fetchResource(StructureDefinition.class,sd.getBaseDefinition());
          if (sd.getUrl().equals(targetUrl)) {
            focus=t;
            break;
          }
        }
      }
    }
 else     throw new DefinitionException("String_Node_Str" + expr.getName() + "String_Node_Str");
  }
 else   if (expr.getKind() == Kind.Group) {
    throw new DefinitionException("String_Node_Str");
  }
 else   if (expr.getKind() == Kind.Constant) {
    throw new DefinitionException("String_Node_Str");
  }
  if (focus == null)   throw new DefinitionException("String_Node_Str");
 else   if (expr.getInner() == null)   return focus;
 else   return evaluateDefinition(expr.getInner(),sd,focus);
}

Fixed version (ground truth):
/** 
 * given an element definition in a profile, what element contains the differentiating fixed  for the element, given the differentiating expresssion. The expression is only allowed to  use a subset of FHIRPath
 * @param profile
 * @param element
 * @return
 * @throws PathEngineException 
 * @throws DefinitionException 
 */
public ElementDefinition evaluateDefinition(ExpressionNode expr,StructureDefinition profile,ElementDefinition element) throws DefinitionException {
  StructureDefinition sd=profile;
  ElementDefinition focus=null;
  if (expr.getKind() == Kind.Name) {
    List<ElementDefinition> childDefinitions;
    childDefinitions=ProfileUtilities.getChildMap(sd,element);
    if (childDefinitions.isEmpty()) {
      sd=fetchStructureByType(element);
      if (sd == null)       throw new DefinitionException("String_Node_Str" + element.getType().get(0).getProfile() + "String_Node_Str"+ element.getId()+ "String_Node_Str");
      childDefinitions=ProfileUtilities.getChildMap(sd,sd.getSnapshot().getElementFirstRep());
    }
    for (    ElementDefinition t : childDefinitions) {
      if (tailMatches(t,expr.getName())) {
        focus=t;
        break;
      }
    }
  }
 else   if (expr.getKind() == Kind.Function) {
    if ("String_Node_Str".equals(expr.getName())) {
      if (!element.hasType())       throw new DefinitionException("String_Node_Str" + element.getId());
      if (element.getType().size() > 1)       throw new DefinitionException("String_Node_Str" + element.getId());
      if (!element.getType().get(0).hasTarget())       throw new DefinitionException("String_Node_Str" + element.getId() + "String_Node_Str"+ element.getType().get(0).getCode()+ "String_Node_Str");
      if (element.getType().get(0).getTargetProfile().size() > 1)       throw new DefinitionException("String_Node_Str" + element.getId());
      sd=worker.fetchResource(StructureDefinition.class,element.getType().get(0).getTargetProfile().get(0).getValue());
      if (sd == null)       throw new DefinitionException("String_Node_Str" + element.getType().get(0).getTargetProfile() + "String_Node_Str"+ element.getId()+ "String_Node_Str");
      focus=sd.getSnapshot().getElementFirstRep();
    }
 else     if ("String_Node_Str".equals(expr.getName())) {
      String targetUrl=expr.getParameters().get(0).getConstant().primitiveValue();
      List<ElementDefinition> childDefinitions=ProfileUtilities.getChildMap(sd,element);
      for (      ElementDefinition t : childDefinitions) {
        if (t.getPath().endsWith("String_Node_Str") && t.hasSliceName()) {
          sd=worker.fetchResource(StructureDefinition.class,t.getType().get(0).getProfile().get(0).getValue());
          while (sd != null && !sd.getBaseDefinition().equals("String_Node_Str"))           sd=worker.fetchResource(StructureDefinition.class,sd.getBaseDefinition());
          if (sd.getUrl().equals(targetUrl)) {
            focus=t;
            break;
          }
        }
      }
    }
 else     throw new DefinitionException("String_Node_Str" + expr.getName() + "String_Node_Str");
  }
 else   if (expr.getKind() == Kind.Group) {
    throw new DefinitionException("String_Node_Str");
  }
 else   if (expr.getKind() == Kind.Constant) {
    throw new DefinitionException("String_Node_Str");
  }
  if (focus == null)   throw new DefinitionException("String_Node_Str");
 else   if (expr.getInner() == null)   return focus;
 else   return evaluateDefinition(expr.getInner(),sd,focus);
}