/*
  * This will list all projects, select the first project with at least one
  * revision and dump the names of all walls within the last revision of that
  * project
  */
 @Test
 public void testDump() {
   try {
     ServiceMap serviceMap = bimServer.getServiceFactory().get(AccessMethod.INTERNAL);
     ServiceInterface service = serviceMap.get(ServiceInterface.class);
     String token = serviceMap.get(AuthInterface.class).login(username, password);
     service =
         bimServer
             .getServiceFactory()
             .get(token, AccessMethod.INTERNAL)
             .get(ServiceInterface.class);
     BimDatabase database = bimServer.getDatabase();
     DatabaseSession session = database.createSession();
     SProject firstProjectWithRevisions = null;
     for (SProject project : serviceMap.getServiceInterface().getAllProjects(false, true)) {
       System.out.println(project.getName());
       if (!project.getRevisions().isEmpty() && firstProjectWithRevisions == null) {
         firstProjectWithRevisions = project;
       }
     }
     if (firstProjectWithRevisions != null) {
       long roid = firstProjectWithRevisions.getLastRevisionId();
       DownloadDatabaseAction downloadDatabaseAction =
           new DownloadDatabaseAction(
               bimServer,
               session,
               AccessMethod.INTERNAL,
               roid,
               -1,
               -1,
               ((ServiceImpl) service).getAuthorization(),
               null);
       IfcModelInterface ifcModelInterface = downloadDatabaseAction.execute();
       for (IfcWall ifcWall : ifcModelInterface.getAllWithSubTypes(IfcWall.class)) {
         System.out.println(ifcWall.getName());
       }
     }
   } catch (ServiceException e) {
     e.printStackTrace();
   } catch (BimserverDatabaseException e) {
     e.printStackTrace();
   } catch (PublicInterfaceNotFoundException e) {
     e.printStackTrace();
   }
 }
 private void processBoundary(
     Building building, Room room, IfcProduct ifcElement, IfcInternalOrExternalEnum boundayType)
     throws SerializerException {
   if (ifcElement instanceof IfcWall) {
     IfcWall ifcWall = (IfcWall) ifcElement;
     if (!convertedObjects.containsKey(ifcWall)) {
       AbstractBoundarySurface boundarySurface = null;
       if (boundayType == null || boundayType == IfcInternalOrExternalEnum.INTERNAL) {
         boundarySurface = new InteriorWallSurface();
       } else {
         boundarySurface = new WallSurface();
       }
       setName(boundarySurface.getName(), ifcWall.getName());
       setGlobalId(boundarySurface, ifcWall);
       convertedObjects.put(ifcWall, boundarySurface);
       BoundarySurfaceProperty boundarySurfaceProperty = new BoundarySurfaceProperty();
       boundarySurfaceProperty.setObject(boundarySurface);
       MultiSurface wallMs = new MultiSurface();
       MultiSurfaceProperty wallMSP = new MultiSurfaceProperty();
       wallMSP.setMultiSurface(wallMs);
       boundarySurface.setLod4MultiSurface(wallMSP);
       setGeometry(wallMs, ifcWall);
       building.addBoundedBySurface(boundarySurfaceProperty);
       for (IfcRelVoidsElement ifcRelVoidsElement : ifcWall.getHasOpenings()) {
         IfcOpeningElement ifcOpeningElement =
             (IfcOpeningElement) ifcRelVoidsElement.getRelatedOpeningElement();
         for (IfcRelFillsElement filling : ifcOpeningElement.getHasFillings()) {
           IfcElement ifcRelatedBuildingElement = filling.getRelatedBuildingElement();
           if (ifcRelatedBuildingElement instanceof IfcWindow) {
             if (!convertedObjects.containsKey(ifcRelatedBuildingElement)) {
               Window window = createWindow((IfcWindow) ifcRelatedBuildingElement);
               OpeningProperty openingProperty = new OpeningProperty();
               openingProperty.setObject(window);
               boundarySurface.addOpening(openingProperty);
               convertedObjects.put(ifcRelatedBuildingElement, window);
             }
           } else if (ifcRelatedBuildingElement instanceof IfcDoor) {
             if (!convertedObjects.containsKey(ifcRelatedBuildingElement)) {
               Door door = createDoor(ifcRelatedBuildingElement);
               OpeningProperty openingProperty = new OpeningProperty();
               openingProperty.setObject(door);
               boundarySurface.addOpening(openingProperty);
               convertedObjects.put(ifcRelatedBuildingElement, door);
             }
           }
         }
       }
     }
   } else if (ifcElement instanceof IfcSlab) {
     convertSlab(building, room, (IfcSlab) ifcElement);
   } else if (ifcElement instanceof IfcRoof) {
     if (!convertedObjects.containsKey(ifcElement)) {
       RoofSurface roofSurface = createRoof(building, ifcElement);
       convertedObjects.put(ifcElement, roofSurface);
     }
   } else if (ifcElement instanceof IfcOpeningElement) {
     List<Element> processProduct = processProduct(ifcElement);
     if (processProduct != null) {
       for (Element element : processProduct) {
         room.addGenericADEComponent(new ADEComponent(element));
       }
     }
   } else if (ifcElement instanceof IfcColumn) {
     // List<Element> processProduct = processProduct(ifcElement);
     // if (processProduct != null) {
     // room.addGenericApplicationPropertyOfRoom(processProduct);
     // }
   } else if (ifcElement == null
       || ifcElement instanceof IfcWindow
       || ifcElement instanceof IfcDoor
       || ifcElement instanceof IfcVirtualElement) {
     // ignore
   } else if (ifcElement instanceof IfcFurnishingElement) {
     // BuildingFurniture buildingFurniture =
     // citygml.createBuildingFurniture();
     // GeometryProperty createGeometryProperty =
     // gml.createGeometryProperty();
     // MultiSurface createMultiSurface = gml.createMultiSurface();
     // setGeometry(createMultiSurface, ifcElement);
     // createGeometryProperty.setGeometry(createMultiSurface);
     // buildingFurniture.setLod4Geometry(createGeometryProperty);
     // InteriorFurnitureProperty ifp =
     // citygml.createInteriorFurnitureProperty();
     // ifp.setObject(buildingFurniture);
     // setName(buildingFurniture.getName(), ifcElement.getName());
     // setGlobalId(buildingFurniture, ifcElement);
     // room.addInteriorFurniture(ifp);
     // convertedObjects.put(ifcElement, buildingFurniture);
   } else if (ifcElement instanceof IfcFlowTerminal) {
     // FlowTerminal flowTerminal = new FlowTerminal();
     // setName(flowTerminal.getName(), ifcElement.getName());
     // MultiSurfaceProperty createGeometryProperty =
     // gml.createMultiSurfaceProperty();
     // MultiSurface createMultiSurface = gml.createMultiSurface();
     // setGeometry(createMultiSurface, ifcElement);
     // createGeometryProperty.setMultiSurface(createMultiSurface);
     // flowTerminal.setLod4MultiSurface(createGeometryProperty);
     // room.getGenericApplicationPropertyOfRoom().add(flowTerminal);
     // setName(flowTerminal.getName(), ifcElement.getName());
     // setGlobalId(flowTerminal, ifcElement);
     // flowTerminal.setGlobalId(ifcElement.getGlobalId());
     // convertedObjects.put(ifcElement, flowTerminal);
   }
 }