<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">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:1px solid rgb(204,204,204);padding-left:1ex"><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li><i style="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">Layout.align</a> (<a href="https://www.web3d.org/x3d/content/X3dTooltips.html#Layout.align" target="_blank">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">NavigationInfo.type</a> (<a href="https://www.web3d.org/x3d/content/X3dTooltips.html#NavigationInfo.type" target="_blank">tooltip</a>).</li></ul><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li><span style="color:darkgreen"><i>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">hasDuplicateValues()</a> and <a href="https://www.web3d.org/specifications/java/javadoc/org/web3d/x3d/jsail/fields/MFString.html#removeDuplicateValues()" target="_blank">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">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">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">https://www.web3d.org/specifications/java/X3DJSAIL.html#Testing</a></li></ul><div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" 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="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li><a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgram.java" target="_blank">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">build.test.X3DJSAIL.txt</a>.</li></ul><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li>Program-generated outputs include <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.x3d" target="_blank">X3D model</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.x3dv" target="_blank">ClassicVRML model</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.wrl" target="_blank">VRML97 model</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.json" target="_blank">JSON encoding</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.java" target="_blank">Java source</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.py" target="_blank">Python source</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutputX3dom.xhtml" target="_blank">X3DOM scene page</a>, <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutputX_ITE.html" target="_blank">X_ITE scene page</a></li></ul><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li>A <a href="https://www.web3d.org/specifications/java/examples/images/HelloWorldProgramOutput.png" target="_blank">screenshot image</a> and <a href="https://www.web3d.org/specifications/java/examples/images/HelloWorldProgramOutput.mp4" target="_blank">movie</a> were produced during early versions of program outputs.</li></ul><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li>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">SmokeTestProgramOutput.java</a></li></ul><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li>Stylesheet-generated <a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.html" target="_blank">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="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li><a href="https://www.web3d.org/specifications/java/examples/SmokeTestProgramOutput.java" target="_blank">SmokeTestProgramOutput.java</a> shows full round-trip conversion from original .java, to .x3d export, to .java source-code serialization.</li></ul><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li>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">X3D.toFileJava(filename)</a>, and the <a href="https://www.web3d.org/specifications/java/lib/stylesheets/X3dToJava.xslt" target="_blank">X3dToJava.xslt</a> stylesheets.</li></ul><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li>Export of ClassicVRML <code>.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">X3D.toFileClassicVRML(filename)</a> are subsequently checked for correct syntax using the <a href="https://castle-engine.io/castle-model-converter" target="_blank">Castle Model Converter</a> and <a href="https://castle-engine.io/castle-model-viewer" target="_blank">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="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li><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">FieldObjectTests.java</a> provides hundreds of tests for each of the of SF/MF field methods and capabilities.</li></ul><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li>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:1px solid rgb(204,204,204);padding-left:1ex"> <a href="https://www.web3d.org/specifications/java/X3DJSAIL.html#Examples" style="font-family:"Times New Roman";font-size:medium">Examples galore</a><span style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium">!</span><ul style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><li>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:1px solid rgb(204,204,204);padding-left:1ex" 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="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><a id="gmail-RoundTripTesting"></a></p><p style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium"><a id="gmail-UnitTesting"></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">Joining Web3D Consortium</a>.</div></div><div><br></div><div><font color="#000000" face="arial, sans-serif">Have fun with X3d using X3DJSAIL Java!  </font>😀👍</div></div></div><div><br></div><div>all the best, Don</div></div>