@Override
  public Continuation apply(final ContainerRequest request) {
    final RoutingContext routingCtx = injector.inject(RoutingContext.class);

    Object subResource = getResource(routingCtx);
    if (subResource == null) {
      throw new WebApplicationException(Response.Status.NOT_FOUND);
    }
    if (subResource.getClass().isAssignableFrom(Class.class)) {
      final Class<?> clazz = (Class<?>) subResource;
      SingletonResourceBinder singletonResourceFactory =
          injector.inject(SingletonResourceBinder.class);
      singletonResourceFactory.bindResourceClassAsSingleton(clazz);
      subResource = injector.inject(clazz);
    }

    // TODO: what to do with the issues?
    final Resource subResourceModel =
        Resource.builder(subResource, new LinkedList<ResourceModelIssue>()).build();
    runtimeModelBuilder.process(subResourceModel, true);

    // TODO: implement generated sub-resource methodAcceptorPair caching
    routingCtx.pushMatchedResource(subResource);
    Router subResourceAcceptor = runtimeModelBuilder.buildModel(true);
    return Continuation.of(request, subResourceAcceptor);
  }
    @Override
    public Response apply(final Request req) {
      i.inject(this);
      // Suspend current request
      invocationContext.suspend();

      Executors.newSingleThreadExecutor()
          .submit(
              new Runnable() {

                @Override
                public void run() {
                  try {
                    Thread.sleep(500);
                  } catch (InterruptedException ex) {
                    ex.printStackTrace(System.err);
                  }

                  // Returning will enter the suspended request
                  invocationContext.resume(Responses.from(200, req).entity("B").build());
                }
              });

      return null;
    }
  @Before
  public void setupApplication() {
    Services services = HK2.get().create(null, new ServerModule());

    final Ref<ServiceProviders> providers =
        services.forContract(new TypeLiteral<Ref<ServiceProviders>>() {}).get();
    providers.set(services.forContract(ServiceProviders.Builder.class).get().build());
    final Ref<MessageBodyWorkers> workers =
        services.forContract(new TypeLiteral<Ref<MessageBodyWorkers>>() {}).get();
    workers.set(new MessageBodyFactory(providers.get()));
    final Ref<ExceptionMappers> mappers =
        services.forContract(new TypeLiteral<Ref<ExceptionMappers>>() {}).get();
    mappers.set(new ExceptionMapperFactory(providers.get()));

    Injector injector = services.forContract(Injector.class).get();
    injector.inject(this);

    final InvokerBuilder invokerBuilder = injector.inject(InvokerBuilder.class);
    this.invoker =
        invokerBuilder.build(
            routeBuilder.root(
                routeBuilder
                    .route("a(/.*)?")
                    .to(LastPathSegmentTracingFilter.class)
                    .to(
                        routeBuilder
                            .route("b(/.*)?")
                            .to(LastPathSegmentTracingFilter.class)
                            .to(
                                routeBuilder
                                    .route("c(/)?")
                                    .to(LastPathSegmentTracingFilter.class)
                                    .to(Routers.asTreeAcceptor(new AsyncInflector(injector))))
                            .to(
                                routeBuilder
                                    .route("d(/)?")
                                    .to(LastPathSegmentTracingFilter.class)
                                    .to(Routers.asTreeAcceptor(new AsyncInflector(injector)))))
                    .build()));
    this.requestScope = injector.inject(RequestScope.class);
  }