<div dir="auto">You’re welcome, Don, I hope to work with X3DJSAIL more in the following days, but recently, I’ve been working on X3D JSON loading into Castle Game Engine (CGE), which is an interesting application of my areas of expertise.  I am relearning Pascal which is kind of “fun,” and the Castle and Free Pascal “units” aka packages and libraries imported into a program.   I was impressed by a benchmark where Pascal out performed C.</div><div dir="auto"><br></div><div dir="auto">Thanks, Don, for adding schematron testing to X3DJSAIL!  Note that X3D JSON can be validated via DOM and X3DJSAIL, or via X3D JSON schema (see npx x3dvalidate).  With the addition of the Schematron to X3DJSAIL, I plan on adding schematron testing to X3D JSON in addition to validation via X3DJSAIL and XML Schema.   These will and do appear under my x3dschema project:  </div><div dir="auto"></div><div dir="auto"><br></div><div dir="auto"><a href="https://github.com/coderextreme/x3dschema">https://github.com/coderextreme/x3dschema</a></div><div dir="auto"><br></div><div dir="auto">I already have batch .x3d schematron testing with X3DJSAIL in X3DSONLD.</div><div dir="auto"><br></div><div dir="auto">Onwards with X3DJSAIL!  Maybe eventually I’ll get to real X3D C++ coding!</div><div dir="auto"><br></div><div dir="auto">But first, to download a new CGE version!</div><div dir="auto"><br></div><div dir="auto">John</div><div dir="auto"><br><div class="gmail_quote gmail_quote_container" dir="auto"><div dir="ltr" class="gmail_attr">On Wed, Aug 6, 2025 at 1:24 PM Don Brutzman via x3d-public <<a href="mailto:x3d-public@web3d.org">x3d-public@web3d.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr">Further work has resulted in another update release of a valuable open-source software library.<div><br></div><div><b>X3DJSAIL, the X3D Java Scene Access Interface Library (X3DJSAIL)</b></div><ul><li>X3D Java Scene Access Interface Library (X3DJSAIL) supports programmers with standards-based X3D Java interfaces and objects, all as open source.</li><li><a href="https://www.web3d.org/specifications/java/X3DJSAIL.html" target="_blank">https://www.web3d.org/specifications/java/X3DJSAIL.html</a></li><li>X3DJSAIL is designed to make it easy for Java programmers to create high-quality X3D models, perform conversions, and launch tools.  The combined strictness of Java, XML, and the X3D architecture means it is actually quite difficult to create an invalid X3D model.</li></ul><div>Multiple improvements are included in this X3DJSAIL release, notably:</div><div><ul><li>X3DJSAIL, Utility Methods and Functionality</li><li><a href="https://www.web3d.org/specifications/java/X3DJSAIL.html#UtilityMethods" target="_blank">https://www.web3d.org/specifications/java/X3DJSAIL.html#UtilityMethods</a></li></ul><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman""><i style="font-family:"Times New Roman";color:darkgreen">Complete.</i> Checks for optional/required MFString enumeration pairs are much improved, for examples see source for fields <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Layout/Layout.html#setAlign(java.lang.String%5B%5D)" target="_blank" style="font-family:"Times New Roman"">Layout.align</a> (<a href="https://www.web3d.org/x3d/content/X3dTooltips.html#Layout.align" target="_blank" style="font-family:"Times New Roman"">tooltip</a>) and <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Navigation/NavigationInfo.html#setType(java.lang.String%5B%5D)" target="_blank" style="font-family:"Times New Roman"">NavigationInfo.type</a> (<a href="https://www.web3d.org/x3d/content/X3dTooltips.html#NavigationInfo.type" target="_blank" style="font-family:"Times New Roman"">tooltip</a>).</li></ul><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman""><span style="font-family:"Times New Roman";color:darkgreen"><i style="font-family:"Times New Roman"">Complete</i></span>. Added MFString utility methods for <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/fields/MFString.html#hasDuplicateValues()" target="_blank" style="font-family:"Times New Roman"">hasDuplicateValues()</a> and <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/fields/MFString.html#removeDuplicateValues()" target="_blank" style="font-family:"Times New Roman"">removeDuplicateValues()</a>. Model authors programming with X3DJSAIL are also prevented from adding illegal duplicate values for special MFString enumeration fields, such as <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Text/FontStyle.html#addFamily(java.lang.String)" target="_blank" style="font-family:"Times New Roman"">FontStyle.addFamily(newValue)</a>, while while still allowing addition of duplicate values for other fields (such as <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Text/Text.html#addString(java.lang.String)" target="_blank" style="font-family:"Times New Roman"">Text.addString(newValue)</a>.</li></ul></blockquote></div></div><div>I have added a Testing section to describe all the detailed attention being paid to correct library operation.</div><div><ul><li>X3DJSAIL, Testing</li><li><a href="https://www.web3d.org/specifications/java/X3DJSAIL.html#Testing" target="_blank">https://www.web3d.org/specifications/java/X3DJSAIL.html#Testing</a></li></ul><div><blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)" class="gmail_quote">Comprehensive testing is performed during X3DJSAIL codebase development. Building a test suite is essential for ensuring that unintended "side effects" and problems don't emerge during the evolution of a sophisticated software library.<br><a href="https://en.wikipedia.org/wiki/Smoke_testing_(software)" target="_blank">Smoke testing</a> confirms correct operation of new features using a single example program.<ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman""><a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgram.java" target="_blank" style="font-family:"Times New Roman"">SmokeTestProgram.java</a> source exercises many X3DJSAIL features, with execution results shown by <a href="https://www.web3d.org/specifications/java/build.test.X3DJSAIL.txt" target="_blank" style="font-family:"Times New Roman"">build.test.X3DJSAIL.txt</a>.</li></ul><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman"">Program-generated outputs include <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.x3d" target="_blank" style="font-family:"Times New Roman"">X3D model</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.x3dv" target="_blank" style="font-family:"Times New Roman"">ClassicVRML model</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.wrl" target="_blank" style="font-family:"Times New Roman"">VRML97 model</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.json" target="_blank" style="font-family:"Times New Roman"">JSON encoding</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.java" target="_blank" style="font-family:"Times New Roman"">Java source</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.py" target="_blank" style="font-family:"Times New Roman"">Python source</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutputX3dom.xhtml" target="_blank" style="font-family:"Times New Roman"">X3DOM scene page</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutputX_ITE.html" target="_blank" style="font-family:"Times New Roman"">X_ITE scene page</a></li></ul><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman"">A <a href="https://www.web3d.org/specifications/java/examples/images/HelloWorldProgramOutput.png" target="_blank" style="font-family:"Times New Roman"">screenshot image</a> and <a href="https://www.web3d.org/specifications/java/examples/images/HelloWorldProgramOutput.mp4" target="_blank" style="font-family:"Times New Roman"">movie</a> were produced during early versions of program outputs.</li></ul><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman"">Concise autogenerated java source produces a nearly identical X3D scene-graph program: <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.java" target="_blank" style="font-family:"Times New Roman"">SmokeTestProgramOutput.java</a></li></ul><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman"">Stylesheet-generated <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.html" target="_blank" style="font-family:"Times New Roman"">pretty-print X3D model documentation</a></li></ul><a href="https://en.wikipedia.org/wiki/Round-trip_engineering" target="_blank">Round-trip engineering (RTE)</a> is another excellent test methodology to help confirm full coverage of capabilities.<ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman""><a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.java" target="_blank" style="font-family:"Times New Roman"">SmokeTestProgramOutput.java</a> shows full round-trip conversion from original .java, to .x3d export, to .java source-code serialization.</li></ul><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman"">Conversions are performed using <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3D.html#toFileJava(java.lang.String)" target="_blank" style="font-family:"Times New Roman"">X3D.toFileJava(filename)</a>, and the <a href="https://www.web3d.org/specifications/java/lib/stylesheets/X3dToJava.xslt" target="_blank" style="font-family:"Times New Roman"">X3dToJava.xslt</a> stylesheets.</li></ul><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman"">Export of ClassicVRML <code style="font-family:monospace">.x3dv</code> versions using <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/Core/X3D.html#toFileClassicVRML(java.lang.String)" target="_blank" style="font-family:"Times New Roman"">X3D.toFileClassicVRML(filename)</a> are subsequently checked for correct syntax using the <a href="https://castle-engine.io/castle-model-converter" target="_blank" style="font-family:"Times New Roman"">Castle Model Converter</a> and <a href="https://castle-engine.io/castle-model-viewer" target="_blank" style="font-family:"Times New Roman"">Castle Model Viewer</a>.</li></ul><a href="https://en.wikipedia.org/wiki/Unit_testing" target="_blank">Unit testing</a> performs low-level checks on specific software methods to demonstrate correct performance of expected behavior.<ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman""><a href="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/tests/org/web3d/x3d/tests/FieldObjectTests.java" target="_blank" style="font-family:"Times New Roman"">FieldObjectTests.java</a> provides hundreds of tests for each of the of SF/MF field methods and capabilities.</li></ul><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman"">This program is also useful for exploring how to correctly invoke a large variety of methods in the X3DJSAIL library.</li></ul></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"> <a href="https://www.web3d.org/specifications/java/X3DJSAIL.html#Examples" style="font-family:"Times New Roman";font-size:medium" target="_blank">Examples galore</a><span style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)">!</span><ul style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><li style="font-family:"Times New Roman"">Generation, compilation, and execution of thousands of example X3D models effectively provides a gigantic test suite for X3DJSAIL.</li></ul></blockquote><blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)" class="gmail_quote">Problems can be discussed on <a href="https://www.web3d.org/mailman/listinfo/x3d-public_web3d.org" target="_blank">x3d-public@web3d.org</a> mailing list (<a href="https://web3d.org/pipermail/x3d-public_web3d.org" target="_blank">archives</a>) and reported on <a href="https://sourceforge.net/p/x3d/tickets" target="_blank">SourceForge tickets list</a>.<br>Issue reports are considered carefully. Correction of reported problems often results in adding further checks within this valuable collection of tests.<br></blockquote><p style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><a id="m_6298069150924014273gmail-RoundTripTesting" style="font-family:"Times New Roman""></a></p><p style="font-family:"Times New Roman";font-size:medium;color:rgb(0,0,0)"><a id="m_6298069150924014273gmail-UnitTesting" style="font-family:"Times New Roman""></a></p></div></div><div>Special thanks to John Carlson for pointing out a serious internal flaw that might have permitted programmers to modify X3D constants and default values that are supposed to be immutable.  This problem has been fixed by applying Good Old-fashioned Object-Oriented Programming (GOOP) encapsulation techniques, only allowing such special values to be reached via accessor methods.  Much appreciated!</div><div><br></div><div><div><div><div><div>As ever, thanks to Web3D Consortium for sustained support of these open-source libraries under version control in SourceForge.  License information:</div></div></div><div><ul><li style="margin-left:15px">Web3D Consortium Open Source License</li><li style="margin-left:15px"><a href="https://www.web3d.org/x3d/content/examples/license.txt" target="_blank">https://www.web3d.org/x3d/content/examples/license.txt</a></li><li style="margin-left:15px"><a href="https://www.web3d.org/x3d/content/examples/license.html" target="_blank">https://www.web3d.org/x3d/content/examples/license.html</a></li><li style="margin-left:15px">X3D Resources: License Support</li><li style="margin-left:15px"><a href="https://www.web3d.org/x3d/content/examples/X3dResources.html#license" target="_blank">https://www.web3d.org/x3d/content/examples/X3dResources.html#license</a></li></ul><div>Membership in Web3D Consortium is not required to use any of this work.  Nevertheless membership has value, please consider <a href="https://www.web3d.org/membership/join" target="_blank">Joining Web3D Consortium</a>.</div></div><div><br></div><div><font face="arial, sans-serif" style="font-family:arial,sans-serif;color:rgb(0,0,0)">Have fun with X3d using X3DJSAIL Java!  </font>😀👍</div></div></div><div><br></div><div>all the best, Don</div></div>
_______________________________________________<br>
x3d-public mailing list<br>
<a href="mailto:x3d-public@web3d.org" target="_blank">x3d-public@web3d.org</a><br>
<a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org" rel="noreferrer" target="_blank">http://web3d.org/mailman/listinfo/x3d-public_web3d.org</a><br>
</blockquote></div></div>