/** Creates request basing on the cache data. */ private ClassLoaderRequest createRequestFromCache(String className) { String[] items = cache.getItemNames(className); if (items == null || items.length == 0) return null; List<ClassLoaderOffer> offers = new ArrayList<ClassLoaderOffer>(); for (String itemName : items) offers.add(cache.createOfferByItemName(itemName)); return new ClassLoaderRequest(className, offers.toArray(new ClassLoaderOffer[offers.size()])); }
/** 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; } }