Пример #1
0
 public void stop() {
   LOGGER.info("Stopping BIMserver");
   executorService.shutdown();
   if (bimDatabase != null) {
     bimDatabase.close();
   }
   if (bimScheduler != null) {
     bimScheduler.close();
   }
   if (longActionManager != null) {
     longActionManager.shutdown();
   }
   if (notificationsManager != null) {
     notificationsManager.shutdown();
   }
   if (embeddedWebServer != null) {
     embeddedWebServer.shutdown();
   }
   if (protocolBuffersServer != null) {
     protocolBuffersServer.shutdown();
   }
   if (commandLine != null) {
     commandLine.shutdown();
   }
   LOGGER.info("BIMserver stopped");
 }
Пример #2
0
  public void start()
      throws DatabaseInitException, BimserverDatabaseException, PluginException,
          DatabaseRestartRequiredException, ServerException {
    try {
      LOGGER.debug("Starting BIMserver");
      SVersion localVersion = versionChecker.getLocalVersion();
      if (localVersion != null) {
        LOGGER.info(
            "Version: "
                + localVersion.getMajor()
                + "."
                + localVersion.getMinor()
                + "."
                + localVersion.getRevision()
                + " - "
                + localVersion.getDate());
      } else {
        LOGGER.info("Unknown version");
      }

      try {
        pluginManager.addPluginChangeListener(
            new PluginChangeListener() {
              @Override
              public void pluginStateChanged(PluginContext pluginContext, boolean enabled) {
                // Reflect this change also in the database
                Condition pluginCondition =
                    new AttributeCondition(
                        StorePackage.eINSTANCE.getPluginDescriptor_PluginClassName(),
                        new StringLiteral(pluginContext.getPlugin().getClass().getName()));
                DatabaseSession session = bimDatabase.createSession();
                try {
                  Map<Long, PluginDescriptor> pluginsFound =
                      session.query(pluginCondition, PluginDescriptor.class, Query.getDefault());
                  if (pluginsFound.size() == 0) {
                    LOGGER.error(
                        "Error changing plugin-state in database, plugin "
                            + pluginContext.getPlugin().getClass().getName()
                            + " not found");
                  } else if (pluginsFound.size() == 1) {
                    PluginDescriptor pluginConfiguration = pluginsFound.values().iterator().next();
                    pluginConfiguration.setEnabled(pluginContext.isEnabled());
                    session.store(pluginConfiguration);
                  } else {
                    LOGGER.error(
                        "Error, too many plugin-objects found in database for name "
                            + pluginContext.getPlugin().getClass().getName());
                  }
                  session.commit();
                } catch (BimserverDatabaseException e) {
                  LOGGER.error("", e);
                } catch (ServiceException e) {
                  LOGGER.error("", e);
                } finally {
                  session.close();
                }
              }
            });
        pluginManager.loadPlugin(
            ObjectIDMPlugin.class,
            new File(".").toURI(),
            "Internal",
            new SchemaFieldObjectIDMPlugin(),
            getClass().getClassLoader(),
            PluginSourceType.INTERNAL,
            null);
      } catch (Exception e) {
        LOGGER.error("", e);
      }

      try {
        metaDataManager.init();
        pluginManager.initAllLoadedPlugins();
      } catch (PluginException e) {
        LOGGER.error("", e);
      }
      serverStartTime = new GregorianCalendar();

      longActionManager = new LongActionManager();

      Set<EPackage> packages = new LinkedHashSet<>();
      packages.add(Ifc2x3tc1Package.eINSTANCE);
      packages.add(Ifc4Package.eINSTANCE);
      templateEngine = new TemplateEngine();
      templateEngine.init(config.getResourceFetcher().getResource("templates/"));
      Path databaseDir = config.getHomeDir().resolve("database");
      BerkeleyKeyValueStore keyValueStore = new BerkeleyKeyValueStore(databaseDir);

      schemaConverterManager.registerConverter(new Ifc2x3tc1ToIfc4SchemaConverterFactory());
      schemaConverterManager.registerConverter(new Ifc4ToIfc2x3tc1SchemaConverterFactory());

      metricsRegistry = new MetricsRegistry();

      Query.setPackageMetaDataForDefaultQuery(metaDataManager.getPackageMetaData("store"));

      bimDatabase = new Database(this, packages, keyValueStore, metaDataManager);
      try {
        bimDatabase.init();
      } catch (DatabaseRestartRequiredException e) {
        bimDatabase.close();
        keyValueStore = new BerkeleyKeyValueStore(databaseDir);
        bimDatabase = new Database(this, packages, keyValueStore, metaDataManager);
        try {
          bimDatabase.init();
        } catch (InconsistentModelsException e1) {
          LOGGER.error("", e);
          serverInfoManager.setServerState(ServerState.FATAL_ERROR);
          serverInfoManager.setErrorMessage("Inconsistent models");
        }
      } catch (InconsistentModelsException e) {
        LOGGER.error("", e);
        serverInfoManager.setServerState(ServerState.FATAL_ERROR);
        serverInfoManager.setErrorMessage("Inconsistent models");
      }

      DatabaseSession encsession = bimDatabase.createSession();
      try {
        byte[] encryptionkeyBytes = null;
        if (!bimDatabase.getRegistry().has(ENCRYPTIONKEY, encsession)) {
          encryptionkeyBytes = new byte[16];
          new SecureRandom().nextBytes(encryptionkeyBytes);
          bimDatabase.getRegistry().save(ENCRYPTIONKEY, encryptionkeyBytes, encsession);
          encsession.commit();
        } else {
          encryptionkeyBytes = bimDatabase.getRegistry().readByteArray(ENCRYPTIONKEY, encsession);
        }
        encryptionkey = new SecretKeySpec(encryptionkeyBytes, "AES");
      } finally {
        encsession.close();
      }

      protocolBuffersMetaData = new ProtocolBuffersMetaData();
      protocolBuffersMetaData.load(servicesMap, ProtocolBuffersBimServerClientFactory.class);

      serverInfoManager.init(this);

      webModuleManager = new WebModuleManager(this);

      jsonHandler = new JsonHandler(this);

      serializerFactory = new SerializerFactory();
      deserializerFactory = new DeserializerFactory();

      serverSettingsCache = new ServerSettingsCache(bimDatabase);

      serverInfoManager.update();

      if (serverInfoManager.getServerState() == ServerState.MIGRATION_REQUIRED) {
        serverInfoManager.registerStateChangeListener(
            new StateChangeListener() {
              @Override
              public void stateChanged(ServerState oldState, ServerState newState) {
                if (oldState == ServerState.MIGRATION_REQUIRED && newState == ServerState.RUNNING) {
                  try {
                    initDatabaseDependantItems();
                  } catch (BimserverDatabaseException e) {
                    LOGGER.error("", e);
                  }
                }
              }
            });
      } else {
        initDatabaseDependantItems();
      }

      mailSystem = new MailSystem(this);

      diskCacheManager = new DiskCacheManager(this, config.getHomeDir().resolve("cache"));

      mergerFactory = new MergerFactory(this);

      FileBasedReflectorFactoryBuilder factoryBuilder = new FileBasedReflectorFactoryBuilder();
      reflectorFactory = factoryBuilder.newReflectorFactory();
      if (reflectorFactory == null) {
        throw new RuntimeException("No reflector factory!");
      }
      servicesMap.setReflectorFactory(reflectorFactory);

      bimScheduler = new JobScheduler(this);
      bimScheduler.start();

      if (config.isStartEmbeddedWebServer()) {
        embeddedWebServer.start();
      }

      if (config.isStartCommandLine()) {
        commandLine = new CommandLine(this);
        commandLine.start();
      }
    } catch (Throwable e) {
      LOGGER.error("", e);
      serverInfoManager.setErrorMessage(e.getMessage());
    }
  }