From 46b71392aad66804d2ee86d60d2341ab9a8a72be Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Thu, 29 Nov 2001 21:58:15 +0000 Subject: [PATCH] Moved some stuff into BundleUtil. Added code to support post-parsing tileset validation. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@700 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../tile/bundle/tools/TileSetBundler.java | 7 +- .../tile/tools/xml/ObjectTileSetRuleSet.java | 75 +++++++++++++++++++ .../tools/xml/SwissArmyTileSetRuleSet.java | 33 +++++++- .../media/tile/tools/xml/TileSetRuleSet.java | 37 ++++++++- .../tile/tools/xml/UniformTileSetRuleSet.java | 33 +++++++- .../tile/tools/xml/XMLTileSetParser.java | 9 ++- 6 files changed, 183 insertions(+), 11 deletions(-) create mode 100644 src/java/com/threerings/media/tile/tools/xml/ObjectTileSetRuleSet.java diff --git a/src/java/com/threerings/media/tile/bundle/tools/TileSetBundler.java b/src/java/com/threerings/media/tile/bundle/tools/TileSetBundler.java index 19667b484..0b5dadaa5 100644 --- a/src/java/com/threerings/media/tile/bundle/tools/TileSetBundler.java +++ b/src/java/com/threerings/media/tile/bundle/tools/TileSetBundler.java @@ -1,5 +1,5 @@ // -// $Id: TileSetBundler.java,v 1.2 2001/11/29 00:13:20 mdb Exp $ +// $Id: TileSetBundler.java,v 1.3 2001/11/29 21:58:15 mdb Exp $ package com.threerings.media.tools.tile.bundle; @@ -30,7 +30,7 @@ import com.samskivert.io.PersistenceException; import com.threerings.media.Log; import com.threerings.media.tile.TileSet; import com.threerings.media.tile.TileSetIDBroker; -import com.threerings.media.tile.bundle.BundledTileSetRepository; +import com.threerings.media.tile.bundle.BundleUtil; import com.threerings.media.tile.bundle.TileSetBundle; import com.threerings.media.tools.tile.xml.TileSetRuleSet; @@ -270,8 +270,7 @@ public class TileSetBundler try { // first write a serialized representation of the tileset // bundle object to the bundle jar file - JarEntry entry = new JarEntry( - BundledTileSetRepository.METADATA_PATH); + JarEntry entry = new JarEntry(BundleUtil.METADATA_PATH); jar.putNextEntry(entry); ObjectOutputStream oout = new ObjectOutputStream(jar); oout.writeObject(bundle); diff --git a/src/java/com/threerings/media/tile/tools/xml/ObjectTileSetRuleSet.java b/src/java/com/threerings/media/tile/tools/xml/ObjectTileSetRuleSet.java new file mode 100644 index 000000000..02ca9c1c9 --- /dev/null +++ b/src/java/com/threerings/media/tile/tools/xml/ObjectTileSetRuleSet.java @@ -0,0 +1,75 @@ +// +// $Id: ObjectTileSetRuleSet.java,v 1.1 2001/11/29 21:58:15 mdb Exp $ + +package com.threerings.media.tools.tile.xml; + +import java.awt.Dimension; +import java.awt.Point; + +import org.xml.sax.Attributes; +import org.apache.commons.digester.Digester; + +import com.samskivert.util.StringUtil; +import com.samskivert.xml.CallMethodSpecialRule; + +import com.threerings.media.tile.TileSet; +import com.threerings.media.tile.ObjectTileSet; + +/** + * Parses {@link ObjectTileSet} instances from a tileset description. An + * object tileset description looks like so: + * + *
+ * <tileset name="Sample Object Tileset">
+ *   <imagePath>path/to/image.png</imagePath>
+ *   <!-- the widths (per row) of each tile in pixels -->
+ *   <widths>265</widths>
+ *   <!-- the heights (per row) of each tile in pixels -->
+ *   <heights>224</heights>
+ *   <!-- the number of tiles in each row -->
+ *   <tileCounts>4</tileCounts>
+ *   <!-- the offset in pixels to the upper left tile -->
+ *   <offsetPos>0, 0</offsetPos>
+ *   <!-- the gap between tiles in pixels -->
+ *   <gapSize>0, 0</gapSize>
+ *   <!-- the widths (in unit tile count) of the objects -->
+ *   <objectWidths>4, 3, 4, 3</objectWidths>
+ *   <!-- the heights (in unit tile count) of the objects -->
+ *   <objectHeights>3, 4, 3, 4</objectHeights>
+ * </tileset>
+ * 
+ */ +public class ObjectTileSetRuleSet extends TileSetRuleSet +{ + // documentation inherited + public void addRuleInstances (Digester digester) + { + super.addRuleInstances(digester); + + digester.addRule( + _prefix + TILESET_PATH + "/objectWidths", + new CallMethodSpecialRule(digester) { + public void parseAndSet (String bodyText, Object target) + { + int[] widths = StringUtil.parseIntArray(bodyText); + ((ObjectTileSet)target).setObjectWidths(widths); + } + }); + + digester.addRule( + _prefix + TILESET_PATH + "/objectHeights", + new CallMethodSpecialRule(digester) { + public void parseAndSet (String bodyText, Object target) + { + int[] heights = StringUtil.parseIntArray(bodyText); + ((ObjectTileSet)target).setObjectHeights(heights); + } + }); + } + + // documentation inherited + protected Class getTileSetClass () + { + return ObjectTileSet.class; + } +} diff --git a/src/java/com/threerings/media/tile/tools/xml/SwissArmyTileSetRuleSet.java b/src/java/com/threerings/media/tile/tools/xml/SwissArmyTileSetRuleSet.java index 2d49e0362..ea59d27c4 100644 --- a/src/java/com/threerings/media/tile/tools/xml/SwissArmyTileSetRuleSet.java +++ b/src/java/com/threerings/media/tile/tools/xml/SwissArmyTileSetRuleSet.java @@ -1,5 +1,5 @@ // -// $Id: SwissArmyTileSetRuleSet.java,v 1.6 2001/11/29 20:39:37 mdb Exp $ +// $Id: SwissArmyTileSetRuleSet.java,v 1.7 2001/11/29 21:58:15 mdb Exp $ package com.threerings.media.tools.tile.xml; @@ -12,6 +12,7 @@ import org.apache.commons.digester.Digester; import com.samskivert.util.StringUtil; import com.samskivert.xml.CallMethodSpecialRule; +import com.threerings.media.Log; import com.threerings.media.tile.TileSet; import com.threerings.media.tile.SwissArmyTileSet; @@ -95,6 +96,36 @@ public class SwissArmyTileSetRuleSet extends TileSetRuleSet }); } + // documentation inherited + public boolean isValid (Object target) + { + SwissArmyTileSet set = (SwissArmyTileSet)target; + boolean valid = super.isValid(target); + + // check for a element + if (set.getWidths() == null) { + Log.warning("Tile set definition missing valid " + + "element [set=" + set + "]."); + valid = false; + } + + // check for a element + if (set.getHeights() == null) { + Log.warning("Tile set definition missing valid " + + "element [set=" + set + "]."); + valid = false; + } + + // check for a element + if (set.getTileCounts() == null) { + Log.warning("Tile set definition missing valid " + + "element [set=" + set + "]."); + valid = false; + } + + return valid; + } + // documentation inherited protected Class getTileSetClass () { diff --git a/src/java/com/threerings/media/tile/tools/xml/TileSetRuleSet.java b/src/java/com/threerings/media/tile/tools/xml/TileSetRuleSet.java index e8bb099c6..009b9f5de 100644 --- a/src/java/com/threerings/media/tile/tools/xml/TileSetRuleSet.java +++ b/src/java/com/threerings/media/tile/tools/xml/TileSetRuleSet.java @@ -1,5 +1,5 @@ // -// $Id: TileSetRuleSet.java,v 1.4 2001/11/21 02:42:15 mdb Exp $ +// $Id: TileSetRuleSet.java,v 1.5 2001/11/29 21:58:15 mdb Exp $ package com.threerings.media.tools.tile.xml; @@ -9,6 +9,11 @@ import org.apache.commons.digester.Digester; import org.apache.commons.digester.Rule; import org.apache.commons.digester.RuleSetBase; +import com.samskivert.util.StringUtil; +import com.samskivert.xml.ValidatedSetNextRule; +import com.samskivert.xml.ValidatedSetNextRule.Validator; + +import com.threerings.media.Log; import com.threerings.media.tile.TileSet; /** @@ -16,7 +21,8 @@ import com.threerings.media.tile.TileSet; * instance. Derived classes would extend this and add rules for their own * special tilesets. */ -public abstract class TileSetRuleSet extends RuleSetBase +public abstract class TileSetRuleSet + extends RuleSetBase implements Validator { /** The component of the digester path that is appended by the tileset * rule set to match a tileset. This is appended to whatever prefix is @@ -69,6 +75,33 @@ public abstract class TileSetRuleSet extends RuleSetBase _prefix + TILESET_PATH + "/imagePath", "setImagePath", 0); } + /** + * The ruleset can be provided to a {@link ValidatedSetNextRule} to + * ensure that the tileset was fully parsed before doing something + * with it. + */ + public boolean isValid (Object target) + { + TileSet set = (TileSet)target; + boolean valid = true; + + // check for the 'name' attribute + if (StringUtil.blank(set.getName())) { + Log.warning("Tile set definition missing 'name' attribute " + + "[set=" + set + "]."); + valid = false; + } + + // check for an element + if (StringUtil.blank(set.getImagePath())) { + Log.warning("Tile set definition missing element " + + "[set=" + set + "]."); + valid = false; + } + + return valid; + } + /** * A tileset rule set will create tilesets of a particular class, * which must be provided by the derived class via this method. diff --git a/src/java/com/threerings/media/tile/tools/xml/UniformTileSetRuleSet.java b/src/java/com/threerings/media/tile/tools/xml/UniformTileSetRuleSet.java index 9b4d7445f..1bdf122ac 100644 --- a/src/java/com/threerings/media/tile/tools/xml/UniformTileSetRuleSet.java +++ b/src/java/com/threerings/media/tile/tools/xml/UniformTileSetRuleSet.java @@ -1,11 +1,12 @@ // -// $Id: UniformTileSetRuleSet.java,v 1.5 2001/11/29 20:39:37 mdb Exp $ +// $Id: UniformTileSetRuleSet.java,v 1.6 2001/11/29 21:58:15 mdb Exp $ package com.threerings.media.tools.tile.xml; import org.xml.sax.Attributes; import org.apache.commons.digester.Digester; +import com.threerings.media.Log; import com.threerings.media.tile.TileSet; import com.threerings.media.tile.UniformTileSet; @@ -43,6 +44,36 @@ public class UniformTileSetRuleSet extends TileSetRuleSet new Class[] { java.lang.Integer.TYPE }); } + // documentation inherited + public boolean isValid (Object target) + { + UniformTileSet set = (UniformTileSet)target; + boolean valid = super.isValid(target); + + // check for a element + if (set.getWidth() == 0) { + Log.warning("Tile set definition missing valid " + + "element [set=" + set + "]."); + valid = false; + } + + // check for a element + if (set.getHeight() == 0) { + Log.warning("Tile set definition missing valid " + + "element [set=" + set + "]."); + valid = false; + } + + // check for a element + if (set.getTileCount() == 0) { + Log.warning("Tile set definition missing valid " + + "element [set=" + set + "]."); + valid = false; + } + + return valid; + } + // documentation inherited protected Class getTileSetClass () { diff --git a/src/java/com/threerings/media/tile/tools/xml/XMLTileSetParser.java b/src/java/com/threerings/media/tile/tools/xml/XMLTileSetParser.java index 5093fa261..1e794f517 100644 --- a/src/java/com/threerings/media/tile/tools/xml/XMLTileSetParser.java +++ b/src/java/com/threerings/media/tile/tools/xml/XMLTileSetParser.java @@ -1,5 +1,5 @@ // -// $Id: XMLTileSetParser.java,v 1.4 2001/11/27 22:06:39 mdb Exp $ +// $Id: XMLTileSetParser.java,v 1.5 2001/11/29 21:58:15 mdb Exp $ package com.threerings.media.tools.tile.xml; @@ -16,6 +16,7 @@ import org.apache.commons.digester.Digester; import org.apache.commons.digester.Rule; import com.samskivert.util.ConfigUtil; +import com.samskivert.xml.ValidatedSetNextRule; import com.threerings.media.Log; import com.threerings.media.tile.TileSet; @@ -57,8 +58,10 @@ public class XMLTileSetParser // add a set next rule which will put tilesets with this prefix // into the array list that'll be on the top of the stack - _digester.addSetNext(prefix + TileSetRuleSet.TILESET_PATH, - "add", "java.lang.Object"); + _digester.addRule(prefix + TileSetRuleSet.TILESET_PATH, + new ValidatedSetNextRule(_digester, + "add", Object.class, + ruleset)); } /**