public void createOrUpdateProject(NamedNodeMap nodeMap, ProjectDAO dao) {
    Project project = new Project(); // проект из БД

    // поля синхронизации
    String name = nodeMap.getNamedItem("name").getNodeValue().trim(); // название проекта
    String idProject = nodeMap.getNamedItem("id").getNodeValue(); // id проекта
    String status = nodeMap.getNamedItem("status").getNodeValue(); // статус проекта
    String pmLdap = nodeMap.getNamedItem("pm").getNodeValue(); // руководитель проекта
    String hcLdap = nodeMap.getNamedItem("hc").getNodeValue(); // hc

    // ищем в БД запись о проекте
    Project findingProject = dao.findByProjectId(idProject);
    if (findingProject == null) { // если проекта еще нет в БД
      project.setActive(newStatus.contains(status)); // установим ему новый статус
    } else {
      // если проект уже существовал - статус менять не будем
      // см. //APLANATS-408
      project.setActive(findingProject.isActive());
    }

    project.setName(name);
    project.setProjectId(idProject);

    if (project.isActive()) {
      if (!setPM(project, pmLdap)) {
        return; // если не указан РП или его нет в БД, то проект не сохраняем, переходим к
                // следующему
      }
      setDivision(project, hcLdap); // установим подразделение пользователя
    }
    dao.store(project); // запишем в БД
  }
  /*
   * Синхронизация проектов с аплановской системой ведения проектов
   * По адресу OQurl находится список проектов вместе с сотрудниками
   * в виде xml (файл синхронизации)
   *
   * <project id="" name="" description="" customer="" ending="" status="7-архив" pm="CN=Somebody Dmitry/CN=Users/DC=aplana/DC=com" hc="CN=Zaitsev Dmitry/CN=Users/DC=aplana/DC=com" >
   *     <workgroup>
   *         <user>Ivanov Ivan</user>
   *         <user>Smirnov S***n</user>
   *         <user>Sidorov Igor</user>
   *     </workgroup>
   * </project>
   */
  @Transactional
  public void sync() {
    trace.setLength(0);
    try {
      trace.append("Начало синхронизации\n");
      projectDAO.setTrace(trace);
      // получим список веток project из xml файла
      NodeList nodes = getOQasNodeList();
      trace
          .append("В файле синхронизации найдено: ")
          .append(nodes.getLength())
          .append(" проектов\n");

      for (int i = 0; i < nodes.getLength(); i++) {
        createOrUpdateProject(nodes.item(i).getAttributes(), projectDAO);
      }
      trace.append("Синхронизация завершена\n");
    } catch (Exception e) {
      logger.error("oq project sync error: ", e);
      trace.append("Синхронизация прервана из-за ошибки: ").append(e.getMessage()).append("\n");
    }
  }