/**
   * Attaches a JAX-RS {@link Application} to this JaxRsApplication.<br>
   * The providers are available for all root resource classes provided to this JaxRsApplication. If
   * you won't mix them, instantiate another JaxRsApplication.
   *
   * @param appConfig Contains the classes to load as root resource classes and as providers.
   *     Invalid root resource classes and provider classes are ignored, according to JAX-RS
   *     specification.
   * @return true, if all resource classes and providers could be added, or false at least one could
   *     not be added. Exceptions were logged.
   * @throws IllegalArgumentException if the given appConfig is null.
   */
  public boolean add(Application appConfig) throws IllegalArgumentException {
    if (appConfig == null) {
      throw new IllegalArgumentException("The ApplicationConfig must not be null");
    }

    JaxRsRestlet jaxRsRestlet = this.jaxRsRestlet;
    boolean everythingFine = true;

    if (jaxRsRestlet == null) {
      everythingFine = false;
      getLogger().warning("No JAX-RS to Restlet adapter available to handle to calls.");
    } else {
      Set<Class<?>> classes = appConfig.getClasses();
      Set<Object> singletons = appConfig.getSingletons();

      if (singletons != null) {
        for (Object singleton : singletons) {
          // LATER test: check, if a singleton is also available in
          // the
          // classes -> ignore or whatever
          if (singleton != null && !classes.contains(singleton.getClass())) {
            everythingFine &= jaxRsRestlet.addSingleton(singleton);
          }
        }
      }

      if (classes != null) {
        for (Class<?> clazz : classes) {
          everythingFine &= jaxRsRestlet.addClass(clazz);
        }
      }
    }

    return everythingFine;
  }
 public void publish(Application application) {
   Set<Class<?>> classes = new LinkedHashSet<>();
   Set<Class<?>> appClasses = application.getClasses();
   if (appClasses != null) {
     classes.addAll(appClasses);
   }
   if (application instanceof EverrestApplication) {
     EverrestApplication everrest = (EverrestApplication) application;
     for (Map.Entry<String, Class<?>> e : everrest.getResourceClasses().entrySet()) {
       Class<?> clazz = e.getValue();
       addResource(e.getKey(), clazz);
       classes.remove(clazz);
     }
     for (Map.Entry<String, Object> e : everrest.getResourceSingletons().entrySet()) {
       addResource(e.getKey(), e.getValue());
     }
     for (ObjectFactory<? extends ObjectModel> factory : everrest.getFactories()) {
       addFactory(factory);
       classes.remove(factory.getObjectModel().getObjectClass());
     }
   }
   for (Class<?> clazz : classes) {
     addPerRequest(clazz);
   }
   Set<Object> singletons = application.getSingletons();
   if (singletons != null) {
     for (Object instance : singletons) {
       addSingleton(instance);
     }
   }
 }
 @GET
 public String get() {
   assertTrue(application != null);
   assertTrue(application.getClasses().contains(ResourceB.class));
   assertTrue(application.getSingletons().size() > 0);
   assertTrue(
       application.getSingletons().iterator().next().getClass().equals(ResourceAReader.class));
   return "get!";
 }
  @Test
  public void callsPreDestroyMethodsForSingletonComponentsOnStop() throws Exception {
    EchoResource resource = new EchoResource();
    Application application = mock(Application.class);
    when(application.getSingletons()).thenReturn(newHashSet(resource));
    when(requestHandler.getResources()).thenReturn(mock(ResourceBinder.class));

    everrestProcessor.addApplication(application);
    everrestProcessor.stop();

    assertEquals(1, resource.preDestroyActionInvocationsCounter.get());
  }
  @Test
  public void addsClassesFromNewApplicationToTheBeginningOfSetOfClasses() {
    Application applicationOne = mock(Application.class);
    Application applicationTwo = mock(Application.class);
    when(applicationOne.getClasses()).thenReturn(newHashSet(ResourceOne.class));
    when(applicationTwo.getClasses()).thenReturn(newHashSet(ResourceTwo.class));

    everrestApplication.addApplication(applicationTwo);
    assertEquals(newHashSet(ResourceTwo.class), everrestApplication.getClasses());
    everrestApplication.addApplication(applicationOne);
    assertEquals(
        newHashSet(ResourceOne.class, ResourceTwo.class), everrestApplication.getClasses());
  }
  @Test
  public void addsSingletonsFromNewApplicationToTheBeginningOfSetOfSingletons() {
    Application applicationOne = mock(Application.class);
    Application applicationTwo = mock(Application.class);
    ResourceOne resourceOne = new ResourceOne();
    ResourceTwo resourceTwo = new ResourceTwo();
    when(applicationOne.getSingletons()).thenReturn(newHashSet(resourceOne));
    when(applicationTwo.getSingletons()).thenReturn(newHashSet(resourceTwo));

    everrestApplication.addApplication(applicationTwo);
    assertEquals(newHashSet(resourceTwo), everrestApplication.getSingletons());
    everrestApplication.addApplication(applicationOne);
    assertEquals(newHashSet(resourceOne, resourceTwo), everrestApplication.getSingletons());
  }
  public static List<String> getPaths(Application application) {
    List<String> paths = new ArrayList<String>();

    Set<Class<?>> clazzes = application.getClasses();
    for (Class<?> clazz : clazzes) {
      paths.addAll(getPaths(clazz));
    }

    Set<Object> singletons = application.getSingletons();
    for (Object object : singletons) {
      paths.addAll(getPaths(object.getClass()));
    }

    return paths;
  }
