| | |
| | | return router; |
| | | } |
| | | |
| | | private Promise<RoutingContext, ResourceException> route(final Context context) { |
| | | Promise<RoutingContext, ResourceException> route(final Context context) { |
| | | final Connection conn = context.asContext(AuthenticatedConnectionContext.class).getConnection(); |
| | | final SearchRequest searchRequest = namingStrategy.createSearchRequest(dnFrom(context), idFrom(context)); |
| | | if (searchRequest.getScope().equals(BASE_OBJECT) && !resource.hasSubTypesWithSubResources()) { |
| | |
| | | return SubResource.convert404To400(ERR_UNSUPPORTED_REQUEST_AGAINST_INSTANCE.get()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Responsible for routing requests to sub-resources of instances within this collection. More specifically, given |
| | | * the URL template /collection/{id} then this handler processes all requests beneath /collection/{id}. |
| | | */ |
| | | private final class SubResourceHandler extends AbstractRequestHandler { |
| | | @Override |
| | | public Promise<ActionResponse, ResourceException> handleAction(final Context context, |
| | | final ActionRequest request) { |
| | | return route(context).thenAsync(new AsyncFunction<RoutingContext, ActionResponse, ResourceException>() { |
| | | @Override |
| | | public Promise<ActionResponse, ResourceException> apply(final RoutingContext context) { |
| | | return subResourceRouterFrom(context).handleAction(context, request); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> handleCreate(final Context context, |
| | | final CreateRequest request) { |
| | | return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() { |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) { |
| | | return subResourceRouterFrom(context).handleCreate(context, request); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> handleDelete(final Context context, |
| | | final DeleteRequest request) { |
| | | return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() { |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) { |
| | | return subResourceRouterFrom(context).handleDelete(context, request); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> handlePatch(final Context context, |
| | | final PatchRequest request) { |
| | | return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() { |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) { |
| | | return subResourceRouterFrom(context).handlePatch(context, request); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public Promise<QueryResponse, ResourceException> handleQuery(final Context context, final QueryRequest request, |
| | | final QueryResourceHandler handler) { |
| | | return route(context).thenAsync(new AsyncFunction<RoutingContext, QueryResponse, ResourceException>() { |
| | | @Override |
| | | public Promise<QueryResponse, ResourceException> apply(final RoutingContext context) { |
| | | return subResourceRouterFrom(context).handleQuery(context, request, handler); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> handleRead(final Context context, |
| | | final ReadRequest request) { |
| | | return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() { |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) { |
| | | return subResourceRouterFrom(context).handleRead(context, request); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> handleUpdate(final Context context, |
| | | final UpdateRequest request) { |
| | | return route(context).thenAsync(new AsyncFunction<RoutingContext, ResourceResponse, ResourceException>() { |
| | | @Override |
| | | public Promise<ResourceResponse, ResourceException> apply(final RoutingContext context) { |
| | | return subResourceRouterFrom(context).handleUpdate(context, request); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |