private void disposeAuthorityFactories(Set<? extends AuthorityFactory> factories)
     throws FactoryException {
   for (AuthorityFactory af : factories) {
     if (af instanceof AbstractAuthorityFactory) {
       LOGGER.info("Disposing referencing factory " + af);
       ((AbstractAuthorityFactory) af).dispose();
     }
   }
 }
 /**
  * Prints a list of codes that duplicate the ones provided by {@link ThreadedEpsgFactory}. This is
  * used for implementation of {@linkplain #main main method} in order to check the content of the
  * {@value #FILENAME} file (or whatever property file used as backing store for this factory) from
  * the command line.
  *
  * @param out The writer where to print the report.
  * @return The set of duplicated codes.
  * @throws FactoryException if an error occured.
  * @since 2.4
  */
 protected Set reportDuplicatedCodes(final PrintWriter out) throws FactoryException {
   final AbstractAuthorityFactory sqlFactory = getFactory(ThreadedEpsgFactory.class);
   final Vocabulary resources = Vocabulary.getResources(null);
   out.println(resources.getLabel(VocabularyKeys.COMPARE_WITH));
   try {
     final IndentedLineWriter w = new IndentedLineWriter(out);
     w.setIndentation(4);
     w.write(sqlFactory.getBackingStoreDescription());
     w.flush();
   } catch (IOException e) {
     // Should never happen, since we are writting to a PrintWriter.
     throw new AssertionError(e);
   }
   out.println();
   final Set<String> wktCodes = this.getAuthorityCodes(IdentifiedObject.class);
   final Set<String> sqlCodes = sqlFactory.getAuthorityCodes(IdentifiedObject.class);
   final Set<String> duplicated = new TreeSet<String>();
   for (String code : wktCodes) {
     code = code.trim();
     if (sqlCodes.contains(code)) {
       duplicated.add(code);
       /*
        * Note: we don't use wktCodes.retainsAll(sqlCode) because the Set implementations
        *       are usually not the standard ones, but rather some implementations backed
        *       by a connection to the resources of the underlying factory. We also close
        *       the connection after this loop for the same reason.  In addition, we take
        *       this opportunity for sorting the codes.
        */
     }
   }
   if (duplicated.isEmpty()) {
     out.println(resources.getString(VocabularyKeys.NO_DUPLICATION_FOUND));
   } else {
     for (final String code : duplicated) {
       out.print(resources.getLabel(VocabularyKeys.DUPLICATED_VALUE));
       out.println(code);
     }
   }
   return duplicated;
 }