@RequestMapping(value = "/link", method = RequestMethod.POST)
  public ResponseEntity<?> shortener(
      @RequestParam("url") String url,
      @RequestParam(value = "sponsor", required = false) String sponsor,
      @RequestParam(value = "brand", required = false) String brand,
      @RequestParam(value = "urlName", required = false) String name,
      @RequestParam("username") String username,
      @RequestParam(value = "advert", required = false) String advertisement,
      @RequestParam(value = "max", required = false) String max,
      @RequestParam MultiValueMap<String, String> params,
      HttpServletRequest request,
      Principal currentUser,
      Model model) {
    logger.info("Requested new short for uri " + url);
    sponsor = "http://localhost:8080/advert";

    boolean useConditional = false;
    // Comprobamos si se usan URIs condicionales
    if (params.getFirst("ifurl1") != null
        && !params.getFirst("ifurl1").equals("")
        && params.getFirst("expr1") != null
        && !params.getFirst("expr1").equals("")) {
      useConditional = true;
    }

    logger.info("Name (hash) is " + name);
    // Si se usan URIs condicionales pero no hay url estandar,
    // se crea un hash usando las targets de las condicionales
    if (name.equals("") && url.equals("") && useConditional) {
      logger.info("There are Conditional URIs but no default target" + name);
      String ifurl = "ifurl";
      String expr = "expr";
      String nueva = "a";

      int paramn = 1;

      String firstparam = ifurl + paramn;
      String secondparam = expr + paramn;

      while ((params.getFirst(firstparam) != null && params.getFirst(secondparam) != null)
          && (!params.getFirst(firstparam).equals("")
              && !params.getFirst(secondparam).equals(""))) {
        nueva += params.getFirst(firstparam);

        paramn++;
        firstparam = ifurl + paramn;
        secondparam = expr + paramn;
      }

      name =
          Hashing.murmur3_32()
              .hashString(url + username + nueva, StandardCharsets.UTF_8)
              .toString();
      while (shortURLRepositoryExtended.findByHash(name, username) != null) {
        // seguir creando
        name =
            Hashing.murmur3_32()
                .hashString(url + username + "" + nueva, StandardCharsets.UTF_8)
                .toString();
        nueva += "a";
      }
    }

    // Si no existe una hash (id or name) se crea una
    else if (name.equals("")) {
      name = Hashing.murmur3_32().hashString(url + username, StandardCharsets.UTF_8).toString();
      String nueva = "a";
      while (shortURLRepositoryExtended.findByHash(name, username) != null) {
        // seguir creando
        name =
            Hashing.murmur3_32()
                .hashString(url + username + "" + nueva, StandardCharsets.UTF_8)
                .toString();
        nueva += "a";
      }
    }
    logger.info("After name (hash) is " + name);

    boolean advert = false;
    int seconds = 0;
    if (advertisement != null) {
      advert = true;
      if (!max.equals("")) {
        seconds = Integer.valueOf(max);
        if (seconds < 1) {
          seconds = 5;
        }
      }
    }

    if (shortURLRepositoryExtended.findByHash(name, username) != null
        && url != null
        && !url.equals("")) {
      ArrayList<String> sufijos = new ArrayList<String>(); // contiene todos los sufijos
      sufijos.add("ada");
      sufijos.add("aco");
      sufijos.add("ado");
      JSONArray arr = new JSONArray();
      JSONObject tmp;
      try {
        for (int i = 0; i < sufijos.size(); i++) {
          ShortURL l = shortURLRepositoryExtended.findByHash(name + "" + sufijos.get(i), username);
          if (l == null) {
            // No existe en la BD, luego no esta cogido
            tmp = new JSONObject();
            tmp.put("name", name + "" + sufijos.get(i));
            arr.put(tmp);
          }
        }
      } catch (Exception e) {
      }
      String devueltos = "'{\"names\":" + arr.toString() + "}'";

      RiWordnet wordnet = new RiWordnet();

      // Crea 10 sinonimos
      String[] poss = wordnet.getPos(name);
      /*
       * for (int j = 0; j < poss.length; j++) {
       * System.out.println("\n\nSynonyms for " + name + " (pos: " +
       * poss[j] + ")");
       */
      JSONArray sinonimos = new JSONArray();
      try {
        String[] synonyms = wordnet.getAllSynonyms(name, poss[0], 10);
        Arrays.sort(synonyms);
        JSONObject tmpo;
        for (int i = 0; i < synonyms.length; i++) {
          ShortURL l = shortURLRepositoryExtended.findByHash(synonyms[i], username);
          if (l == null) {
            // No existe en la BD, luego no esta cogido
            tmpo = new JSONObject();
            tmpo.put("synonym", synonyms[i]);
            sinonimos.put(tmpo);
          }
        }
      } catch (Exception e) {
      }
      String synDevueltos = "'{\"synonyms\":" + sinonimos.toString() + "}'";
      String respuesta = devueltos + "separa" + synDevueltos;
      return new ResponseEntity<>(respuesta, HttpStatus.NOT_ACCEPTABLE);
    } else {
      ShortURL su =
          createAndSaveIfValid(
              url,
              sponsor,
              brand,
              UUID.randomUUID().toString(),
              extractIP(request),
              name,
              username,
              advert,
              seconds,
              useConditional);
      if (su != null) {
        HttpHeaders h = new HttpHeaders();
        h.setLocation(su.getUri());

        saveConditionalURIs(name, params);

        return new ResponseEntity<>(su, h, HttpStatus.CREATED);
      } else {
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
      }
    }
  }