private FullHttpResponse handleJsonServiceMappings(
     FullHttpRequest request, JsonServiceMapping jsonServiceMapping, Matcher matcher)
     throws Exception {
   if (!httpSessionManager.hasReadAccess(request)) {
     return handleNotAuthenticated(request);
   }
   boolean isGetRequest = request.method().name().equals(HttpMethod.GET.name());
   if (!isGetRequest && !httpSessionManager.hasAdminAccess(request)) {
     return handleNotAuthorized();
   }
   String requestText = getRequestText(request);
   String[] args = new String[matcher.groupCount()];
   for (int i = 0; i < args.length; i++) {
     String group = matcher.group(i + 1);
     checkNotNull(group);
     args[i] = group;
   }
   logger.debug(
       "handleJsonRequest(): serviceMethodName={}, args={}, requestText={}",
       jsonServiceMapping.methodName(),
       args,
       requestText);
   Object responseObject;
   try {
     responseObject =
         callMethod(
             jsonServiceMapping.service(), jsonServiceMapping.methodName(), args, requestText);
   } catch (Exception e) {
     return newHttpResponseFromException(e);
   }
   return buildJsonResponse(responseObject);
 }
 private @Nullable FullHttpResponse handleHttpService(
     ChannelHandlerContext ctx, FullHttpRequest request, HttpService httpService)
     throws Exception {
   if (!httpSessionManager.hasReadAccess(request)
       && !(httpService instanceof UnauthenticatedHttpService)) {
     return handleNotAuthenticated(request);
   }
   boolean isGetRequest = request.method().name().equals(HttpMethod.GET.name());
   if (!isGetRequest && !httpSessionManager.hasAdminAccess(request)) {
     return handleNotAuthorized();
   }
   return httpService.handleRequest(ctx, request);
 }