@Override
  public void synchronizeWithDatabase(ConnectorManager connectorManager) {
    ConnectorTypeServices connectorTypeServices = ConstellioSpringUtils.getConnectorTypeServices();

    // Add missing connector types
    List<String> connectorTypeNames = getConnectorTypes(connectorManager);
    for (String connectorTypeName : connectorTypeNames) {
      ConnectorType connectorType = connectorTypeServices.get(connectorTypeName);
      if (connectorType == null) {
        connectorType = new ConnectorType();
        connectorType.setName(connectorTypeName);

        File connectorsDir = ConstellioSpringUtils.getGoogleConnectorsDir();
        File connectorTypeDir = new File(connectorsDir, connectorType.getName());

        File iconFile = new File(connectorTypeDir, "icon.gif");
        if (iconFile.exists()) {
          try {
            byte[] iconBytes = FileUtils.readFileToByteArray(iconFile);
            connectorType.setIconFileContent(iconBytes);
          } catch (IOException e) {
            throw new RuntimeException(e);
          }
        }

        File connectorTypeMetaXmlFile = new File(connectorTypeDir, "connectorTypeMeta.xml");
        if (connectorTypeMetaXmlFile.exists()) {
          String path = connectorTypeMetaXmlFile.toURI().toString();
          BeanFactory connectorTypeMeta = new FileSystemXmlApplicationContext(path);
          if (connectorTypeMeta.containsBean("searchResultPanelClassName")) {
            String searchResultPanelClassName =
                (String) connectorTypeMeta.getBean("searchResultPanelClassName");
            connectorType.setSearchResultPanelClassName(searchResultPanelClassName);
          }
          if (connectorTypeMeta.containsBean("initInstanceHandlerClassName")) {
            String initInstancePluginClassName =
                (String) connectorTypeMeta.getBean("initInstanceHandlerClassName");
            connectorType.setInitInstanceHandlerClassName(initInstancePluginClassName);
          }
        }

        connectorType.setConnectorManager(connectorManager);
        connectorTypeServices.makePersistent(connectorType);
      }
    }

    // Remove deleted connector types
    List<ConnectorType> dbConnectorType = connectorTypeServices.list();
    for (ConnectorType connectorType : dbConnectorType) {
      if (!connectorTypeNames.contains(connectorType.getName())) {
        connectorTypeServices.makeTransient(connectorType);
      }
    }

    ConnectorInstanceServices connectorInstanceServices =
        ConstellioSpringUtils.getConnectorInstanceServices();
    BackupServices backupServices = ConstellioSpringUtils.getBackupServices();
    List<ConnectorInstance> connectorInstances = connectorInstanceServices.list();
    for (ConnectorInstance connectorInstance : connectorInstances) {
      String connectorName = connectorInstance.getName();
      String connectorTypeName = connectorInstance.getConnectorType().getName();
      boolean existingConnector = isExistingConnector(connectorManager, connectorName);
      boolean hasConfigBackup = backupServices.hasConfigBackup(connectorName, connectorTypeName);
      if (!existingConnector && hasConfigBackup) {
        backupServices.restoreConfigBackup(connectorName, connectorTypeName);
      } else if (existingConnector && !hasConfigBackup) {
        backupServices.backupConfig(connectorName, connectorTypeName);
      }
    }
  }