Program: 63662
Project: 63662
Buggy source:
public Mapping generateMappingForReferenceProperty(Property property,Descriptor descriptor,NamespaceInfo namespaceInfo){
  boolean isCollection=helper.isCollectionType(property.getType()) || property.getType().isArray();
  Mapping mapping;
  if (isCollection) {
    mapping=new XMLChoiceCollectionMapping();
    initializeXMLContainerMapping((ChoiceCollectionMapping)mapping,property.getType().isArray());
    JavaClass collectionType=property.getType();
    collectionType=containerClassImpl(collectionType);
    ((ChoiceCollectionMapping)mapping).useCollectionClassName(collectionType.getRawName());
    JAXBElementRootConverter jaxbERConverter=new JAXBElementRootConverter(Object.class);
    if (property.isSetXmlJavaTypeAdapter()) {
      JavaClass adapterClass=helper.getJavaClass(property.getXmlJavaTypeAdapter().getValue());
      jaxbERConverter.setNestedConverter(new XMLJavaTypeConverter(adapterClass.getQualifiedName()));
    }
    ((ChoiceCollectionMapping)mapping).setConverter(jaxbERConverter);
    if (property.isSetWriteOnly()) {
      ((ChoiceCollectionMapping)mapping).setIsWriteOnly(property.isWriteOnly());
    }
    if (property.isSetXmlElementWrapper()) {
      ((ChoiceCollectionMapping)mapping).setWrapperNullPolicy(getWrapperNullPolicyFromProperty(property));
    }
  }
 else {
    mapping=new XMLChoiceObjectMapping();
    JAXBElementRootConverter jaxbERConverter=new JAXBElementRootConverter(Object.class);
    if (property.isSetXmlJavaTypeAdapter()) {
      JavaClass adapterClass=helper.getJavaClass(property.getXmlJavaTypeAdapter().getValue());
      jaxbERConverter.setNestedConverter(new XMLJavaTypeConverter(adapterClass.getQualifiedName()));
    }
    ((ChoiceObjectMapping)mapping).setConverter(jaxbERConverter);
    if (property.isSetWriteOnly()) {
      ((ChoiceObjectMapping)mapping).setIsWriteOnly(property.isWriteOnly());
    }
  }
  initializeXMLMapping((XMLMapping)mapping,property);
  List<ElementDeclaration> referencedElements=property.getReferencedElements();
  JavaClass propertyType=property.getType();
  if (propertyType.isArray()) {
    JAXBArrayAttributeAccessor accessor=new JAXBArrayAttributeAccessor(mapping.getAttributeAccessor(),mapping.getContainerPolicy(),helper.getClassLoader());
    accessor.setComponentClassName(property.getType().getComponentType().getQualifiedName());
    JavaClass componentType=propertyType.getComponentType();
    if (componentType.isArray()) {
      Class adaptedClass=classToGeneratedClasses.get(componentType.getQualifiedName());
      accessor.setAdaptedClassName(adaptedClass.getName());
    }
    mapping.setAttributeAccessor(accessor);
  }
  String wrapperXPath="String_Node_Str";
  if (property.isSetXmlElementWrapper()) {
    XmlElementWrapper wrapper=property.getXmlElementWrapper();
    String namespace=wrapper.getNamespace();
    if (namespace.equals(XMLProcessor.DEFAULT)) {
      if (namespaceInfo.isElementFormQualified()) {
        namespace=namespaceInfo.getNamespace();
      }
 else {
        namespace="String_Node_Str";
      }
    }
    if (namespace.equals("String_Node_Str")) {
      wrapperXPath+=(wrapper.getName() + "String_Node_Str");
    }
 else {
      String prefix=getPrefixForNamespace(namespace,namespaceInfo.getNamespaceResolver());
      wrapperXPath+=getQualifiedString(prefix,wrapper.getName() + "String_Node_Str");
    }
  }
  if (property.isMixedContent() && isCollection) {
    if (wrapperXPath.length() == 0) {
      ((ChoiceCollectionMapping)mapping).setMixedContent(true);
    }
 else {
      ((ChoiceCollectionMapping)mapping).setMixedContent(wrapperXPath.substring(0,wrapperXPath.length() - 1));
    }
  }
  for (  ElementDeclaration element : referencedElements) {
    QName elementName=element.getElementName();
    JavaClass pType=element.getJavaType();
    String pTypeName=element.getJavaTypeName();
    boolean isBinaryType=(areEquals(pType,AnnotationsProcessor.JAVAX_ACTIVATION_DATAHANDLER) || areEquals(pType,byte[].class) || areEquals(pType,Image.class)|| areEquals(pType,Source.class)|| areEquals(pType,AnnotationsProcessor.JAVAX_MAIL_INTERNET_MIMEMULTIPART));
    boolean isText=pType.isEnum() || (!isBinaryType && !(this.typeInfo.containsKey(element.getJavaTypeName())) && !(element.getJavaTypeName().equals(OBJECT_CLASS_NAME)));
    String xPath=wrapperXPath;
    Field xmlField=this.getXPathForElement(xPath,elementName,namespaceInfo,isText);
    if (helper.getXMLToJavaTypeMap().get(pType.getRawName()) == Constants.BASE_64_BINARY_QNAME) {
      xmlField.setSchemaType(Constants.BASE_64_BINARY_QNAME);
    }
    if (areEquals(pType,Object.class)) {
      setTypedTextField(xmlField);
    }
    Mapping nestedMapping;
    AbstractNullPolicy nullPolicy=null;
    if (isCollection) {
      ChoiceCollectionMapping xmlChoiceCollectionMapping=(ChoiceCollectionMapping)mapping;
      xmlChoiceCollectionMapping.addChoiceElement(xmlField,pTypeName);
      nestedMapping=(Mapping)xmlChoiceCollectionMapping.getChoiceElementMappings().get(xmlField);
      if (nestedMapping.isAbstractCompositeCollectionMapping()) {
        ((CompositeCollectionMapping)nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
        nullPolicy=((CompositeCollectionMapping)nestedMapping).getNullPolicy();
      }
      if (nestedMapping.isAbstractCompositeDirectCollectionMapping()) {
        DirectCollectionMapping nestedCompositeDirectCollectionMapping=(DirectCollectionMapping)nestedMapping;
        nullPolicy=nestedCompositeDirectCollectionMapping.getNullPolicy();
        if (pType.isEnum()) {
          TypeInfo enumTypeInfo=typeInfo.get(pType.getQualifiedName());
          nestedCompositeDirectCollectionMapping.setValueConverter(buildJAXBEnumTypeConverter(nestedCompositeDirectCollectionMapping,(EnumTypeInfo)enumTypeInfo));
        }
        if (element.isList()) {
          XMLListConverter listConverter=new XMLListConverter();
          listConverter.setObjectClassName(pType.getQualifiedName());
          ((DirectCollectionMapping)nestedMapping).setValueConverter(listConverter);
        }
      }
 else       if (nestedMapping instanceof BinaryDataCollectionMapping) {
        nullPolicy=((BinaryDataCollectionMapping)nestedMapping).getNullPolicy();
        if (element.isList()) {
          ((XMLField)((BinaryDataCollectionMapping)nestedMapping).getField()).setUsesSingleNode(true);
        }
      }
    }
 else {
      ChoiceObjectMapping xmlChoiceObjectMapping=(ChoiceObjectMapping)mapping;
      xmlChoiceObjectMapping.addChoiceElement(xmlField,pTypeName);
      nestedMapping=(Mapping)xmlChoiceObjectMapping.getChoiceElementMappings().get(xmlField);
      if (pType.isEnum()) {
        TypeInfo enumTypeInfo=typeInfo.get(pType.getQualifiedName());
        ((DirectMapping)nestedMapping).setConverter(buildJAXBEnumTypeConverter(nestedMapping,(EnumTypeInfo)enumTypeInfo));
      }
      if (nestedMapping.isAbstractCompositeObjectMapping()) {
        ((CompositeObjectMapping)nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
        nullPolicy=((CompositeObjectMapping)nestedMapping).getNullPolicy();
      }
 else       if (nestedMapping instanceof BinaryDataMapping) {
        nullPolicy=((BinaryDataMapping)nestedMapping).getNullPolicy();
      }
 else       if (nestedMapping instanceof DirectMapping) {
        nullPolicy=((DirectMapping)nestedMapping).getNullPolicy();
      }
    }
    if (nullPolicy != null) {
      nullPolicy.setNullRepresentedByEmptyNode(false);
      nullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);
      nullPolicy.setNullRepresentedByXsiNil(true);
    }
    if (!element.isXmlRootElement()) {
      Class scopeClass=element.getScopeClass();
      if (scopeClass == javax.xml.bind.annotation.XmlElementDecl.GLOBAL.class) {
        scopeClass=JAXBElement.GlobalScope.class;
      }
      Class declaredType=null;
      if (element.getAdaptedJavaType() != null) {
        declaredType=org.eclipse.persistence.internal.helper.Helper.getClassFromClasseName(element.getAdaptedJavaType().getQualifiedName(),helper.getClassLoader());
      }
 else {
        declaredType=org.eclipse.persistence.internal.helper.Helper.getClassFromClasseName(pType.getQualifiedName(),helper.getClassLoader());
      }
      JAXBElementConverter converter=new JAXBElementConverter(xmlField,declaredType,scopeClass);
      if (isCollection) {
        ChoiceCollectionMapping xmlChoiceCollectionMapping=(ChoiceCollectionMapping)mapping;
        if (element.getJavaTypeAdapterClass() != null) {
          converter.setNestedConverter(new XMLJavaTypeConverter(element.getJavaTypeAdapterClass().getName()));
        }
 else {
          CoreConverter originalConverter=xmlChoiceCollectionMapping.getConverter(xmlField);
          converter.setNestedConverter(originalConverter);
        }
        xmlChoiceCollectionMapping.addConverter(xmlField,converter);
      }
 else {
        ChoiceObjectMapping xmlChoiceObjectMapping=(ChoiceObjectMapping)mapping;
        if (element.getJavaTypeAdapterClass() != null) {
          converter.setNestedConverter(new XMLJavaTypeConverter(element.getJavaTypeAdapterClass().getName()));
        }
 else {
          CoreConverter originalConverter=xmlChoiceObjectMapping.getConverter(xmlField);
          converter.setNestedConverter(originalConverter);
        }
        xmlChoiceObjectMapping.addConverter(xmlField,converter);
      }
    }
  }
  if (property.isAny()) {
    if (isCollection) {
      XMLChoiceCollectionMapping xmlChoiceCollectionMapping=(XMLChoiceCollectionMapping)mapping;
      xmlChoiceCollectionMapping.setIsAny(true);
    }
 else {
      XMLChoiceObjectMapping xmlChoiceObjectMapping=(XMLChoiceObjectMapping)mapping;
    }
  }
  return mapping;
}

Fixed version (ground truth):
public Mapping generateMappingForReferenceProperty(Property property,Descriptor descriptor,NamespaceInfo namespaceInfo){
  boolean isCollection=helper.isCollectionType(property.getType()) || property.getType().isArray();
  Mapping mapping;
  if (isCollection) {
    mapping=new XMLChoiceCollectionMapping();
    initializeXMLContainerMapping((ChoiceCollectionMapping)mapping,property.getType().isArray());
    JavaClass collectionType=property.getType();
    collectionType=containerClassImpl(collectionType);
    ((ChoiceCollectionMapping)mapping).useCollectionClassName(collectionType.getRawName());
    JAXBElementRootConverter jaxbERConverter=new JAXBElementRootConverter(Object.class);
    if (property.isSetXmlJavaTypeAdapter()) {
      JavaClass adapterClass=helper.getJavaClass(property.getXmlJavaTypeAdapter().getValue());
      jaxbERConverter.setNestedConverter(new XMLJavaTypeConverter(adapterClass.getQualifiedName()));
    }
    ((ChoiceCollectionMapping)mapping).setConverter(jaxbERConverter);
    if (property.isSetWriteOnly()) {
      ((ChoiceCollectionMapping)mapping).setIsWriteOnly(property.isWriteOnly());
    }
    if (property.isSetXmlElementWrapper()) {
      ((ChoiceCollectionMapping)mapping).setWrapperNullPolicy(getWrapperNullPolicyFromProperty(property));
    }
  }
 else {
    mapping=new XMLChoiceObjectMapping();
    JAXBElementRootConverter jaxbERConverter=new JAXBElementRootConverter(Object.class);
    if (property.isSetXmlJavaTypeAdapter()) {
      JavaClass adapterClass=helper.getJavaClass(property.getXmlJavaTypeAdapter().getValue());
      jaxbERConverter.setNestedConverter(new XMLJavaTypeConverter(adapterClass.getQualifiedName()));
    }
    ((ChoiceObjectMapping)mapping).setConverter(jaxbERConverter);
    if (property.isSetWriteOnly()) {
      ((ChoiceObjectMapping)mapping).setIsWriteOnly(property.isWriteOnly());
    }
  }
  initializeXMLMapping((XMLMapping)mapping,property);
  List<ElementDeclaration> referencedElements=property.getReferencedElements();
  JavaClass propertyType=property.getType();
  if (propertyType.isArray()) {
    JAXBArrayAttributeAccessor accessor=new JAXBArrayAttributeAccessor(mapping.getAttributeAccessor(),mapping.getContainerPolicy(),helper.getClassLoader());
    accessor.setComponentClassName(property.getType().getComponentType().getQualifiedName());
    JavaClass componentType=propertyType.getComponentType();
    if (componentType.isArray()) {
      Class adaptedClass=classToGeneratedClasses.get(componentType.getQualifiedName());
      accessor.setAdaptedClassName(adaptedClass.getName());
    }
    mapping.setAttributeAccessor(accessor);
  }
  String wrapperXPath="String_Node_Str";
  if (property.isSetXmlElementWrapper()) {
    XmlElementWrapper wrapper=property.getXmlElementWrapper();
    String namespace=wrapper.getNamespace();
    if (namespace.equals(XMLProcessor.DEFAULT)) {
      if (namespaceInfo.isElementFormQualified()) {
        namespace=namespaceInfo.getNamespace();
      }
 else {
        namespace="String_Node_Str";
      }
    }
    if (namespace.equals("String_Node_Str")) {
      wrapperXPath+=(wrapper.getName() + "String_Node_Str");
    }
 else {
      String prefix=getPrefixForNamespace(namespace,namespaceInfo.getNamespaceResolver());
      wrapperXPath+=getQualifiedString(prefix,wrapper.getName() + "String_Node_Str");
    }
  }
  if (property.isMixedContent() && isCollection) {
    if (wrapperXPath.length() == 0) {
      ((ChoiceCollectionMapping)mapping).setMixedContent(true);
    }
 else {
      ((ChoiceCollectionMapping)mapping).setMixedContent(wrapperXPath.substring(0,wrapperXPath.length() - 1));
    }
  }
  for (  ElementDeclaration element : referencedElements) {
    QName elementName=element.getElementName();
    JavaClass pType=element.getJavaType();
    String pTypeName=element.getJavaTypeName();
    boolean isBinaryType=(areEquals(pType,AnnotationsProcessor.JAVAX_ACTIVATION_DATAHANDLER) || areEquals(pType,byte[].class) || areEquals(pType,Image.class)|| areEquals(pType,Source.class)|| areEquals(pType,AnnotationsProcessor.JAVAX_MAIL_INTERNET_MIMEMULTIPART));
    boolean isText=pType.isEnum() || (!isBinaryType && !(this.typeInfo.containsKey(element.getJavaTypeName())) && !(element.getJavaTypeName().equals(OBJECT_CLASS_NAME)));
    String xPath=wrapperXPath;
    Field xmlField=this.getXPathForElement(xPath,elementName,namespaceInfo,isText);
    if (helper.getXMLToJavaTypeMap().get(pType.getRawName()) == Constants.BASE_64_BINARY_QNAME) {
      xmlField.setSchemaType(Constants.BASE_64_BINARY_QNAME);
    }
    if (areEquals(pType,Object.class)) {
      setTypedTextField(xmlField);
    }
    Mapping nestedMapping;
    AbstractNullPolicy nullPolicy=null;
    if (isCollection) {
      ChoiceCollectionMapping xmlChoiceCollectionMapping=(ChoiceCollectionMapping)mapping;
      xmlChoiceCollectionMapping.addChoiceElement(xmlField,pTypeName);
      nestedMapping=(Mapping)xmlChoiceCollectionMapping.getChoiceElementMappings().get(xmlField);
      if (nestedMapping.isAbstractCompositeCollectionMapping()) {
        ((CompositeCollectionMapping)nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
        nullPolicy=((CompositeCollectionMapping)nestedMapping).getNullPolicy();
      }
      if (nestedMapping.isAbstractCompositeDirectCollectionMapping()) {
        DirectCollectionMapping nestedCompositeDirectCollectionMapping=(DirectCollectionMapping)nestedMapping;
        nullPolicy=nestedCompositeDirectCollectionMapping.getNullPolicy();
        if (pType.isEnum()) {
          TypeInfo enumTypeInfo=typeInfo.get(pType.getQualifiedName());
          nestedCompositeDirectCollectionMapping.setValueConverter(buildJAXBEnumTypeConverter(nestedCompositeDirectCollectionMapping,(EnumTypeInfo)enumTypeInfo));
        }
        if (element.isList()) {
          XMLListConverter listConverter=new XMLListConverter();
          listConverter.setObjectClassName(pType.getQualifiedName());
          ((DirectCollectionMapping)nestedMapping).setValueConverter(listConverter);
        }
      }
 else       if (nestedMapping instanceof BinaryDataCollectionMapping) {
        nullPolicy=((BinaryDataCollectionMapping)nestedMapping).getNullPolicy();
        if (element.isList()) {
          ((XMLField)((BinaryDataCollectionMapping)nestedMapping).getField()).setUsesSingleNode(true);
        }
      }
    }
 else {
      ChoiceObjectMapping xmlChoiceObjectMapping=(ChoiceObjectMapping)mapping;
      xmlChoiceObjectMapping.addChoiceElement(xmlField,pTypeName);
      nestedMapping=(Mapping)xmlChoiceObjectMapping.getChoiceElementMappings().get(xmlField);
      if (pType.isEnum()) {
        TypeInfo enumTypeInfo=typeInfo.get(pType.getQualifiedName());
        ((DirectMapping)nestedMapping).setConverter(buildJAXBEnumTypeConverter(nestedMapping,(EnumTypeInfo)enumTypeInfo));
      }
      if (nestedMapping.isAbstractCompositeObjectMapping()) {
        ((CompositeObjectMapping)nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
        nullPolicy=((CompositeObjectMapping)nestedMapping).getNullPolicy();
      }
 else       if (nestedMapping instanceof BinaryDataMapping) {
        nullPolicy=((BinaryDataMapping)nestedMapping).getNullPolicy();
      }
 else       if (nestedMapping instanceof DirectMapping) {
        nullPolicy=((DirectMapping)nestedMapping).getNullPolicy();
      }
    }
    if (nullPolicy != null) {
      nullPolicy.setNullRepresentedByEmptyNode(false);
      nullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);
      nullPolicy.setNullRepresentedByXsiNil(true);
    }
    if (!element.isXmlRootElement()) {
      Class scopeClass=element.getScopeClass();
      if (scopeClass == javax.xml.bind.annotation.XmlElementDecl.GLOBAL.class) {
        scopeClass=JAXBElement.GlobalScope.class;
      }
      Class declaredType=null;
      if (element.getAdaptedJavaType() != null) {
        declaredType=org.eclipse.persistence.internal.helper.Helper.getClassFromClasseName(element.getAdaptedJavaType().getQualifiedName(),helper.getClassLoader());
      }
 else {
        declaredType=org.eclipse.persistence.internal.helper.Helper.getClassFromClasseName(pType.getQualifiedName(),helper.getClassLoader());
      }
      JAXBElementConverter converter=new JAXBElementConverter(xmlField,declaredType,scopeClass);
      if (isCollection) {
        ChoiceCollectionMapping xmlChoiceCollectionMapping=(ChoiceCollectionMapping)mapping;
        if (element.getJavaTypeAdapterClass() != null) {
          converter.setNestedConverter(new XMLJavaTypeConverter(element.getJavaTypeAdapterClass().getName()));
        }
 else {
          CoreConverter originalConverter=xmlChoiceCollectionMapping.getConverter(xmlField);
          converter.setNestedConverter(originalConverter);
        }
        xmlChoiceCollectionMapping.addConverter(xmlField,converter);
      }
 else {
        ChoiceObjectMapping xmlChoiceObjectMapping=(ChoiceObjectMapping)mapping;
        if (element.getJavaTypeAdapterClass() != null) {
          converter.setNestedConverter(new XMLJavaTypeConverter(element.getJavaTypeAdapterClass().getName()));
        }
 else {
          CoreConverter originalConverter=xmlChoiceObjectMapping.getConverter(xmlField);
          converter.setNestedConverter(originalConverter);
        }
        xmlChoiceObjectMapping.addConverter(xmlField,converter);
      }
    }
  }
  if (property.isAny()) {
    if (isCollection) {
      XMLChoiceCollectionMapping xmlChoiceCollectionMapping=(XMLChoiceCollectionMapping)mapping;
      xmlChoiceCollectionMapping.setIsAny(true);
    }
  }
  return mapping;
}