Okay. In fact, I don't understand which this code works in Java but not in Groovy (even if naming a variable with a class name, not in camel case, is weird ...).
I made this test class to illustrate this : package com.sylob.cochise.test; import groovy.lang.Binding; import groovy.lang.GroovyShell; public class TestMyWeirdScript { public static class MyClass { private final String code; public MyClass(String code) { super(); this.code = code; } @Override public String toString() { return this.code; } } public static String SCRIPT_SRC = "import com.sylob.cochise.test.TestMyWeirdScript.MyClass;\r\n" + "MyClass instance = MyClass;\r\n" + "\r\n" + "System.out.println(instance);"; public static void main(String[] args) { MyClass instance = new MyClass("code"); // throws : org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object // 'class com.sylob.cochise.test.TestMyWeirdScript$MyClass' with class 'java.lang.Class' to // class 'com.sylob.cochise.test.TestMyWeirdScript$MyClass' TestMyWeirdScript.execGroovy(instance); // Compilation & exec OK TestMyWeirdScript.execJava(instance); } public static void execGroovy(MyClass instance) { Binding binding = new Binding(); binding.setVariable("MyClass", instance); new GroovyShell(binding).evaluate(TestMyWeirdScript.SCRIPT_SRC); } public static void execJava(MyClass MyClass) { MyClass instance = MyClass; System.out.println(instance); } } Definitly no solution to handle this case, without refactoring existing scripts ? Cheers, Mickael. ________________________________ From: Paul King <pa...@asert.com.au> Sent: Tuesday, February 25, 2020 11:57 To: users@groovy.apache.org <users@groovy.apache.org> Subject: Re: please help : GroovyCastException: why ? It is still a bit hard to let you know the best way to proceed from just the sample you have shown without more context. If I had a class Article and an instance Article (I am assuming from the binding), then I would either: * use an alias for the class, i.e.: import Article as MyArticle // then use MyArticle everywhere (in that script) where you want the class but you'd still need to be careful, some things won't work; or * just reserve the Article binding variable name for the binding only, e.g.: def article = binding.variables.get('Article') // at start of script // ... use article instance through script ... binding.variables.put('Article', article) // at end of script Cheers, Paul. On Tue, Feb 25, 2020 at 8:37 PM Mickaël SALMON <m...@sylob.com<mailto:m...@sylob.com>> wrote: User scripts were coded Beanshell, I try to migrate to Groovy ... ________________________________ From: Alessio Stalla <alessiosta...@gmail.com<mailto:alessiosta...@gmail.com>> Sent: Tuesday, February 25, 2020 11:16 To: users@groovy.apache.org<mailto:users@groovy.apache.org> <users@groovy.apache.org<mailto:users@groovy.apache.org>> Subject: Re: please help : GroovyCastException: why ? If the user scripts are already existing, which version of Groovy were they targeting? I've seen this behavior (of treating identifiers starting with an uppercase letter as potential class names) for my entire life as a Groovy developer, which started several years ago. On Tue, 25 Feb 2020 at 10:19, Mickaël SALMON <m...@sylob.com<mailto:m...@sylob.com>> wrote: Unfortunatly yes, that's what I need to do, passing an Article instance into a variable named "Article", not "article" like it should be ... Because of existing user scripts which must continue to work without refactoring. How can I deal with it ? ________________________________ From: MG <mg...@arscreat.com<mailto:mg...@arscreat.com>> Sent: Monday, February 24, 2020 23:30 To: users@groovy.apache.org<mailto:users@groovy.apache.org> <users@groovy.apache.org<mailto:users@groovy.apache.org>>; Mickaël SALMON <m...@sylob.com<mailto:m...@sylob.com>> Subject: Re: please help : GroovyCastException: why ? Article articleTmp = (Article) Article; in Groovy is the same as Article articleTmp = (Article) Article.getClass(); in Java. Article.getClass() is of type Class<Article>, so casting it to Article will fail - what you want to do ist pass an Article instance, not the class, I presume... hth, mg On 24/02/2020 18:24, Mickaël SALMON wrote: Hello, I'm using last Groovy version (3.0.1) in my Java application to run user defined scripts (Java based). Here is how a script is executed (sorry for the formatting) : public Object eval(String scriptName, String script, Map<String, Object> mapVariable) throws CochiseException { groovy.lang.Script groovyScript = this.scriptCache.get(scriptName); if (groovyScript == null) { groovyScript = new GroovyShell().parse(script); this.scriptCache.put(scriptName, groovyScript); } groovyScript.setBinding(new Binding(mapVariable)); return groovyScript.run(); } I have the following exception when I pass the object "Article" of class "com.sylob.cochise.dm1.ejb.entite.article.Article" in the Map of variables : org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'interface com.sylob.cochise.dm1.ejb.entite.article.Article' with class 'java.lang.Class' to class 'com.sylob.cochise.dm1.ejb.entite.article.Article' Here is the script : import com.sylob.cochise.dm1.ejb.entite.article.Article; println "CL import Article : " + Article.class.getClassLoader() println "CL var Article: " + Article.getClass().getClassLoader() Article articleTmp = (Article) Article; // ... some stuff This not seem to be a classLoader problem, because same class loader is used to load both com.sylob.cochise.dm1.ejb.entite.article.Article class in the script and "Article" object in the calling application. Also tested with 2.5.9, same error. What's wrong here ? Thanks.