Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Rolleander committed Oct 9, 2023
1 parent 1dbfedd commit 4b1aba5
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 25 deletions.
43 changes: 24 additions & 19 deletions src/main/java/com/broll/networklib/network/AnnotationScanner.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.broll.networklib.network;

import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.commons.lang3.tuple.Pair;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
Expand All @@ -12,9 +10,6 @@
import java.util.List;
import java.util.stream.Collectors;

import dorkbox.annotation.AnnotationDefaults;
import dorkbox.annotation.AnnotationDetector;

public final class AnnotationScanner {

private AnnotationScanner() {
Expand All @@ -33,21 +28,31 @@ public static <A extends Annotation> List<Pair<Field, A>> findAnnotatedFields(Ob
}

public static List<Method> findAnnotatedMethods(Object object, Class<? extends Annotation> annotation) {
return Arrays.stream(object.getClass().getMethods())
.filter(m -> m.getAnnotation(annotation) != null)
.collect(Collectors.toList());
List<Method> resolvedMethods = new ArrayList<>();
Class<?> clazz = object.getClass();
while(!clazz.getName().equals("java.lang.Object")){
List<Method> annotatedMethods = Arrays.stream(clazz.getDeclaredMethods())
.filter(m -> m.getAnnotation(annotation) != null)
.collect(Collectors.toList());
annotatedMethods.forEach(it-> addUniqueMethods(resolvedMethods,it));
clazz= clazz.getSuperclass();
}
return resolvedMethods;
}

public static List<?> initAnnotatedClasses(Class<? extends Annotation> annotation) throws IOException {
List<Class<?>> clazzes = AnnotationDetector.scanClassPath().forAnnotations(annotation).collect(AnnotationDefaults.getType);
return clazzes.stream().map(clazz -> {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList());
private static void addUniqueMethods(List<Method> methods, Method method){
if(methods.stream().noneMatch(it->isSameSignature(it, method))) {
methods.add(method);
}
}

private static boolean isSameSignature(Method methodA, Method methodB) {
if (methodA == null)
return false;
if (methodB == null)
return false;
List<Class<?>> parameterTypesA = Arrays.asList(methodA.getParameterTypes());
List<Class<?>> parameterTypesB = Arrays.asList(methodB.getParameterTypes());
return methodA.getName().equals(methodB.getName()) && parameterTypesA.containsAll(parameterTypesB);
}
}
10 changes: 9 additions & 1 deletion src/main/java/com/broll/networklib/server/LobbyGameServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,15 @@ public LobbyGameServer(String name, IRegisterNetwork registerNetwork) {
this(new GameServer(registerNetwork), name);
}

public LobbyGameServer(String name, LobbySite<L,P> lobbySite, IRegisterNetwork registerNetwork) {
this(new GameServer(registerNetwork), name, lobbySite);
}

public LobbyGameServer(GameServer server, String name) {
this(server,name,new LobbySite<>());
}

public LobbyGameServer(GameServer server, String name, LobbySite<L,P> lobbySite) {
this.server = server;
PlayerRegister playerRegister = new PlayerRegister();
connectionSite = new ConnectionSite(name, playerRegister);
Expand All @@ -49,7 +57,7 @@ public void kickedPlayer(Player<P> player) {
}, playerRegister, sitesHandler, listeners);
server.setSitesHandler(sitesHandler);
register(connectionSite);
register(new LobbySite());
register(lobbySite);
}

public void addListener(ILobbyServerListener<L, P> listener) {
Expand Down
19 changes: 15 additions & 4 deletions src/main/java/com/broll/networklib/server/impl/LobbySite.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,22 @@ public class LobbySite<L extends ILobbyData, P extends ILobbyData> extends Lobby

@PackageReceiver
@ConnectionRestriction(RestrictionType.IN_LOBBY)
public void receive(NT_ChatMessage chatMessage) {
//forward message to all other players in the lobby
private void receive(NT_ChatMessage chatMessage) {
chat(chatMessage);
}

protected void chat(NT_ChatMessage chatMessage){
chatMessage.from = getPlayer().getName();
getLobby().getActivePlayers().stream().filter(p -> p != getPlayer()).forEach(p -> p.sendTCP(chatMessage));
}

@PackageReceiver
@ConnectionRestriction(RestrictionType.LOBBY_UNLOCKED)
public void receive(NT_LobbyKick kick) {
private void receive(NT_LobbyKick kick) {
kick(kick);
}

protected void kick(NT_LobbyKick kick){
ServerLobby<L, P> lobby = getLobby();
if (lobby.getOwner() == getPlayer() ) {
Player<P> playerToKick = lobby.getPlayer(kick.player);
Expand All @@ -32,7 +39,11 @@ public void receive(NT_LobbyKick kick) {

@PackageReceiver
@ConnectionRestriction(RestrictionType.LOBBY_UNLOCKED)
public void leave(NT_LobbyLeave nt) {
private void receive(NT_LobbyLeave nt) {
leave(nt);
}

protected void leave(NT_LobbyLeave leave){
ServerLobby<L, P> lobby = getLobby();
lobby.getLobbyHandler().removePlayer(lobby, getPlayer());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,17 @@ public void setUnknownMessageReceiver(IUnknownMessageReceiver unknownMessageRece

public void clear() {
siteModificationLock.writeLock().lock();
new ArrayList(sites.values()).stream().filter(site -> !INTERNAL_SITES.contains(site.getClass())).forEach(site -> {
new ArrayList(sites.values()).stream().filter(this::isRemovableSite).forEach(site -> {
sites.remove(site.getClass());
removeSite((T) site);
});
siteModificationLock.writeLock().unlock();
}

private boolean isRemovableSite(Object site){
return INTERNAL_SITES.stream().noneMatch(it-> it.isInstance(site));
}

public final void add(T site) {
siteModificationLock.writeLock().lock();
putSite(site);
Expand Down
60 changes: 60 additions & 0 deletions src/test/java/com/broll/networklib/test/ScannerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.broll.networklib.test;

import com.broll.networklib.PackageReceiver;
import com.broll.networklib.network.AnnotationScanner;

import org.junit.Assert;
import org.junit.Test;

import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;

public class ScannerTest {

@Test
public void scansMethodsCorrectly(){
Assert.assertArrayEquals(new String[]{"com.broll.networklib.test.ScannerTest$A:test"},
scanPackageReceivers(new A()));
Assert.assertArrayEquals(new String[]{"com.broll.networklib.test.ScannerTest$B:test",
"com.broll.networklib.test.ScannerTest$B:test2"},
scanPackageReceivers(new B()));
Assert.assertArrayEquals(new String[]{"com.broll.networklib.test.ScannerTest$C:test2",
"com.broll.networklib.test.ScannerTest$A:test"},
scanPackageReceivers(new C()));
}

private String[] scanPackageReceivers(Object o){
return AnnotationScanner.findAnnotatedMethods(o, PackageReceiver.class).stream().map(m->
m.getDeclaringClass().getName()+":"+ m.getName()).toArray(String[]::new);
}

public static class A{

@PackageReceiver
void test(){

}
}

public static class B extends A{
@PackageReceiver
void test(){
super.test();
}
@PackageReceiver
void test2(){

}

}
public static class C extends A{

@PackageReceiver
void test2(){

}

}
}

0 comments on commit 4b1aba5

Please sign in to comment.