package com.github.ltsopensource.cmd;
import com.github.ltsopensource.core.commons.utils.Assert;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author Robert HG (254963746@qq.com) on 2/17/16.
*/
public class HttpCmdContext {
private ReentrantLock lock = new ReentrantLock();
private final Map<String/*节点标识*/, Map<String/*cmd*/, HttpCmdProc>>
NODE_PROCESSOR_MAP = new HashMap<String, Map<String, HttpCmdProc>>();
public void addCmdProcessor(HttpCmdProc proc) {
if (proc == null) {
throw new IllegalArgumentException("proc can not be null");
}
String identity = proc.nodeIdentity();
Assert.hasText(identity, "nodeIdentity can't be empty");
String command = proc.getCommand();
Assert.hasText(command, "command can't be empty");
Map<String, HttpCmdProc> cmdProcessorMap = NODE_PROCESSOR_MAP.get(identity);
if (cmdProcessorMap == null) {
lock.lock();
cmdProcessorMap = NODE_PROCESSOR_MAP.get(identity);
if (cmdProcessorMap == null) {
cmdProcessorMap = new ConcurrentHashMap<String, HttpCmdProc>();
NODE_PROCESSOR_MAP.put(identity, cmdProcessorMap);
}
lock.unlock();
}
cmdProcessorMap.put(command, proc);
}
public HttpCmdProc getCmdProcessor(String nodeIdentity, String command) {
Assert.hasText(nodeIdentity, "nodeIdentity can't be empty");
Map<String, HttpCmdProc> cmdProcessorMap = NODE_PROCESSOR_MAP.get(nodeIdentity);
if (cmdProcessorMap == null) {
return null;
}
return cmdProcessorMap.get(command);
}
}