polygene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Niclas Hedhman (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (POLYGENE-306) Dynamic Method Annotations at bootstrap
Date Thu, 26 Apr 2018 09:34:00 GMT

    [ https://issues.apache.org/jira/browse/POLYGENE-306?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16453754#comment-16453754
] 

Niclas Hedhman edited comment on POLYGENE-306 at 4/26/18 9:33 AM:
------------------------------------------------------------------

A complete example of what I would like to be able to do, which is the ability to add an annotation
that controls the invocation of Concerns.

 
{code:java}
public class DynamicAnnotationTest extends AbstractPolygeneTest
{
    @Override
    public void assemble( ModuleAssembly module )
        throws AssemblyException
    {
        module.services( Map.class )
              .withMixins( HashMap.class )
              .withConcerns( DisabledMethodConcern.class );
        module.forMixin( HashMap.class )
              .annotations( annotation( Disabled.class ) )
              .put( null, null );
    }

    @Test
    void test1()
        throws Exception
    {
        Map underTest = serviceFinder.findService( Map.class ).get();
        assertThrows( DisabledMethodException.class, () -> underTest.put( "1", "2" ) );
    }

    @Target( ElementType.METHOD )
    @Retention( RetentionPolicy.RUNTIME )
    public @interface Disabled
    {
    }

    @AppliesTo( Disabled.class )
    public static class DisabledMethodConcern extends ConcernOf<InvocationHandler>
        implements InvocationHandler
    {

        @Override
        public Object invoke( Object o, Method method, Object[] objects )
            throws Throwable
        {
            throw new DisabledMethodException();
        }
    }

    public static class DisabledMethodException extends RuntimeException
    {
    }
}
{code}


was (Author: niclas):
A complete example of what I would like to be able to do;

 
{code:java}
public class DynamicAnnotationTest extends AbstractPolygeneTest
{
    @Override
    public void assemble( ModuleAssembly module )
        throws AssemblyException
    {
        module.services( Map.class ).withMixins( HashMap.class );
        module.forMixin( HashMap.class )
              .annotations( annotation( Disabled.class ) )
              .put( null, null );
    }

    @Test
    void test1()
        throws Exception
    {
        Map underTest = serviceFinder.findService( Map.class ).get();
        assertThrows( DisabledMethodException.class, () -> underTest.put( "1", "2" ) );
    }

    @Target( ElementType.METHOD )
    @Retention( RetentionPolicy.RUNTIME )
    public @interface Disabled
    {
    }

    @AppliesTo( Disabled.class )
    public static class DisabledMethodConcern extends ConcernOf<InvocationHandler>
        implements InvocationHandler
    {

        @Override
        public Object invoke( Object o, Method method, Object[] objects )
            throws Throwable
        {
            throw new DisabledMethodException();
        }
    }

    public static class DisabledMethodException extends RuntimeException
    {
    }
}
{code}

> Dynamic Method Annotations at bootstrap
> ---------------------------------------
>
>                 Key: POLYGENE-306
>                 URL: https://issues.apache.org/jira/browse/POLYGENE-306
>             Project: Polygene
>          Issue Type: New Feature
>            Reporter: Niclas Hedhman
>            Priority: Major
>
> Currently we can manipulate types pretty much freely at bootstrap, but we can't add annotations
to methods, which would be useful for instance when working with external types not under
one's control.
> This will need to add metaInfo to Property and add the annotation there, rather than
trying to compile it into the method itself.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message