/**
  * If this factory is a wrapper for the specified factory that do not add any additional
  * {@linkplain #getAuthorityCodes authority codes}, returns {@code true}. This method is for
  * {@link FallbackAuthorityFactory} internal use only and should not be public. A cheap test
  * without {@link #getBackingStore} invocation is suffisient for our needs.
  */
 @Override
 boolean sameAuthorityCodes(final AuthorityFactory factory) {
   final AbstractAuthorityFactory backingStore = this.backingStore; // Protect from changes.
   if (backingStore != null && backingStore.sameAuthorityCodes(factory)) {
     return true;
   }
   return super.sameAuthorityCodes(factory);
 }
 /** Releases resources immediately instead of waiting for the garbage collector. */
 @Override
 public synchronized void dispose() throws FactoryException {
   if (backingStore != null) {
     backingStore.dispose();
     backingStore = null;
   }
   objectCache.clear();
   super.dispose();
 }
 /**
  * Constructs an instance wrapping the specified factory. The {@code maxStrongReferences} argument
  * specify the maximum number of objects to keep by strong reference. If a greater amount of
  * objects are created, then the strong references for the oldest ones are replaced by weak
  * references.
  *
  * <p>This constructor is protected because subclasses must declare which of the {@link
  * DatumAuthorityFactory}, {@link CSAuthorityFactory}, {@link CRSAuthorityFactory} and {@link
  * CoordinateOperationAuthorityFactory} interfaces they choose to implement.
  *
  * @param factory The factory to cache. Can not be {@code null}.
  * @param maxStrongReferences The maximum number of objects to keep by strong reference.
  */
 protected ThreadedAuthorityFactory(
     AbstractAuthorityFactory factory, final int maxStrongReferences) {
   super(factory.getPriority());
   while (factory instanceof ThreadedAuthorityFactory) {
     factory = ((ThreadedAuthorityFactory) factory).backingStore;
   }
   this.backingStore = factory;
   this.objectCache = new OldReferencingObjectCache(maxStrongReferences);
   completeHints();
 }
 /**
  * Returns the organization or party responsible for definition and maintenance of the underlying
  * database.
  */
 public synchronized Citation getAuthority() {
   return (backingStore != null) ? backingStore.getAuthority() : null;
 }
 /** Returns the vendor responsible for creating the underlying factory implementation. */
 @Override
 public synchronized Citation getVendor() {
   return (backingStore != null) ? backingStore.getVendor() : super.getVendor();
 }