/** * Returns all responses from all members as a linked map, where order is group member order. */ protected LinkedHashMap<Repository, Response> getAll(@Nonnull final Context context, @Nonnull final Iterable<Repository> members, @Nonnull final DispatchedRepositories dispatched) throws Exception { return getAll(context.getRequest(), context, members, dispatched); }
/** * Method that actually performs group GET. Override if needed. */ protected Response doGet(@Nonnull final Context context, @Nonnull final DispatchedRepositories dispatched) throws Exception { final GroupFacet groupFacet = context.getRepository().facet(GroupFacet.class); return getFirst(context, groupFacet.members(), dispatched); }
/** * Returns the first OK response from member repositories or {@link HttpResponses#notFound()} if none of the members * responded with OK. */ protected Response getFirst(@Nonnull final Context context, @Nonnull final List<Repository> members, @Nonnull final DispatchedRepositories dispatched) throws Exception { final Request request = context.getRequest(); for (Repository member : members) { log.trace("Trying member: {}", member); // track repositories we have dispatched to, prevent circular dispatch for nested groups if (dispatched.contains(member)) { log.trace("Skipping already dispatched member: {}", member); continue; } dispatched.add(member); final ViewFacet view = member.facet(ViewFacet.class); final Response response = view.dispatch(request, context); log.trace("Member {} response {}", member, response.getStatus()); if (isValidResponse(response)) { return response; } } return notFoundResponse(context); }
@Nonnull @Override public Response handle(@Nonnull final Context context) throws Exception { final String method = context.getRequest().getAction(); switch (method) { case GET: case HEAD: { final DispatchedRepositories dispatched = context.getRequest().getAttributes() .getOrCreate(DispatchedRepositories.class); return doGet(context, dispatched); } default: return HttpResponses.methodNotAllowed(method, GET, HEAD); } }