@Nonnull public synchronized FactSheet getFactSheet() throws NotFoundException { log.info("getFactSheet() - {}", taxon); log.debug(">>>> weak reference: {}", factSheetRef); FactSheet factSheet = null; if (factSheetRef != null) { factSheet = factSheetRef.get(); log.debug(">>>> factSheet from weak reference: {}", factSheet); } if (factSheet == null) { log.info(">>>> loading fact sheet for {}...", taxon); final long time = System.currentTimeMillis(); factSheet = new FactSheet(taxon.getId()); // FIXME: use Locator.findAll() or Locator.createAllProvidersFor() for (final FactSheetProvider provider : Lookup.getDefault().lookupAll(FactSheetProvider.class)) { log.debug(">>>> calling {} ...", provider); factSheet = factSheet.mergedWith(provider.createFactSheetFor(taxon)); } log.debug(">>>> fact sheet loaded in {} msec...", System.currentTimeMillis() - time); factSheetRef = new WeakReference<FactSheet>(factSheet); } return factSheet; } }