예제 #1
0
  /** Ensures that all additional files that this file requires are loaded. */
  private void ensureAdditionalClassesLoaded(Class<?> clazz) {
    if (!cache.isClassLoadedFromCache(clazz)) return;

    if (!hasFileDependencyAnnotation(clazz)) return;

    // we're here if annotation is present. We have to detect if all files are loaded.
    //
    // getting items where this class is registered.
    //
    String[] items = cache.getItemNames(clazz.getName());

    // finding the item that we used to instantiate this class.
    String usedItem = null;
    if (items != null)
      for (String item : items)
        if (usedOffers.contains(item)) {
          usedItem = item;
          break;
        }
    //
    // checking if files for this item were loaded.
    //
    ClassLoaderRequest request = null;
    if (usedItem != null) {
      String[] classesWithFiles = cache.getClassesWithFiles(usedItem);
      if (classesWithFiles != null && Arrays.asList(classesWithFiles).contains(clazz.getName()))
        return; // everything is fine, we loaded all necessary stuff.

      request =
          new ClassLoaderRequest(
              clazz.getName(), new ClassLoaderOffer[] {cache.createOfferByItemName(usedItem)});
    } else {
      log.info(
          "Class "
              + clazz.getName()
              + " has FileDependency annotation, but we could not detect the offer that this class was taken from. Asking from the client.");
      request = new ClassLoaderRequest(clazz.getName());
    }

    // files were not loaded. asking client for the data for our class.
    // Client will have to include files.
    try {
      ClassLoaderResponse response = (ClassLoaderResponse) mq.requestResponse(request, id);
      ClassLoaderOffer acceptedOffer = response.getAcceptedOffer();

      // updating the offer
      if (acceptedOffer.hasFiles()) {
        cache.registerOffer(acceptedOffer);
        // unpacking and using it.
        // we don't need class, just files. but let's do the whole sequence...
        useOffer(null, acceptedOffer);
      } else
        log.info(
            "Trying to load missing dependent files of class "
                + clazz.getName()
                + " we received offer without files. Nothing to load.");
    } catch (JMSException | TimeoutException e) {
      log.severe(
          "Failed to load additional files for class "
              + clazz.getName()
              + " . Exception occured: "
              + e);
      return;
    }
  }