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));
}
/**