diff --git a/src/java/com/threerings/miso/client/Portal.java b/src/java/com/threerings/miso/client/Portal.java
index d9efe0eb4..5b848655e 100644
--- a/src/java/com/threerings/miso/client/Portal.java
+++ b/src/java/com/threerings/miso/client/Portal.java
@@ -1,12 +1,12 @@
//
-// $Id: Portal.java,v 1.2 2001/08/16 22:05:01 shaper Exp $
+// $Id: Portal.java,v 1.3 2001/08/21 01:15:16 shaper Exp $
package com.threerings.miso.scene;
/**
- * The Portal class represents a Location in
- * a scene that both leads to a different scene and serves as a
- * potential entrance into its containing scene.
+ * The portal class represents a {@link Location} in a scene that both
+ * leads to a different scene and serves as a potential entrance into
+ * its containing scene.
*/
public class Portal extends Location
{
@@ -20,7 +20,7 @@ public class Portal extends Location
public Portal dest;
/**
- * Construct an Portal object.
+ * Construct a portal object.
*
* @param loc the location associated with the portal.
* @param name the portal name.
@@ -44,6 +44,15 @@ public class Portal extends Location
this.dest = dest;
}
+ /**
+ * Return whether this portal has a valid destination scene and
+ * portal.
+ */
+ public boolean hasDestination ()
+ {
+ return (sid != MisoScene.SID_INVALID && dest != null);
+ }
+
/**
* Return a String representation of this object.
*/
diff --git a/src/java/com/threerings/miso/tools/xml/XMLSceneGroupParser.java b/src/java/com/threerings/miso/tools/xml/XMLSceneGroupParser.java
index b54e4f97d..8037ff834 100644
--- a/src/java/com/threerings/miso/tools/xml/XMLSceneGroupParser.java
+++ b/src/java/com/threerings/miso/tools/xml/XMLSceneGroupParser.java
@@ -1,5 +1,5 @@
//
-// $Id: XMLSceneGroupParser.java,v 1.2 2001/08/16 22:05:01 shaper Exp $
+// $Id: XMLSceneGroupParser.java,v 1.3 2001/08/21 01:15:16 shaper Exp $
package com.threerings.miso.scene.xml;
@@ -74,6 +74,9 @@ public class XMLSceneGroupParser extends DefaultHandler
// the associated scene objects, resolve bindings between
// all scenes in the group.
_info.resolveBindings();
+
+ // warn about any remaining un-bound portals
+ _info.checkUnboundPortals();
}
// note that we're not within a tag to avoid considering any
@@ -193,7 +196,7 @@ public class XMLSceneGroupParser extends DefaultHandler
}
/**
- * Resolve portal bindings and set entrance portal for all scenes.
+ * Resolve the portal bindings and entrance portal for all scenes.
*/
public void resolveBindings ()
{
@@ -210,9 +213,8 @@ public class XMLSceneGroupParser extends DefaultHandler
// resolve the portal binding
resolvePortal(sinfo, pinfo);
- // set the entrance portal
- Portal entrance = sinfo.scene.getPortal(sinfo.entrance);
- sinfo.scene.setEntrance(entrance);
+ // resolve the entrance portal
+ resolveEntrance(sinfo);
}
}
}
@@ -228,31 +230,78 @@ public class XMLSceneGroupParser extends DefaultHandler
// get the source portal object
Portal src = sinfo.scene.getPortal(pinfo.src);
if (src == null) {
- Log.warning(
- "Missing source portal [scene=" + sinfo.name +
- ", pinfo=" + pinfo + "].");
+ Log.warning("Missing source portal [scene=" + sinfo.name +
+ ", pinfo=" + pinfo + "].");
return;
}
// get the destination scene
MisoScene destScene = getScene(pinfo.destScene);
if (destScene == null) {
- Log.warning(
- "Missing destination scene [scene=" + sinfo.name +
- ", pinfo=" + pinfo + "].");
+ Log.warning("Missing destination scene [scene=" + sinfo.name +
+ ", pinfo=" + pinfo + "].");
+ return;
}
// get the destination portal object
Portal dest = destScene.getPortal(pinfo.dest);
if (dest == null) {
- Log.warning(
- "Missing destination portal [scene=" + sinfo.name +
- ", pinfo=" + pinfo + "].");
+ Log.warning("Missing destination portal [scene=" + sinfo.name +
+ ", pinfo=" + pinfo + "].");
+ return;
}
// update source portal with full destination information
src.setDestination(destScene.getId(), dest);
- }
+ }
+
+ /**
+ * Resolve the binding for the entrance portal in the given scene.
+ *
+ * @param sinfo the scene info.
+ */
+ protected void resolveEntrance (SceneInfo sinfo)
+ {
+ Portal entrance = sinfo.scene.getPortal(sinfo.entrance);
+ if (entrance == null) {
+ Log.warning( "Missing entrance portal [scene=" + sinfo.name +
+ ", entrance=" + sinfo.entrance + "].");
+ return;
+ }
+
+ sinfo.scene.setEntrance(entrance);
+ }
+
+ /**
+ * Scan through all scenes and output a warning message if any
+ * portals are found that aren't bound to a destination
+ * portal. Intended for calling after {@link
+ * #resolveBindings} is called to make sure the scene group
+ * description wasn't lacking a binding for some portal; or,
+ * that the scenes don't contain any unintended or unnecessary
+ * portals.
+ */
+ public void checkUnboundPortals ()
+ {
+ int size = sceneinfo.size();
+ for (int ii = 0; ii < size; ii++) {
+ // retrieve the next scene info object
+ SceneInfo sinfo = (SceneInfo)sceneinfo.get(ii);
+
+ // get the portals in the scene
+ List portals = sinfo.scene.getPortals();
+
+ // check each portal to make sure it has a valid destination
+ int psize = portals.size();
+ for (int jj = 0; jj < size; jj++) {
+ Portal portal = (Portal)portals.get(jj);
+ if (!portal.hasDestination()) {
+ Log.warning("Unbound portal [scene=" + sinfo.name +
+ ", portal=" + portal + "].");
+ }
+ }
+ }
+ }
}
/**