But, you can declare the values "property" to be of type MyEnum[]. Is what
we're really looking for here the ability to extend an enum (if that even
makes sense)? I've often thought it would be nice if I could add stuff to
an enum from the outside. But, that kind of goes against the idea of an
enum, doesn't it?
On Thu, Dec 4, 2008 at 11:51 PM, Bruno Borges <[EMAIL PROTECTED]>wrote:
> Well... you can't do this:
>
> @Foo(values={MyEnum.FOO, MyEnum.BAR});
>
> @interface Foo {
> Object[] values() default {};
>
> }
>
> James Carman wrote:
>
>> What do you mean by "Enums as Objects"?
>>
>> On Thu, Dec 4, 2008 at 11:11 PM, Bruno Borges <[EMAIL PROTECTED]
>> >wrote:
>>
>>
>>
>>> Well... You don't have to create one java file for each class. You can
>>> put
>>> all of them on the same file, like:
>>>
>>> public final class MyAppRoles {
>>> private MyAppRoles() {}
>>> public static final class Admin extends Role {
>>> private Admin() {}
>>> }
>>>
>>> public static final class User extends Role {
>>> private User() {}
>>> }
>>> }
>>>
>>> Note that this is really type-safe, and these classes will never be
>>> instantiated.
>>> But, I'm not defending that we should change that. I'm just showing a
>>> possibility. :-)
>>>
>>> I really did't understand why Sun decided to reject Enums as Objects in
>>> this context of annotations.
>>>
>>> cheers,
>>> Bruno
>>>
>>> James Carman wrote:
>>>
>>>
>>>
>>>> I don't know about this. It would work (and break existing code, unless
>>>> you
>>>> use something other than value for the annotation). I don't know if I
>>>> would
>>>> want to have to create a new class for each role in my project. Yes, it
>>>> would be a small price to pay, but it just feels wrong.
>>>>
>>>> On Thu, Dec 4, 2008 at 10:33 PM, Bruno Borges <[EMAIL PROTECTED]
>>>>
>>>>
>>>>> wrote:
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>>> I've found a way to implement a type-safe check for this. Here it goes:
>>>>>
>>>>> import java.lang.annotation.Documented;
>>>>> import java.lang.annotation.ElementType;
>>>>> import java.lang.annotation.Inherited;
>>>>> import java.lang.annotation.Retention;
>>>>> import java.lang.annotation.RetentionPolicy;
>>>>> import java.lang.annotation.Target;
>>>>>
>>>>> @AuthorizeInstantiation(value = { User.class, Admin.class })
>>>>> public class EnumAnnotation {
>>>>>
>>>>> }
>>>>>
>>>>> @Retention(RetentionPolicy.RUNTIME)
>>>>> @Target( { ElementType.PACKAGE, ElementType.TYPE })
>>>>> @Documented
>>>>> @Inherited
>>>>> @interface AuthorizeInstantiation {
>>>>>
>>>>> Class<? extends Role>[] value() default {};
>>>>>
>>>>> }
>>>>>
>>>>> class Role {
>>>>> }
>>>>>
>>>>> class User extends Role {
>>>>> }
>>>>>
>>>>> class Admin extends Role {
>>>>> }
>>>>>
>>>>> So, the only thing that must change is the annotation
>>>>> @AuthorizeInstantiation, to accept classes that extends roles.
>>>>>
>>>>> Thoughts anyone?
>>>>>
>>>>> cheers,
>>>>> Bruno
>>>>>
>>>>>
>>>>>
>>>>> Bruno Borges wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> You simply can't do that because the nature of Annotations.
>>>>>>
>>>>>> Even if AuthorizeInstantiation's values were of type Object[] you
>>>>>> wouldn't
>>>>>> be able to do that with Enums.
>>>>>>
>>>>>> You will have to use Strings.
>>>>>>
>>>>>> Although there's some hack you can make using Java 6 to accomplish
>>>>>> what
>>>>>> you want. If you are interested, take a look at this link:
>>>>>>
>>>>>> http://www.iam.unibe.ch/~akuhn/blog/2008/roman-numerals-in-your-java/<http://www.iam.unibe.ch/%7Eakuhn/blog/2008/roman-numerals-in-your-java/>
>>>>>> <
>>>>>> http://www.iam.unibe.ch/%7Eakuhn/blog/2008/roman-numerals-in-your-java/
>>>>>> >
>>>>>> <
>>>>>>
>>>>>> http://www.iam.unibe.ch/%7Eakuhn/blog/2008/roman-numerals-in-your-java/
>>>>>> Good luck!!
>>>>>>
>>>>>> Cheers,
>>>>>> Bruno
>>>>>>
>>>>>> miro wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> I am using this @AuthorizeInstantiation (wicket authetication
>>>>>>> annotation)
>>>>>>> in my pages , the code for this annotation
>>>>>>>
>>>>>>> @Retention(RetentionPolicy.RUNTIME)
>>>>>>> @Target( { ElementType.PACKAGE, ElementType.TYPE })
>>>>>>> @Documented
>>>>>>> @Inherited
>>>>>>> public @interface AuthorizeInstantiation {
>>>>>>>
>>>>>>> /**
>>>>>>> * Gets the roles that are allowed to take the action.
>>>>>>> * * @return the roles that are allowed. Returns a zero length
>>>>>>> array by
>>>>>>> default
>>>>>>> */
>>>>>>> String[] value() default {};
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> I created my enum with representing authorities
>>>>>>>
>>>>>>> public enum Authorities {
>>>>>>> LIASION_OFFICER,
>>>>>>> GRANTS_OFFICER,
>>>>>>> PROGRAM_ANALYST,
>>>>>>> ADMIN;
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> I am trying to use AuthorizeInstantiation in my page here an
>>>>>>> example
>>>>>>> @AuthorizeInstantiation(value={Authorities.LIASION_OFFICER.name()})
>>>>>>> public class HomePage extends BasePage {
>>>>>>>
>>>>>>>
>>>>>>> this line does not compile, I get the error
>>>>>>> The value of annotation attribute AuthorizeInstantiation .value must
>>>>>>> be
>>>>>>> a
>>>>>>> constant expression .please help me resolve this .
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>>
>>>>>>
>>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>>> For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>>>
>>>
>>
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>