Program: 64119
Project: 64119
Buggy source:
/** 
 * Perform any final generation and/or validation operations on TypeInfo properties.
 */
public void finalizeProperties(){
  ArrayList<JavaClass> jClasses=getTypeInfoClasses();
  for (  JavaClass jClass : jClasses) {
    TypeInfo tInfo=getTypeInfo().get(jClass.getQualifiedName());
    if (tInfo.isTransient()) {
      continue;
    }
    String[] propOrder=tInfo.getPropOrder();
    boolean hasPropOrder=propOrder.length > 0 && !(propOrder.length == 1 && propOrder[0].equals(Constants.EMPTY_STRING));
    List<String> propOrderList=Arrays.asList(tInfo.getPropOrder());
    ArrayList<Property> propsList=tInfo.getPropertyList();
    for (int i=0; i < propsList.size(); i++) {
      Property p=propsList.get(i);
      if (p.isTransient() && propOrderList.contains(p.getPropertyName())) {
        throw org.eclipse.persistence.exceptions.JAXBException.transientInProporder(p.getPropertyName());
      }
      if (hasPropOrder && !p.isAttribute() && !p.isTransient()&& !p.isInverseReference()) {
        if (!propOrderList.contains(p.getPropertyName())) {
          throw JAXBException.missingPropertyInPropOrder(p.getPropertyName(),tInfo.getJavaClassName());
        }
      }
    }
    if (!jClass.isInterface() && !tInfo.isEnumerationType() && !jClass.isAbstract()) {
      if (tInfo.getFactoryMethodName() == null && tInfo.getObjectFactoryClassName() == null) {
        JavaConstructor zeroArgConstructor=jClass.getDeclaredConstructor(new JavaClass[]{});
        if (zeroArgConstructor == null) {
          if (tInfo.isSetXmlJavaTypeAdapter()) {
            tInfo.setTransient(true);
          }
 else {
            if (!referencedByTransformer.contains(jClass.getName())) {
              throw org.eclipse.persistence.exceptions.JAXBException.factoryMethodOrConstructorRequired(jClass.getName());
            }
          }
        }
      }
    }
    if (tInfo.getXmlValueProperty() != null) {
      validateXmlValueFieldOrProperty(jClass,tInfo.getXmlValueProperty());
    }
    Set<QName> referenceQNames=new HashSet<QName>();
    for (    Property property : tInfo.getPropertyList()) {
      JavaClass typeClass=property.getActualType();
      if (property.isChoice()) {
        Collection<Property> choiceProps=property.getChoiceProperties();
        Iterator<Property> choicePropsIter=choiceProps.iterator();
        while (choicePropsIter.hasNext()) {
          Property nextChoiceProp=choicePropsIter.next();
          JavaClass nextChoicePropTypeClass=nextChoiceProp.getActualType();
          TypeInfo targetInfo=typeInfo.get(nextChoicePropTypeClass.getQualifiedName());
          finalizeProperty(property,targetInfo,nextChoicePropTypeClass,jClass);
        }
      }
 else {
        TypeInfo targetInfo=typeInfo.get(typeClass.getQualifiedName());
        finalizeProperty(property,targetInfo,typeClass,jClass);
      }
      if (tInfo.isSetXmlValueProperty()) {
        if (property.isXmlValue() && !(tInfo.getXmlValueProperty().getPropertyName().equals(property.getPropertyName()))) {
          throw JAXBException.xmlValueAlreadySet(property.getPropertyName(),tInfo.getXmlValueProperty().getPropertyName(),jClass.getName());
        }
        if (!property.isXmlValue() && !property.isAttribute() && !property.isInverseReference()&& !property.isTransient()) {
          throw JAXBException.propertyOrFieldShouldBeAnAttribute(property.getPropertyName());
        }
      }
      if (property.isReference()) {
        processReferenceProperty(property,tInfo,jClass,referenceQNames);
      }
      if (property.isSwaAttachmentRef() && !this.hasSwaRef) {
        this.hasSwaRef=true;
      }
      if (property.isXmlId() && tInfo.getIDProperty() != null && !(tInfo.getIDProperty().getPropertyName().equals(property.getPropertyName()))) {
        throw JAXBException.idAlreadySet(property.getPropertyName(),tInfo.getIDProperty().getPropertyName(),jClass.getName());
      }
      if (property.isAnyAttribute() && tInfo.isSetAnyAttributePropertyName() && !(tInfo.getAnyAttributePropertyName().equals(property.getPropertyName()))) {
        throw JAXBException.multipleAnyAttributeMapping(jClass.getName());
      }
      if (property.isAny() && tInfo.isSetAnyElementPropertyName() && !(tInfo.getAnyElementPropertyName().equals(property.getPropertyName()))) {
        throw JAXBException.xmlAnyElementAlreadySet(property.getPropertyName(),tInfo.getAnyElementPropertyName(),jClass.getName());
      }
      if (property.isSwaAttachmentRef() && !areEquals(property.getActualType(),JAVAX_ACTIVATION_DATAHANDLER)) {
        throw JAXBException.invalidAttributeRef(property.getPropertyName(),jClass.getQualifiedName());
      }
      if (property.getXmlElementWrapper() != null) {
        if (!helper.isCollectionType(property.getType()) && !property.getType().isArray() && !helper.isMapType(property.getType())) {
          throw JAXBException.invalidElementWrapper(property.getPropertyName());
        }
      }
      if (property.isXmlTransformation()) {
        processXmlTransformationProperty(property);
      }
      if (property.isSetXmlJoinNodes()) {
        TypeInfo targetInfo=typeInfo.get(typeClass.getQualifiedName());
        if (targetInfo == null) {
          throw JAXBException.invalidXmlJoinNodeReferencedClass(property.getPropertyName(),typeClass.getQualifiedName());
        }
        if (targetInfo.getIDProperty() == null && targetInfo.getXmlKeyProperties() == null) {
          throw JAXBException.noKeyOrIDPropertyOnJoinTarget(jClass.getQualifiedName(),property.getPropertyName(),typeClass.getQualifiedName());
        }
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Perform any final generation and/or validation operations on TypeInfo properties.
 */
public void finalizeProperties(){
  ArrayList<JavaClass> jClasses=getTypeInfoClasses();
  for (  JavaClass jClass : jClasses) {
    TypeInfo tInfo=getTypeInfo().get(jClass.getQualifiedName());
    if (tInfo.isTransient()) {
      continue;
    }
    String[] propOrder=tInfo.getPropOrder();
    boolean hasPropOrder=propOrder.length > 0 && !(propOrder.length == 1 && propOrder[0].equals(Constants.EMPTY_STRING));
    List<String> propOrderList=Arrays.asList(tInfo.getPropOrder());
    ArrayList<Property> propsList=tInfo.getPropertyList();
    for (int i=0; i < propsList.size(); i++) {
      Property p=propsList.get(i);
      if (p.isTransient() && propOrderList.contains(p.getPropertyName())) {
        throw org.eclipse.persistence.exceptions.JAXBException.transientInProporder(p.getPropertyName());
      }
      if (hasPropOrder && !p.isAttribute() && !p.isTransient()&& !p.isInverseReference()) {
        if (!propOrderList.contains(p.getPropertyName())) {
          throw JAXBException.missingPropertyInPropOrder(p.getPropertyName(),tInfo.getJavaClassName());
        }
      }
    }
    if (!jClass.isInterface() && !tInfo.isEnumerationType() && !jClass.isAbstract()) {
      if (tInfo.getFactoryMethodName() == null && tInfo.getObjectFactoryClassName() == null) {
        JavaConstructor zeroArgConstructor=jClass.getDeclaredConstructor(new JavaClass[]{});
        if (zeroArgConstructor == null) {
          if (tInfo.isSetXmlJavaTypeAdapter()) {
            tInfo.setTransient(true);
          }
 else {
            if (!referencedByTransformer.contains(jClass.getName())) {
              throw org.eclipse.persistence.exceptions.JAXBException.factoryMethodOrConstructorRequired(jClass.getName());
            }
          }
        }
      }
    }
    if (tInfo.getXmlValueProperty() != null) {
      validateXmlValueFieldOrProperty(jClass,tInfo.getXmlValueProperty());
    }
    Set<QName> referenceQNames=new HashSet<QName>();
    Map<QName,Set<QName>> referenceQNamesForWrapper=new HashMap<QName,Set<QName>>();
    List<Property> anyElementProperties=new ArrayList<Property>();
    for (    Property property : tInfo.getPropertyList()) {
      JavaClass typeClass=property.getActualType();
      if (property.isChoice()) {
        Collection<Property> choiceProps=property.getChoiceProperties();
        Iterator<Property> choicePropsIter=choiceProps.iterator();
        while (choicePropsIter.hasNext()) {
          Property nextChoiceProp=choicePropsIter.next();
          JavaClass nextChoicePropTypeClass=nextChoiceProp.getActualType();
          TypeInfo targetInfo=typeInfo.get(nextChoicePropTypeClass.getQualifiedName());
          finalizeProperty(property,targetInfo,nextChoicePropTypeClass,jClass);
        }
      }
 else {
        TypeInfo targetInfo=typeInfo.get(typeClass.getQualifiedName());
        finalizeProperty(property,targetInfo,typeClass,jClass);
      }
      if (tInfo.isSetXmlValueProperty()) {
        if (property.isXmlValue() && !(tInfo.getXmlValueProperty().getPropertyName().equals(property.getPropertyName()))) {
          throw JAXBException.xmlValueAlreadySet(property.getPropertyName(),tInfo.getXmlValueProperty().getPropertyName(),jClass.getName());
        }
        if (!property.isXmlValue() && !property.isAttribute() && !property.isInverseReference()&& !property.isTransient()) {
          throw JAXBException.propertyOrFieldShouldBeAnAttribute(property.getPropertyName());
        }
      }
      if (property.isReference()) {
        processReferenceProperty(property,tInfo,jClass,referenceQNames,referenceQNamesForWrapper);
      }
      if (property.isSwaAttachmentRef() && !this.hasSwaRef) {
        this.hasSwaRef=true;
      }
      if (property.isXmlId() && tInfo.getIDProperty() != null && !(tInfo.getIDProperty().getPropertyName().equals(property.getPropertyName()))) {
        throw JAXBException.idAlreadySet(property.getPropertyName(),tInfo.getIDProperty().getPropertyName(),jClass.getName());
      }
      if (property.isAnyAttribute() && tInfo.isSetAnyAttributePropertyName() && !(tInfo.getAnyAttributePropertyName().equals(property.getPropertyName()))) {
        throw JAXBException.multipleAnyAttributeMapping(jClass.getName());
      }
      if (property.isAny()) {
        if (!anyElementProperties.isEmpty()) {
          for (          Property nextAny : anyElementProperties) {
            if (!property.isSetXmlElementWrapper() && !nextAny.isSetXmlElementWrapper()) {
              throw JAXBException.xmlAnyElementAlreadySet(property.getPropertyName(),nextAny.getPropertyName(),jClass.getName());
            }
            org.eclipse.persistence.jaxb.xmlmodel.XmlElementWrapper wrapper=property.getXmlElementWrapper();
            org.eclipse.persistence.jaxb.xmlmodel.XmlElementWrapper targetWrapper=nextAny.getXmlElementWrapper();
            if (wrapper != null && targetWrapper != null) {
              if (wrapper.getName().equals(targetWrapper.getName()) && wrapper.getNamespace().equals(targetWrapper.getNamespace())) {
                throw JAXBException.xmlAnyElementAlreadySet(property.getPropertyName(),nextAny.getPropertyName(),jClass.getName());
              }
            }
          }
        }
        anyElementProperties.add(property);
      }
      if (property.isSwaAttachmentRef() && !areEquals(property.getActualType(),JAVAX_ACTIVATION_DATAHANDLER)) {
        throw JAXBException.invalidAttributeRef(property.getPropertyName(),jClass.getQualifiedName());
      }
      if (property.getXmlElementWrapper() != null) {
        if (!helper.isCollectionType(property.getType()) && !property.getType().isArray() && !helper.isMapType(property.getType())) {
          throw JAXBException.invalidElementWrapper(property.getPropertyName());
        }
      }
      if (property.isXmlTransformation()) {
        processXmlTransformationProperty(property);
      }
      if (property.isSetXmlJoinNodes()) {
        TypeInfo targetInfo=typeInfo.get(typeClass.getQualifiedName());
        if (targetInfo == null) {
          throw JAXBException.invalidXmlJoinNodeReferencedClass(property.getPropertyName(),typeClass.getQualifiedName());
        }
        if (targetInfo.getIDProperty() == null && targetInfo.getXmlKeyProperties() == null) {
          throw JAXBException.noKeyOrIDPropertyOnJoinTarget(jClass.getQualifiedName(),property.getPropertyName(),typeClass.getQualifiedName());
        }
      }
    }
  }
}