/* * Copyright 2008 (C) Tom Parker <thpr@users.sourceforge.net> * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package pcgen.rules.context; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.TreeSet; import pcgen.base.util.DoubleKeyMapToList; import pcgen.base.util.MapToList; import pcgen.base.util.TreeMapToList; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMList; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMObjectUtilities; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.MasterListInterface; import pcgen.cdom.base.SimpleAssociatedObject; import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.reference.ReferenceUtilities; public class ConsolidatedListCommitStrategy implements ListCommitStrategy, MasterListInterface { private URI sourceURI; private URI extractURI; private final DoubleKeyMapToList<CDOMReference<? extends CDOMList<?>>, CDOMObject, AssociatedPrereqObject> masterList = new DoubleKeyMapToList<>(); public URI getExtractURI() { return extractURI; } @Override public void setExtractURI(URI extractURI) { this.extractURI = extractURI; } public URI getSourceURI() { return sourceURI; } @Override public void setSourceURI(URI sourceURI) { this.sourceURI = sourceURI; } /* (non-Javadoc) * @see pcgen.rules.context.ListCommitStrategy#addToMasterList(java.lang.String, pcgen.cdom.base.CDOMObject, pcgen.cdom.base.CDOMReference, pcgen.cdom.base.CDOMObject) */ @Override public <T extends CDOMObject> AssociatedPrereqObject addToMasterList( String tokenName, CDOMObject owner, CDOMReference<? extends CDOMList<T>> list, T allowed) { SimpleAssociatedObject a = new SimpleAssociatedObject(); a.setAssociation(AssociationKey.OWNER, owner); a.setAssociation(AssociationKey.TOKEN, tokenName); masterList.addToListFor(list, allowed, a); return a; } @Override public <T extends CDOMObject> void removeFromMasterList(String tokenName, CDOMObject owner, CDOMReference<? extends CDOMList<T>> list, T allowed) { masterList.removeListFor(list, allowed); } @Override public <T extends CDOMList<?>> Changes<CDOMReference<T>> getMasterListChanges(String tokenName, CDOMObject owner, Class<T> cl) { TreeSet<CDOMReference<T>> set = new TreeSet<>(ReferenceUtilities.REFERENCE_SORTER); LIST: for (CDOMReference<? extends CDOMList<?>> ref : masterList.getKeySet()) { if (!cl.equals(ref.getReferenceClass())) { continue; } @SuppressWarnings("unchecked") CDOMReference<T> tr = (CDOMReference<T>) ref; for (CDOMObject allowed : masterList.getSecondaryKeySet(tr)) { for (AssociatedPrereqObject assoc : masterList.getListFor(tr, allowed)) { if (owner .equals(assoc.getAssociation(AssociationKey.OWNER)) && tokenName.equals(assoc .getAssociation(AssociationKey.TOKEN))) { set.add(tr); continue LIST; } } } } return new CollectionChanges<>(set, null, false); } @Override public void clearAllMasterLists(String tokenName, CDOMObject owner) { for (CDOMReference<? extends CDOMList<?>> ref : masterList.getKeySet()) { for (CDOMObject allowed : masterList.getSecondaryKeySet(ref)) { for (AssociatedPrereqObject assoc : masterList.getListFor(ref, allowed)) { if (owner .equals(assoc.getAssociation(AssociationKey.OWNER)) && tokenName.equals(assoc .getAssociation(AssociationKey.TOKEN))) { masterList.removeFromListFor(ref, allowed, assoc); } } } } } @Override public <T extends CDOMObject> AssociatedChanges<T> getChangesInMasterList( String tokenName, CDOMObject owner, CDOMReference<? extends CDOMList<T>> swl) { Set<CDOMObject> added = masterList.getSecondaryKeySet(swl); MapToList<T, AssociatedPrereqObject> owned = new TreeMapToList<>( CDOMObjectUtilities.CDOM_SORTER); for (CDOMObject lw : added) { List<AssociatedPrereqObject> list = masterList.getListFor(swl, lw); for (AssociatedPrereqObject assoc : list) { if (owner.equals(assoc.getAssociation(AssociationKey.OWNER))) { owned.addToListFor((T) lw, assoc); break; } } } return new AssociatedCollectionChanges<>(owned, null, false); } @Override public boolean hasMasterLists() { return !masterList.isEmpty(); } @Override public <T extends CDOMObject> AssociatedPrereqObject addToList( String tokenName, CDOMObject owner, CDOMReference<? extends CDOMList<? super T>> list, CDOMReference<T> allowed) { SimpleAssociatedObject a = new SimpleAssociatedObject(); a.setAssociation(AssociationKey.TOKEN, tokenName); owner.putToList(list, allowed, a); return a; } @Override public <T extends CDOMObject> AssociatedPrereqObject removeFromList(String tokenName, CDOMObject owner, CDOMReference<? extends CDOMList<? super T>> swl, CDOMReference<T> ref) { owner.removeFromList(swl, ref); return new SimpleAssociatedObject(); } @Override public void removeAllFromList(String tokenName, CDOMObject owner, CDOMReference<? extends CDOMList<?>> swl) { owner.removeAllFromList(swl); } @Override public Collection<CDOMReference<? extends CDOMList<?>>> getChangedLists( CDOMObject owner, Class<? extends CDOMList<?>> cl) { ArrayList<CDOMReference<? extends CDOMList<?>>> list = new ArrayList<>(); for (CDOMReference<? extends CDOMList<?>> ref : owner .getModifiedLists()) { if (cl.equals(ref.getReferenceClass())) { list.add(ref); } } return list; } @Override public <T extends CDOMObject> AssociatedChanges<CDOMReference<T>> getChangesInList( String tokenName, CDOMObject owner, CDOMReference<? extends CDOMList<T>> swl) { return new ListChanges<>(tokenName, owner, null, swl, false); } @Override public Set<CDOMReference<? extends CDOMList<?>>> getActiveLists() { return masterList.getKeySet(); } @Override public <T extends CDOMObject> Collection<AssociatedPrereqObject> getAssociations( CDOMReference<? extends CDOMList<T>> key1, T key2) { return masterList.getListFor(key1, key2); } @Override public <T extends CDOMObject> Collection<AssociatedPrereqObject> getAssociations( CDOMList<T> key1, T key2) { List<AssociatedPrereqObject> list = new ArrayList<>(); for (CDOMReference ref : masterList.getKeySet()) { if (ref.contains(key1)) { List<AssociatedPrereqObject> tempList = masterList.getListFor(ref, key2); if (tempList != null) { list.addAll(tempList); } } } return list; } @Override public boolean equalsTracking(ListCommitStrategy commit) { return false; } @SuppressWarnings("unchecked") @Override public <T extends CDOMObject> Collection<T> getObjects( CDOMReference<CDOMList<T>> ref) { return (Collection<T>) masterList.getSecondaryKeySet(ref); } }