package io.muoncore.protocol.requestresponse.server;
import io.muoncore.codec.Codecs;
import io.muoncore.codec.CodecsSource;
import io.muoncore.descriptors.SchemaDescriptor;
import java.util.*;
public interface RequestResponseServerHandlerApi extends
RequestResponseHandlersSource, CodecsSource {
/**
* RPC handler API. Each incoming request will be passed to the handler instance for it
* to reply to.
* <p>
* The predicate is used to match requests.
*/
default void handleRequest(
final HandlerPredicate predicate,
final Handler handler) {
getRequestResponseHandlers().addHandler(new RequestResponseServerHandler() {
@Override
public HandlerPredicate getPredicate() {
return predicate;
}
@Override
public void handle(RequestWrapper request) {
handler.handle(request);
}
@Override
public Map<String, SchemaDescriptor> getDescriptors() {
System.out.println("EMPTY DESCRIPTORS FOR " + getPredicate().resourceString());
return Collections.emptyMap();
}
});
}
default HandlerBuilder handleRequest(HandlerPredicate predicate) {
return HandlerBuilder.buildHandler(getCodecs(), getRequestResponseHandlers(), predicate);
}
interface Handler {
void handle(RequestWrapper wrapper);
}
class HandlerBuilder {
private Codecs codecs;
private RequestResponseHandlers handlers;
private HandlerPredicate predicate;
private Handler thehandler;
private List<Class> requestTypes = new ArrayList<>();
private List<Class> responseTypes = new ArrayList<>();
public static HandlerBuilder buildHandler(Codecs codecs, RequestResponseHandlers handlers, HandlerPredicate predicate) {
HandlerBuilder handlerBuilder = new HandlerBuilder();
handlerBuilder.codecs = codecs;
handlerBuilder.handlers = handlers;
handlerBuilder.predicate = predicate;
return handlerBuilder;
}
public HandlerBuilder addRequestType(Class type) {
requestTypes.add(type);
return this;
}
public HandlerBuilder addResponseType(Class type) {
responseTypes.add(type);
return this;
}
public HandlerBuilder handler(Handler handler) {
this.thehandler = handler;
return this;
}
public void build() {
handlers.addHandler(new RequestResponseServerHandler() {
@Override
public HandlerPredicate getPredicate() {
return predicate;
}
@Override
public void handle(RequestWrapper request) {
//TODO, use the schemas?
thehandler.handle(request);
}
@Override
public Map<String, SchemaDescriptor> getDescriptors() {
Map<String, SchemaDescriptor> schemas = new HashMap<>();
for (int i = 0; i < requestTypes.size(); i++) {
String schemaName = "Request-" + requestTypes.get(i).getSimpleName();
codecs.getSchemaFor(requestTypes.get(i)).ifPresent(schemaInfo -> {
schemas.put(schemaName, new SchemaDescriptor(schemaName, schemaInfo.getSchemaText(), schemaInfo.getSchemaType()));
});
}
for (int i = 0; i < requestTypes.size(); i++) {
String schemaName = "Response-" + responseTypes.get(i).getSimpleName();
codecs.getSchemaFor(responseTypes.get(i)).ifPresent(schemaInfo -> {
schemas.put(schemaName, new SchemaDescriptor(schemaName, schemaInfo.getSchemaText(), schemaInfo.getSchemaType()));
});
}
return schemas;
}
});
}
}
}