Program: 160522
Project: 160522
Buggy source:
@SuppressWarnings("String_Node_Str") private IdEObject copy(EClass originalEClass,IdEObject original) throws IfcModelInterfaceException {
  if (!((IdEObjectImpl)original).isLoadedOrLoading()) {
    return null;
  }
  if (converted.containsKey(original)) {
    return converted.get(original);
  }
  IdEObject newObject=(IdEObject)objectFactory.create(original.eClass());
  if (keepOriginalOids) {
    ((IdEObjectImpl)newObject).setOid(original.getOid());
  }
 else {
    if (newObject.getOid() == -1) {
      if (oidProvider != null) {
        ((IdEObjectImpl)newObject).setOid(oidProvider.newOid(newObject.eClass()));
      }
 else {
        ((IdEObjectImpl)newObject).setOid(original.getOid());
      }
    }
  }
  converted.put(original,newObject);
  if (newObject.eClass().getEAnnotation("String_Node_Str") == null) {
    targetModel.add(newObject.getOid(),newObject);
  }
  for (  EStructuralFeature eStructuralFeature : original.eClass().getEAllStructuralFeatures()) {
    if (objectIDM == null || objectIDM.shouldFollowReference(originalEClass,original.eClass(),eStructuralFeature)) {
      Object get=original.eGet(eStructuralFeature);
      if (eStructuralFeature instanceof EAttribute) {
        if (get instanceof Double) {
          EStructuralFeature doubleStringFeature=original.eClass().getEStructuralFeature("String_Node_Str");
          if (doubleStringFeature != null) {
            Object doubleString=original.eGet(doubleStringFeature);
            newObject.eSet(doubleStringFeature,doubleString);
          }
 else {
            newObject.eSet(eStructuralFeature,get);
          }
        }
 else {
          newObject.eSet(eStructuralFeature,get);
        }
      }
 else       if (eStructuralFeature instanceof EReference) {
        if (get == null) {
        }
 else {
          if (eStructuralFeature.isMany()) {
            EList<EObject> list=(EList<EObject>)get;
            AbstractEList<EObject> toList=(AbstractEList<EObject>)newObject.eGet(eStructuralFeature);
            for (            Object o : list) {
              if (converted.containsKey(o)) {
                toList.addUnique(converted.get(o));
              }
 else {
                IdEObject result=copy(originalEClass,(IdEObject)o);
                if (result != null) {
                  toList.addUnique(result);
                }
              }
            }
          }
 else {
            if (converted.containsKey(get)) {
              newObject.eSet(eStructuralFeature,converted.get(get));
            }
 else {
              newObject.eSet(eStructuralFeature,copy(originalEClass,(IdEObject)get));
            }
          }
        }
      }
    }
  }
  return newObject;
}

Fixed version (ground truth):
@SuppressWarnings("String_Node_Str") private IdEObject copy(EClass originalEClass,IdEObject original) throws IfcModelInterfaceException {
  if (!((IdEObjectImpl)original).isLoadedOrLoading()) {
    return null;
  }
  if (converted.containsKey(original)) {
    return converted.get(original);
  }
  IdEObject newObject=(IdEObject)objectFactory.create(original.eClass());
  if (keepOriginalOids) {
    ((IdEObjectImpl)newObject).setOid(original.getOid());
  }
 else {
    if (newObject.getOid() == -1) {
      if (oidProvider != null) {
        ((IdEObjectImpl)newObject).setOid(oidProvider.newOid(newObject.eClass()));
      }
 else {
        ((IdEObjectImpl)newObject).setOid(original.getOid());
      }
    }
  }
  converted.put(original,newObject);
  if (newObject.eClass().getEAnnotation("String_Node_Str") == null) {
    targetModel.add(newObject.getOid(),newObject);
  }
  if (inverseFixes.containsKey(original.getOid())) {
    InverseFix inverseFix=inverseFixes.get(original.getOid());
    inverseFix.apply(newObject);
  }
  for (  EStructuralFeature eStructuralFeature : original.eClass().getEAllStructuralFeatures()) {
    boolean canFollow=objectIDM == null || objectIDM.shouldFollowReference(originalEClass,original.eClass(),eStructuralFeature);
    Object get=original.eGet(eStructuralFeature);
    if (eStructuralFeature instanceof EAttribute) {
      if (get instanceof Double) {
        EStructuralFeature doubleStringFeature=original.eClass().getEStructuralFeature("String_Node_Str");
        if (doubleStringFeature != null) {
          Object doubleString=original.eGet(doubleStringFeature);
          newObject.eSet(doubleStringFeature,doubleString);
        }
 else {
          newObject.eSet(eStructuralFeature,get);
        }
      }
 else {
        newObject.eSet(eStructuralFeature,get);
      }
    }
 else     if (eStructuralFeature instanceof EReference) {
      if (get == null) {
      }
 else {
        if (eStructuralFeature.isMany()) {
          EList<EObject> list=(EList<EObject>)get;
          AbstractEList<EObject> toList=(AbstractEList<EObject>)newObject.eGet(eStructuralFeature);
          for (          Object o : list) {
            if (converted.containsKey(o)) {
              toList.addUnique(converted.get(o));
            }
 else {
              if (canFollow) {
                IdEObject result=copy(originalEClass,(IdEObject)o);
                if (result != null) {
                  toList.addUnique(result);
                }
              }
 else {
                if (eStructuralFeature.getName().equals("String_Node_Str")) {
                  inverseFixes.put(((IdEObject)o).getOid(),new InverseFix(Ifc2x3tc1Package.eINSTANCE.getIfcRelContainedInSpatialStructure_RelatedElements(),newObject));
                  System.out.println("String_Node_Str");
                }
              }
            }
          }
        }
 else {
          if (converted.containsKey(get)) {
            newObject.eSet(eStructuralFeature,converted.get(get));
          }
 else {
            if (canFollow) {
              newObject.eSet(eStructuralFeature,copy(originalEClass,(IdEObject)get));
            }
          }
        }
      }
    }
  }
  return newObject;
}