Пример #1
0
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    CharSequence pathInfo = request.getPathInfo();
    if (pathInfo == null) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No path");
      return;
    }
    Iterator<String> pathComponents = SLASH.split(pathInfo).iterator();
    String userID;
    List<String> itemIDsList;
    try {
      userID = pathComponents.next();
      itemIDsList = Lists.newArrayList();
      while (pathComponents.hasNext()) {
        itemIDsList.add(pathComponents.next());
      }
    } catch (NoSuchElementException nsee) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, nsee.toString());
      return;
    }

    String[] itemIDs = itemIDsList.toArray(new String[itemIDsList.size()]);
    unescapeSlashHack(itemIDs);

    OryxRecommender recommender = getRecommender();
    try {
      float[] estimates = recommender.estimatePreferences(userID, itemIDs);
      output(request, response, estimates);
    } catch (NotReadyException nre) {
      response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, nre.toString());
    }
  }
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    CharSequence pathInfo = request.getPathInfo();
    if (pathInfo == null) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No path");
      return;
    }
    Iterator<String> pathComponents = SLASH.split(pathInfo).iterator();
    long toItemID;
    List<Long> itemIDsList = Lists.newArrayList();
    try {
      toItemID = Long.parseLong(pathComponents.next());
      while (pathComponents.hasNext()) {
        itemIDsList.add(Long.parseLong(pathComponents.next()));
      }
    } catch (NoSuchElementException nsee) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, nsee.toString());
      return;
    } catch (NumberFormatException nfe) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, nfe.toString());
      return;
    }
    if (itemIDsList.isEmpty()) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No items");
      return;
    }
    long[] itemIDs = new long[itemIDsList.size()];
    for (int i = 0; i < itemIDs.length; i++) {
      itemIDs[i] = itemIDsList.get(i);
    }

    MyrrixRecommender recommender = getRecommender();
    try {
      float[] similarities = recommender.similarityToItem(toItemID, itemIDs);
      Writer out = response.getWriter();
      for (float similarity : similarities) {
        out.write(Float.toString(similarity));
        out.write('\n');
      }
    } catch (NoSuchItemException nsie) {
      response.sendError(HttpServletResponse.SC_NOT_FOUND, nsie.toString());
    } catch (NotReadyException nre) {
      response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, nre.toString());
    } catch (TasteException te) {
      response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, te.toString());
      getServletContext().log("Unexpected error in " + getClass().getSimpleName(), te);
    }
  }
Пример #3
0
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    CharSequence pathInfo = request.getPathInfo();
    if (pathInfo == null) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, "No path");
      return;
    }
    Iterator<String> pathComponents = SLASH.split(pathInfo).iterator();
    String userID;
    String itemID;
    try {
      userID = pathComponents.next();
      itemID = pathComponents.next();
    } catch (NoSuchElementException nsee) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, nsee.toString());
      return;
    }
    if (pathComponents.hasNext()) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Path too long");
      return;
    }

    userID = unescapeSlashHack(userID);
    itemID = unescapeSlashHack(itemID);

    OryxRecommender recommender = getRecommender();
    try {
      output(
          request,
          response,
          recommender.recommendedBecause(userID, itemID, getNumResultsToFetch(request)));
    } catch (NoSuchUserException nsue) {
      response.sendError(HttpServletResponse.SC_NOT_FOUND, nsue.toString());
    } catch (NoSuchItemException nsie) {
      response.sendError(HttpServletResponse.SC_NOT_FOUND, nsie.toString());
    } catch (NotReadyException nre) {
      response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, nre.toString());
    } catch (IllegalArgumentException iae) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, iae.toString());
    } catch (UnsupportedOperationException uoe) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, uoe.toString());
    }
  }
