Details
-
Type:
Bug
-
Status:
Open
-
Priority:
Major
-
Resolution: Unresolved
-
Affects Version/s: 1.6.5
-
Fix Version/s: None
-
Component/s: None
-
Labels:None
-
Number of attachments :
Description
I'm not sure if there any constraint with the name parameter before passing to GroovyCodeSource but it is raising an exception if the name includes "-" sign :
GroovyCodeSource gcs = new GroovyCodeSource(inputStream, "file-name.gtmpl", "/groovy/shell");
Here is the exception :
Caused by: java.lang.ClassFormatError: Illegal class name "File-name" in class file File-name
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at groovy.lang.GroovyClassLoader.access$200(GroovyClassLoader.java:54)
at groovy.lang.GroovyClassLoader$ClassCollector.createClass(GroovyClassLoader.java:482)
at groovy.lang.GroovyClassLoader$ClassCollector.onClassNode(GroovyClassLoader.java:499)
at groovy.lang.GroovyClassLoader$ClassCollector.call(GroovyClassLoader.java:503)
at org.codehaus.groovy.control.CompilationUnit$10.call(CompilationUnit.java:728)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:925)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:462)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:278)
It seems that the name parameter is used for createing Class in Java, so it must be a binary name as defined by the Java Language Specification. If so, the name would be validated and converted to good one ? Or I must to take care of that myself before using GroovyCodeSource ?
Yes, the name that you pass to GroovyCodeSource is used to come up with the class name of the script class that you parse using that GroovyCodeSource.
The behavior reported (class loader rejecting such classes with invalid names with ClassFormatError) seems to be JVM specific.
I am on Windows XP with following Java 1.5.0_04 and for me the class loading does not fail.
Should we validate the class names and reject the invalid ones?