Skip to content

Commit

Permalink
Merge pull request #24859 from avpinchuk/repeatable-restrict-to-annot…
Browse files Browse the repository at this point in the history
…ation

Make `@RestrictTo` annotation repeatable
  • Loading branch information
avpinchuk committed Mar 15, 2024
2 parents 5292f99 + 38ed41e commit fc6506e
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 4 deletions.
Expand Up @@ -18,6 +18,7 @@
package org.glassfish.api.event;

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
Expand All @@ -35,7 +36,15 @@
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(RestrictTo.List.class)
public @interface RestrictTo {

String value();

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@interface List {

RestrictTo[] value();
}
}
Expand Up @@ -86,10 +86,18 @@ public void send(final Event<?> event, boolean asynchronously) {
continue;
}

RestrictTo restrictTo = eventMethod.getParameters()[0].getAnnotation(RestrictTo.class);
if (restrictTo != null) {
EventTypes<?> interested = EventTypes.create(restrictTo.value());
if (!event.is(interested)) {
RestrictTo[] restrictTo = eventMethod.getParameters()[0].getAnnotationsByType(RestrictTo.class);
if (restrictTo.length > 0) {
boolean isInterested = false;
for (RestrictTo restrict : restrictTo) {
EventTypes<?> interestedEvent = EventTypes.create(restrict.value());
if (event.is(interestedEvent)) {
isInterested = true;
break;
}
}

if (!isInterested) {
continue;
}
}
Expand Down
Expand Up @@ -34,10 +34,14 @@
import static org.glassfish.api.event.EventTypes.PREPARE_SHUTDOWN;
import static org.glassfish.api.event.EventTypes.PREPARE_SHUTDOWN_NAME;
import static org.glassfish.api.event.EventTypes.SERVER_READY;
import static org.glassfish.api.event.EventTypes.SERVER_READY_NAME;
import static org.glassfish.api.event.EventTypes.SERVER_SHUTDOWN;
import static org.glassfish.api.event.EventTypes.SERVER_SHUTDOWN_NAME;
import static org.glassfish.api.event.EventTypes.SERVER_STARTUP;
import static org.glassfish.api.event.EventTypes.SERVER_STARTUP_NAME;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertSame;
Expand Down Expand Up @@ -77,6 +81,85 @@ public void event(@RestrictTo(PREPARE_SHUTDOWN_NAME) Event<?> event) {
events.unregister(listener);
}

@Test
public void repeatableRestrictedEventListenerTest() {
Events events = serviceLocator.getService(Events.class);

List<EventTypes<?>> eventTypes = new ArrayList<>();

// Do not replace with lambda because annotations will be lost
EventListener listener = new EventListener() {

@Override
public void event(@RestrictTo(SERVER_STARTUP_NAME) @RestrictTo(SERVER_SHUTDOWN_NAME) Event<?> event) {
eventTypes.add(event.type());
}
};

events.register(listener);

events.send(new Event<>(SERVER_STARTUP), false);
events.send(new Event<>(SERVER_READY), false);
events.send(new Event<>(PREPARE_SHUTDOWN), false);
events.send(new Event<>(SERVER_SHUTDOWN), false);

assertAll(
() -> assertThat(eventTypes, hasSize(2)),
() -> assertThat(eventTypes, contains(SERVER_STARTUP, SERVER_SHUTDOWN))
);

events.unregister(listener);
}

@Test
public void nonMatchingEventListenerTest() {
Events events = serviceLocator.getService(Events.class);

List<EventTypes<?>> eventTypes = new ArrayList<>();

// Do not replace with lambda because annotation will be lost
EventListener listener = new EventListener() {

@Override
public void event(@RestrictTo(SERVER_STARTUP_NAME) Event<?> event) {
eventTypes.add(event.type());
}
};

events.register(listener);

events.send(new Event<>(SERVER_SHUTDOWN), false);

assertThat(eventTypes, empty());

events.unregister(listener);
}

@Test
public void nonMatchingRepeatableEventListenerTest() {
Events events = serviceLocator.getService(Events.class);

List<EventTypes<?>> eventTypes = new ArrayList<>();

// Do not replace with lambda because annotations will be lost
EventListener listener = new EventListener() {

@Override
public void event(@RestrictTo(SERVER_READY_NAME) @RestrictTo(PREPARE_SHUTDOWN_NAME) Event<?> event) {
eventTypes.add(event.type());
}
};

events.register(listener);

events.send(new Event<>(SERVER_STARTUP), false);
events.send(new Event<>(SERVER_SHUTDOWN), false);

assertThat(eventTypes, empty());

events.unregister(listener);
}

@Test
public void unrestrictedEventListenerTest() {
Events events = serviceLocator.getService(Events.class);
Expand Down

0 comments on commit fc6506e

Please sign in to comment.