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.
>
>
>

Reply via email to