private void applyIDMFilter(IfcModelInterface model) {
    try {
      ObjectIDM objectIDM = cobieToolkit.getObjectIDM();
      if (objectIDM != null) {
        ArrayList<IdEObject> removeTheseObjects = new ArrayList<IdEObject>();
        for (long key : model.getObjects().keySet()) {
          IdEObject candidateObject = model.get(key);
          boolean shouldIncludeObject =
              objectIDM.shouldIncludeClass(candidateObject.eClass(), candidateObject.eClass());
          for (EStructuralFeature feature : candidateObject.eClass().getEAllStructuralFeatures()) {
            boolean shouldFollowReference =
                objectIDM.shouldFollowReference(
                    candidateObject.eClass(), candidateObject.eClass(), feature);
            if (!shouldFollowReference) {
              candidateObject.eUnset(feature);
            }
          }
          if (!shouldIncludeObject) {
            removeTheseObjects.add(candidateObject);
          }
        }
        for (IdEObject ideObject : removeTheseObjects) {
          model.remove(ideObject);
        }
      }

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 /*
  * Serializers, deserializers, renderengines etc... all have counterparts as
  * objects in the database for configuration purposes, this methods syncs
  * both versions
  */
 private void createDatabaseObjects(DatabaseSession session)
     throws BimserverLockConflictException, BimserverDatabaseException, PluginException,
         BimserverConcurrentModificationDatabaseException {
   IfcModelInterface allOfType =
       session.getAllOfType(StorePackage.eINSTANCE.getUser(), Query.getDefault());
   for (User user : allOfType.getAll(User.class)) {
     updateUserSettings(session, user);
   }
 }
 public void update() {
   try {
     serverInfo.setVersion(
         bimServer
             .getSConverter()
             .convertFromSObject(bimServer.getVersionChecker().getLocalVersion(), null));
   } catch (BimserverDatabaseException e) {
     LOGGER.error("", e);
   }
   if (bimServer.getDatabase().getMigrator().migrationRequired()) {
     setServerState(ServerState.MIGRATION_REQUIRED);
     if (bimServer.getConfig().isAutoMigrate()) {
       try {
         bimServer.getDatabase().getMigrator().migrate();
         setServerState(ServerState.RUNNING);
       } catch (MigrationException | InconsistentModelsException e) {
         LOGGER.error("", e);
       }
     }
   } else if (bimServer.getDatabase().getMigrator().migrationImpossible()) {
     setServerState(ServerState.MIGRATION_IMPOSSIBLE);
   } else {
     DatabaseSession session = bimServer.getDatabase().createSession();
     try {
       boolean adminFound = false;
       ServerSettings settings = bimServer.getServerSettingsCache().getServerSettings();
       IfcModelInterface users =
           session.getAllOfType(StorePackage.eINSTANCE.getUser(), Query.getDefault());
       for (IdEObject idEObject : users.getValues()) {
         if (idEObject instanceof User) {
           User user = (User) idEObject;
           if (user.getUserType() == UserType.ADMIN) {
             adminFound = true;
             break;
           }
         }
       }
       if (settings.getSiteAddress().isEmpty()
           || settings.getSmtpServer().isEmpty()
           || !adminFound) {
         setServerState(ServerState.NOT_SETUP);
       } else {
         setServerState(ServerState.RUNNING);
       }
     } catch (BimserverDatabaseException e) {
       LOGGER.error("", e);
     } finally {
       session.close();
     }
   }
 }
  private void setClassificationInverseSlots(IfcModelInterface model) {

    for (IfcRelAssociatesClassification classificationAssociation :
        model.getAllWithSubTypes(IfcRelAssociatesClassification.class)) {
      for (IfcRoot relatedObject : classificationAssociation.getRelatedObjects()) {
        if (relatedObject instanceof IfcPropertySetDefinition) {
          try {
            IfcPropertySetDefinition propertySetDefinition =
                (IfcPropertySetDefinition) relatedObject;
            if (!propertySetDefinition.getHasAssociations().contains(classificationAssociation)) {
              propertySetDefinition.getHasAssociations().add(classificationAssociation);
            }
          } catch (Exception ex) {

          }
        } else if (relatedObject instanceof IfcObjectDefinition) {
          try {
            IfcObjectDefinition objectDefinition = (IfcObjectDefinition) relatedObject;
            if (!objectDefinition.getHasAssociations().contains(classificationAssociation)) {;
            }
            objectDefinition.getHasAssociations().add(classificationAssociation);
          } catch (Exception ex) {

          }
        }
      }
    }
  }
 /*
  * 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 step1() {
   List<IfcDistributionPort> ports = model.getAll(IfcDistributionPort.class);
   for (IfcDistributionPort port : ports) {
     if (port.getConnectedTo().size() == 0 && port.getConnectedFrom().size() == 0) {
       LOGGER.info("Step 1: DistributionPort = " + port.getName());
       step2(port);
     }
   }
 }
 private void createProperty(
     IfcWindow window, IfcModelInterface model, String name, String description, Object value)
     throws IfcModelInterfaceException {
   IfcRelDefinesByProperties ifcRelDefinesByProperties =
       model.create(IfcRelDefinesByProperties.class);
   window.getIsDefinedBy().add(ifcRelDefinesByProperties);
   IfcPropertySet propertySet = model.create(IfcPropertySet.class);
   ifcRelDefinesByProperties.setRelatingPropertyDefinition(propertySet);
   IfcPropertySingleValue property = model.create(IfcPropertySingleValue.class);
   propertySet.getHasProperties().add(property);
   property.setName(name);
   property.setDescription(description);
   if (value instanceof Boolean) {
     IfcBoolean ifcValue = model.create(IfcBoolean.class);
     ifcValue.setWrappedValue(((Boolean) value) ? Tristate.TRUE : Tristate.FALSE);
     property.setNominalValue(ifcValue);
   } else {
     // Unimplemented
   }
 }
  public static void writeResources(COBIEType cType, IfcModelInterface model) {
    LogHandler loggerHandler = new LogHandler(sheetName, LOGGER);
    loggerHandler.sheetWriteBegin();
    COBIEType.Resources resources;
    String name;
    IfcOwnerHistory oh;
    String createdBy;
    Calendar createdOn;
    String category;
    String extSystem;
    String extObject;
    String extIdentifier;
    String description;
    try {
      resources = cType.getResources();
      if (resources == null) {
        resources = cType.addNewResources();
      }
    } catch (Exception ex) {
      resources = cType.addNewResources();
    }

    for (IfcConstructionEquipmentResource equipmentResource :
        model.getAll(IfcConstructionEquipmentResource.class)) {
      try {

        name = IfcToResource.nameFromConstructionEquipmentResource(equipmentResource);
        oh = equipmentResource.getOwnerHistory();
        createdBy = COBieUtility.getEmailFromOwnerHistory(oh);
        createdOn = IfcToContact.getCreatedOn(oh.getCreationDate());
        category = IfcToResource.categoryFromConstructionEquipmentResource(equipmentResource);
        extSystem = COBieUtility.getApplicationName(oh);
        extObject = COBieUtility.extObjectFromObjectDef(equipmentResource);
        extIdentifier = COBieUtility.extIdFromRoot(equipmentResource);
        description = IfcToResource.descriptionFromConstructionEquipmentResource(equipmentResource);

        ResourceType resource = resources.addNewResource();
        resource.setName(name);
        resource.setCreatedBy(createdBy);
        resource.setCreatedOn(createdOn);
        resource.setCategory(category);
        resource.setExtSystem(extSystem);
        resource.setExtObject(extObject);
        resource.setExtIdentifier(extIdentifier);
        resource.setDescription(description);
        loggerHandler.rowWritten();
      } catch (Exception ex) {
        loggerHandler.error(ex);
      }
    }
    loggerHandler.sheetWritten();
  }
  @Test
  public void test() {
    ProtocolBuffersMetaData protocolBuffersMetaData = new ProtocolBuffersMetaData();
    protocolBuffersMetaData.load(
        bimServer.getServicesMap(), ProtocolBuffersBimServerClientFactory.class);
    BimServerClientFactory factory =
        new ProtocolBuffersBimServerClientFactory(
            "localhost", 8020, 8080, protocolBuffersMetaData, null);
    UsernamePasswordAuthenticationInfo usernamePasswordAuthenticationInfo =
        new UsernamePasswordAuthenticationInfo("*****@*****.**", "admin");
    try {
      bimServerClient = factory.create(usernamePasswordAuthenticationInfo);
    } catch (ChannelConnectionException e1) {
      e1.printStackTrace();
    } catch (ServerException e) {
      e.printStackTrace();
    } catch (UserException e) {
      e.printStackTrace();
    } catch (ServiceException e) {
      e.printStackTrace();
    }
    try {
      IfcModelInterface model = bimServerClient.newModel(createProject(), false);
      SProject project = createProject();
      CreateFromScratch createFromScratch = new CreateFromScratch();
      createFromScratch.createIfcProject(model);
      long roid = model.commit("tralala");

      dumpToFile(project, roid);

      createFromScratch.createWall(model);
      roid = model.commit("test");

      dumpToFile(project, roid);
    } catch (Exception e) {
      e.printStackTrace();
      fail(e.getMessage());
    }
  }
 @Override
 public void execute(VirtualUser virtualUser)
     throws ServerException, UserException, PublicInterfaceNotFoundException {
   SRevision randomRevision = virtualUser.getRandomRevision();
   if (randomRevision != null) {
     IfcModelInterface model;
     try {
       SProject project =
           virtualUser
               .getBimServerClient()
               .getBimsie1ServiceInterface()
               .getProjectByPoid(randomRevision.getProjectId());
       model =
           virtualUser
               .getBimServerClient()
               .getModel(project, randomRevision.getOid(), true, false);
       PluginManager pluginManager = getTestFramework().getPluginManager();
       SerializerPlugin serializerPlugin =
           pluginManager.getSerializerPlugin(
               "org.bimserver.ifc.step.serializer.IfcStepSerializerPlugin", true);
       Serializer serializer = serializerPlugin.createSerializer(new PluginConfiguration());
       model.generateMinimalExpressIds();
       serializer.init(
           model, null, pluginManager, pluginManager.requireRenderEngine(), null, false);
       serializer.writeToFile(
           new File(getTestFramework().getTestConfiguration().getOutputFolder(), "test.ifc"),
           null);
     } catch (BimServerClientException e1) {
       e1.printStackTrace();
     } catch (RenderEngineException e) {
       e.printStackTrace();
     } catch (PluginException e) {
       e.printStackTrace();
     } catch (SerializerException e) {
       e.printStackTrace();
     }
   }
 }
Exemple #11
0
  private void createSceneGraph() throws PluginException, IfcModelInterfaceException {
    buildingTransformGroup = new TransformGroup();

    Set<Class<? extends IfcRoot>> classesToConvert = new HashSet<Class<? extends IfcRoot>>();
    classesToConvert.add(IfcWall.class);
    classesToConvert.add(IfcWallStandardCase.class);
    classesToConvert.add(IfcWindow.class);
    classesToConvert.add(IfcOpeningElement.class);
    classesToConvert.add(IfcSlab.class);
    classesToConvert.add(IfcRoof.class);
    classesToConvert.add(IfcColumn.class);
    classesToConvert.add(IfcSpace.class);
    classesToConvert.add(IfcDoor.class);
    classesToConvert.add(IfcRailing.class);
    classesToConvert.add(IfcFurnishingElement.class);
    classesToConvert.add(IfcStair.class);
    classesToConvert.add(IfcBeam.class);
    classesToConvert.add(IfcFlowTerminalType.class);
    classesToConvert.add(IfcDistributionFlowElement.class);
    classesToConvert.add(IfcSite.class);
    // classesToConvert.add(IfcProxy.class);

    for (IdEObject idEObject : model.getValues()) {
      if (classesToConvert.contains(idEObject.eClass().getInstanceClass())) {
        setGeometry((IfcRoot) idEObject);
      }
    }
    buildingBranchGroup = new BranchGroup();
    addLights(buildingBranchGroup);
    buildingBranchGroup.addChild(buildingTransformGroup);
    showLoader = false;
    sceneBranchGroup.removeChild(loaderBranchGroup);
    sharedGroup.addChild(buildingBranchGroup);

    // for (int x = 0; x < 5; x++) {
    // for (int y = 0; y < 5; y++) {
    Link link1 = new Link(sharedGroup);
    Transform3D t3d1 = new Transform3D();
    // t3d1.setTranslation(new Vector3f(x * 20, y * 20, 0f));
    BranchGroup x1 = new BranchGroup();
    TransformGroup t1 = new TransformGroup(t3d1);
    x1.addChild(t1);
    t1.addChild(link1);
    sceneBranchGroup.addChild(x1);
    // }
    // }

    reInitView();
  }
 public CompareResult compare(
     IfcModelInterface model1, IfcModelInterface model2, CompareType compareType)
     throws ModelCompareException {
   CompareResult result = StoreFactory.eINSTANCE.createCompareResult();
   try {
     for (EClassifier eClassifier : Ifc2x3tc1Package.eINSTANCE.getEClassifiers()) {
       if (eClassifier instanceof EClass
           && Ifc2x3tc1Package.eINSTANCE.getIfcRoot().isSuperTypeOf((EClass) eClassifier)) {
         EClass eClass = (EClass) eClassifier;
         for (IdEObject i : model1.getValues()) {
           if (i instanceof IfcWindow) {
             IfcWindow window = (IfcWindow) i;
             for (EStructuralFeature feature : window.eClass().getEStructuralFeatures()) {
               window.eGet(feature);
             }
           }
         }
         for (String guid : model1.getGuids(eClass)) {
           IdEObject eObject1 = model1.getByGuid(guid);
           IdEObject eObject2 = model2.getByGuid(guid);
           if (eObject2 == null) {
             if (compareType == CompareType.ALL || compareType == CompareType.DELETE) {
               ObjectRemoved objectRemoved = StoreFactory.eINSTANCE.createObjectRemoved();
               objectRemoved.setDataObject(makeDataObject(eObject1));
               getCompareContainer(eObject1.eClass()).getItems().add(objectRemoved);
             }
           }
         }
         for (String guid : model2.getGuids(eClass)) {
           IdEObject eObject1 = model1.getByGuid(guid);
           IdEObject eObject2 = model2.getByGuid(guid);
           if (eObject1 == null) {
             if (compareType == CompareType.ALL || compareType == CompareType.ADD) {
               ObjectAdded objectAdded = StoreFactory.eINSTANCE.createObjectAdded();
               objectAdded.setDataObject(makeDataObject(eObject2));
               getCompareContainer(eObject2.eClass()).getItems().add(objectAdded);
             }
           } else {
             compareEObjects(eClass, eObject1, eObject2, result, compareType);
           }
         }
       }
     }
   } catch (Exception e) {
     throw new ModelCompareException(e);
   }
   for (CompareContainer compareContainer : getMap().values()) {
     result.getItems().add(compareContainer);
   }
   return result;
 }
Exemple #13
0
  @Test
  public void test() {
    try {
      // Create a new BimServerClient with authentication
      BimServerClientInterface bimServerClient =
          getFactory()
              .create(new UsernamePasswordAuthenticationInfo("*****@*****.**", "admin"));

      // Create a new project
      SProject newProject =
          bimServerClient
              .getBimsie1ServiceInterface()
              .addProject("test" + Math.random(), "ifc2x3tc1");

      // Get the appropriate deserializer
      SDeserializerPluginConfiguration deserializer =
          bimServerClient
              .getBimsie1ServiceInterface()
              .getSuggestedDeserializerForExtension("ifc", newProject.getOid());

      // Checkin the file
      bimServerClient.checkin(
          newProject.getOid(),
          "test",
          deserializer.getOid(),
          false,
          true,
          new File("../TestData/data/AC11-Institute-Var-2-IFC.ifc"));

      // Refresh project info
      newProject =
          bimServerClient.getBimsie1ServiceInterface().getProjectByPoid(newProject.getOid());

      IfcModelInterface model =
          bimServerClient.getModel(newProject, newProject.getLastRevisionId(), true, false);
      for (IfcFurnishingElement ifcFurnishingElement :
          model.getAllWithSubTypes(IfcFurnishingElement.class)) {
        IfcObjectPlacement objectPlacement = ifcFurnishingElement.getObjectPlacement();
        if (objectPlacement != null && objectPlacement instanceof IfcLocalPlacement) {
          IfcLocalPlacement localPlacement = (IfcLocalPlacement) objectPlacement;
          IfcAxis2Placement relativePlacement = localPlacement.getRelativePlacement();
          if (relativePlacement != null) {
            if (relativePlacement instanceof IfcAxis2Placement3D) {
              IfcAxis2Placement3D axis2Placement3D = (IfcAxis2Placement3D) relativePlacement;
              IfcCartesianPoint location = axis2Placement3D.getLocation();
              double newValue = location.getCoordinates().get(2) + 50;
              System.out.println(
                  "Changing z value of "
                      + ifcFurnishingElement.getName()
                      + " from "
                      + location.getCoordinates().get(2)
                      + " to "
                      + newValue);
              location.getCoordinates().set(2, newValue);
            }
          }
        }
      }
      long newRoid = model.commit("Moved all furniture 50 meters up");
      SSerializerPluginConfiguration ifcSerializer =
          bimServerClient
              .getBimsie1ServiceInterface()
              .getSerializerByContentType("application/ifc");
      bimServerClient.download(newRoid, ifcSerializer.getOid(), new File("movedf.ifc"));
    } catch (Throwable e) {
      e.printStackTrace();
      if (e instanceof AssertionError) {
        throw (AssertionError) e;
      }
      fail(e.getMessage());
    }
  }
  private IfcModel realCheckout(
      Project project, Revision revision, DatabaseSession databaseSession, User user)
      throws BimserverLockConflictException, BimserverDatabaseException, UserException {
    SerializerPluginConfiguration serializerPluginConfiguration =
        getDatabaseSession()
            .get(
                StorePackage.eINSTANCE.getSerializerPluginConfiguration(),
                serializerOid,
                Query.getDefault());
    final long totalSize = revision.getSize();
    final AtomicLong total = new AtomicLong();

    IfcModelSet ifcModelSet = new IfcModelSet();
    for (ConcreteRevision subRevision : revision.getConcreteRevisions()) {
      IfcModel subModel = new IfcModel();
      int highestStopId = findHighestStopRid(project, subRevision);
      Query query =
          new Query(
              subRevision.getProject().getId(), subRevision.getId(), null, Deep.YES, highestStopId);
      subModel.addChangeListener(
          new IfcModelChangeListener() {
            @Override
            public void objectAdded() {
              total.incrementAndGet();
              if (totalSize == 0) {
                setProgress("Preparing checkout...", 0);
              } else {
                setProgress(
                    "Preparing checkout...", (int) Math.round(100.0 * total.get() / totalSize));
              }
            }
          });
      getDatabaseSession().getMap(subModel, query);
      try {
        checkGeometry(
            serializerPluginConfiguration,
            getBimServer().getPluginManager(),
            subModel,
            project,
            subRevision,
            revision);
      } catch (GeometryGeneratingException e) {
        throw new UserException(e);
      }
      subModel.getModelMetaData().setDate(subRevision.getDate());
      ifcModelSet.add(subModel);
    }

    IfcModelInterface ifcModel = new IfcModel();
    if (ifcModelSet.size() > 1) {
      try {
        ifcModel =
            getBimServer()
                .getMergerFactory()
                .createMerger(getDatabaseSession(), getAuthorization().getUoid())
                .merge(revision.getProject(), ifcModelSet, new ModelHelper(ifcModel));
      } catch (MergeException e) {
        throw new UserException(e);
      }
    } else {
      ifcModel = ifcModelSet.iterator().next();
    }

    ifcModel.getModelMetaData().setName(project.getName() + "." + revision.getId());
    ifcModel.getModelMetaData().setRevisionId(project.getRevisions().indexOf(revision) + 1);
    ifcModel.getModelMetaData().setAuthorizedUser(user.getName());
    ifcModel.getModelMetaData().setDate(new Date());
    return (IfcModel) ifcModel;
  }
Exemple #15
0
  @Override
  public void run() {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    running = true;
    while (running) {
      try {
        String line = reader.readLine();
        if (line == null) {
          try {
            Thread.sleep(50);
          } catch (InterruptedException e) {
            LOGGER.error("", e);
          }
          continue;
        }
        if (line.equalsIgnoreCase("exit")) {
          bimServer.stop();
          return;
        } else if (line.startsWith("dumpmodel")) {
          try {
            long roid = Long.parseLong(line.substring(9).trim());
            DatabaseSession databaseSession = bimServer.getDatabase().createSession();
            try {
              DownloadDatabaseAction downloadDatabaseAction =
                  new DownloadDatabaseAction(
                      bimServer,
                      databaseSession,
                      AccessMethod.INTERNAL,
                      roid,
                      -1,
                      -1,
                      new SystemAuthorization(1, TimeUnit.HOURS),
                      null,
                      new Reporter() {
                        @Override
                        public void error(String error) {}

                        @Override
                        public void info(String info) {}

                        @Override
                        public void warning(String warning) {}
                      });
              IfcModelInterface model = downloadDatabaseAction.execute();
              LOGGER.info("Model size: " + model.size());

              List<IfcWall> walls = model.getAll(IfcWall.class);
              List<IfcProject> projects = model.getAll(IfcProject.class);
              List<IfcSlab> slabs = model.getAll(IfcSlab.class);
              List<IfcWindow> windows = model.getAll(IfcWindow.class);

              LOGGER.info("Walls: " + walls.size());
              LOGGER.info("Windows: " + windows.size());
              LOGGER.info("Projects: " + projects.size());
              LOGGER.info("Slabs: " + slabs.size());
            } catch (UserException e) {
              LOGGER.error("", e);
            } catch (BimserverLockConflictException e) {
              LOGGER.error("", e);
            } catch (BimserverDatabaseException e) {
              LOGGER.error("", e);
            } finally {
              databaseSession.close();
            }
          } catch (Exception e) {
            LOGGER.error("", e);
          }
        } else if (line.equalsIgnoreCase("dump")) {
          LOGGER.info("Dumping all thread's track traces...");
          LOGGER.info("");
          Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();
          for (Thread t : allStackTraces.keySet()) {
            LOGGER.info(t.getName());
            StackTraceElement[] stackTraceElements = allStackTraces.get(t);
            for (StackTraceElement stackTraceElement : stackTraceElements) {
              LOGGER.info(
                  "\t"
                      + stackTraceElement.getClassName()
                      + ":"
                      + stackTraceElement.getLineNumber()
                      + "."
                      + stackTraceElement.getMethodName());
            }
            LOGGER.info("");
          }
          LOGGER.info("Done printing stack traces");
          LOGGER.info("");
          try {
            Thread.sleep(10000);
          } catch (InterruptedException e) {
            LOGGER.error("", e);
          }
        } else if (line.equals("migrate")) {
          try {
            bimServer.getDatabase().getMigrator().migrate();
            bimServer.getServerInfoManager().update();
          } catch (MigrationException e) {
            LOGGER.error("", e);
          } catch (InconsistentModelsException e) {
            LOGGER.error("", e);
          }
        } else if (line.equals("clearendpoints")) {
          bimServer.getEndPointManager().clear();
        } else if (line.startsWith("showall")) {
          KeyValueStore keyValueStore = ((Database) bimServer.getDatabase()).getKeyValueStore();
          Set<String> allTableNames = keyValueStore.getAllTableNames();
          long total = 0;
          for (String tableName : allTableNames) {
            long size = keyValueStore.count(tableName);
            total += size;
            if (size != 0) {
              LOGGER.info(tableName + " " + size);
            }
          }
          LOGGER.info("total: " + total);
        } else {
          LOGGER.info("Unknown command");
        }
      } catch (IOException e) {
        LOGGER.error("", e);
      }
    }
  }
  private static void exportBAMieClassificationReferences(
      IfcModelInterface model,
      LogHandler loggerHandler,
      ArrayList<String> documentNames,
      COBIEType.Documents documents) {
    String name;
    String createdBy;
    Calendar createdOn;
    String category;
    String approvalBy;
    String stage;
    String sheetName;
    String rowName;
    String directory;
    String extSystem;
    String extObject;
    String extIdentifier;
    String description;
    String reference;
    IfcOwnerHistory oh;
    DocumentType tempDocument;
    for (IfcDistributionElement element : model.getAllWithSubTypes(IfcDistributionElement.class)) {
      try {
        for (IfcRelAssociates relAssociates : element.getHasAssociations()) {
          if (relAssociates instanceof IfcRelAssociatesClassification) {
            category = COBieIfcUtility.getObjectClassificationCategoryString(element);
            if (ClassificationHandler.isBAMieRelAssociatesClassification(
                (IfcRelAssociatesClassification) relAssociates)) {
              name = COBieUtility.getCOBieString(element.getName());
              oh = element.getOwnerHistory();
              createdBy = COBieIfcUtility.getEmailFromOwnerHistory(oh);
              createdOn = IfcToContact.getCreatedOn(oh.getCreationDate());
              category = IfcToDocument.BAMIE_CATEGORY;
              approvalBy = IfcToDocument.ApprovalBy;
              stage = IfcToDocument.Stage;
              sheetName = COBieUtility.CobieSheetName.Component.name();
              rowName = IfcToDocument.bamieRowNameFromDistributionElement(element);
              extSystem = COBieIfcUtility.getApplicationName(oh);
              extObject = IfcToComponent.extObjectFromProduct(element);
              extIdentifier = COBieIfcUtility.extIdFromRoot(element);
              description = COBieUtility.getCOBieString(element.getName());
              reference = IfcToDocument.Reference;

              IfcClassificationReference classificationReference =
                  COBieIfcUtility.getObjectClassificationReference(element);
              directory = COBieUtility.getCOBieString(classificationReference.getLocation());

              tempDocument = documents.addNewDocument();
              tempDocument.setName(name);
              tempDocument.setCreatedBy(createdBy);
              tempDocument.setCreatedOn(createdOn);
              tempDocument.setCategory(category);
              tempDocument.setApprovalBy(approvalBy);
              tempDocument.setStage(stage);
              tempDocument.setSheetName(sheetName);
              tempDocument.setRowName(rowName);
              tempDocument.setDirectory(directory);
              tempDocument.setFile(COBieUtility.COBieNA);
              tempDocument.setExtSystem(extSystem);
              tempDocument.setExtObject(extObject);
              tempDocument.setExtIdentifier(extIdentifier);
              tempDocument.setDescription(description);
              tempDocument.setReference(reference);
              loggerHandler.rowWritten();
            }
          }
        }
      } catch (Exception ex) {

      }
    }
  }
  private static void exportDocumentInformationObjects(
      IfcModelInterface model,
      LogHandler loggerHandler,
      ArrayList<String> documentNames,
      COBIEType.Documents documents) {
    String name;
    String createdBy;
    Calendar createdOn;
    String category;
    String approvalBy;
    String stage;
    String sheetName;
    String rowName;
    String directory;
    String file;
    String extSystem;
    String extObject;
    String extIdentifier;
    String description;
    String reference;
    IfcOwnerHistory oh;
    DocumentType tempDocument;
    for (IfcRelAssociatesDocument relAssociatesDocument :
        model.getAll(IfcRelAssociatesDocument.class)) {
      IfcDocumentSelect docInfoSelect = relAssociatesDocument.getRelatingDocument();
      if (docInfoSelect instanceof IfcDocumentInformation) {
        IfcDocumentInformation docInfo = (IfcDocumentInformation) docInfoSelect;
        try {

          name = IfcToDocument.nameFromDocumentInformation(docInfo);
          oh = relAssociatesDocument.getOwnerHistory();
          createdBy = COBieIfcUtility.getEmailFromOwnerHistory(oh);
          createdOn = IfcToContact.getCreatedOn(oh.getCreationDate());
          category = IfcToDocument.categoryFromDocumentInformation(docInfo);
          approvalBy = IfcToDocument.approvalByFromDocumentInformation(docInfo);
          stage = IfcToDocument.stageFromDocumentInformation(docInfo);
          sheetName = IfcToDocument.sheetNameFromRelAssociatesDocument(relAssociatesDocument);
          rowName = IfcToDocument.rowNameFromRelAssociatesDocument(relAssociatesDocument);
          directory = IfcToDocument.directoryFromDocumentInformation(docInfo);
          file = IfcToDocument.fileFromDocumentInformation(docInfo);
          extSystem = COBieIfcUtility.getApplicationName(oh);
          extObject = IfcToDocument.extObjectFromRelAssociatesDocument(relAssociatesDocument);
          extIdentifier = IfcToDocument.extIdFromRelAssociatesDocument(relAssociatesDocument);
          description = IfcToDocument.descriptionFromDocumentInformation(docInfo);
          reference = IfcToDocument.referenceFromDocumentInformation(docInfo);

          tempDocument = documents.addNewDocument();
          tempDocument.setName(name);
          tempDocument.setCreatedBy(createdBy);
          tempDocument.setCreatedOn(createdOn);
          tempDocument.setCategory(category);
          tempDocument.setApprovalBy(approvalBy);
          tempDocument.setStage(stage);
          tempDocument.setSheetName(sheetName);
          tempDocument.setRowName(rowName);
          tempDocument.setDirectory(directory);
          tempDocument.setFile(file);
          tempDocument.setExtSystem(extSystem);
          tempDocument.setExtIdentifier(extIdentifier);
          tempDocument.setExtObject(extObject);
          tempDocument.setDescription(description);
          tempDocument.setReference(reference);
          documentNames.add(name);
          loggerHandler.rowWritten();
        } catch (Exception ex) {
          loggerHandler.error(ex);
        }
      }
    }
  }
  private static void exportTypeInformation(
      IfcModelInterface model,
      LogHandler loggerHandler,
      ArrayList<String> typeNames,
      ArrayList<String> documentNames,
      COBIEType.Documents documents) {
    String name;
    String createdBy;
    Calendar createdOn;
    String category;
    String approvalBy;
    String stage;
    String sheetName;
    String rowName;
    String directory;
    String file;
    String extSystem;
    String extObject;
    String extIdentifier;
    String description;
    String reference;
    IfcOwnerHistory oh;
    DocumentType tempDocument;
    if (documentNames.size() == 0) {
      for (IfcRelDefinesByType defByType : model.getAll(IfcRelDefinesByType.class)) {
        try {
          IfcTypeObject type = defByType.getRelatingType();
          if (type != null) {
            name = IfcToDocument.nameFromTypeObject(type);
            if (!typeNames.contains(name)) {

              oh = COBieIfcUtility.firstOwnerHistoryFromModel(model);
              createdBy = COBieIfcUtility.getEmailFromOwnerHistory(oh);
              createdOn = IfcToContact.getCreatedOn(oh.getCreationDate());
              category = IfcToDocument.categoryFromTypeObject(type);
              approvalBy = IfcToDocument.ApprovalBy;
              stage = IfcToDocument.Stage;
              sheetName = IfcToDocument.TypeSheetName;
              rowName = IfcToType.nameFromTypeObject(type);
              directory = IfcToDocument.Directory;
              file = IfcToDocument.File;
              extSystem = COBieIfcUtility.getApplicationName(oh);
              extObject = IfcToType.extObjectFromTypeObject(type);
              extIdentifier = COBieIfcUtility.extIdFromRoot(type);
              description = IfcToDocument.descriptionFromTypeObject(type);
              reference = IfcToDocument.Reference;

              tempDocument = documents.addNewDocument();
              typeNames.add(name);
              tempDocument.setName(name);
              tempDocument.setCreatedBy(createdBy);
              tempDocument.setCreatedOn(createdOn);
              tempDocument.setCategory(category);
              tempDocument.setApprovalBy(approvalBy);
              tempDocument.setStage(stage);
              tempDocument.setSheetName(sheetName);
              tempDocument.setRowName(rowName);
              tempDocument.setDirectory(directory);
              tempDocument.setFile(file);
              tempDocument.setExtSystem(extSystem);
              tempDocument.setExtObject(extObject);
              tempDocument.setExtIdentifier(extIdentifier);
              tempDocument.setDescription(description);
              tempDocument.setReference(reference);
              loggerHandler.rowWritten();
            }
          }
        } catch (Exception ex) {
          loggerHandler.error(ex);
        }
      }
    }
  }
  public static void main(String[] args) {
    try {
      PluginManager pluginManager = LocalDevPluginLoader.createPluginManager(new File("home"));
      DeserializerPlugin deserializerPlugin =
          pluginManager.getFirstDeserializer("ifc", Schema.IFC2X3TC1, true);

      Deserializer deserializer = deserializerPlugin.createDeserializer(null);
      deserializer.init(pluginManager.getMetaDataManager().getPackageMetaData("ifc2x3tc1"));

      IfcModelInterface model =
          deserializer.read(new File("../TestData/data/AC9R1-Haus-G-H-Ver2-2x3.ifc"));

      deserializer = deserializerPlugin.createDeserializer(null);
      deserializer.init(pluginManager.getMetaDataManager().getPackageMetaData("ifc2x3tc1"));
      IfcModelInterface furnishingModel = deserializer.read(new File("test.ifc"));

      model.fixOids(new IncrementingOidProvider());
      long oid = model.getHighestOid();
      IncrementingOidProvider oidProvider = new IncrementingOidProvider(oid + 1);

      IfcFurnishingElement picknick =
          (IfcFurnishingElement)
              furnishingModel.getByName(
                  Ifc2x3tc1Package.eINSTANCE.getIfcFurnishingElement(), "Picknik Bank");

      ModelHelper modelHelper =
          new ModelHelper(
              pluginManager.getMetaDataManager(),
              new HideAllInversesObjectIDM(
                  CollectionUtils.singleSet(Ifc2x3tc1Package.eINSTANCE),
                  pluginManager.requireSchemaDefinition("ifc2x3tc1")),
              model);

      IfcProductDefinitionShape representation =
          (IfcProductDefinitionShape) picknick.getRepresentation();
      IfcRepresentation surfaceModel = null;
      IfcRepresentation boundingBox = null;
      for (IfcRepresentation ifcRepresentation : representation.getRepresentations()) {
        IfcShapeRepresentation ifcShapeRepresentation = (IfcShapeRepresentation) ifcRepresentation;
        if (ifcShapeRepresentation.getRepresentationType().equals("SurfaceModel")) {
          surfaceModel = (IfcRepresentation) modelHelper.copy(ifcShapeRepresentation, false);
        } else if (ifcShapeRepresentation.getRepresentationType().equals("BoundingBox")) {
          boundingBox = (IfcRepresentation) modelHelper.copy(ifcShapeRepresentation, false);
        }
      }

      IfcOwnerHistory ownerHistory = null;
      List<IfcOwnerHistory> all = model.getAll(IfcOwnerHistory.class);
      if (all.size() > 0) {
        ownerHistory = all.get(0);
      }

      for (IfcBuildingStorey ifcBuildingStorey : model.getAll(IfcBuildingStorey.class)) {
        for (IfcRelDecomposes ifcRelDecomposes : ifcBuildingStorey.getIsDecomposedBy()) {
          for (IfcObjectDefinition ifcObjectDefinition : ifcRelDecomposes.getRelatedObjects()) {
            if (ifcObjectDefinition instanceof IfcSpace) {
              IfcSpace ifcSpace = (IfcSpace) ifcObjectDefinition;
              //							IfcProductDefinitionShape slabRepr = (IfcProductDefinitionShape)
              // ifcSpace.getRepresentation();
              //							IfcBoundingBox box = null;
              //							for (IfcRepresentation representation2 : slabRepr.getRepresentations()) {
              //								IfcShapeRepresentation shapeRepresentation =
              // (IfcShapeRepresentation)representation2;
              //								if (shapeRepresentation.getRepresentationType().equals("BoundingBox")) {
              //									for (IfcRepresentationItem i2 : shapeRepresentation.getItems()) {
              //										box = (IfcBoundingBox)i2;
              //									}
              //								}
              //							}

              IfcFurnishingElement newFurnishing =
                  model.create(IfcFurnishingElement.class, oidProvider);

              IfcRelContainedInSpatialStructure containedInSpatialStructure2 =
                  model.create(IfcRelContainedInSpatialStructure.class, oidProvider);
              containedInSpatialStructure2.setRelatingStructure(ifcBuildingStorey);
              containedInSpatialStructure2.getRelatedElements().add(newFurnishing);

              newFurnishing.setName("Generated");
              newFurnishing.setGlobalId("TEST");
              newFurnishing.setOwnerHistory(ownerHistory);
              IfcProductDefinitionShape definitionShape =
                  model.create(IfcProductDefinitionShape.class, oidProvider);
              newFurnishing.setRepresentation(definitionShape);

              definitionShape.getRepresentations().add(boundingBox);
              definitionShape.getRepresentations().add(surfaceModel);

              IfcLocalPlacement localPlacement = model.create(IfcLocalPlacement.class, oidProvider);
              localPlacement.setPlacementRelTo(ifcSpace.getObjectPlacement());
              IfcAxis2Placement3D axis2Placement3D =
                  model.create(IfcAxis2Placement3D.class, oidProvider);
              localPlacement.setRelativePlacement(axis2Placement3D);

              IfcCartesianPoint pos = model.create(IfcCartesianPoint.class, oidProvider);
              pos.getCoordinates().add(-3d);
              pos.getCoordinates().add(+0.5d);
              pos.getCoordinates().add(0d);
              axis2Placement3D.setLocation(pos);

              newFurnishing.setObjectPlacement(localPlacement);
            }
          }
        }
      }

      model.resetExpressIds();

      SerializerPlugin serializerPlugin =
          pluginManager.getSerializerPlugin(
              "org.bimserver.ifc.step.serializer.IfcStepSerializerPlugin", true);
      Serializer serializer = serializerPlugin.createSerializer(null);
      serializer.init(model, null, pluginManager, null, null, true);
      serializer.writeToFile(new File("withfurn.ifc"), null);
    } catch (PluginException e) {
      e.printStackTrace();
    } catch (DeserializeException e) {
      e.printStackTrace();
    } catch (IfcModelInterfaceException e) {
      e.printStackTrace();
    } catch (SerializerException e) {
      e.printStackTrace();
    }
  }
  @Test
  public void test() {
    try {
      // New client
      BimServerClientInterface bimServerClient =
          getFactory()
              .create(new UsernamePasswordAuthenticationInfo("*****@*****.**", "admin"));

      // Create a project
      SProject project =
          bimServerClient
              .getBimsie1ServiceInterface()
              .addProject("test" + Math.random(), "ifc2x3tc1");

      // Look for a deserializer
      SDeserializerPluginConfiguration deserializer =
          bimServerClient
              .getBimsie1ServiceInterface()
              .getSuggestedDeserializerForExtension("ifc", project.getOid());

      bimServerClient.checkin(
          project.getOid(),
          "test",
          deserializer.getOid(),
          false,
          true,
          new File("../TestData/data/AC11-Institute-Var-2-IFC.ifc"));

      // Refresh project
      project = bimServerClient.getBimsie1ServiceInterface().getProjectByPoid(project.getOid());

      // Load model without lazy loading (complete model at once)
      IfcModelInterface model =
          bimServerClient.getModel(project, project.getLastRevisionId(), true, false);

      String propertyName = "BooleanProperty";

      int nrWindowsFirst = 0;
      // Iterate over all projects, there should be 1
      for (IfcWindow window : model.getAllWithSubTypes(IfcWindow.class)) {
        nrWindowsFirst++;
        createProperty(window, model, propertyName, "Description of property", true);
      }

      model.commit("Added boolean properties to " + nrWindowsFirst + " windows");

      project = bimServerClient.getBimsie1ServiceInterface().getProjectByPoid(project.getOid());
      model = bimServerClient.getModel(project, project.getLastRevisionId(), true, false);
      int foundOke = 0;
      int nrWindowsSecond = 0;
      Set<Long> counted = new HashSet<Long>();
      for (IfcWindow window : model.getAllWithSubTypes(IfcWindow.class)) {
        nrWindowsSecond++;
        for (IfcRelDefines ifcRelDefines : window.getIsDefinedBy()) {
          if (ifcRelDefines instanceof IfcRelDefinesByProperties) {
            IfcRelDefinesByProperties ifcRelDefinesByProperties =
                (IfcRelDefinesByProperties) ifcRelDefines;
            IfcPropertySetDefinition relatingPropertyDefinition =
                ifcRelDefinesByProperties.getRelatingPropertyDefinition();
            if (relatingPropertyDefinition instanceof IfcPropertySet) {
              IfcPropertySet ifcPropertySet = (IfcPropertySet) relatingPropertyDefinition;
              for (IfcProperty ifcProperty : ifcPropertySet.getHasProperties()) {
                if (ifcProperty instanceof IfcPropertySingleValue) {
                  IfcPropertySingleValue ifcPropertySingleValue =
                      (IfcPropertySingleValue) ifcProperty;
                  if (ifcPropertySingleValue.getName().equals(propertyName)) {
                    IfcValue nominalValue = ifcPropertySingleValue.getNominalValue();
                    if (nominalValue instanceof IfcBoolean) {
                      if (((IfcBoolean) nominalValue).getWrappedValue() == Tristate.TRUE) {
                        if (!counted.contains(ifcPropertySingleValue.getOid())) {
                          foundOke++;
                          counted.add(ifcPropertySingleValue.getOid());
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
      LOGGER.info("Windows first: " + nrWindowsFirst);
      LOGGER.info("Windows second: " + nrWindowsSecond);
      LOGGER.info("Found Oke: " + foundOke);
      if (foundOke != nrWindowsFirst) {
        fail(foundOke + " / " + nrWindowsFirst);
      }
    } catch (Throwable e) {
      e.printStackTrace();
      fail(e.getMessage());
    }
  }
  @Override
  public IfcModelInterface execute()
      throws UserException, BimserverLockConflictException, BimserverDatabaseException {
    User user = getUserByUoid(getAuthorization().getUoid());
    Set<String> foundNames = new HashSet<String>();
    IfcModelSet ifcModelSet = new IfcModelSet();
    Project project = null;
    long incrSize = 0L;

    SerializerPluginConfiguration serializerPluginConfiguration =
        getDatabaseSession()
            .get(
                StorePackage.eINSTANCE.getSerializerPluginConfiguration(),
                serializerOid,
                Query.getDefault());

    for (Long roid : roids) {
      Revision virtualRevision = getRevisionByRoid(roid);
      project = virtualRevision.getProject();
      if (!getAuthorization().hasRightsOnProjectOrSuperProjectsOrSubProjects(user, project)) {
        throw new UserException(
            "User has insufficient rights to download revisions from this project");
      }
      Map<ConcreteRevision, Set<Long>> map = new HashMap<ConcreteRevision, Set<Long>>();
      for (String name : names) {
        if (!foundNames.contains(name)) {
          for (ConcreteRevision concreteRevision : virtualRevision.getConcreteRevisions()) {
            for (ObjectIdentifier objectIdentifier :
                getDatabaseSession()
                    .getOidsOfName(
                        name, concreteRevision.getProject().getId(), concreteRevision.getId())) {
              foundNames.add(name);
              if (!map.containsKey(concreteRevision)) {
                map.put(concreteRevision, new HashSet<Long>());
                incrSize += concreteRevision.getSize();
              }
              map.get(concreteRevision).add(objectIdentifier.getOid());
            }
          }
        }
      }
      final long totalSize = incrSize;
      final AtomicLong total = new AtomicLong();

      for (ConcreteRevision concreteRevision : map.keySet()) {
        IfcModel subModel = new IfcModel();
        int highestStopId = findHighestStopRid(project, concreteRevision);
        Query query =
            new Query(
                concreteRevision.getProject().getId(),
                concreteRevision.getId(),
                objectIDM,
                deep,
                highestStopId);
        subModel.addChangeListener(
            new IfcModelChangeListener() {
              @Override
              public void objectAdded() {
                total.incrementAndGet();
                progress = (int) Math.round(100.0 * total.get() / totalSize);
              }
            });
        Set<Long> oids = map.get(concreteRevision);
        getDatabaseSession().getMapWithOids(subModel, oids, query);
        subModel.getModelMetaData().setDate(concreteRevision.getDate());

        try {
          checkGeometry(
              serializerPluginConfiguration,
              bimServer.getPluginManager(),
              subModel,
              project,
              concreteRevision,
              virtualRevision);
        } catch (GeometryGeneratingException e) {
          throw new UserException(e);
        }

        ifcModelSet.add(subModel);
      }
    }
    IfcModelInterface ifcModel = new IfcModel();
    try {
      ifcModel =
          bimServer
              .getMergerFactory()
              .createMerger(getDatabaseSession(), getAuthorization().getUoid())
              .merge(project, ifcModelSet, new ModelHelper(ifcModel));
      ifcModel.getModelMetaData().setName("query");
      for (String name : names) {
        if (!foundNames.contains(name)) {
          throw new UserException("Name " + name + " not found");
        }
      }
      ifcModel.getModelMetaData().setRevisionId(1);
      ifcModel
          .getModelMetaData()
          .setAuthorizedUser(getUserByUoid(getAuthorization().getUoid()).getName());
      ifcModel.getModelMetaData().setDate(new Date());
      return ifcModel;
    } catch (MergeException e) {
      throw new UserException(e);
    }
  }