<div dir="ltr">John, thanks for the excellent issue report.<div><br></div><div>Diagnosis: the problem is in how X3DJSAIL Layout.java setAlign() method is evaluating the string pair. Instead of pairwise comparison with quotes included, it is performing unquoted single-string comparisons to quoted string pairs. Those (apples versus oranges) don't match, so the error results. Autogenerated source-code excerpts:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div> /** MFString field named <i>align</i> with X3DUOM simpleType <i>layoutAlignChoices</i> and with X3DUOM baseType <i>MFString</i> is an array that can only include one set of the quoted enumeration values <i>"\"LEFT\" \"BOTTOM\""</i> (Java syntax) or <i>'"LEFT" "BOTTOM"'</i> (XML syntax).</div><div> * @see <a href="<a href="https://web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_layoutAlignChoices.html">https://web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_layoutAlignChoices.html</a>">XML Schema: layoutAlignChoices</a> */</div><div> public static final String ALIGN_LEFT_BOTTOM = "\"LEFT\" \"BOTTOM\"";</div></blockquote><div><br></div><div>then under setAlign() method, the erroneous test:</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div> if (!(</div><div> (newValue.length == 0) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_LEFT_BOTTOM) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_LEFT_CENTER) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_LEFT_TOP) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_CENTER_BOTTOM) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_CENTER_CENTER) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_CENTER_TOP) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_RIGHT_BOTTOM) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_RIGHT_CENTER) ||</div><div> newValue[i].toString().replace("\"","").equals(ALIGN_RIGHT_TOP)))</div></blockquote><div><br></div><div>Note that this is a little trickier than usual because Layout node only allows certain paired combinations:</div><div><ul><li>X3D 4.0 Architecture, clause 36 Layout component, 36.4.1 Layout</li><li><a href="https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/layout.html#Layout">https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/layout.html#Layout</a></li><li><pre class="gmail-node" style="color:rgb(0,0,0);font-size:11.05px;margin-left:25px">Layout : X3DLayoutNode {
MFString [in,out] align ["CENTER","CENTER"] ["LEFT"|"CENTER"|"RIGHT"],["BOTTOM"|"CENTER"|"TOP"] </pre></li><li><pre class="gmail-node" style="color:rgb(0,0,0);font-size:11.05px;margin-left:25px"><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">The values of the </span><i style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">align</i><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">, </span><i style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">offset</i><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">, and </span><i style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">offsetUnits</i><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> fields are used to determine the location of the layout region. First, the </span><i style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">align</i><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> field values align the sized rectangle to an edge or center of the parent rectangle. Then, the offset is applied using the units specified in the </span><i style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">offsetUnits</i><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> field. The first value of the </span><i style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">align</i><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> field corresponds to the horizontal alignment. The value </span><span class="gmail-code" style="font-size:14.3px;white-space:normal">"LEFT"</span><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> specifies that the left side of this rectangle shall be aligned with the left side of the parent rectangle. The value </span><span class="gmail-code" style="font-size:14.3px;white-space:normal">"RIGHT"</span><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> specifies that the right side of this rectangle shall be aligned with the right side of the parent rectangle. The value </span><span class="gmail-code" style="font-size:14.3px;white-space:normal">"CENTER"</span><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> specifies that this rectangle shall be horizontally centred in its parent. Similarly, the second </span><i style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">align</i><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> field value aligns the vertical position of the rectangle to either the </span><span class="gmail-code" style="font-size:14.3px;white-space:normal">"TOP"</span><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal">, </span><span class="gmail-code" style="font-size:14.3px;white-space:normal">"BOTTOM"</span><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> or </span><span class="gmail-code" style="font-size:14.3px;white-space:normal">"CENTER"</span><span style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px;white-space:normal"> of the parent rectangle.</span>
</pre></li></ul></div><div><br></div><div>I'll have to work out a better code pattern for this special test. Will work on it.</div><div><br></div><div>For ongoing QA unit testing, am adding the following to the smoke-test Hello World Program:</div><div><br></div><div> Layout layout = new Layout();<br> layout.setAlign(new MFString("\"LEFT\",\"BOTTOM\"")); // or<br> layout.setAlign(new java.lang.String[] {"LEFT","BOTTOM"});<br> System.out.println("layout.getAlign=" + layout.getAlignString());<br> <br> // TODO simpler MFString constructor that accepts an arbitrary-length series of String values</div><div><br></div><div>all the best, Don</div><div><br></div></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, Jun 24, 2025 at 4:49 AM John Carlson 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:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Forgot X3D-Edit QA. But even that is a bit strange.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jun 24, 2025 at 6:31 AM John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank">yottzumm@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr">Three strange exceptions. They compile, but throw warnings when run.</div><div dir="ltr"><br></div><div dir="ltr">Java code is attached.</div><div dir="ltr"><br></div><div dir="ltr">Apologies for not researching this more.</div><div dir="ltr"><br></div><div dir="ltr">Note that this is my own X3DJSAIL, so one's results may be different.<br><div><br></div><div><div><br></div><div>javac -proc:full -J-Xss1g -J-Xmx4g bumpyfreewrljsonverse.java</div><div>javac -proc:full -J-Xss1g -J-Xmx4g bumpyfreewrlsliders.java</div><div>javac -proc:full -J-Xss1g -J-Xmx4g bumpyx_itesliders.java</div><div><br></div><div>java -Xss1g -Xmx4g net/coderextreme/data/bumpyfreewrljsonverse</div><div>[warning] Layout align newValue='[LEFT, BOTTOM]' includes an unrecognized optional value newValue[0]=LEFT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div>Exception in thread "main" org.web3d.x3d.sai.InvalidFieldValueException: [warning] Layout align newValue='[LEFT, BOTTOM]' includes an unrecognized optional value newValue[0]=LEFT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:737)</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:766)</div><div> at net.coderextreme.data.bumpyfreewrljsonverse.initialize(bumpyfreewrljsonverse.java:330)</div><div> at net.coderextreme.data.bumpyfreewrljsonverse.getRootNodeList(bumpyfreewrljsonverse.java:55)</div><div> at net.coderextreme.data.bumpyfreewrljsonverse.main(bumpyfreewrljsonverse.java:48)</div><div><br></div><div><br></div><div><br></div><div>java -Xss1g -Xmx4g net/coderextreme/data/bumpyfreewrlsliders</div><div>[warning] Layout align newValue='[RIGHT, BOTTOM]' includes an unrecognized optional value newValue[0]=RIGHT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div>Exception in thread "main" org.web3d.x3d.sai.InvalidFieldValueException: [warning] Layout align newValue='[RIGHT, BOTTOM]' includes an unrecognized optional value newValue[0]=RIGHT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:737)</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:766)</div><div> at net.coderextreme.data.bumpyfreewrlsliders.initialize(bumpyfreewrlsliders.java:345)</div><div> at net.coderextreme.data.bumpyfreewrlsliders.getRootNodeList(bumpyfreewrlsliders.java:55)</div><div> at net.coderextreme.data.bumpyfreewrlsliders.main(bumpyfreewrlsliders.java:48)</div><div><br></div><div><br></div><div>java -Xss1g -Xmx4g net/coderextreme/data/bumpyx_itesliders</div><div>[warning] Layout align newValue='[RIGHT, BOTTOM]' includes an unrecognized optional value newValue[0]=RIGHT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div>Exception in thread "main" org.web3d.x3d.sai.InvalidFieldValueException: [warning] Layout align newValue='[RIGHT, BOTTOM]' includes an unrecognized optional value newValue[0]=RIGHT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:737)</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:766)</div><div> at net.coderextreme.data.bumpyx_itesliders.initialize(bumpyx_itesliders.java:346)</div><div> at net.coderextreme.data.bumpyx_itesliders.getRootNodeList(bumpyx_itesliders.java:55)</div><div> at net.coderextreme.data.bumpyx_itesliders.main(bumpyx_itesliders.java:48)</div><div>~/X3DJSONLD/src/main/shell</div></div><div>====================================================================</div><div>Results from X3ToJava.xslt (not included).</div><div><br></div><div><div>$ grep -l DISEntity net/coderextreme/data/bumpy*java | xargs javac</div><div>(venv)</div><div>jcarl@JustHumans MINGW64 ~/X3DJSONLD/src/main/java (master)</div><div>$ for i in `grep -l Align net/x3djsonld/data/*java`; do javac $i; export CL=`dirname "$i"|sed 's/\//./g'`/`basename "$i" .java`; echo $CL; java -cp "C:/Users/jcarl/X3DJSONLD/X3DJSAIL.4.0.full.jar;." "$CL"; done</div><div>net.x3djsonld.data/bumpyfreewrljsonverse</div><div>Build this X3D model, showing validation diagnostics...</div><div>[warning] Layout align newValue='[LEFT, BOTTOM]' includes an unrecognized optional value newValue[0]=LEFT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div>*** Further hints on X3DJSAIL errors and exceptions at</div><div>*** <a href="https://www.web3d.org/specifications/java/X3DJSAIL.html" target="_blank">https://www.web3d.org/specifications/java/X3DJSAIL.html</a></div><div>Exception in thread "main" org.web3d.x3d.sai.InvalidFieldValueException: [warning] Layout align newValue='[LEFT, BOTTOM]' includes an unrecognized optional value newValue[0]=LEFT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:737)</div><div> at net.x3djsonld.data.bumpyfreewrljsonverse.initialize(bumpyfreewrljsonverse.java:327)</div><div> at net.x3djsonld.data.bumpyfreewrljsonverse.<init>(bumpyfreewrljsonverse.java:136)</div><div> at net.x3djsonld.data.bumpyfreewrljsonverse.main(bumpyfreewrljsonverse.java:506)</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>net.x3djsonld.data/bumpyfreewrlsliders</div><div>Build this X3D model, showing validation diagnostics...</div><div>[warning] Layout align newValue='[RIGHT, BOTTOM]' includes an unrecognized optional value newValue[0]=RIGHT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div>*** Further hints on X3DJSAIL errors and exceptions at</div><div>*** <a href="https://www.web3d.org/specifications/java/X3DJSAIL.html" target="_blank">https://www.web3d.org/specifications/java/X3DJSAIL.html</a></div><div>Exception in thread "main" org.web3d.x3d.sai.InvalidFieldValueException: [warning] Layout align newValue='[RIGHT, BOTTOM]' includes an unrecognized optional value newValue[0]=RIGHT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:737)</div><div> at net.x3djsonld.data.bumpyfreewrlsliders.initialize(bumpyfreewrlsliders.java:267)</div><div> at net.x3djsonld.data.bumpyfreewrlsliders.<init>(bumpyfreewrlsliders.java:134)</div><div> at net.x3djsonld.data.bumpyfreewrlsliders.main(bumpyfreewrlsliders.java:476)</div><div><br></div><div><br></div><div><br></div><div><br></div><div>net.x3djsonld.data/bumpyx_itesliders</div><div>Build this X3D model, showing validation diagnostics...</div><div>[warning] Layout align newValue='[RIGHT, BOTTOM]' includes an unrecognized optional value newValue[0]=RIGHT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div>*** Further hints on X3DJSAIL errors and exceptions at</div><div>*** <a href="https://www.web3d.org/specifications/java/X3DJSAIL.html" target="_blank">https://www.web3d.org/specifications/java/X3DJSAIL.html</a></div><div>Exception in thread "main" org.web3d.x3d.sai.InvalidFieldValueException: [warning] Layout align newValue='[RIGHT, BOTTOM]' includes an unrecognized optional value newValue[0]=RIGHT not matching any of the required enumeration string tokens.</div><div> Supported values are "LEFT" "BOTTOM", "LEFT" "CENTER", "LEFT" "TOP", "CENTER" "BOTTOM", "CENTER" "CENTER", "CENTER" "TOP", "RIGHT" "BOTTOM", "RIGHT" "CENTER", "RIGHT" "TOP"</div><div> at org.web3d.x3d.jsail.Layout.Layout.setAlign(Layout.java:737)</div><div> at net.x3djsonld.data.bumpyx_itesliders.initialize(bumpyx_itesliders.java:270)</div><div> at net.x3djsonld.data.bumpyx_itesliders.<init>(bumpyx_itesliders.java:134)</div><div> at net.x3djsonld.data.bumpyx_itesliders.main(bumpyx_itesliders.java:479)</div></div><div><br></div><div><br></div></div></div></div>
</blockquote></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>