package edu.uw.zookeeper.server;
import java.util.Map;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import edu.uw.zookeeper.common.Processor;
import edu.uw.zookeeper.protocol.FourLetterRequest;
import edu.uw.zookeeper.protocol.FourLetterWord;
import edu.uw.zookeeper.protocol.FourLetterResponse;
public class FourLetterRequestProcessor implements Processor<FourLetterRequest, FourLetterResponse> {
public static FourLetterRequestProcessor create(Object...args) {
ImmutableMap.Builder<FourLetterWord, Processor<FourLetterRequest, FourLetterResponse>> builder = ImmutableMap.builder();
for (FourLetterWord word: FourLetterWord.values()) {
try {
builder.put(word, FourLetterCommands.create(word, args));
} catch (Exception e) {
throw new AssertionError(e);
}
}
return new FourLetterRequestProcessor(builder.build());
}
private final Map<FourLetterWord, Processor<FourLetterRequest, FourLetterResponse>> commands;
protected FourLetterRequestProcessor(Map<FourLetterWord, Processor<FourLetterRequest, FourLetterResponse>> commands) {
this.commands = commands;
}
@Override
public FourLetterResponse apply(FourLetterRequest request) {
Processor<FourLetterRequest, FourLetterResponse> command = commands.get(request.first());
if (command == null) {
throw new UnsupportedOperationException(String.valueOf(request));
}
try {
return command.apply(request);
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
}