From: <th...@us...> - 2007-03-12 01:36:35
|
Revision: 2481 http://svn.sourceforge.net/pcgen/?rev=2481&view=rev Author: thpr Date: 2007-03-11 18:36:36 -0700 (Sun, 11 Mar 2007) Log Message: ----------- CDOM: Enhancements and Bug Fixes Modified Paths: -------------- branches/cdom/code/src/java/pcgen/base/graph/core/AbstractSetMapGraph.java branches/cdom/code/src/java/pcgen/cdom/content/LevelCommandFactory.java branches/cdom/code/src/java/pcgen/cdom/content/SpecialProperty.java branches/cdom/code/src/java/pcgen/cdom/content/Weight.java branches/cdom/code/src/java/pcgen/cdom/enumeration/AssociationKey.java branches/cdom/code/src/java/pcgen/core/ArmorProf.java branches/cdom/code/src/java/pcgen/core/Equipment.java branches/cdom/code/src/java/pcgen/core/ShieldProf.java branches/cdom/code/src/java/pcgen/persistence/GraphContext.java branches/cdom/code/src/java/pcgen/persistence/lst/AutoLoader.java branches/cdom/code/src/java/pcgen/persistence/lst/AutoLstToken.java branches/cdom/code/src/java/plugin/lsttokens/AutoLst.java branches/cdom/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java branches/cdom/code/src/java/plugin/lsttokens/auto/EquipToken.java branches/cdom/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java branches/cdom/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java branches/cdom/code/src/java/plugin/lsttokens/deity/DeityweapToken.java branches/cdom/code/src/java/plugin/lsttokens/deity/DomainsToken.java branches/cdom/code/src/java/plugin/lsttokens/deity/FolloweralignToken.java branches/cdom/code/src/java/plugin/lsttokens/deity/PantheonToken.java branches/cdom/code/src/java/plugin/lsttokens/deity/RaceToken.java branches/cdom/code/src/java/plugin/lsttokens/domain/FeatToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/AccheckToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/AltcritmultToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/AltcritrangeToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/AlteqmodToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/AlttypeToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/BaseqtyToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/CostToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/CritmultToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/CritrangeToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/EdrToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/EqmodToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/FumblerangeToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/HandsToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/NumPagesToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/QualityToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/RangeToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/ReachMultToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/ReachToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/SlotsToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/SpellfailureToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/SpropToken.java branches/cdom/code/src/java/plugin/lsttokens/equipment/WtToken.java branches/cdom/code/src/java/plugin/lsttokens/equipmentmodifier/AddprofToken.java branches/cdom/code/src/java/plugin/lsttokens/equipmentmodifier/ChargesToken.java branches/cdom/code/src/java/plugin/lsttokens/equipmentmodifier/NameoptToken.java branches/cdom/code/src/java/plugin/lsttokens/equipmentmodifier/ReplacesToken.java branches/cdom/code/src/java/plugin/lsttokens/equipmentmodifier/SpropToken.java branches/cdom/code/src/java/plugin/lsttokens/race/HitdiceadvancementToken.java branches/cdom/code/src/java/plugin/lsttokens/race/MonsterclassToken.java branches/cdom/code/src/java/plugin/lsttokens/race/StartfeatsToken.java Modified: branches/cdom/code/src/java/pcgen/base/graph/core/AbstractSetMapGraph.java =================================================================== --- branches/cdom/code/src/java/pcgen/base/graph/core/AbstractSetMapGraph.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/base/graph/core/AbstractSetMapGraph.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -391,6 +391,8 @@ if (thisNodeSize != otherNodeList.size()) { System.err.println("Not equal node count"); + System.err.println(nodeMap.keySet()); + System.err.println(otherNodeList); return false; } // (potentially wasteful, but defensive copy) Modified: branches/cdom/code/src/java/pcgen/cdom/content/LevelCommandFactory.java =================================================================== --- branches/cdom/code/src/java/pcgen/cdom/content/LevelCommandFactory.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/cdom/content/LevelCommandFactory.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -20,8 +20,10 @@ import pcgen.cdom.base.CDOMSimpleSingleRef; import pcgen.cdom.base.ConcretePrereqObject; import pcgen.core.PCClass; +import pcgen.persistence.lst.utils.TokenUtilities; -public class LevelCommandFactory extends ConcretePrereqObject +public class LevelCommandFactory extends ConcretePrereqObject implements + Comparable<LevelCommandFactory> { private final CDOMSimpleSingleRef<PCClass> pcClass; @@ -49,11 +51,13 @@ return pcClass.getLSTformat(); } + @Override public int hashCode() { return pcClass.hashCode() * 29 + levels; } + @Override public boolean equals(Object o) { if (this == o) @@ -68,4 +72,18 @@ return levels == lcf.levels && pcClass.equals(lcf.pcClass); } + public int compareTo(LevelCommandFactory arg0) + { + int i = TokenUtilities.REFERENCE_SORTER.compare(pcClass, arg0.pcClass); + if (i == 0) + { + if (levels == arg0.levels) + { + return 0; + } + return levels < arg0.levels ? -1 : 1; + } + return i; + } + } Modified: branches/cdom/code/src/java/pcgen/cdom/content/SpecialProperty.java =================================================================== --- branches/cdom/code/src/java/pcgen/cdom/content/SpecialProperty.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/cdom/content/SpecialProperty.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -34,4 +34,25 @@ { return property; } + + @Override + public int hashCode() + { + return property.hashCode(); + } + + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (!(o instanceof SpecialProperty)) + { + return false; + } + SpecialProperty other = (SpecialProperty) o; + return property.equals(other.property) && super.matchesFormulaList(other); + } } Modified: branches/cdom/code/src/java/pcgen/cdom/content/Weight.java =================================================================== --- branches/cdom/code/src/java/pcgen/cdom/content/Weight.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/cdom/content/Weight.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -19,7 +19,7 @@ import pcgen.cdom.base.ConcretePrereqObject; -public class Weight extends ConcretePrereqObject +public class Weight extends ConcretePrereqObject implements Comparable<Weight> { private double weight; @@ -34,6 +34,25 @@ return weight; } - // FIXME TODO Needs to be comparable... + public int compareTo(Weight arg0) + { + if (weight == arg0.weight) + { + return 0; + } + return weight < arg0.weight ? -1 : 1; + } + @Override + public int hashCode() + { + return (int) weight; + } + + @Override + public boolean equals(Object o) + { + return o instanceof Weight && ((Weight) o).weight == weight; + } + } Modified: branches/cdom/code/src/java/pcgen/cdom/enumeration/AssociationKey.java =================================================================== --- branches/cdom/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -113,6 +113,9 @@ @Override public String toString() { + if (map == null) { + buildMap(); + } /* * CONSIDER Should this find a way to do a Two-Way Map or something to * that effect? Modified: branches/cdom/code/src/java/pcgen/core/ArmorProf.java =================================================================== --- branches/cdom/code/src/java/pcgen/core/ArmorProf.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/core/ArmorProf.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -29,10 +29,6 @@ */ public final class ArmorProf extends PObject implements Comparable<Object> { - ArmorProf(final String aString) - { - setName(aString); - } /** * Compares keyName only Modified: branches/cdom/code/src/java/pcgen/core/Equipment.java =================================================================== --- branches/cdom/code/src/java/pcgen/core/Equipment.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/core/Equipment.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -47,7 +47,6 @@ import pcgen.core.prereq.Prerequisite; import pcgen.core.utils.CoreUtility; import pcgen.core.utils.IntegerKey; -import pcgen.core.utils.ListKey; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.core.utils.StringKey; Modified: branches/cdom/code/src/java/pcgen/core/ShieldProf.java =================================================================== --- branches/cdom/code/src/java/pcgen/core/ShieldProf.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/core/ShieldProf.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -30,10 +30,6 @@ */ public final class ShieldProf extends PObject implements Comparable<Object> { - ShieldProf(final String aString) - { - setName(aString); - } /** * Compares keyName only Modified: branches/cdom/code/src/java/pcgen/persistence/GraphContext.java =================================================================== --- branches/cdom/code/src/java/pcgen/persistence/GraphContext.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/persistence/GraphContext.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -208,8 +208,13 @@ public void unlinkChildNodesOfClass(String tokenName, CDOMObject obj, Class<? extends PrereqObject> cl) { - for (PCGraphEdge edge : graph.getOutwardEdgeList(obj)) + List<PCGraphEdge> outwardEdgeList = graph.getOutwardEdgeList(obj); + if (outwardEdgeList == null) { + return; + } + for (PCGraphEdge edge : outwardEdgeList) + { if (edge.getSourceToken().equals(tokenName)) { for (PrereqObject node : edge.getAdjacentNodes()) Modified: branches/cdom/code/src/java/pcgen/persistence/lst/AutoLoader.java =================================================================== --- branches/cdom/code/src/java/pcgen/persistence/lst/AutoLoader.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/persistence/lst/AutoLoader.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -34,11 +34,12 @@ { private AutoLoader() { - //Utility Class, no construction needed + // Utility Class, no construction needed } /** * This method is static so it can be used by the AUTO Token. + * * @param target * @param lstLine * @param source @@ -66,7 +67,7 @@ } } - public static boolean parseLine(LoadContext context, CDOMObject obj, + public static boolean parseLine(LoadContext context, PObject obj, String key, String value) { Map<String, LstToken> tokenMap = @@ -77,7 +78,7 @@ LstUtils.deprecationCheck(token, obj, value); if (!token.parse(context, obj, value)) { - Logging.errorPrint("Error parsing AUTO: " + key + ":" + value); + Logging.errorPrint("Error parsing AUTO:" + key + ":" + value); return false; } return true; @@ -88,4 +89,31 @@ return false; } } + + public static String unparse(LoadContext context, CDOMObject obj) + { + StringBuilder sb = new StringBuilder(); + boolean needTab = false; + for (LstToken token : TokenStore.inst().getTokenMap(AutoLstToken.class) + .values()) + { + String s = ((AutoLstToken) token).unparse(context, (PObject) obj); + if (s != null) + { + if (needTab) + { + sb.append('\t'); + } + needTab = true; + /* + * TODO FIXME This introduces a BUG, in that this assumes the s + * is only one token, and there is no parent involved... therefore + * the unparse methods in AUTO either need to return String[] + * or something else needs to be done... + */ + sb.append("AUTO:").append(s); + } + } + return sb.length() == 0 ? null : sb.toString(); + } } Modified: branches/cdom/code/src/java/pcgen/persistence/lst/AutoLstToken.java =================================================================== --- branches/cdom/code/src/java/pcgen/persistence/lst/AutoLstToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/pcgen/persistence/lst/AutoLstToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -25,7 +25,6 @@ */ package pcgen.persistence.lst; -import pcgen.cdom.base.CDOMObject; import pcgen.core.PObject; import pcgen.persistence.LoadContext; @@ -34,9 +33,9 @@ * * @author Thomas Parker <th...@us...> */ -public interface AutoLstToken extends LstToken +public interface AutoLstToken extends CDOMToken<PObject> { public boolean parse(PObject target, String value); - public boolean parse(LoadContext context, CDOMObject obj, String value); + public boolean parse(LoadContext context, PObject obj, String value); } Modified: branches/cdom/code/src/java/plugin/lsttokens/AutoLst.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/AutoLst.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/AutoLst.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -64,12 +64,11 @@ return false; } String subKey = value.substring(0, barLoc); - return AutoLoader.parseLine(context, obj, subKey, value.substring(barLoc + 1)); + return AutoLoader.parseLine(context, (PObject) obj, subKey, value.substring(barLoc + 1)); } public String unparse(LoadContext context, CDOMObject obj) { - // FIXME Auto-generated method stub - return null; + return AutoLoader.unparse(context, obj); } } Modified: branches/cdom/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -21,12 +21,14 @@ */ package plugin.lsttokens.auto; +import java.util.Set; +import java.util.SortedSet; import java.util.StringTokenizer; +import java.util.TreeSet; -import pcgen.cdom.base.CDOMGroupRef; -import pcgen.cdom.base.CDOMObject; -import pcgen.cdom.base.CDOMSimpleSingleRef; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.graph.PCGraphEdge; import pcgen.cdom.graph.PCGraphGrantsEdge; import pcgen.core.ArmorProf; import pcgen.core.PObject; @@ -34,6 +36,7 @@ import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.AutoLstToken; import pcgen.persistence.lst.prereq.PreParserFactory; +import pcgen.persistence.lst.utils.TokenUtilities; import pcgen.util.Logging; public class ArmorProfToken implements AutoLstToken @@ -50,7 +53,7 @@ return true; } - public boolean parse(LoadContext context, CDOMObject obj, String value) + public boolean parse(LoadContext context, PObject obj, String value) { String armorProfs; String prereq = null; // Do not initialize, null is significant! @@ -76,36 +79,32 @@ prereq = value.substring(openBracketLoc + 1, value.length() - 2); } + if (armorProfs.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (armorProfs.charAt(armorProfs.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (armorProfs.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(armorProfs, Constants.PIPE); while (tok.hasMoreTokens()) { String aProf = tok.nextToken(); - if (aProf.startsWith(Constants.LST_TYPE) - || aProf.startsWith(Constants.LST_TYPE_OLD)) + if ("%LIST".equals(value)) { - CDOMGroupRef<ArmorProf> ref = - context.ref.getCDOMTypeReference(ArmorProf.class, aProf - .substring(5).split(".")); - PCGraphGrantsEdge edge = - context.graph.linkObjectIntoGraph(getTokenName(), obj, - ref); - if (prereq != null) - { - try - { - edge.addPreReq(PreParserFactory.getInstance().parse( - prereq)); - } - catch (PersistenceLayerException e) - { - Logging.errorPrint("Error generating Prerequisite " - + prereq + " in " + getTokenName()); - } - } - } - else if ("%LIST".equals(value)) - { /* * FIXME Need to figure out how to handle this!!! */ @@ -117,12 +116,13 @@ } else { - CDOMSimpleSingleRef<ArmorProf> ref = - context.ref.getCDOMReference(ArmorProf.class, aProf); - /* - * FIXME There is source consolidation that can be done once - * %LIST is figured out - */ + CDOMReference<ArmorProf> ref = + TokenUtilities.getObjectReference(context, + ArmorProf.class, aProf); + if (ref == null) + { + return false; + } PCGraphGrantsEdge edge = context.graph.linkObjectIntoGraph(getTokenName(), obj, ref); @@ -139,10 +139,40 @@ + prereq + " in " + getTokenName()); } } - // Individual prefs } } return true; } + + public String unparse(LoadContext context, PObject obj) + { + Set<PCGraphEdge> edges = + context.graph.getChildLinksFromToken(getTokenName(), obj, + ArmorProf.class); + if (edges.isEmpty()) + { + return null; + } + SortedSet<CDOMReference<ArmorProf>> set = + new TreeSet<CDOMReference<ArmorProf>>( + TokenUtilities.REFERENCE_SORTER); + boolean needComma = false; + for (PCGraphEdge edge : edges) + { + set.add((CDOMReference<ArmorProf>) edge.getSinkNodes().get(0)); + } + StringBuilder sb = + new StringBuilder().append(getTokenName()).append('|'); + for (CDOMReference<ArmorProf> ref : set) + { + if (needComma) + { + sb.append(Constants.PIPE); + } + needComma = true; + sb.append(ref.getLSTformat()); + } + return sb.toString(); + } } Modified: branches/cdom/code/src/java/plugin/lsttokens/auto/EquipToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/auto/EquipToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/auto/EquipToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -21,7 +21,6 @@ */ package plugin.lsttokens.auto; -import pcgen.cdom.base.CDOMObject; import pcgen.core.PObject; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.AutoLstToken; @@ -40,7 +39,7 @@ return true; } - public boolean parse(LoadContext context, CDOMObject obj, String value) + public boolean parse(LoadContext context, PObject obj, String value) { /* * TODO FIXME For EQUIP: @@ -149,4 +148,10 @@ // // return true; } + + public String unparse(LoadContext context, PObject obj) + { + // TODO Auto-generated method stub + return null; + } } Modified: branches/cdom/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -21,12 +21,14 @@ */ package plugin.lsttokens.auto; +import java.util.Set; +import java.util.SortedSet; import java.util.StringTokenizer; +import java.util.TreeSet; -import pcgen.cdom.base.CDOMGroupRef; -import pcgen.cdom.base.CDOMObject; -import pcgen.cdom.base.CDOMSimpleSingleRef; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.graph.PCGraphEdge; import pcgen.cdom.graph.PCGraphGrantsEdge; import pcgen.core.PObject; import pcgen.core.ShieldProf; @@ -34,6 +36,7 @@ import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.AutoLstToken; import pcgen.persistence.lst.prereq.PreParserFactory; +import pcgen.persistence.lst.utils.TokenUtilities; import pcgen.util.Logging; public class ShieldProfToken implements AutoLstToken @@ -50,7 +53,7 @@ return true; } - public boolean parse(LoadContext context, CDOMObject obj, String value) + public boolean parse(LoadContext context, PObject obj, String value) { String shieldProfs; String prereq = null; // Do not initialize, null is significant! @@ -72,36 +75,32 @@ prereq = value.substring(openBracketLoc + 1, value.length() - 2); } + if (shieldProfs.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (shieldProfs.charAt(shieldProfs.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (shieldProfs.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(shieldProfs, Constants.PIPE); while (tok.hasMoreTokens()) { String aProf = tok.nextToken(); - if (aProf.startsWith(Constants.LST_TYPE) - || aProf.startsWith(Constants.LST_TYPE_OLD)) + if ("%LIST".equals(value)) { - CDOMGroupRef<ShieldProf> ref = - context.ref.getCDOMTypeReference(ShieldProf.class, - aProf.substring(5).split(".")); - PCGraphGrantsEdge edge = - context.graph.linkObjectIntoGraph(getTokenName(), obj, - ref); - if (prereq != null) - { - try - { - edge.addPreReq(PreParserFactory.getInstance().parse( - prereq)); - } - catch (PersistenceLayerException e) - { - Logging.errorPrint("Error generating Prerequisite " - + prereq + " in " + getTokenName()); - } - } - } - else if ("%LIST".equals(value)) - { /* * FIXME Need to figure out how to handle this!!! */ @@ -113,12 +112,13 @@ } else { - CDOMSimpleSingleRef<ShieldProf> ref = - context.ref.getCDOMReference(ShieldProf.class, aProf); - /* - * FIXME There is source consolidation that can be done once - * %LIST is figured out - */ + CDOMReference<ShieldProf> ref = + TokenUtilities.getObjectReference(context, + ShieldProf.class, aProf); + if (ref == null) + { + return false; + } PCGraphGrantsEdge edge = context.graph.linkObjectIntoGraph(getTokenName(), obj, ref); @@ -135,11 +135,40 @@ + prereq + " in " + getTokenName()); } } - // Individual prefs } } return true; } + public String unparse(LoadContext context, PObject obj) + { + Set<PCGraphEdge> edges = + context.graph.getChildLinksFromToken(getTokenName(), obj, + ShieldProf.class); + if (edges.isEmpty()) + { + return null; + } + SortedSet<CDOMReference<ShieldProf>> set = + new TreeSet<CDOMReference<ShieldProf>>( + TokenUtilities.REFERENCE_SORTER); + boolean needComma = false; + for (PCGraphEdge edge : edges) + { + set.add((CDOMReference<ShieldProf>) edge.getSinkNodes().get(0)); + } + StringBuilder sb = + new StringBuilder().append(getTokenName()).append('|'); + for (CDOMReference<ShieldProf> ref : set) + { + if (needComma) + { + sb.append(Constants.PIPE); + } + needComma = true; + sb.append(ref.getLSTformat()); + } + return sb.toString(); + } } Modified: branches/cdom/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -21,12 +21,14 @@ */ package plugin.lsttokens.auto; +import java.util.Set; +import java.util.SortedSet; import java.util.StringTokenizer; +import java.util.TreeSet; -import pcgen.cdom.base.CDOMGroupRef; -import pcgen.cdom.base.CDOMObject; -import pcgen.cdom.base.CDOMSimpleSingleRef; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.graph.PCGraphEdge; import pcgen.cdom.graph.PCGraphGrantsEdge; import pcgen.core.PObject; import pcgen.core.WeaponProf; @@ -34,6 +36,7 @@ import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.AutoLstToken; import pcgen.persistence.lst.prereq.PreParserFactory; +import pcgen.persistence.lst.utils.TokenUtilities; import pcgen.util.Logging; public class WeaponProfToken implements AutoLstToken @@ -50,7 +53,7 @@ return true; } - public boolean parse(LoadContext context, CDOMObject obj, String value) + public boolean parse(LoadContext context, PObject obj, String value) { String weaponProfs; String prereq = null; // Do not initialize, null is significant! @@ -72,36 +75,32 @@ prereq = value.substring(openBracketLoc + 1, value.length() - 2); } + if (weaponProfs.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (weaponProfs.charAt(weaponProfs.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (weaponProfs.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(weaponProfs, Constants.PIPE); while (tok.hasMoreTokens()) { String aProf = tok.nextToken(); - if (aProf.startsWith(Constants.LST_TYPE) - || aProf.startsWith(Constants.LST_TYPE_OLD)) + if ("%LIST".equals(value)) { - CDOMGroupRef<WeaponProf> ref = - context.ref.getCDOMTypeReference(WeaponProf.class, - aProf.substring(5).split(".")); - PCGraphGrantsEdge edge = - context.graph.linkObjectIntoGraph(getTokenName(), obj, - ref); - if (prereq != null) - { - try - { - edge.addPreReq(PreParserFactory.getInstance().parse( - prereq)); - } - catch (PersistenceLayerException e) - { - Logging.errorPrint("Error generating Prerequisite " - + prereq + " in " + getTokenName()); - } - } - } - else if ("%LIST".equals(value)) - { /* * FIXME Need to figure out how to handle this!!! */ @@ -113,12 +112,13 @@ } else { - CDOMSimpleSingleRef<WeaponProf> ref = - context.ref.getCDOMReference(WeaponProf.class, aProf); - /* - * FIXME There is source consolidation that can be done once - * %LIST is figured out - */ + CDOMReference<WeaponProf> ref = + TokenUtilities.getObjectReference(context, + WeaponProf.class, aProf); + if (ref == null) + { + return false; + } PCGraphGrantsEdge edge = context.graph.linkObjectIntoGraph(getTokenName(), obj, ref); @@ -135,11 +135,41 @@ + prereq + " in " + getTokenName()); } } - // Individual prefs } } return true; } + public String unparse(LoadContext context, PObject obj) + { + Set<PCGraphEdge> edges = + context.graph.getChildLinksFromToken(getTokenName(), obj, + WeaponProf.class); + if (edges.isEmpty()) + { + return null; + } + SortedSet<CDOMReference<WeaponProf>> set = + new TreeSet<CDOMReference<WeaponProf>>( + TokenUtilities.REFERENCE_SORTER); + boolean needComma = false; + for (PCGraphEdge edge : edges) + { + set.add((CDOMReference<WeaponProf>) edge.getSinkNodes().get(0)); + } + StringBuilder sb = + new StringBuilder().append(getTokenName()).append('|'); + for (CDOMReference<WeaponProf> ref : set) + { + if (needComma) + { + sb.append(Constants.PIPE); + } + needComma = true; + sb.append(ref.getLSTformat()); + } + return sb.toString(); + } + } Modified: branches/cdom/code/src/java/plugin/lsttokens/deity/DeityweapToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/deity/DeityweapToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/deity/DeityweapToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -31,6 +31,7 @@ import pcgen.core.WeaponProf; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.DeityLstToken; +import pcgen.util.Logging; /** * Class deals with DEITYWEAP Token @@ -51,6 +52,30 @@ public boolean parse(LoadContext context, Deity deity, String value) { + if (value.length() == 0) + { + Logging.errorPrint(getTokenName() + " arguments may not be empty"); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); while (tok.hasMoreTokens()) { @@ -64,7 +89,7 @@ { List<CDOMSimpleSingleRef<WeaponProf>> profs = deity.getListFor(ListKey.DEITY_WEAPON); - if (profs.isEmpty()) + if (profs == null || profs.isEmpty()) { return null; } @@ -77,6 +102,7 @@ { sb.append(Constants.PIPE); } + needPipe = true; sb.append(wp.getLSTformat()); } return sb.toString(); Modified: branches/cdom/code/src/java/plugin/lsttokens/deity/DomainsToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/deity/DomainsToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/deity/DomainsToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -22,7 +22,9 @@ package plugin.lsttokens.deity; import java.util.Set; +import java.util.SortedSet; import java.util.StringTokenizer; +import java.util.TreeSet; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; @@ -32,6 +34,8 @@ import pcgen.core.utils.CoreUtility; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.DeityLstToken; +import pcgen.persistence.lst.utils.TokenUtilities; +import pcgen.util.Logging; /** * Class deals with DOMAINS Token @@ -58,6 +62,30 @@ public boolean parse(LoadContext context, Deity deity, String value) { + if (value.length() == 0) + { + Logging.errorPrint(getTokenName() + " arguments may not be empty"); + return false; + } + if (value.charAt(0) == ',') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with , : " + value); + return false; + } + if (value.charAt(value.length() - 1) == ',') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with , : " + value); + return false; + } + if (value.indexOf(",,") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator ,, : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.COMMA); while (tok.hasMoreTokens()) { @@ -85,20 +113,25 @@ { return null; } + SortedSet<CDOMReference<Domain>> set = + new TreeSet<CDOMReference<Domain>>( + TokenUtilities.REFERENCE_SORTER); + + for (PCGraphEdge edge : edges) + { + set.add((CDOMReference<Domain>) edge.getNodeAt(1)); + } StringBuilder sb = new StringBuilder().append(getTokenName()).append(':'); boolean needBar = false; - /* - * FIXME Doesn't account for TYPE :/ - */ - for (PCGraphEdge edge : edges) + for (CDOMReference<Domain> domain : set) { if (needBar) { - sb.append(Constants.PIPE); + sb.append(Constants.COMMA); } - sb.append(((Domain) edge.getSinkNodes().get(0)).getKeyName()); needBar = true; + sb.append(domain.getLSTformat()); } return sb.toString(); } Modified: branches/cdom/code/src/java/plugin/lsttokens/deity/FolloweralignToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/deity/FolloweralignToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/deity/FolloweralignToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -51,7 +51,31 @@ public boolean parse(LoadContext context, Deity deity, String value) { - StringTokenizer commaTok = new StringTokenizer(Constants.COMMA); + if (value.length() == 0) + { + Logging.errorPrint(getTokenName() + " arguments may not be empty"); + return false; + } + if (value.charAt(0) == ',') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with , : " + value); + return false; + } + if (value.charAt(value.length() - 1) == ',') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with , : " + value); + return false; + } + if (value.indexOf(",,") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator ,, : " + value); + return false; + } + + StringTokenizer commaTok = new StringTokenizer(value, Constants.COMMA); while (commaTok.hasMoreTokens()) { try @@ -72,7 +96,7 @@ public String unparse(LoadContext context, Deity deity) { List<AlignmentType> atypes = deity.getListFor(ListKey.FOLLOWER_ALIGN); - if (atypes.isEmpty()) + if (atypes == null || atypes.isEmpty()) { return null; } @@ -83,8 +107,9 @@ { if (needPipe) { - sb.append(Constants.PIPE); + sb.append(Constants.COMMA); } + needPipe = true; sb.append(at); } return sb.toString(); Modified: branches/cdom/code/src/java/plugin/lsttokens/deity/PantheonToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/deity/PantheonToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/deity/PantheonToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -28,6 +28,7 @@ import pcgen.core.utils.CoreUtility; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.DeityLstToken; +import pcgen.util.Logging; import java.util.List; import java.util.StringTokenizer; @@ -57,6 +58,30 @@ public boolean parse(LoadContext context, Deity deity, String value) { + if (value.length() == 0) + { + Logging.errorPrint(getTokenName() + " arguments may not be empty"); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); while (tok.hasMoreTokens()) { @@ -69,7 +94,7 @@ public String unparse(LoadContext context, Deity deity) { List<Pantheon> pantheons = deity.getListFor(ListKey.PANTHEON); - if (pantheons.isEmpty()) + if (pantheons == null || pantheons.isEmpty()) { return null; } @@ -82,6 +107,7 @@ { sb.append(Constants.PIPE); } + needPipe = true; sb.append(rp); } return sb.toString(); Modified: branches/cdom/code/src/java/plugin/lsttokens/deity/RaceToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/deity/RaceToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/deity/RaceToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -28,6 +28,7 @@ import pcgen.core.utils.CoreUtility; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.DeityLstToken; +import pcgen.util.Logging; import java.util.List; import java.util.StringTokenizer; @@ -57,6 +58,30 @@ public boolean parse(LoadContext context, Deity deity, String value) { + if (value.length() == 0) + { + Logging.errorPrint(getTokenName() + " arguments may not be empty"); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); while (tok.hasMoreTokens()) { @@ -69,7 +94,7 @@ public String unparse(LoadContext context, Deity deity) { List<RacePantheon> pantheons = deity.getListFor(ListKey.RACE_PANTHEON); - if (pantheons.isEmpty()) + if (pantheons == null || pantheons.isEmpty()) { return null; } @@ -82,6 +107,7 @@ { sb.append(Constants.PIPE); } + needPipe = true; sb.append(rp); } return sb.toString(); Modified: branches/cdom/code/src/java/plugin/lsttokens/domain/FeatToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/domain/FeatToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/domain/FeatToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -26,16 +26,18 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.SortedSet; import java.util.StringTokenizer; +import java.util.TreeSet; import pcgen.base.util.HashMapToList; import pcgen.cdom.base.CDOMCategorizedSingleRef; import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CategorizedCDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AbilityCategory; import pcgen.cdom.enumeration.AbilityNature; import pcgen.cdom.enumeration.AssociationKey; -import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.graph.PCGraphGrantsEdge; import pcgen.cdom.graph.PCGraphEdge; import pcgen.core.Ability; @@ -46,6 +48,7 @@ import pcgen.persistence.lst.AbstractToken; import pcgen.persistence.lst.DomainLstToken; import pcgen.persistence.lst.output.prereq.PrerequisiteWriter; +import pcgen.persistence.lst.utils.TokenUtilities; import pcgen.util.Logging; /** @@ -74,6 +77,25 @@ public boolean parseFeat(LoadContext context, CDOMObject obj, String value) { + if (value.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + final StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); if (!tok.hasMoreTokens()) @@ -140,8 +162,8 @@ { return null; } - HashMapToList<Set<Prerequisite>, Ability> m = - new HashMapToList<Set<Prerequisite>, Ability>(); + HashMapToList<Set<Prerequisite>, CategorizedCDOMReference<Ability>> m = + new HashMapToList<Set<Prerequisite>, CategorizedCDOMReference<Ability>>(); for (PCGraphEdge edge : edges) { AbilityNature an = @@ -152,8 +174,10 @@ + getTokenName() + " must be of NORMAL AbilityNature"); return null; } - Ability ab = (Ability) edge.getSinkNodes().get(0); - if (!AbilityCategory.FEAT.equals(ab.get(ObjectKey.CATEGORY))) + CategorizedCDOMReference<Ability> ab = + (CategorizedCDOMReference<Ability>) edge.getSinkNodes() + .get(0); + if (!AbilityCategory.FEAT.equals(ab.getCDOMCategory())) { context.addWriteMessage("Abilities awarded by " + getTokenName() + " must be of CATEGORY FEAT"); @@ -165,24 +189,35 @@ StringBuilder sb = new StringBuilder(); PrerequisiteWriter prereqWriter = new PrerequisiteWriter(); + SortedSet<CategorizedCDOMReference<Ability>> set = + new TreeSet<CategorizedCDOMReference<Ability>>( + TokenUtilities.CAT_REFERENCE_SORTER); + boolean needSpacer = false; for (Set<Prerequisite> prereqs : m.getKeySet()) { - List<Ability> abilities = m.getListFor(prereqs); + List<CategorizedCDOMReference<Ability>> abilities = + m.getListFor(prereqs); if (needSpacer) { sb.append('\t'); } sb.append(getTokenName()).append(':'); boolean needBar = false; - for (Ability ab : abilities) + set.clear(); + set.addAll(abilities); + for (CategorizedCDOMReference<Ability> ab : set) { if (needBar) { sb.append(Constants.PIPE); } needBar = true; - sb.append(ab.getKeyName()); + /* + * FIXME This isn't entirely true, is it? I mean, how is the + * category handled with CategorizedSingleRef? + */ + sb.append(ab.getLSTformat()); } if (prereqs != null && !prereqs.isEmpty()) { Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/AccheckToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/AccheckToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/AccheckToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -48,7 +48,13 @@ { try { - eq.put(IntegerKey.AC_CHECK, Integer.valueOf(value)); + Integer valueOf = Integer.valueOf(value); + if (valueOf.intValue() <= 0) + { + Logging.errorPrint(getTokenName() + " must be an integer > 0"); + return false; + } + eq.put(IntegerKey.AC_CHECK, valueOf); return true; } catch (NumberFormatException nfe) Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/AltcritmultToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/AltcritmultToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/AltcritmultToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -74,8 +74,13 @@ { try { - altHead.put(IntegerKey.CRIT_MULT, Integer.valueOf(value - .substring(1))); + Integer cm = Integer.valueOf(value.substring(1)); + if (cm.intValue() <= 0) + { + Logging.errorPrint(getTokenName() + " cannot be <= 0"); + return false; + } + altHead.put(IntegerKey.CRIT_MULT, cm); return true; } catch (NumberFormatException nfe) @@ -88,7 +93,7 @@ altHead.put(IntegerKey.CRIT_MULT, Integer.valueOf(-1)); return true; } - return true; + return false; } catch (NumberFormatException nfe) { Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/AltcritrangeToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/AltcritrangeToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/AltcritrangeToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -53,8 +53,13 @@ { try { - getEquipmentHead(context, eq, 2).put(IntegerKey.CRIT_RANGE, - Integer.valueOf(value)); + Integer cr = Integer.valueOf(value); + if (cr.intValue() <= 0) + { + Logging.errorPrint(getTokenName() + " cannot be <= 0"); + return false; + } + getEquipmentHead(context, eq, 2).put(IntegerKey.CRIT_RANGE, cr); return true; } catch (NumberFormatException nfe) Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/AlteqmodToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/AlteqmodToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/AlteqmodToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -21,9 +21,14 @@ */ package plugin.lsttokens.equipment; +import java.util.Collection; import java.util.Set; +import java.util.SortedMap; import java.util.StringTokenizer; +import java.util.TreeMap; +import java.util.Map.Entry; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.CDOMSimpleSingleRef; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AssociationKey; @@ -34,6 +39,8 @@ import pcgen.core.EquipmentModifier; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.EquipmentLstToken; +import pcgen.persistence.lst.utils.TokenUtilities; +import pcgen.util.Logging; /** * Deals with ALTEQMOD token @@ -62,6 +69,29 @@ protected boolean parseEqMod(LoadContext context, EquipmentHead primHead, String value) { + if (Constants.LST_NONE.equals(value)) + { + return true; + } + if (value.charAt(0) == '.') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with . : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '.') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with . : " + value); + return false; + } + if (value.indexOf("..") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator .. : " + value); + return false; + } + StringTokenizer dotTok = new StringTokenizer(value, Constants.DOT); while (dotTok.hasMoreTokens()) @@ -70,8 +100,28 @@ if (aEqModName.equalsIgnoreCase(Constants.LST_NONE)) { - continue; + Logging.errorPrint("Embedded " + Constants.LST_NONE + + " is prohibited in " + getTokenName()); + return false; } + if (aEqModName.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (aEqModName.charAt(aEqModName.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (aEqModName.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } StringTokenizer pipeTok = new StringTokenizer(aEqModName, "|"); // The type of EqMod, eg: ABILITYPLUS @@ -105,33 +155,53 @@ { String assocTok = pipeTok.nextToken(); StringTokenizer bracketTok = new StringTokenizer(assocTok, "]"); - while (bracketTok.hasMoreTokens()) + if (assocTok.indexOf(']') == -1) { - String assoc = bracketTok.nextToken(); - if (assoc.length() == 0 && !bracketTok.hasMoreTokens()) + /* + * TODO Can this be done in some way to learn from the EqMod + * what the association actually is?? + */ + edge.setAssociation(AssociationKey.ONLY, assocTok); + } + else + { + if (!setAssoc(edge, assocTok)) { - // Last one should be empty - break; - } - int openBracketLoc = assoc.indexOf('['); - if (openBracketLoc == -1) - { return false; } - if (openBracketLoc != assoc.lastIndexOf('[')) - { - return false; - } - String assocKey = assoc.substring(0, openBracketLoc); - String assocVal = assoc.substring(openBracketLoc + 1); - edge.setAssociation(AssociationKey.getKeyFor(String.class, - assocKey), assocVal); } } } return true; } + private boolean setAssoc(PCGraphGrantsEdge edge, String assocTok) + { + if (assocTok.indexOf("[]") != -1) + { + return false; + } + StringTokenizer bracketTok = new StringTokenizer(assocTok, "]"); + while (bracketTok.hasMoreTokens()) + { + String assoc = bracketTok.nextToken(); + int openBracketLoc = assoc.indexOf('['); + if (openBracketLoc == -1) + { + return false; + } + if (openBracketLoc != assoc.lastIndexOf('[')) + { + return false; + } + String assocKey = assoc.substring(0, openBracketLoc); + String assocVal = assoc.substring(openBracketLoc + 1); + edge.setAssociation(AssociationKey + .getKeyFor(String.class, assocKey), assocVal); + } + return true; + } + protected EquipmentHead getEquipmentHead(LoadContext context, Equipment eq, int index) { @@ -177,27 +247,74 @@ { return null; } + SortedMap<CDOMReference<EquipmentModifier>, PCGraphEdge> set = + new TreeMap<CDOMReference<EquipmentModifier>, PCGraphEdge>( + TokenUtilities.REFERENCE_SORTER); StringBuilder sb = new StringBuilder(); + sb.append(getTokenName()).append(':'); boolean needDot = false; for (PCGraphEdge edge : edgeList) { - EquipmentModifier eqMod = - (EquipmentModifier) edge.getSinkNodes().get(0); + CDOMReference<EquipmentModifier> eqMod = + (CDOMReference<EquipmentModifier>) edge.getSinkNodes().get( + 0); + set.put(eqMod, edge); + } + for (Entry<CDOMReference<EquipmentModifier>, PCGraphEdge> me : set + .entrySet()) + { if (needDot) { sb.append('.'); } - sb.append(eqMod.getKeyName()); + needDot = true; + sb.append(me.getKey().getLSTformat()); + PCGraphEdge edge = me.getValue(); if (edge.hasAssociations()) { + /* + * TODO FIXME These need to be sorted... :( + */ sb.append(Constants.PIPE); - for (AssociationKey ak : edge.getAssociationKeys()) + Collection<AssociationKey<?>> akColl = + edge.getAssociationKeys(); + if (akColl.size() == 1) { - String st = (String) edge.getAssociation(ak); - sb.append(ak).append('[').append(st).append(']'); + AssociationKey ak = akColl.iterator().next(); + if (AssociationKey.ONLY.equals(ak)) + { + sb.append((String) edge.getAssociation(ak)); + } + else + { + String st = (String) edge.getAssociation(ak); + sb.append(ak).append('[').append(st).append(']'); + } } + else + { + TreeMap<String, String> map = new TreeMap<String, String>(); + for (AssociationKey ak : edge.getAssociationKeys()) + { + if (AssociationKey.ONLY.equals(ak)) + { + context.addWriteMessage("Edge Association ONLY is " + + "not valid if more than one association " + + "is required"); + return null; + } + map + .put(ak.toString(), (String) edge + .getAssociation(ak)); + } + for (Entry<String, String> ae : map.entrySet()) + { + sb.append(ae.getKey()).append('[') + .append(ae.getValue()).append(']'); + } + + } } - needDot = true; } return sb.toString(); } Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/AlttypeToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/AlttypeToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/AlttypeToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -30,6 +30,7 @@ import pcgen.core.Equipment; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.EquipmentLstToken; +import pcgen.util.Logging; /** * Deals with ALTTYPE token @@ -50,6 +51,30 @@ public boolean parse(LoadContext context, Equipment eq, String value) { + if (value.length() == 0) + { + Logging.errorPrint(getTokenName() + " arguments may not be empty"); + return false; + } + if (value.charAt(0) == '.') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with . : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '.') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with . : " + value); + return false; + } + if (value.indexOf("..") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator .. : " + value); + return false; + } + StringTokenizer aTok = new StringTokenizer(value.trim(), Constants.DOT); boolean removeType = false; @@ -89,6 +114,10 @@ public String unparse(LoadContext context, Equipment eq) { List<Type> list = eq.getListFor(ListKey.ALT_TYPE); + if (list == null || list.isEmpty()) + { + return null; + } StringBuilder sb = new StringBuilder(); sb.append(getTokenName()).append(':'); boolean needsDot = false; Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/BaseqtyToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/BaseqtyToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/BaseqtyToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -48,7 +48,13 @@ { try { - eq.put(IntegerKey.BASE_QUANTITY, Integer.valueOf(value)); + Integer quan = Integer.valueOf(value); + if (quan.intValue() <= 0) + { + Logging.errorPrint(getTokenName() + " expected an integer > 0"); + return false; + } + eq.put(IntegerKey.BASE_QUANTITY, quan); return true; } catch (NumberFormatException nfe) Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/CostToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/CostToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/CostToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -27,6 +27,7 @@ import pcgen.core.Equipment; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.EquipmentLstToken; +import pcgen.util.Logging; /** * Deals with COST token @@ -47,8 +48,23 @@ public boolean parse(LoadContext context, Equipment eq, String value) { - eq.put(ObjectKey.COST, new BigDecimal(value)); - return true; + try + { + BigDecimal cost = new BigDecimal(value); + if (cost.compareTo(BigDecimal.ZERO) < 0) + { + Logging.errorPrint(getTokenName() + + " must be a positive number: " + value); + return false; + } + eq.put(ObjectKey.COST, cost); + return true; + } + catch (NumberFormatException e) + { + Logging.errorPrint(getTokenName() + " expected a number: " + value); + return false; + } } public String unparse(LoadContext context, Equipment eq) Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/CritmultToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/CritmultToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/CritmultToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -74,8 +74,12 @@ { try { - primHead.put(IntegerKey.CRIT_MULT, Integer.valueOf(value - .substring(1))); + Integer cm = Integer.valueOf(value.substring(1)); + if (cm.intValue() <= 0) { + Logging.errorPrint(getTokenName() + " cannot be <= 0"); + return false; + } + primHead.put(IntegerKey.CRIT_MULT, cm); return true; } catch (NumberFormatException nfe) @@ -88,7 +92,7 @@ primHead.put(IntegerKey.CRIT_MULT, Integer.valueOf(-1)); return true; } - return true; + return false; } catch (NumberFormatException nfe) { Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/CritrangeToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/CritrangeToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/CritrangeToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -53,8 +53,13 @@ { try { - getEquipmentHead(context, eq, 1).put(IntegerKey.CRIT_RANGE, - Integer.valueOf(value)); + Integer cr = Integer.valueOf(value); + if (cr.intValue() <= 0) + { + Logging.errorPrint(getTokenName() + " cannot be <= 0"); + return false; + } + getEquipmentHead(context, eq, 1).put(IntegerKey.CRIT_RANGE, cr); return true; } catch (NumberFormatException nfe) Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/EdrToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/EdrToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/EdrToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -48,7 +48,13 @@ { try { - eq.put(IntegerKey.EDR, Integer.valueOf(value)); + Integer edr = Integer.valueOf(value); + if (edr.intValue() <= 0) + { + Logging.errorPrint(getTokenName() + " must be an integer > 0"); + return false; + } + eq.put(IntegerKey.EDR, edr); return true; } catch (NumberFormatException nfe) Modified: branches/cdom/code/src/java/plugin/lsttokens/equipment/EqmodToken.java =================================================================== --- branches/cdom/code/src/java/plugin/lsttokens/equipment/EqmodToken.java 2007-03-11 23:50:38 UTC (rev 2480) +++ branches/cdom/code/src/java/plugin/lsttokens/equipment/EqmodToken.java 2007-03-12 01:36:36 UTC (rev 2481) @@ -21,9 +21,14 @@ */ package plugin.lsttokens.equipment; +import java.util.Collection; import java.util.Set; +import java.util.SortedMap; import java.util.StringTokenizer; +import java.util.TreeMap; +import java.util.Map.Entry; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.CDOMSimpleSingleRef; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AssociationKey; @@ -34,6 +39,8 @@ import pcgen.core.EquipmentModifier; import pcgen.persistence.LoadContext; import pcgen.persistence.lst.EquipmentLstToken; +import pcgen.persistence.lst.utils.TokenUtilities; +import pcgen.util.Logging; /** * Deals with EQMOD token @@ -62,6 +69,29 @@ protected boolean parseEqMod(LoadContext context, EquipmentHead primHead, String value) { + if (Constants.LST_NONE.equals(value)) + { + return true; + } + if (value.charAt(0) == '.') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with . : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '.') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with . : " + value); + return false; + } + if (value.indexOf("..") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator .. : " + value); + return false; + } + StringTokenizer dotTok = new StringTokenizer(value, Constants.DOT); while (dotTok.hasMoreTokens()) @@ -70,8 +100,28 @@ if (aEqModName.equalsIgnoreCase(Constants.LST_NONE)) { - continue; + Logging.errorPrint("Embedded " + Constants.LST_NONE + + " is prohibited in " + getTokenName()); + return false; } + if (aEqModName.charAt(0) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (aEqModName.charAt(aEqModName.length() - 1) == '|') + { + Logging.errorPrint(getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (aEqModName.indexOf("||") != -1) + { + Logging.errorPrint(getTokenName() + + " arguments uses double separator || : " + value); + return false; + } StringTokenizer pipeTok = new Str... [truncated message content] |