private boolean validateDuplicates() {
   boolean returnGood = true;
   for (CaseInsensitiveString second : duplicates.getKeySet()) {
     List<T> list = duplicates.getListFor(second);
     T good = active.get(second.toString());
     /*
      * CONSIDER Should get CDOMObject reference out of here :(
      */
     if (good instanceof CDOMObject) {
       CDOMObject cdo = (CDOMObject) good;
       for (int i = 0; i < list.size(); i++) {
         T dupe = list.get(i);
         if (cdo.isCDOMEqual((CDOMObject) dupe)) {
           for (Iterator<WeakReference<T>> it = manufactured.iterator(); it.hasNext(); ) {
             WeakReference<T> wr = it.next();
             T mfg = wr.get();
             if (mfg == null) {
               it.remove();
             }
             // Yes this is instance equality, not .equals
             else if (mfg == good) {
               forgetObject(good);
               break;
             }
           }
         }
       }
     }
     if (duplicates.containsListFor(second)) {
       Logging.errorPrint(
           "More than one "
               + factory.getReferenceDescription()
               + " with key/name "
               + good.getKeyName()
               + " was built");
       List<T> dupes = duplicates.getListFor(second);
       StringBuilder sb = new StringBuilder(1000);
       sb.append("Sources: ");
       sb.append(good.isInternal() ? "<internal>" : good.getSourceURI());
       for (T dupe : dupes) {
         sb.append(", ").append(dupe.isInternal() ? "<internal>" : dupe.getSourceURI());
         if (!dupe.getKeyName().equals(good.getKeyName())) {
           Logging.errorPrint("Key case differed for " + dupe.getKeyName());
         }
       }
       Logging.errorPrint(sb.toString());
       returnGood = false;
     }
   }
   return returnGood;
 }
 /**
  * Remove the given object from this AbstractReferenceManufacturer. Returns true if the object was
  * removed from this AbstractReferenceManufacturer; false otherwise.
  *
  * @param item The object to be removed from this AbstractReferenceManufacturer.
  * @return true if the object was removed from this AbstractReferenceManufacturer; false
  *     otherwise.
  */
 @Override
 public boolean forgetObject(T item) {
   if (!factory.isMember(item)) {
     throw new IllegalArgumentException(
         "Object to be forgotten does not match Class " + "of this AbstractReferenceManufacturer");
   }
   String key = active.getKeyFor(item);
   if (key == null) {
     /*
      * TODO This is a bug - the key name is not necessarily loaded into
      * the object, it may have been consumed by the object context... :P
      */
     CaseInsensitiveString ocik = new CaseInsensitiveString(item.getKeyName());
     duplicates.removeFromListFor(ocik, item);
   } else {
     CaseInsensitiveString ocik = new CaseInsensitiveString(key);
     List<T> list = duplicates.getListFor(ocik);
     if (list == null) {
       // No replacement
       active.remove(key);
     } else {
       T newActive = duplicates.getElementInList(ocik, 0);
       duplicates.removeFromListFor(ocik, newActive);
       active.put(key, newActive);
     }
   }
   return true;
 }
 /**
  * Changes the identifier for a given object, as stored in this AbstractReferenceManufacturer.
  *
  * @param key The new identifier to be used for the given object
  * @param item The object for which the identifier in this AbstractReferenceManufacturer should be
  *     changed
  */
 @Override
 public void renameObject(String key, T item) {
   String oldKey = item.getKeyName();
   if (oldKey.equalsIgnoreCase(key)) {
     if (Logging.isDebugMode()) {
       Logging.debugPrint(
           "Worthless Key change encountered: " + item.getDisplayName() + " " + oldKey);
       Logging.reportSource(Logging.DEBUG, item.getSourceURI());
     }
   }
   forgetObject(item);
   addObject(item, key);
 }
 /**
  * @see pcgen.rules.persistence.token.DeferredToken#process(pcgen.rules.context.LoadContext,
  *     pcgen.cdom.base.Loadable)
  */
 @Override
 public boolean process(LoadContext context, T obj) {
   FactKey<F> fk = def.getFactKey();
   if (context.getObjectContext().getFact(obj, fk) != null) {
     return true;
   }
   Logging.errorPrint(
       "FACT "
           + def.getFactName()
           + " was required but not set in "
           + obj.getClass().getSimpleName()
           + " "
           + obj.getKeyName());
   return false;
 }
 private boolean validateActive() {
   boolean returnGood = true;
   for (Object second : active.keySet()) {
     T activeObj = active.get(second);
     String keyName = activeObj.getKeyName();
     if (keyName == null) {
       Logging.errorPrint(
           activeObj.getClass() + " " + activeObj.getDisplayName() + " has a null KeyName");
     } else if (!keyName.equalsIgnoreCase(second.toString())) {
       Logging.errorPrint(
           getReferenceDescription() + " Magical Key Change: " + second + " to " + keyName);
       returnGood = false;
     }
   }
   return returnGood;
 }
 @Override
 public String unconvert(T arg0) {
   return arg0.getKeyName();
 }
 @Override
 public String encodeChoice(T choice) {
   return choice.getKeyName();
 }