private static boolean error(VaadinRequest request, VaadinResponse response, String logMessage)
      throws IOException {
    getLogger().log(Level.WARNING, logMessage);
    response.sendError(
        HttpServletResponse.SC_NOT_FOUND, request.getPathInfo() + " can not be found");

    // Request handled (though not in a nice way)
    return true;
  }
  @Override
  public boolean handleRequest(
      VaadinSession session, VaadinRequest request, VaadinResponse response) throws IOException {
    String pathInfo = request.getPathInfo();
    if (pathInfo == null) {
      return false;
    }

    Matcher matcher = pattern.matcher(pathInfo);
    if (!matcher.matches()) {
      return false;
    }

    String uiid = matcher.group(1);
    String type = matcher.group(3);
    String key = matcher.group(2);

    if (key == null) {
      return error(request, response, pathInfo + " is not a valid global resource path");
    }

    UI ui = session.getUIById(Integer.parseInt(uiid));
    if (ui == null) {
      return error(request, response, "No UI found for id  " + uiid);
    }
    UI.setCurrent(ui);

    ConnectorResource resource;
    if (LEGACY_TYPE.equals(type)) {
      resource = legacyResources.get(key);
    } else {
      return error(
          request,
          response,
          "Unknown global resource type " + type + " in requested path " + pathInfo);
    }

    if (resource == null) {
      return error(request, response, "Global resource " + key + " not found");
    }

    DownloadStream stream = resource.getStream();
    if (stream == null) {
      return error(request, response, "Resource " + resource + " didn't produce any stream.");
    }

    stream.writeResponse(request, response);
    return true;
  }
  @Override
  public boolean handleRequest(
      VaadinSession session, VaadinRequest request, VaadinResponse response) throws IOException {

    if (data.isCallbackForMe(request)) {

      String verifier = request.getParameter(data.getVerifierParameterName());
      if (verifier != null) {
        // Got verifier!
        data.setVerifier(requestToken, new Verifier(verifier));
        finish(session, response);

        Token t = data.getAccessToken();

        OAuthRequest r = new OAuthRequest(Verb.GET, data.getRequestLink());
        data.signRequest(t, r);
        Response resp = r.send();

        FacebookAnswer answer = new Gson().fromJson(resp.getBody(), FacebookAnswer.class);

        String name = answer.name;
        String picUrl = answer.picture.data.url;
        String oauthId = "facebook" + answer.id;
        saveUser(oauthId, name, "", picUrl);

        VaadinSession.getCurrent().removeRequestHandler(this);
        ((VaadinServletResponse) response)
            .getHttpServletResponse()
            .sendRedirect(data.getRedirectUrl());

        return true;
      }

      // No verifier in the parameters. That's most likely because the user
      // denied the OAuth.

      // TODO: current error message reporting (below) is not very useful

      String error = null;
      for (String errorName : data.getErrorParameterNames()) {
        error = request.getParameter(errorName);
        if (error != null) {
          break;
        }
      }

      String errorMessage;
      if (error == null) {
        errorMessage = "OAuth failed.";
      } else {
        errorMessage = "OAuth denied: " + error;
      }

      data.setDenied(errorMessage);
      finish(session, response);
    } else if (request.getParameter("code") != null) {
      String code = request.getParameter("code");
      Verifier v = new Verifier(code);
      Token t = googleService.getAccessToken(null, v);

      OAuthRequest r = new OAuthRequest(Verb.GET, "https://www.googleapis.com/plus/v1/people/me");
      googleService.signRequest(t, r);
      Response resp = r.send();

      GooglePlusAnswer answer = new Gson().fromJson(resp.getBody(), GooglePlusAnswer.class);

      String name =
          (answer.displayName != null && !answer.displayName.equals(""))
              ? answer.displayName
              : answer.emails[0].value.substring(0, answer.emails[0].value.indexOf("@"));
      String picUrl = answer.image.url;
      String oauthId = "google" + answer.id;
      saveUser(oauthId, name, answer.emails[0].value, picUrl);

      VaadinSession.getCurrent().removeRequestHandler(this);
      ((VaadinServletResponse) response)
          .getHttpServletResponse()
          .sendRedirect(data.getRedirectUrl());
      return true;
    }
    return false;
  }