Program: 64573
Project: 64573
Buggy source:
public DatabaseMapping generateMappingForReferenceProperty(Property property,XMLDescriptor descriptor,NamespaceInfo namespaceInfo){
  boolean isCollection=isCollectionType(property) || property.getType().isArray();
  if (property.isAny()) {
    return generateAnyCollectionMapping(property,descriptor,namespaceInfo,true);
  }
  DatabaseMapping mapping;
  if (isCollection) {
    mapping=new XMLChoiceCollectionMapping();
    initializeXMLContainerMapping((XMLChoiceCollectionMapping)mapping);
    JavaClass collectionType=property.getType();
    collectionType=containerClassImpl(collectionType);
    ((XMLChoiceCollectionMapping)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()));
    }
    ((XMLChoiceCollectionMapping)mapping).setConverter(jaxbERConverter);
    if (property.isSetWriteOnly()) {
      ((XMLChoiceCollectionMapping)mapping).setIsWriteOnly(property.isWriteOnly());
    }
    if (property.isSetXmlElementWrapper()) {
      ((XMLChoiceCollectionMapping)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()));
    }
    ((XMLChoiceObjectMapping)mapping).setConverter(jaxbERConverter);
    if (property.isSetWriteOnly()) {
      ((XMLChoiceObjectMapping)mapping).setIsWriteOnly(property.isWriteOnly());
    }
  }
  if (property.isSetReadOnly()) {
    mapping.setIsReadOnly(property.isReadOnly());
  }
  mapping.setAttributeName(property.getPropertyName());
  if (property.isMethodProperty()) {
    if (property.getGetMethodName() == null) {
      String paramTypeAsString=property.getType().getName();
      mapping.setAttributeAccessor(new JAXBSetMethodAttributeAccessor(paramTypeAsString,helper.getClassLoader()));
      mapping.setIsReadOnly(true);
      mapping.setSetMethodName(property.getSetMethodName());
    }
 else     if (property.getSetMethodName() == null) {
      mapping.setGetMethodName(property.getGetMethodName());
      ((XMLMapping)mapping).setIsWriteOnly(true);
    }
 else {
      mapping.setSetMethodName(property.getSetMethodName());
      mapping.setGetMethodName(property.getGetMethodName());
    }
  }
  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(),null);
      wrapperXPath+=getQualifiedString(prefix,wrapper.getName() + "String_Node_Str");
    }
  }
  if (property.isMixedContent() && isCollection) {
    if (wrapperXPath.length() == 0) {
      ((XMLChoiceCollectionMapping)mapping).setMixedContent(true);
    }
 else {
      ((XMLChoiceCollectionMapping)mapping).setMixedContent(wrapperXPath.substring(0,wrapperXPath.length() - 1));
    }
  }
  for (  ElementDeclaration element : referencedElements) {
    QName elementName=element.getElementName();
    JavaClass pType=element.getJavaType();
    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;
    XMLField xmlField=this.getXPathForElement(xPath,elementName,namespaceInfo,isText);
    if (helper.getXMLToJavaTypeMap().get(element.getJavaType().getRawName()) == XMLConstants.BASE_64_BINARY_QNAME) {
      xmlField.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME);
    }
    if (areEquals(pType,Object.class)) {
      xmlField.setIsTypedTextField(true);
      xmlField.setSchemaType(XMLConstants.ANY_TYPE_QNAME);
    }
    DatabaseMapping nestedMapping;
    AbstractNullPolicy nullPolicy=null;
    if (isCollection) {
      XMLChoiceCollectionMapping xmlChoiceCollectionMapping=(XMLChoiceCollectionMapping)mapping;
      xmlChoiceCollectionMapping.addChoiceElement(xmlField,element.getJavaTypeName());
      nestedMapping=(DatabaseMapping)xmlChoiceCollectionMapping.getChoiceElementMappings().get(xmlField);
      if (nestedMapping.isAbstractCompositeCollectionMapping()) {
        ((XMLCompositeCollectionMapping)nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
        nullPolicy=((XMLCompositeCollectionMapping)nestedMapping).getNullPolicy();
      }
      if (nestedMapping.isAbstractCompositeDirectCollectionMapping()) {
        XMLCompositeDirectCollectionMapping nestedCompositeDirectCollectionMapping=(XMLCompositeDirectCollectionMapping)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(element.getJavaType().getQualifiedName());
          ((XMLCompositeDirectCollectionMapping)nestedMapping).setValueConverter(listConverter);
        }
      }
 else       if (nestedMapping instanceof XMLBinaryDataCollectionMapping) {
        nullPolicy=((XMLBinaryDataCollectionMapping)nestedMapping).getNullPolicy();
      }
    }
 else {
      XMLChoiceObjectMapping xmlChoiceObjectMapping=(XMLChoiceObjectMapping)mapping;
      xmlChoiceObjectMapping.addChoiceElement(xmlField,element.getJavaTypeName());
      nestedMapping=(DatabaseMapping)xmlChoiceObjectMapping.getChoiceElementMappings().get(xmlField);
      if (pType.isEnum()) {
        TypeInfo enumTypeInfo=typeInfo.get(pType.getQualifiedName());
        ((XMLDirectMapping)nestedMapping).setConverter(buildJAXBEnumTypeConverter(nestedMapping,(EnumTypeInfo)enumTypeInfo));
      }
      if (nestedMapping.isAbstractCompositeObjectMapping()) {
        ((XMLCompositeObjectMapping)nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
        nullPolicy=((XMLCompositeObjectMapping)nestedMapping).getNullPolicy();
      }
 else       if (nestedMapping instanceof XMLBinaryDataMapping) {
        nullPolicy=((XMLBinaryDataMapping)nestedMapping).getNullPolicy();
      }
 else       if (nestedMapping instanceof XMLDirectMapping) {
        nullPolicy=((XMLDirectMapping)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=helper.getClassForJavaClass(element.getJavaType());
      JAXBElementConverter converter=new JAXBElementConverter(xmlField,declaredType,scopeClass);
      if (isCollection) {
        XMLChoiceCollectionMapping xmlChoiceCollectionMapping=(XMLChoiceCollectionMapping)mapping;
        Converter originalConverter=xmlChoiceCollectionMapping.getConverter(xmlField);
        converter.setNestedConverter(originalConverter);
        xmlChoiceCollectionMapping.addConverter(xmlField,converter);
      }
 else {
        XMLChoiceObjectMapping xmlChoiceObjectMapping=(XMLChoiceObjectMapping)mapping;
        Converter originalConverter=xmlChoiceObjectMapping.getConverter(xmlField);
        converter.setNestedConverter(originalConverter);
        xmlChoiceObjectMapping.addConverter(xmlField,converter);
      }
    }
  }
  return mapping;
}

Fixed version (ground truth):
public DatabaseMapping generateMappingForReferenceProperty(Property property,XMLDescriptor descriptor,NamespaceInfo namespaceInfo){
  boolean isCollection=helper.isCollectionType(property.getType()) || property.getType().isArray();
  if (property.isAny()) {
    return generateAnyCollectionMapping(property,descriptor,namespaceInfo,true);
  }
  DatabaseMapping mapping;
  if (isCollection) {
    mapping=new XMLChoiceCollectionMapping();
    initializeXMLContainerMapping((XMLChoiceCollectionMapping)mapping);
    JavaClass collectionType=property.getType();
    collectionType=containerClassImpl(collectionType);
    ((XMLChoiceCollectionMapping)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()));
    }
    ((XMLChoiceCollectionMapping)mapping).setConverter(jaxbERConverter);
    if (property.isSetWriteOnly()) {
      ((XMLChoiceCollectionMapping)mapping).setIsWriteOnly(property.isWriteOnly());
    }
    if (property.isSetXmlElementWrapper()) {
      ((XMLChoiceCollectionMapping)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()));
    }
    ((XMLChoiceObjectMapping)mapping).setConverter(jaxbERConverter);
    if (property.isSetWriteOnly()) {
      ((XMLChoiceObjectMapping)mapping).setIsWriteOnly(property.isWriteOnly());
    }
  }
  if (property.isSetReadOnly()) {
    mapping.setIsReadOnly(property.isReadOnly());
  }
  mapping.setAttributeName(property.getPropertyName());
  if (property.isMethodProperty()) {
    if (property.getGetMethodName() == null) {
      String paramTypeAsString=property.getType().getName();
      mapping.setAttributeAccessor(new JAXBSetMethodAttributeAccessor(paramTypeAsString,helper.getClassLoader()));
      mapping.setIsReadOnly(true);
      mapping.setSetMethodName(property.getSetMethodName());
    }
 else     if (property.getSetMethodName() == null) {
      mapping.setGetMethodName(property.getGetMethodName());
      ((XMLMapping)mapping).setIsWriteOnly(true);
    }
 else {
      mapping.setSetMethodName(property.getSetMethodName());
      mapping.setGetMethodName(property.getGetMethodName());
    }
  }
  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(),null);
      wrapperXPath+=getQualifiedString(prefix,wrapper.getName() + "String_Node_Str");
    }
  }
  if (property.isMixedContent() && isCollection) {
    if (wrapperXPath.length() == 0) {
      ((XMLChoiceCollectionMapping)mapping).setMixedContent(true);
    }
 else {
      ((XMLChoiceCollectionMapping)mapping).setMixedContent(wrapperXPath.substring(0,wrapperXPath.length() - 1));
    }
  }
  for (  ElementDeclaration element : referencedElements) {
    QName elementName=element.getElementName();
    JavaClass pType=element.getJavaType();
    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;
    XMLField xmlField=this.getXPathForElement(xPath,elementName,namespaceInfo,isText);
    if (helper.getXMLToJavaTypeMap().get(element.getJavaType().getRawName()) == XMLConstants.BASE_64_BINARY_QNAME) {
      xmlField.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME);
    }
    if (areEquals(pType,Object.class)) {
      xmlField.setIsTypedTextField(true);
      xmlField.setSchemaType(XMLConstants.ANY_TYPE_QNAME);
    }
    DatabaseMapping nestedMapping;
    AbstractNullPolicy nullPolicy=null;
    if (isCollection) {
      XMLChoiceCollectionMapping xmlChoiceCollectionMapping=(XMLChoiceCollectionMapping)mapping;
      xmlChoiceCollectionMapping.addChoiceElement(xmlField,element.getJavaTypeName());
      nestedMapping=(DatabaseMapping)xmlChoiceCollectionMapping.getChoiceElementMappings().get(xmlField);
      if (nestedMapping.isAbstractCompositeCollectionMapping()) {
        ((XMLCompositeCollectionMapping)nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
        nullPolicy=((XMLCompositeCollectionMapping)nestedMapping).getNullPolicy();
      }
      if (nestedMapping.isAbstractCompositeDirectCollectionMapping()) {
        XMLCompositeDirectCollectionMapping nestedCompositeDirectCollectionMapping=(XMLCompositeDirectCollectionMapping)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(element.getJavaType().getQualifiedName());
          ((XMLCompositeDirectCollectionMapping)nestedMapping).setValueConverter(listConverter);
        }
      }
 else       if (nestedMapping instanceof XMLBinaryDataCollectionMapping) {
        nullPolicy=((XMLBinaryDataCollectionMapping)nestedMapping).getNullPolicy();
      }
    }
 else {
      XMLChoiceObjectMapping xmlChoiceObjectMapping=(XMLChoiceObjectMapping)mapping;
      xmlChoiceObjectMapping.addChoiceElement(xmlField,element.getJavaTypeName());
      nestedMapping=(DatabaseMapping)xmlChoiceObjectMapping.getChoiceElementMappings().get(xmlField);
      if (pType.isEnum()) {
        TypeInfo enumTypeInfo=typeInfo.get(pType.getQualifiedName());
        ((XMLDirectMapping)nestedMapping).setConverter(buildJAXBEnumTypeConverter(nestedMapping,(EnumTypeInfo)enumTypeInfo));
      }
      if (nestedMapping.isAbstractCompositeObjectMapping()) {
        ((XMLCompositeObjectMapping)nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
        nullPolicy=((XMLCompositeObjectMapping)nestedMapping).getNullPolicy();
      }
 else       if (nestedMapping instanceof XMLBinaryDataMapping) {
        nullPolicy=((XMLBinaryDataMapping)nestedMapping).getNullPolicy();
      }
 else       if (nestedMapping instanceof XMLDirectMapping) {
        nullPolicy=((XMLDirectMapping)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=helper.getClassForJavaClass(element.getJavaType());
      JAXBElementConverter converter=new JAXBElementConverter(xmlField,declaredType,scopeClass);
      if (isCollection) {
        XMLChoiceCollectionMapping xmlChoiceCollectionMapping=(XMLChoiceCollectionMapping)mapping;
        Converter originalConverter=xmlChoiceCollectionMapping.getConverter(xmlField);
        converter.setNestedConverter(originalConverter);
        xmlChoiceCollectionMapping.addConverter(xmlField,converter);
      }
 else {
        XMLChoiceObjectMapping xmlChoiceObjectMapping=(XMLChoiceObjectMapping)mapping;
        Converter originalConverter=xmlChoiceObjectMapping.getConverter(xmlField);
        converter.setNestedConverter(originalConverter);
        xmlChoiceObjectMapping.addConverter(xmlField,converter);
      }
    }
  }
  return mapping;
}