<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>First, I admit, the problem is in *my* XML code.  I am very
      confused but happy that my changes seem to work for compiling my
      Java code.  I attempt an IS statement inside a fieldValue.  I
      doubt if that is acceptable, but I still try!  Add below patch to
      the fieldValue statement in X3DUOM v4.0.  Then you don't have to
      come up with a single acceptableNodeType for the children field to
      encompass Nodes and Statements...can one have both SFNode and
      MFNode fields? So fieldValue may have children, IS, or value,
      exclusively?  I'm not really sure how to do that in X3DUOM
      (probably needs work), but I can probably do it in JSON Schema. 
      Anyway, somehow in X3DJSAIL stylesheet, if nodes and IS statements
      inherit from X3DConcreteElement (probably not in standard?, but IS
      does!), then it's possible you could combine IS and other
      statements with children.  I tried providing an alternate
      acceptableNodeType for the children node in X3DUOM 4 in the
      fieldValue statement, but it felt like I was digging a deeper
      hole. A mouse told me that we were trying to come up with a
      unified schema for abstract classes or interfaces above nodes and
      statements, so here we are!<br>
    </p>
    <p>diff --git a/src/specifications/X3dUnifiedObjectModel-4.0.xml
      b/src/specifications/X3dUnifiedObjectModel-4.0.xml<br>
      index 4cb5df50f..dc43f4dbd 100644<br>
      --- a/src/specifications/X3dUnifiedObjectModel-4.0.xml<br>
      +++ b/src/specifications/X3dUnifiedObjectModel-4.0.xml<br>
      @@ -41490,6 +41490,12 @@<br>
                          type="MFNode"<br>
                          accessType="inputOutput"<br>
                          acceptableNodeTypes="X3DNode"/><br>
      +            <field name="IS"<br>
      +                   type="SFNode"<br>
      +                   accessType="inputOutput"<br>
      +                   default="NULL"<br>
      +                   acceptableNodeTypes="IS"<br>
      +                   inheritedFrom="X3DNode"/><br>
                   <field name="class"<br>
                          type="SFString"<br>
                          accessType="inputOutput"</p>
    <p><br>
    </p>
    <p>Don's compile is below John's log.   <font size="+3">Attaching
        original .x3d which doesn't validate, that I know of.</font><br>
    </p>
    <p>I have not checked in all my JS code.  If someone wants to
      explore some boundaries of X3D, let me know.  Log of John's code
      test script (success? round trips working):<br>
    </p>
    <p>John's log:<br>
    </p>
    <p>$ bash several.sh ../data/rubik2x2x2.x3d<br>
      BEGIN ../data/rubik2x2x2.x3d > json, END ../data/rubik2x2x2.x3d<br>
================================================================================<br>
      /home/coderextreme/X3DJSONLD/src/main/node/xmldiff.js
      ../data/rubik2x2x2.x3d ../data/rubik2x2x2.x3d.new<br>
      @5 /X3D/Scene/0/ProtoDeclare/0/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @8
      /X3D/Scene/0/ProtoDeclare/0/ProtoBody/0/Transform/0/Shape/0/Box/0
      /X3D/Scene/0/ProtoDeclare/0/ProtoBody/0/Transform/0/Shape/0/Box/0<br>
      < ""<br>
      > {"$":{"containerField":"geometry"}}<br>
      @5 /X3D/Scene/0/ProtoDeclare/1/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @5 /X3D/Scene/0/ProtoDeclare/2/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @5 /X3D/Scene/0/ProtoDeclare/3/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      <br>
      Different<br>
      ~/X3DJSONLD/src/main/java/net/coderextreme/data
      ~/X3DJSONLD/src/main/shell<br>
      ../java/net/coderextreme/data/rubik2x2x2.java<br>
      ~/X3DJSONLD/src/main/shell<br>
      ~/X3DJSONLD/src/main/java ~/X3DJSONLD/src/main/shell<br>
      net/coderextreme/data/rubik2x2x2<br>
      Note: toFileStylesheetConversion(X3dToJson.xslt) is overwriting
      prior file ../data/rubik2x2x2.new.json<br>
      ~/X3DJSONLD/src/main/shell<br>
