-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRequestHandler.java
More file actions
96 lines (88 loc) · 3.39 KB
/
RequestHandler.java
File metadata and controls
96 lines (88 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.github.redreaperlp.socketapi.communication.handler;
import com.github.redreaperlp.socketapi.communication.request.Request;
import com.github.redreaperlp.socketapi.communication.request.special.RequestPromising;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class RequestHandler {
Map<Class<? extends Request>, List<IRequestHandler>> handlers = new HashMap<>();
Map<Class<? extends RequestPromising>, List<IPromisingRequestHandler>> promisingHandlers = new HashMap<>();
/**
* Registers a handler for a request
*
* @param clazz The request class
* @param handler The handler
* @apiNote This handler will be called when the request arrives
*/
public void registerHandler(Class<? extends Request> clazz, IReqHandler handler) {
if (handler instanceof IRequestHandler reqHandler) {
if (handlers.containsKey(clazz)) {
handlers.get(clazz).add(reqHandler);
return;
}
List<IRequestHandler> list = new ArrayList<>();
list.add(reqHandler);
handlers.put(clazz, list);
} else if (handler instanceof IPromisingRequestHandler reqHandler) {
if (clazz.getSuperclass().equals(RequestPromising.class)) {
registerPromisingHandler((Class<? extends RequestPromising>) clazz, reqHandler);
}
}
}
/**
* Registers a handler for a promising request
*
* @param clazz The request class
* @param handler The handler
* @apiNote This handler will be called when the request arrives
*/
public void registerPromisingHandler(Class<? extends RequestPromising> clazz, IPromisingRequestHandler handler) {
if (promisingHandlers.containsKey(clazz)) {
promisingHandlers.get(clazz).add(handler);
return;
}
List<IPromisingRequestHandler> list = new ArrayList<>();
list.add(handler);
promisingHandlers.put(clazz, list);
}
/**
* Unregisters a handler for a request
*
* @param clazz The request class
* @param handler The handler
*/
public void unregisterHandler(Class<? extends Request> clazz, IRequestHandler handler) {
if (handlers.containsKey(clazz)) {
handlers.get(clazz).remove(handler);
}
}
/**
* Unregisters a handler for a promising request
*
* @param clazz The request class
* @param handler The handler
*/
public void unregisterPromisingHandler(Class<? extends RequestPromising> clazz, IPromisingRequestHandler handler) {
if (promisingHandlers.containsKey(clazz)) {
promisingHandlers.get(clazz).remove(handler);
}
}
/**
* Handles a request
*
* @param request The request to handle
* @param data The data to handle
*/
public void handleRequest(Request request, JSONObject data) {
if (handlers.containsKey(request.getClass())) {
handlers.get(request.getClass()).forEach(h -> h.handleRequest(request, data));
}
if (request instanceof RequestPromising promising) {
if (promisingHandlers.containsKey(request.getClass())) {
promisingHandlers.get(request.getClass()).forEach(h -> h.handleRequest(promising, data));
}
}
}
}