Beispiel #8
0
 private RSDL getRSDL(Application application) throws ClassNotFoundException, IOException {
   RSDL rsdl = null;
   for (Object obj : application.getSingletons()) {
     if (obj instanceof BackendApiResource) {
       BackendApiResource resource = (BackendApiResource) obj;
       rsdl = resource.getRSDL();
       break;
     }
   }
   assert (rsdl != null)
       : "Resource that generates RSDL, BackendApiResource, not found (this should never happen)";
   return rsdl;
 }
Beispiel #9
0
  @SuppressWarnings("unchecked")
  public static JAXRSServerFactoryBean createApplication(
      Application app, boolean ignoreAppPath, boolean staticSubresourceResolution) {

    Set<Object> singletons = app.getSingletons();
    verifySingletons(singletons);

    List<Class<?>> resourceClasses = new ArrayList<Class<?>>();
    List<Object> providers = new ArrayList<Object>();
    List<Feature> features = new ArrayList<Feature>();
    Map<Class<?>, ResourceProvider> map = new HashMap<Class<?>, ResourceProvider>();

    // Note, app.getClasses() returns a list of per-request classes
    // or singleton provider classes
    for (Class<?> cls : app.getClasses()) {
      if (isValidApplicationClass(cls, singletons)) {
        if (isValidProvider(cls)) {
          providers.add(createProviderInstance(cls));
        } else if (Feature.class.isAssignableFrom(cls)) {
          features.add(createFeatureInstance((Class<? extends Feature>) cls));
        } else {
          resourceClasses.add(cls);
          map.put(cls, new PerRequestResourceProvider(cls));
        }
      }
    }

    // we can get either a provider or resource class here
    for (Object o : singletons) {
      if (isValidProvider(o.getClass())) {
        providers.add(o);
      } else if (o instanceof Feature) {
        features.add((Feature) o);
      } else {
        resourceClasses.add(o.getClass());
        map.put(o.getClass(), new SingletonResourceProvider(o));
      }
    }

    JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
    String address = "/";
    if (!ignoreAppPath) {
      ApplicationPath appPath = app.getClass().getAnnotation(ApplicationPath.class);
      if (appPath != null) {
        address = appPath.value();
      }
    }
    if (!address.startsWith("/")) {
      address = "/" + address;
    }
    bean.setAddress(address);
    bean.setStaticSubresourceResolution(staticSubresourceResolution);
    bean.setResourceClasses(resourceClasses);
    bean.setProviders(providers);
    bean.setFeatures(features);
    for (Map.Entry<Class<?>, ResourceProvider> entry : map.entrySet()) {
      bean.setResourceProvider(entry.getKey(), entry.getValue());
    }
    Map<String, Object> appProps = app.getProperties();
    if (appProps != null) {
      bean.getProperties(true).putAll(appProps);
    }
    bean.setApplication(app);

    return bean;
  }
  /** Assumes the configuration field is initialized with a valid ResourceConfig. */
  private void initialize() {
    LOGGER.info(LocalizationMessages.INIT_MSG(Version.getBuildId()));

    // Lock original ResourceConfig.
    if (application instanceof ResourceConfig) {
      ((ResourceConfig) application).lock();
    }

    // add WADL support
    runtimeConfig.register(WadlModelProcessorFeature.class);

    // Configure binders and features.
    runtimeConfig.configureMetaProviders(locator);

    // Introspecting classes & instances
    final ResourceBag.Builder resourceBagBuilder = new ResourceBag.Builder();
    for (Class<?> c : runtimeConfig.getClasses()) {
      try {
        Resource resource = Resource.from(c);
        if (resource != null) {
          resourceBagBuilder.registerResource(c, resource);
        }
      } catch (IllegalArgumentException ex) {
        LOGGER.warning(ex.getMessage());
      }
    }

    for (Object o : runtimeConfig.getSingletons()) {
      try {
        Resource resource = Resource.from(o.getClass());
        if (resource != null) {
          resourceBagBuilder.registerResource(o, resource);
        }
      } catch (IllegalArgumentException ex) {
        LOGGER.warning(ex.getMessage());
      }
    }

    // Adding programmatic resource models
    for (Resource programmaticResource : runtimeConfig.getResources()) {
      resourceBagBuilder.registerProgrammaticResource(programmaticResource);
    }

    final ResourceBag resourceBag = resourceBagBuilder.build();

    runtimeConfig.lock();

    // Registering Injection Bindings
    final Set<ComponentProvider> componentProviders = new HashSet<ComponentProvider>();

    for (ComponentProvider provider : ServiceFinder.find(ComponentProvider.class)) {
      provider.initialize(locator);
      componentProviders.add(provider);
    }

    final ComponentBag componentBag = runtimeConfig.getComponentBag();
    bindProvidersAndResources(
        componentProviders, componentBag, resourceBag.classes, resourceBag.instances);
    for (ComponentProvider componentProvider : componentProviders) {
      componentProvider.done();
    }

    // scan for NameBinding annotations attached to the application class
    Collection<Class<? extends Annotation>> applicationNameBindings =
        ReflectionHelper.getAnnotationTypes(application.getClass(), NameBinding.class);

    // find all filters, interceptors and dynamic features
    final Iterable<RankedProvider<ContainerResponseFilter>> responseFilters =
        Providers.getAllRankedProviders(locator, ContainerResponseFilter.class);
    final MultivaluedMap<Class<? extends Annotation>, RankedProvider<ContainerResponseFilter>>
        nameBoundResponseFilters =
            filterNameBound(responseFilters, null, componentBag, applicationNameBindings);

    final Iterable<RankedProvider<ContainerRequestFilter>> requestFilters =
        Providers.getAllRankedProviders(locator, ContainerRequestFilter.class);
    final List<RankedProvider<ContainerRequestFilter>> preMatchFilters = Lists.newArrayList();
    final MultivaluedMap<Class<? extends Annotation>, RankedProvider<ContainerRequestFilter>>
        nameBoundRequestFilters =
            filterNameBound(requestFilters, preMatchFilters, componentBag, applicationNameBindings);

    final Iterable<RankedProvider<ReaderInterceptor>> readerInterceptors =
        Providers.getAllRankedProviders(locator, ReaderInterceptor.class);
    final MultivaluedMap<Class<? extends Annotation>, RankedProvider<ReaderInterceptor>>
        nameBoundReaderInterceptors =
            filterNameBound(readerInterceptors, null, componentBag, applicationNameBindings);

    final Iterable<RankedProvider<WriterInterceptor>> writerInterceptors =
        Providers.getAllRankedProviders(locator, WriterInterceptor.class);
    final MultivaluedMap<Class<? extends Annotation>, RankedProvider<WriterInterceptor>>
        nameBoundWriterInterceptors =
            filterNameBound(writerInterceptors, null, componentBag, applicationNameBindings);
    final Iterable<DynamicFeature> dynamicFeatures =
        Providers.getAllProviders(locator, DynamicFeature.class);

    ResourceModel resourceModel =
        new ResourceModel.Builder(resourceBag.getRootResources(), false).build();

    resourceModel = processResourceModel(resourceModel);
    // validate the models
    validate(resourceModel);

    bindEnhancingResourceClasses(resourceModel, resourceBag, componentProviders);

    final RuntimeModelBuilder runtimeModelBuilder = locator.getService(RuntimeModelBuilder.class);
    runtimeModelBuilder.setGlobalInterceptors(readerInterceptors, writerInterceptors);
    runtimeModelBuilder.setBoundProviders(
        nameBoundRequestFilters,
        nameBoundResponseFilters,
        nameBoundReaderInterceptors,
        nameBoundWriterInterceptors,
        dynamicFeatures);

    // assembly request processing chain
    /**
     * Root hierarchical request matching acceptor. Invoked in a single linear stage as part of the
     * main linear accepting chain.
     */
    final Router resourceRoutingRoot =
        runtimeModelBuilder.buildModel(resourceModel.getRuntimeResourceModel(), false);

    final ContainerFilteringStage preMatchRequestFilteringStage =
        locator
            .createAndInitialize(ContainerFilteringStage.Builder.class)
            .build(preMatchFilters, responseFilters);
    final RoutingStage routingStage =
        locator.createAndInitialize(RoutingStage.Builder.class).build(resourceRoutingRoot);
    final ContainerFilteringStage resourceFilteringStage =
        locator
            .createAndInitialize(ContainerFilteringStage.Builder.class)
            .build(requestFilters, null);
    final RoutedInflectorExtractorStage routedInflectorExtractorStage =
        locator.createAndInitialize(RoutedInflectorExtractorStage.class);
    /**
     * Root linear request acceptor. This is the main entry point for the whole request processing.
     */
    final Stage<ContainerRequest> rootStage =
        Stages.chain(locator.createAndInitialize(ReferencesInitializer.class))
            .to(locator.createAndInitialize(ContainerMessageBodyWorkersInitializer.class))
            .to(preMatchRequestFilteringStage)
            .to(routingStage)
            .to(resourceFilteringStage)
            .build(routedInflectorExtractorStage);

    // Inject instances.
    for (Object instance : componentBag.getInstances(ComponentBag.EXCLUDE_META_PROVIDERS)) {
      locator.inject(instance);
    }
    for (Object instance : resourceBag.instances) {
      locator.inject(instance);
    }

    // initiate resource model into JerseyResourceContext
    JerseyResourceContext jerseyResourceContext = locator.getService(JerseyResourceContext.class);
    jerseyResourceContext.setResourceModel(resourceModel);

    this.runtime = locator.createAndInitialize(ServerRuntime.Builder.class).build(rootStage);

    // inject self
    locator.inject(this);
  }
 public AuthorResource(@Context Application app) throws Exception {
   _authorDao = (AuthorDao) app.getProperties().get("authorDao");
   logger.info("Using AuthorDao implementation " + _authorDao.getClass().getSimpleName());
 }