================================================================================<br>
      /home/coderextreme/X3DJSONLD/src/main/node/xmldiff.js
      ../data/rubik2x2x2.x3d
      ../data/rubik2x2x2.newPrettyPrint.intermediate.x3d<br>
      @7/X3D/Scene/0/NavigationInfo/0/$/avatarSize<br>
      >"0.25 1.6 0.75"<br>
      @7/X3D/Scene/0/NavigationInfo/0/$/transitionType<br>
      >"\"LINEAR\""<br>
      @5 /X3D/Scene/0/ProtoDeclare/0/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @5 /X3D/Scene/0/ProtoDeclare/1/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @5 /X3D/Scene/0/ProtoDeclare/2/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @5 /X3D/Scene/0/ProtoDeclare/3/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      <br>
      Different<br>
      ~/X3DJSONLD/src/main/node ~/X3DJSONLD/src/main/shell<br>
      ../node/net/coderextreme/data/rubik2x2x2.js<br>
      Warning: ../data/rubik2x2x2.new.x3d does not meet suggested X3D
      naming conventions, continuing...<br>
      Note: toFileX3D() is overwriting prior file
      ../data/rubik2x2x2.new.x3d<br>
      ~/X3DJSONLD/src/main/shell<br>
      node /home/coderextreme/X3DJSONLD/src/main/node/xmldiff.js
      ../data/rubik2x2x2.x3d ../data/rubik2x2x2.new.x3d<br>
================================================================================<br>
      /home/coderextreme/X3DJSONLD/src/main/node/xmldiff.js
      ../data/rubik2x2x2.x3d ../data/rubik2x2x2.new.x3d<br>
      @7/X3D/Scene/0/NavigationInfo/0/$/avatarSize<br>
      >"0.25 1.6 0.75"<br>
      @7/X3D/Scene/0/NavigationInfo/0/$/transitionType<br>
      >"\"LINEAR\""<br>
      @5 /X3D/Scene/0/ProtoDeclare/0/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @5 /X3D/Scene/0/ProtoDeclare/1/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @5 /X3D/Scene/0/ProtoDeclare/2/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      @5 /X3D/Scene/0/ProtoDeclare/3/ProtoBody/0/Transform/0/$<br>
      < {"translation":"0 0 0"}<br>
      <br>
      Different</p>
    <p>===========================================================</p>
    <p>Note: Don's code doesn't compile! Attached. Log:<br>
    </p>
    <p><br>
    </p>
    <p>$ javac -cp
/c/x3d-code/www.web3d.org/x3d/stylesheets/java/jars/X3DJSAIL.4.0.full.jar:.
      net/x3djsonld/data/rubik2x2x2.java<br>
      net/x3djsonld/data/rubik2x2x2.java:104: error: incompatible types:
      IS cannot be converted to X3DNode<br>
                      .addConnect(new
      connect().setNodeField("diffuseColor").setProtoField("diffuseColor")))))<br>
                                 ^<br>
      net/x3djsonld/data/rubik2x2x2.java:109: error: incompatible types:
      IS cannot be converted to X3DNode<br>
                      .addConnect(new
connect().setNodeField("diffuseColor").setProtoField("diffuseColor"))))))))<br>
                                 ^<br>
      net/x3djsonld/data/rubik2x2x2.java:123: error: incompatible types:
      IS cannot be converted to X3DNode<br>
                      .addConnect(new
connect().setNodeField("diffuseColor").setProtoField("x1diffuseColor")))))<br>
                                 ^<br>
      net/x3djsonld/data/rubik2x2x2.java:128: error: incompatible types:
      IS cannot be converted to X3DNode<br>
                      .addConnect(new
connect().setNodeField("diffuseColor").setProtoField("x2diffuseColor"))))))))<br>
                                 ^<br>
      Note: Some messages have been simplified; recompile with
      -Xdiags:verbose to get full output</p>
    <p>4 errors</p>
    <p>$ javac -cp
/c/x3d-code/www.web3d.org/x3d/stylesheets/java/jars/X3DJSAIL.4.0.full.jar:.
      -Xdiags:verbose net/x3djsonld/data/rubik2x2x2.java<br>
      net/x3djsonld/data/rubik2x2x2.java:103: error: method addChild in
      class fieldValue cannot be applied to given types;<br>
                    .addChild(new IS()<br>
                    ^<br>
        required: X3DNode<br>
        found:    IS<br>
        reason: argument mismatch; IS cannot be converted to X3DNode<br>
      net/x3djsonld/data/rubik2x2x2.java:108: error: method addChild in
      class fieldValue cannot be applied to given types;<br>
                    .addChild(new IS()<br>
                    ^<br>
        required: X3DNode<br>
        found:    IS<br>
        reason: argument mismatch; IS cannot be converted to X3DNode<br>
      net/x3djsonld/data/rubik2x2x2.java:122: error: method addChild in
      class fieldValue cannot be applied to given types;<br>
                    .addChild(new IS()<br>
                    ^<br>
        required: X3DNode<br>
        found:    IS<br>
        reason: argument mismatch; IS cannot be converted to X3DNode<br>
      net/x3djsonld/data/rubik2x2x2.java:127: error: method addChild in
      class fieldValue cannot be applied to given types;<br>
                    .addChild(new IS()<br>
                    ^<br>
        required: X3DNode<br>
        found:    IS<br>
        reason: argument mismatch; IS cannot be converted to X3DNode<br>
      4 errors<br>
    </p>
    <p><br>
    </p>
  </body>
</html>