public Element exec(Element params, ServiceContext context) throws Exception {

    Path harvestingLogoDirectory = Resources.locateHarvesterLogosDir(context);
    Path nodeLogoDirectory = Resources.locateLogosDir(context);

    String file = Util.getParam(params, Params.FNAME);
    String asFavicon = Util.getParam(params, Params.FAVICON, "0");

    if (file.contains("..")) {
      throw new BadParameterEx("Invalid character found in resource name.", file);
    }

    if ("".equals(file)) {
      throw new Exception("Logo name is not defined.");
    }

    SettingManager settingMan = context.getBean(SettingManager.class);
    String nodeUuid = settingMan.getSiteId();

    try {
      Path logoFilePath = harvestingLogoDirectory.resolve(file);
      if (!Files.exists(logoFilePath)) {
        logoFilePath = context.getAppPath().resolve("images/harvesting/" + file);
      }
      try (InputStream inputStream = Files.newInputStream(logoFilePath)) {
        BufferedImage source = ImageIO.read(inputStream);

        if ("1".equals(asFavicon)) {
          createFavicon(source, nodeLogoDirectory.resolve("favicon.png"));
        } else {
          Path logo = nodeLogoDirectory.resolve(nodeUuid + ".png");
          Path defaultLogo = nodeLogoDirectory.resolve("logo.png");

          if (!file.endsWith(".png")) {
            try (OutputStream logoOut = Files.newOutputStream(logo);
                OutputStream defLogoOut = Files.newOutputStream(defaultLogo); ) {
              ImageIO.write(source, "png", logoOut);
              ImageIO.write(source, "png", defLogoOut);
            }
          } else {
            Files.deleteIfExists(logo);
            IO.copyDirectoryOrFile(logoFilePath, logo, false);
            Files.deleteIfExists(defaultLogo);
            IO.copyDirectoryOrFile(logoFilePath, defaultLogo, false);
          }
        }
      }
    } catch (Exception e) {
      throw new Exception(
          "Unable to move uploaded thumbnail to destination directory. Error: " + e.getMessage());
    }

    Element response = new Element("response");
    response.addContent(new Element("status").setText("Logo set."));
    return response;
  }
  public GeonetResult align(Set<RecordInfo> records) throws Exception {
    log.info("Start of alignment for : " + params.name);

    // -----------------------------------------------------------------------
    // --- retrieve all local categories and groups
    // --- retrieve harvested uuids for given harvesting node

    localCateg = new CategoryMapper(dbms);
    localGroups = new GroupMapper(dbms);
    localUuids = new UUIDMapper(dbms, params.uuid);
    dbms.commit();

    parseXSLFilter();

    // -----------------------------------------------------------------------
    // --- remove old metadata

    for (String uuid : localUuids.getUUIDs())
      if (!exists(records, uuid)) {
        String id = localUuids.getID(uuid);

        if (log.isDebugEnabled()) log.debug("  - Removing old metadata with id:" + id);
        dataMan.deleteMetadata(context, dbms, id);
        dbms.commit();
        result.locallyRemoved++;
      }

    // -----------------------------------------------------------------------
    // --- insert/update new metadata

    for (RecordInfo ri : records) {
      result.totalMetadata++;

      if (!dataMan.existsSchema(ri.schema)) {
        if (log.isDebugEnabled())
          log.debug(
              "  - Metadata skipped due to unknown schema. uuid:"
                  + ri.uuid
                  + ", schema:"
                  + ri.schema);
        result.unknownSchema++;
      } else {
        String id = dataMan.getMetadataId(dbms, ri.uuid);

        // look up value of localrating/enabled
        GeonetContext gc = (GeonetContext) context.getHandlerContext(Geonet.CONTEXT_NAME);
        SettingManager settingManager = gc.getSettingManager();
        boolean localRating = settingManager.getValueAsBool("system/localrating/enabled", false);

        if (id == null) {
          addMetadata(ri, localRating);
        } else {
          updateMetadata(ri, id, localRating);
        }
      }
    }

    log.info("End of alignment for : " + params.name);

    return result;
  }
  public LDAPContext(SettingManager sm) {
    String prefix = "system/ldap";

    use = sm.getValueAsBool(prefix + "/use");
    host = sm.getValue(prefix + "/host");
    port = sm.getValueAsInt(prefix + "/port");
    defProfile = sm.getValue(prefix + "/defaultProfile");
    defGroup = sm.getValue(prefix + "/defaultGroup");
    baseDN = sm.getValue(prefix + "/distinguishedNames/base");
    usersDN = sm.getValue(prefix + "/distinguishedNames/users");
    nameAttr = sm.getValue(prefix + "/userAttribs/name");
    profileAttr = sm.getValue(prefix + "/userAttribs/profile");
    emailAttr = "mail"; // TODO make it configurable
    uidAttr = sm.getValue(prefix + "/uidAttr");
    groupAttr = sm.getValue(prefix + "/userAttribs/group");

    if (profileAttr.trim().length() == 0) profileAttr = null;

    if (groupAttr.trim().length() == 0) groupAttr = null;

    // --- init set of allowed profiles

    profiles.add("Hoofdeditor");
    profiles.add("Editor");
    profiles.add("RegisteredUser");
    profiles.add("UserAdmin");
    profiles.add("Monitor");
    profiles.add("Administrator");
  }
  /**
   * @param xml
   * @param fileIds
   * @param context
   * @param toIndex
   * @return
   * @throws Exception
   */
  private boolean insertTransaction(
      Element xml, List<String> fileIds, ServiceContext context, Set<String> toIndex)
      throws Exception {
    GeonetContext gc = (GeonetContext) context.getHandlerContext(Geonet.CONTEXT_NAME);
    DataManager dataMan = gc.getDataManager();

    String schema = dataMan.autodetectSchema(xml);

    //		String category   = Util.getParam(request, Params.CATEGORY);
    String category = null, source = null, createDate = null, changeDate = null;

    String uuid;
    uuid = dataMan.extractUUID(schema, xml);
    if (uuid.length() == 0) uuid = UUID.randomUUID().toString();

    // -----------------------------------------------------------------------
    // --- insert metadata into the system

    UserSession us = context.getUserSession();

    if (us.getUserId() == null) throw new NoApplicableCodeEx("User not authenticated.");

    String profile = us.getProfile();

    // Only editors and above are allowed to insert metadata
    if (!profile.equals(Geonet.Profile.EDITOR)
        && !profile.equals(Geonet.Profile.REVIEWER)
        && !profile.equals(Geonet.Profile.USER_ADMIN)
        && !profile.equals(Geonet.Profile.ADMINISTRATOR))
      throw new NoApplicableCodeEx("User not allowed to insert metadata.");

    int userId = us.getUserIdAsInt();

    AccessManager am = gc.getAccessManager();
    Dbms dbms = (Dbms) context.getResourceManager().open(Geonet.Res.MAIN_DB);

    // Set default group: user first group
    Set<String> userGroups = am.getVisibleGroups(dbms, userId);
    String group;
    if (userGroups.isEmpty()) {
      group = null;
    } else {
      group = (String) userGroups.iterator().next();
    }
    //
    // insert metadata
    //
    String docType = null, title = null, isTemplate = null;
    boolean ufo = true, indexImmediate = false;
    String id =
        dataMan.insertMetadata(
            context,
            dbms,
            schema,
            xml,
            context.getSerialFactory().getSerial(dbms, "Metadata"),
            uuid,
            userId,
            group,
            source,
            isTemplate,
            docType,
            title,
            category,
            createDate,
            changeDate,
            ufo,
            indexImmediate);

    if (id == null) return false;

    // Set metadata as public if setting enabled
    SettingManager sm = gc.getSettingManager();
    boolean metadataPublic = sm.getValueAsBool("system/csw/metadataPublic", false);

    if (metadataPublic) {
      dataMan.setOperation(context, dbms, id, "1", AccessManager.OPER_VIEW);
    }

    dataMan.indexMetadata(dbms, id);

    fileIds.add(uuid);

    dbms.commit();
    toIndex.add(id);
    return true;
  }
  private String getSiteId() {
    GeonetContext gc = (GeonetContext) context.getHandlerContext(Geonet.CONTEXT_NAME);
    SettingManager sm = gc.getBean(SettingManager.class);

    return sm.getValue("system/site/siteId");
  }