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> wrote: > User scripts were coded Beanshell, I try to migrate to Groovy ... > ------------------------------ > *From:* Alessio Stalla <alessiosta...@gmail.com> > *Sent:* Tuesday, February 25, 2020 11:16 > *To:* users@groovy.apache.org <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> 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> > *Sent:* Monday, February 24, 2020 23:30 > *To:* users@groovy.apache.org <users@groovy.apache.org>; Mickaël SALMON < > 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. > > >