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(); }