private void processStorey(Building building, IfcBuildingStorey ifcBuildingStorey)
     throws SerializerException {
   for (IfcRelDecomposes ifcRelDecomposes : ifcBuildingStorey.getIsDecomposedBy()) {
     for (IfcObjectDefinition ifcObjectDefinition : ifcRelDecomposes.getRelatedObjects()) {
       if (ifcObjectDefinition instanceof IfcSpace) {
         IfcSpace ifcSpace = (IfcSpace) ifcObjectDefinition;
         processSpace(building, ifcSpace);
       }
     }
   }
   for (IfcRelContainedInSpatialStructure ifcRelContainedInSpatialStructure :
       ifcBuildingStorey.getContainsElements()) {
     for (IfcProduct ifcProduct : ifcRelContainedInSpatialStructure.getRelatedElements()) {
       if (!convertedObjects.containsKey(ifcProduct)) {
         Room room = createFakeRoom(building);
         processBoundary(building, room, ifcProduct, null);
         if (ifcProduct instanceof IfcSpace) {
           IfcSpace ifcSpace = (IfcSpace) ifcProduct;
           processSpace(building, ifcSpace);
         } else if (ifcProduct instanceof IfcSlab) {
           convertSlab(building, room, (IfcSlab) ifcProduct);
         }
       }
     }
   }
   for (IfcRelContainedInSpatialStructure spatialStructure :
       ifcBuildingStorey.getContainsElements()) {
     for (IfcProduct ifcProduct : spatialStructure.getRelatedElements()) {
       if (ifcProduct instanceof IfcRoof) {
         RoofSurface roofSurface = new RoofSurface();
         MultiSurfaceProperty roofMSP = new MultiSurfaceProperty();
         MultiSurface roofMs = new MultiSurface();
         roofMSP.setMultiSurface(roofMs);
         roofSurface.setLod4MultiSurface(roofMSP);
         setGeometry(roofMs, (IfcProduct) ifcProduct);
         BoundarySurfaceProperty boundarySurfaceProperty = new BoundarySurfaceProperty();
         boundarySurfaceProperty.setObject(roofSurface);
         convertedObjects.put(ifcProduct, roofSurface);
         setName(roofSurface.getName(), ifcProduct.getName());
         setGlobalId(roofSurface, ifcProduct);
         // IfcRoof ifcRoof = (IfcRoof) ifcProduct;
         // RoofTypeEnum roofTypeEnum =
         // RoofTypeEnum.valueOf(ifcRoof.getShapeType().getName());
         // roofSurface.addGenericApplicationPropertyOfCityObject(roofTypeEnum);
         building.addBoundedBySurface(boundarySurfaceProperty);
       } else {
         List<Element> processProduct = processProduct(ifcProduct);
         if (processProduct != null) {
           for (Element element : processProduct) {
             building.addGenericADEComponent(new ADEComponent(element));
           }
         }
       }
     }
   }
 }
 private RoofSurface createRoof(Building building, IfcProduct ifcRelating)
     throws SerializerException {
   RoofSurface roofSurface = new RoofSurface();
   MultiSurfaceProperty roofMSP = new MultiSurfaceProperty();
   MultiSurface roofMs = new MultiSurface();
   roofMSP.setMultiSurface(roofMs);
   roofSurface.setLod4MultiSurface(roofMSP);
   setGeometry(roofMs, ifcRelating);
   BoundarySurfaceProperty boundarySurfaceProperty = new BoundarySurfaceProperty();
   boundarySurfaceProperty.setObject(roofSurface);
   building.addBoundedBySurface(boundarySurfaceProperty);
   setName(roofSurface.getName(), ifcRelating.getName());
   setGlobalId(roofSurface, ifcRelating);
   return roofSurface;
 }