Пример #4
0
  @SuppressWarnings({"unchecked"})
  private String createURLInternal(Map paramValues, String encoding, boolean includeContextPath) {

    if (encoding == null) encoding = "utf-8";

    String contextPath = "";
    if (includeContextPath) {
      GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.getRequestAttributes();
      if (webRequest != null) {
        contextPath = webRequest.getAttributes().getApplicationUri(webRequest.getCurrentRequest());
      }
    }
    if (paramValues == null) paramValues = Collections.EMPTY_MAP;
    StringBuilder uri = new StringBuilder(contextPath);
    Set usedParams = new HashSet();

    String[] tokens = urlData.getTokens();
    int paramIndex = 0;
    for (int i = 0; i < tokens.length; i++) {
      String token = tokens[i];
      if (i == tokens.length - 1 && urlData.hasOptionalExtension()) {
        token += OPTIONAL_EXTENSION_WILDCARD;
      }
      Matcher m = OPTIONAL_EXTENSION_WILDCARD_PATTERN.matcher(token);
      if (m.find()) {

        if (token.startsWith(CAPTURED_WILDCARD)) {
          ConstrainedProperty prop = constraints[paramIndex++];
          String propName = prop.getPropertyName();

          Object value = paramValues.get(propName);
          usedParams.add(propName);

          if (value != null) {
            token = token.replaceFirst(DOUBLE_WILDCARD_PATTERN.pattern(), value.toString());
          } else if (prop.isNullable()) {
            break;
          }
        }
        uri.append(SLASH);
        ConstrainedProperty prop = constraints[paramIndex++];
        String propName = prop.getPropertyName();
        Object value = paramValues.get(propName);
        usedParams.add(propName);
        if (value != null) {
          String ext = "." + value;
          uri.append(
              token
                  .replace(OPTIONAL_EXTENSION_WILDCARD + '?', ext)
                  .replace(OPTIONAL_EXTENSION_WILDCARD, ext));
        } else {
          uri.append(
              token
                  .replace(OPTIONAL_EXTENSION_WILDCARD + '?', "")
                  .replace(OPTIONAL_EXTENSION_WILDCARD, ""));
        }

        continue;
      }
      if (token.endsWith("?")) {
        token = token.substring(0, token.length() - 1);
      }
      m = DOUBLE_WILDCARD_PATTERN.matcher(token);
      if (m.find()) {
        StringBuffer buf = new StringBuffer();
        do {
          ConstrainedProperty prop = constraints[paramIndex++];
          String propName = prop.getPropertyName();
          Object value = paramValues.get(propName);
          usedParams.add(propName);
          if (value == null && !prop.isNullable()) {
            throw new UrlMappingException(
                "Unable to create URL for mapping ["
                    + this
                    + "] and parameters ["
                    + paramValues
                    + "]. Parameter ["
                    + prop.getPropertyName()
                    + "] is required, but was not specified!");
          } else if (value == null) {
            m.appendReplacement(buf, "");
          } else {
            m.appendReplacement(buf, Matcher.quoteReplacement(value.toString()));
          }
        } while (m.find());

        m.appendTail(buf);

        try {
          String v = buf.toString();
          if (v.indexOf(SLASH) > -1 && CAPTURED_DOUBLE_WILDCARD.equals(token)) {
            // individually URL encode path segments
            if (v.startsWith(SLASH)) {
              // get rid of leading slash
              v = v.substring(SLASH.length());
            }
            String[] segs = v.split(SLASH);
            for (String segment : segs) {
              uri.append(SLASH).append(encode(segment, encoding));
            }
          } else if (v.length() > 0) {
            // original behavior
            uri.append(SLASH).append(encode(v, encoding));
          } else {
            // Stop processing tokens once we hit an empty one.
            break;
          }
        } catch (UnsupportedEncodingException e) {
          throw new ControllerExecutionException(
              "Error creating URL for parameters ["
                  + paramValues
                  + "], problem encoding URL part ["
                  + buf
                  + "]: "
                  + e.getMessage(),
              e);
        }
      } else {
        uri.append(SLASH).append(token);
      }
    }
    populateParameterList(paramValues, encoding, uri, usedParams);

    if (LOG.isDebugEnabled()) {
      LOG.debug(
          "Created reverse URL mapping ["
              + uri.toString()
              + "] for parameters ["
              + paramValues
              + "]");
    }
    return uri.toString();
  }