Wrapper Tags Considered Harmful
Don Brutzman, 6 February 2000
Problem statement
Tags in the
x3d-draft.dtd
map VRML nodes to XML tags.
Parent-child relationships among VRML nodes
correspond to parent-child relationships among XML tags.
"Wrapper tags" inserts an explicit tag for labeling each field name.
This means that the wrapper tags create new nodes in the scene graph
when instantiated as an object model.
Here is an implemented
WrapperTagsExample.xml
and a
VRML translation
to show the nodes used.
A link to the opposing arguments will be added when provided.
Implementation and evaluation background
This technical analysis of wrapper tags is based on
implementing and evaluating X3D using multiple languages and representations:
DTD tagset definitions and XML tags,
closely observing development of Xj3D browser written in Java3D,
scene graph visualization
using the X3D-Edit authoring tool,
using half a dozen (of 27+ available) XML parsers,
Extensible Stylesheet Language (XSL) parsing & translation
from XML to VRML/HTML,
and (perhaps most importantly) the VRML source which results from translation
Reasons why wrapper tags are harmful
- Wrapper tags do not fix any real problem.
Solutions are demonstrated for all examples that have been proposed.
- Wrapper tags add no information to a scene.
Example: the fixed-pair tagset
<appearance><Appearance>...</Appearance></appearance>
is functionally identical to the tagset
<Appearance>...</Appearance>
,
as search/replace using any text editor quickly shows.
Evidence: the X3D->VRML
stylesheet translates the full VRML scene graph satisfactorily and identically,
with or without wrappers, by trapping and immediately discarding wrapper tags whenever found.
- Unnecessarily verbose.
Adding superfluous wrapper tags make X3D scene graph files harder to read, harder to
author, and thus more error prone. These problems harm X3D deployment.
- Wrapper tags bloat every scene subgraph and increase all file sizes.
To date, three estimates have been made on the severity of this problem.
Given tokenization capabilities of compression tools, wrapper tags are not
expected to make significant difference in compressed scenes.
- Chris Marrin's "Statistics on file sizes..." message of 1/26/00 (link needed)
examines a heavily structured scene and a heavily numeric scene, comparing sizes
compressed/uncompressed using a variety of DTDs. Differences range from 0.5% to 41.0%.
- WrapperTagsExample.xml shows
that use of wrapper tags doubles the number of tags wherever they occur.
- No valid counterexamples have been proposed or demonstrated. A wide variety of
valid examples
have been demonstrated in equivalent VRML and X3D without wrappers.
Next step is to translate every example in the
VRML 97 specification.
There is no problem case made for wrapper tags.
- Disambiguation of children nodes without wrapper tags has been demonstrated.
Detecting and disambiguating children takes 2-3 case statements with ~15
cases, all of which are needed anyway when building a VRML 97 scene graph.
- Making multiple children into multiple grandchildren doesn't solve node
disambiguation. Case statements matching node names disambiguates nodes.
- Future extensions are not a lurking problem.
The number of case statements needed for disambiguation is bounded to match VRML 97 semantics.
Future X3D extensions must map node types to VRML, and thus must explicitly
define contained nodes just as PROTO declarations do. PROTO examples are
already demonstrated to work without wrapper tags.
- Working alternative to wrapper tags implemented and demonstrated.
WrapperTagsExample shows four
separate solutions - be sure to view the
VRML result
PROTO declarations using PROTO tags and new native XML tags have each been
demonstrated to perform equivalently and interoperably. Thus there are
no downstream problems for new X3D extensions when we choose to avoid wrapper tags.
- VRML 97 nodes strictly map to XML tags in x3d-draft.dtd. Scene graph
relationships are unambiguously preserved with a one-to-one correspondence
by tag relationships. Wrappers insert relationship labels as nodes/tags,
which is incorrect semantics and incorrect topology for graph instances
that are reflecting VRML 97 scene graphs. Incorrect topology is a major
indicator of incompatibility problems. Related note: traversing a
'this-grandchild-is-one-of-this-parents-children' wrapper doesn't render.
- Mixed, mismatched semantics are error-prone representations. Errors
occurring in such designs are typically subtle and difficult to debug.
- A scene graph with wrapper tags has a different topology than the VRML 97
scene graph. This means that tree algorithms must be modified prior to
being able run on X3D-based scene graphs. This opposes requirements to
map X3D to VRML 97.
- Parser testing. All X3D parsers originally placed under public
scrutiny have worked. The Blendo parser needs to be tested. This was made
available 4 February 2000 following a long-standing claim that it was unable
to parse X3D without wrapper tags. Further scrutiny regarding its capabilities
is now warranted.
- Numerous tests satisfactory without wrapper tags.
About a dozen public XML parsers have been tested out of 27+ available.
All work satisfactorily without wrapper tags. Smallest parsers to date
include XPAT (44 KB Windows executable) and Internet Explorer 5.01 (0 KB).
Parser instances smaller than 44 KB are likely soon, using customized
Java or C++ classes autogenerated directly from the DTD.
- Demonstrated validity without wrapper tags.
Translating VRML -> X3D -> VRML correctly and exhaustively has
demonstrated DTD validity for all VRML 97 nodes without wrapper tags.
- Routing events to/from wrapper tags produces a VRML error. This is because
such tags perform no function, and the events needed to be routed to
the intended scene node regardless. Such new errors are eliminated when
wrapper tags are eliminated. Examples have shown that routing to
child nodes (such as sending an Appearance node as an event to a Shape's
SFNode appearance field) occurs using identical syntax in X3D and VRML.
- Creation of nonfunctional classes in autogenerated code.
Wrapper tags add a significant number of wrapper classes which must be
instantiated and supported. This is because a DTD is not a suggestion
about how to interpret a tagset - a DTD directly and strictly instantiates
classes and functionality in software. Thus wrapper tags also cause
code bloat, increased code complexity for implementers, and increased
possibility of run-time error for developers.
- Performance reductions on every render cycle.
Because they have no functionality, adding intermediate wrapper classes
only reduces run-time performance by a tiny amount. However this
performance reduction occurs on every traversal of every parent-child-
relationship during every rendering cycle of every scene graph, forever.
To avoid this, browsers must be hand modified ignore the classes defined
by wrapper tags.
- Unwrapping/rewrapping required.
Implementations that do manually re-optimize the scene graph by
collapsing intermediate wrapper classes are no longer compliant with
the DOM API for the X3D DTD. Left that way, they will not be able to receive events
from the web browser's Document Object Model (DOM) or from a remote/networked SMIL event stream.
Thus they would have to further remap DOM events to internal classes,
rather than sending them directly in the first place. Rephrase: browsers must
rewrap a wrapper API around the unwrapped internal classes to correct
mismatches produced from optimizing the performance reduction of wrapper-tag classes
- Wrappers are a different scene graph, untested and unverified.
Changing the VRML scene graph and corresponding class hierarchy to
include nonfunctional wrapper-relationship nodes may well
prevent the forthcoming Script Authoring Interface (SAI) from
compatibly reconciling Java/ECMAScript JSAI, EAI and DOM APIs. This
is because a DTD allows no interpretation variations, it is strict.
Thus authors will need different algorithms when traversing wrapped
X3D scene graphs. This problem also makes translation of existing
scripts into DOM-compatible versions more error prone.
- Wrappers for repeating values unnecessary.
Allowing wrapper tags to appear multiple times as siblings to preserve
a permitted VRML ambiguity is of questionable value, is not a unique
capability of wrapper tags, weakens XML type-checking strengths,
enables logical errors in content that are otherwise flagged for
authors, and provides no difference in the resulting scene graph
(since excess-identical-sibling definitions are ignored anyway by
VRML 97 rules).
- Further testing of implementations is possible.
The x3d-draft.dtd is extensible to interoperably permit children tags
as an alternative encoding. Such an approach enables further testing
of content with respect to wrapper-tag pros and cons, if desired.
Demonstrating results is a necessary prerequisite for
making an informed, grounded evaluation about DTD alternatives.
- Wrappers remain redundant.
The fact that the multi-profile X3D DTD is further modifiable to compatibly
enable or ignore wrapper tags (as indicated by a simple authoring flag in
scenes) is in itself further evidence that the DTD is already complete
and correct without needing the addition of wrapper tags.
- Wrappers permit writing a context-free parser.
Producing a context-free parser (i.e. a special class of finite state
machine) is not an identified X3D requirement. Whether or not a formally
context-free parser can even parse the full semantic complexities VRML 97
is of questionable merit and has not been demonstrated. Multiple fast
and small parsers (e.g. 44K Windows executable, zero bytes when in
browser, others available) are already suitable for support of small-footprint core-profile browsers.
- Naming collisions threaten extensibility.
Having duplicate names like
<appearance> <Appearance>
prevents generation of uniquely named accessor methods (e.g. getAppearance), setAppearance)
for component classes generated from the DTD. Precluding the component interface model
precludes implementing extensibility - this wrapper-ambiguity problem must be resolved.
In conclusion:
- Overwhelming evidence against wrapper tags without demonstrated counterexamples.
The large number of strong technical arguments against wrapper tags,
combined with the large number of undemonstrated implementation questions,
makes wrapper tag incorporation into the X3D DTD inadvisable and harmful.
Failing to make such a major decision, without implementation evidence regarding most of these points, rejects
the "implement and evaluate" requirements of the X3D process.