[ http://issues.apache.org/jira/browse/XMLBEANS-111?page=all ]
     
Radu Preotiuc-Pietro resolved XMLBEANS-111:
-------------------------------------------

     Resolution: Fixed
    Fix Version: Version 2 Beta 2
                 Version 2
                     (was: TBD)

I have actually found a way to fix it in the 95% case without affecting 
performance, so I was able to check it in.


> Upper case conversion of special characters causes javac error
> --------------------------------------------------------------
>
>          Key: XMLBEANS-111
>          URL: http://issues.apache.org/jira/browse/XMLBEANS-111
>      Project: XMLBeans
>         Type: Bug
>   Components: Compiler
>  Environment: Tested with UTF-8 encoding
>     Reporter: Anne Marie Simmie
>     Assignee: Radu Preotiuc-Pietro
>     Priority: Minor
>      Fix For: Version 2 Beta 2, Version 2
>  Attachments: XMLBEANS-111.patch
>
> When a character has no Unicode upper case equivalent, and it is mapped to 
> upper case by NameUtil.java, the conversion returns an invalid character.  
> This causes the compilation of the generated classes to fail.  A sample xsd 
> that causes the error, the javac output, and diff of a suggested fix follow.
> Thanks - excellent program - saves tons of time over doing it the 
> old-fashioned way!
> ----------------------------------------------
> Sample XSD that causes the error:
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema 
>       elementFormDefault="qualified" 
>       attributeFormDefault="unqualified" 
>       xmlns:xs="http://www.w3.org/2001/XMLSchema";>
>               <xs:element name="Unit" type="unit_list"/>
>               <xs:simpleType name="unit_list">
>               <xs:restriction base="xs:string">
>                       <xs:enumeration value="g/dl"/>
>                       <xs:enumeration value="µg/dl"/>
>                       <xs:enumeration value="µg/L"/>
>                       <xs:enumeration value="g/ml"/>
>                       <xs:enumeration value="pg/µL"/>
>                       <xs:enumeration value="No unit"/>
>               </xs:restriction>
>       </xs:simpleType>
> </xs:schema>
> -------------------------------------------------
> Here's the error from javac after scomp:
> C:\>scomp -out test.jar test.xsd
> Time to build schema type system: 0.781 seconds
> Time to generate code: 0.081 seconds
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:24: <identifier> 
> expected
>     static final Enum ?G_DL = Enum.forString("&#9569;g/dl");
>                       ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:24: = expected
>     static final Enum ?G_DL = Enum.forString("&#9569;g/dl");
>                                                      ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:25: <identifier> 
> expected
>     static final Enum ?G_L = Enum.forString("&#9569;g/L");
>                       ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:25: = expected
>     static final Enum ?G_L = Enum.forString("&#9569;g/L");
>                                                    ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:27: = expected
>     static final Enum PG_?_L = Enum.forString("pg/&#9569;L");
>                          ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:31: = expected
>     static final int INT_?G_DL = Enum.INT_?G_DL;
>                          ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:32: = expected
>     static final int INT_?G_L = Enum.INT_?G_L;
>                          ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:34: = expected
>     static final int INT_PG_?_L = Enum.INT_PG_?_L;
>                             ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:69: ';' expected
>         static final int INT_?G_DL = 2;
>                              ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:70: ';' expected
>         static final int INT_?G_L = 3;
>                              ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:72: ';' expected
>         static final int INT_PG_?_L = 5;
>                                 ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:81: : expected
>                 new Enum("&#9569;g/dl", INT_?G_DL),
>                                            ^
> C:\..\Temp\xbean16323.d\src\noNamespace\UnitList.java:86: illegal start of 
> expression
>             }
>             ^
> 13 errors
> BUILD FAILED
> -----------------------------------------------------------
> On my own copy of the XMLBeans source I've fixed the problem by altering 
> NameUtil.java to check for a successful conversion to upper case, and replace 
> any offending characters with underscores.  In case it would be useful here's 
> a diff of the changes:
> C:\WebsphereStuff\xmlbeans\source\trunk\src\common\org\apache\xmlbeans\impl\comm
> on>svn diff
> Index: NameUtil.java
> ===================================================================
> --- NameUtil.java       (revision 154882)
> +++ NameUtil.java       (working copy)
> @@ -555,9 +555,8 @@
>          for(int j = 0 ; j < len ; j++)
>          {
>              char c = buf.charAt(j);
> -            buf.setCharAt(j, Character.toUpperCase(c));
> -        }
> -
> +           buf.setCharAt(j, safeToUpperCase(c));
> +       }
>          return buf.toString();
>      }
> @@ -638,7 +637,7 @@
>              return s;
>          StringBuffer buf = new StringBuffer(s);
> -        buf.setCharAt(0, Character.toUpperCase(buf.charAt(0)));
> +        buf.setCharAt(0, safeToUpperCase(buf.charAt(0)));
>          return buf.toString();
>      }
> @@ -776,4 +775,17 @@
>      {
>          return javaNames.contains(word);
>      }
> +
> +    public static char safeToUpperCase(char c) {
> +       Character upperCaseC = new Character(Character.toUpperCase(c));
> +       Character lowerCaseC = new 
> Character(Character.toLowerCase(upperCaseC.charValue()));
> +       if(!lowerCaseC.equals(new Character(c)))
> +           //if we cannot get back to the lower case, then the character has 
> no upper case form
> +           //replace with underscore
> +           {
> +               upperCaseC = new Character(USCORE);
> +           }
> +       return upperCaseC.charValue();
> +    }
> +
>  }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to