Program: 66237
Project: 66237
Buggy source:
public ArrayList<Property> getPropertyPropertiesForClass(JavaClass cls,TypeInfo info,boolean onlyPublic){
  ArrayList<Property> properties=new ArrayList<Property>();
  if (cls == null) {
    return properties;
  }
  ArrayList<JavaMethod> propertyMethods=new ArrayList<JavaMethod>();
  for (  JavaMethod next : new ArrayList<JavaMethod>(cls.getDeclaredMethods())) {
    if ((next.getName().startsWith("String_Node_Str") && next.getName().length() > 3) || (next.getName().startsWith("String_Node_Str") && next.getName().length() > 2)) {
      int modifiers=next.getModifiers();
      if (!Modifier.isStatic(modifiers) && !Modifier.isTransient(modifiers) && ((onlyPublic && Modifier.isPublic(next.getModifiers())) || !onlyPublic)) {
        propertyMethods.add(next);
      }
    }
 else     if (next.getName().startsWith("String_Node_Str") && next.getName().length() > 3 && next.getParameterTypes().length == 1) {
      int modifiers=next.getModifiers();
      if (!Modifier.isStatic(modifiers) && !Modifier.isTransient(modifiers) && ((onlyPublic && Modifier.isPublic(next.getModifiers())) || !onlyPublic)) {
        propertyMethods.add(next);
      }
    }
  }
  ArrayList<String> propertyNames=new ArrayList<String>();
  for (int i=0; i < propertyMethods.size(); i++) {
    boolean isPropertyTransient=false;
    JavaMethod nextMethod=propertyMethods.get(i);
    String propertyName="String_Node_Str";
    JavaMethod getMethod;
    JavaMethod setMethod;
    JavaMethod propertyMethod=null;
    if (!nextMethod.getName().startsWith("String_Node_Str")) {
      if (nextMethod.getName().startsWith("String_Node_Str")) {
        propertyName=nextMethod.getName().substring(3);
      }
 else       if (nextMethod.getName().startsWith("String_Node_Str")) {
        propertyName=nextMethod.getName().substring(2);
      }
      getMethod=nextMethod;
      String setMethodName="String_Node_Str" + propertyName;
      propertyName=Introspector.decapitalize(propertyName);
      JavaClass[] paramTypes={(JavaClass)getMethod.getReturnType()};
      setMethod=cls.getDeclaredMethod(setMethodName,paramTypes);
      if (setMethod != null && !setMethod.getAnnotations().isEmpty()) {
        if (!helper.isAnnotationPresent(setMethod,XmlTransient.class)) {
          propertyMethod=setMethod;
        }
 else {
          isPropertyTransient=true;
        }
      }
 else {
        if (!helper.isAnnotationPresent(getMethod,XmlTransient.class)) {
          propertyMethod=getMethod;
        }
 else {
          isPropertyTransient=true;
        }
      }
    }
 else {
      propertyName=nextMethod.getName().substring(3);
      setMethod=nextMethod;
      String getMethodName="String_Node_Str" + propertyName;
      getMethod=cls.getDeclaredMethod(getMethodName,new JavaClass[]{});
      if (getMethod == null) {
        getMethodName="String_Node_Str" + propertyName;
        getMethod=cls.getDeclaredMethod(getMethodName,new JavaClass[]{});
      }
      if (getMethod != null && !getMethod.getAnnotations().isEmpty()) {
        if (!helper.isAnnotationPresent(getMethod,XmlTransient.class)) {
          propertyMethod=getMethod;
        }
 else {
          isPropertyTransient=true;
        }
      }
 else {
        if (!helper.isAnnotationPresent(setMethod,XmlTransient.class)) {
          propertyMethod=setMethod;
        }
 else {
          isPropertyTransient=true;
        }
      }
      propertyName=Introspector.decapitalize(propertyName);
    }
    JavaClass ptype=null;
    if (getMethod != null) {
      ptype=(JavaClass)getMethod.getReturnType();
    }
 else {
      ptype=setMethod.getParameterTypes()[0];
    }
    if (!propertyNames.contains(propertyName)) {
      propertyNames.add(propertyName);
      Property property=buildNewProperty(info,cls,propertyMethod,propertyName,ptype);
      property.setTransient(isPropertyTransient);
      if (getMethod != null) {
        property.setOriginalGetMethodName(getMethod.getName());
        if (property.getGetMethodName() == null) {
          property.setGetMethodName(getMethod.getName());
        }
      }
      if (setMethod != null) {
        property.setOriginalSetMethodName(setMethod.getName());
        if (property.getSetMethodName() == null) {
          property.setSetMethodName(setMethod.getName());
        }
      }
      property.setMethodProperty(true);
      if (!helper.isAnnotationPresent(property.getElement(),XmlTransient.class)) {
        properties.add(property);
      }
 else {
        List<String> propOrderList=Arrays.asList(info.getPropOrder());
        if (propOrderList.contains(propertyName)) {
          throw JAXBException.transientInProporder(propertyName);
        }
        property.setTransient(true);
      }
    }
  }
  Collections.sort(properties,new PropertyComparitor());
  return properties;
}

