You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (JIRA)" <ji...@apache.org> on 2018/03/26 14:27:01 UTC
[jira] [Closed] (GROOVY-8485) PropertyHandler support producing
errors when supplied class loader is not in loader chain of
PropertyLoder.class
[ https://issues.apache.org/jira/browse/GROOVY-8485?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Eric Milles closed GROOVY-8485.
-------------------------------
Resolution: Not A Problem
> PropertyHandler support producing errors when supplied class loader is not in loader chain of PropertyLoder.class
> -----------------------------------------------------------------------------------------------------------------
>
> Key: GROOVY-8485
> URL: https://issues.apache.org/jira/browse/GROOVY-8485
> Project: Groovy
> Issue Type: Bug
> Reporter: Eric Milles
> Priority: Major
>
> I'm having a little trouble with the new PropertyHandler stuff that supports @Immutable. The error "The propertyHandler class 'groovy.transform.options.ImmutablePropertyHandler' on @MapConstructor is not a propertyHandler" is showing anywhere @Immutable is applied. I think the ClassLoader used to load PropertyHandler was different from the one passed as "loader" to the method below. And so the isAssignableFrom check fails. When I edit (see below) to use the same class loader used for PropertyHandler, the check and typecast succeed.
>
> {code:java}
> public static PropertyHandler createPropertyHandler(AbstractASTTransformation xform, GroovyClassLoader loader, ClassNode cNode) {
> List<AnnotationNode> annotations = cNode.getAnnotations(PROPERTY_OPTIONS_TYPE);
> AnnotationNode anno = annotations.isEmpty() ? null : annotations.get(0);
> if (anno == null) return new groovy.transform.options.DefaultPropertyHandler();
>
> ClassNode handlerClass = xform.getMemberClassValue(anno, "propertyHandler", ClassHelper.make(groovy.transform.options.DefaultPropertyHandler.class));
>
> if (handlerClass == null) {
> xform.addError("Couldn't determine propertyHandler class", anno);
> return null;
> }
>
> String className = handlerClass.getName();
> try {
> // GRECLIPSE edit
> //Object instance = loader.loadClass(className).newInstance();
> Object instance = PropertyHandler.class.getClassLoader().loadClass(className).newInstance();
> // GRECLIPSE end
> if (instance == null) {
> xform.addError("Can't load propertyHandler '" + className + "'", anno);
> return null;
> }
> if (!PropertyHandler.class.isAssignableFrom(instance.getClass())) {
> xform.addError("The propertyHandler class '" + handlerClass.getName() + "' on " + xform.getAnnotationName() + " is not a propertyHandler", anno);
> return null;
> }
>
> return (PropertyHandler) instance;
> } catch (Exception e) {
> xform.addError("Can't load propertyHandler '" + className + "' " + e, anno);
> return null;
> }
> }
> {code}
> Please note this is from within Eclipse IDE support. So the GroovyClassLoader has a different origin than the command-line tools provide.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)