Fixed version (ground truth):
public ArrayList<Property> getPropertyPropertiesForClass(JavaClass cls,TypeInfo info,boolean onlyPublic){
  ArrayList<Property> properties=new ArrayList<Property>();
  if (cls == null) {
    return properties;
  }
  ArrayList<JavaMethod> propertyMethods=new ArrayList<JavaMethod>();
  for (  JavaMethod next : new ArrayList<JavaMethod>(cls.getDeclaredMethods())) {
    if (((next.getName().startsWith("String_Node_Str") && next.getName().length() > 3) || (next.getName().startsWith("String_Node_Str") && next.getName().length() > 2)) && next.getParameterTypes().length == 0 && next.getReturnType() != helper.getJavaClass(java.lang.Void.class)) {
      int modifiers=next.getModifiers();
      if (!Modifier.isStatic(modifiers) && !Modifier.isTransient(modifiers) && ((onlyPublic && Modifier.isPublic(next.getModifiers())) || !onlyPublic)) {
        propertyMethods.add(next);
      }
    }
 else     if (next.getName().startsWith("String_Node_Str") && next.getName().length() > 3 && next.getParameterTypes().length == 1) {
      int modifiers=next.getModifiers();
      if (!Modifier.isStatic(modifiers) && !Modifier.isTransient(modifiers) && ((onlyPublic && Modifier.isPublic(next.getModifiers())) || !onlyPublic)) {
        propertyMethods.add(next);
      }
    }
  }
  ArrayList<String> propertyNames=new ArrayList<String>();
  for (int i=0; i < propertyMethods.size(); i++) {
    boolean isPropertyTransient=false;
    JavaMethod nextMethod=propertyMethods.get(i);
    String propertyName="String_Node_Str";
    JavaMethod getMethod;
    JavaMethod setMethod;
    JavaMethod propertyMethod=null;
    if (!nextMethod.getName().startsWith("String_Node_Str")) {
      if (nextMethod.getName().startsWith("String_Node_Str")) {
        propertyName=nextMethod.getName().substring(3);
      }
 else       if (nextMethod.getName().startsWith("String_Node_Str")) {
        propertyName=nextMethod.getName().substring(2);
      }
      getMethod=nextMethod;
      String setMethodName="String_Node_Str" + propertyName;
      propertyName=Introspector.decapitalize(propertyName);
      JavaClass[] paramTypes={(JavaClass)getMethod.getReturnType()};
      setMethod=cls.getDeclaredMethod(setMethodName,paramTypes);
      if (setMethod != null && !setMethod.getAnnotations().isEmpty()) {
        if (!helper.isAnnotationPresent(setMethod,XmlTransient.class)) {
          propertyMethod=setMethod;
        }
 else {
          isPropertyTransient=true;
        }
      }
 else {
        if (!helper.isAnnotationPresent(getMethod,XmlTransient.class)) {
          propertyMethod=getMethod;
        }
 else {
          isPropertyTransient=true;
        }
      }
    }
 else {
      propertyName=nextMethod.getName().substring(3);
      setMethod=nextMethod;
      String getMethodName="String_Node_Str" + propertyName;
      getMethod=cls.getDeclaredMethod(getMethodName,new JavaClass[]{});
      if (getMethod == null) {
        getMethodName="String_Node_Str" + propertyName;
        getMethod=cls.getDeclaredMethod(getMethodName,new JavaClass[]{});
      }
      if (getMethod != null && !getMethod.getAnnotations().isEmpty()) {
        if (!helper.isAnnotationPresent(getMethod,XmlTransient.class)) {
          propertyMethod=getMethod;
        }
 else {
          isPropertyTransient=true;
        }
      }
 else {
        if (!helper.isAnnotationPresent(setMethod,XmlTransient.class)) {
          propertyMethod=setMethod;
        }
 else {
          isPropertyTransient=true;
        }
      }
      propertyName=Introspector.decapitalize(propertyName);
    }
    JavaClass ptype=null;
    if (getMethod != null) {
      ptype=(JavaClass)getMethod.getReturnType();
    }
 else {
      ptype=setMethod.getParameterTypes()[0];
    }
    if (!propertyNames.contains(propertyName)) {
      propertyNames.add(propertyName);
      Property property=buildNewProperty(info,cls,propertyMethod,propertyName,ptype);
      property.setTransient(isPropertyTransient);
      if (getMethod != null) {
        property.setOriginalGetMethodName(getMethod.getName());
        if (property.getGetMethodName() == null) {
          property.setGetMethodName(getMethod.getName());
        }
      }
      if (setMethod != null) {
        property.setOriginalSetMethodName(setMethod.getName());
        if (property.getSetMethodName() == null) {
          property.setSetMethodName(setMethod.getName());
        }
      }
      property.setMethodProperty(true);
      if (!helper.isAnnotationPresent(property.getElement(),XmlTransient.class)) {
        properties.add(property);
      }
 else {
        List<String> propOrderList=Arrays.asList(info.getPropOrder());
        if (propOrderList.contains(propertyName)) {
          throw JAXBException.transientInProporder(propertyName);
        }
        property.setTransient(true);
      }
    }
  }
  Collections.sort(properties,new PropertyComparitor());
  return properties;
}