package com.weibo.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.weibo.api.motan.registry.support.command.RpcCommand;
import com.weibo.api.motan.registry.support.command.RpcCommandUtil;
import com.weibo.api.motan.util.LoggerUtil;
import com.weibo.dao.OperationRecordMapper;
import com.weibo.model.OperationRecord;
import com.weibo.service.CommandService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
public abstract class AbstractCommandService implements CommandService {
@Autowired(required = false)
private OperationRecordMapper recordMapper;
/**
* 向指定group添加指令
*
* @param group
* @param command
* @return
*/
@Override
public boolean addCommand(String group, RpcCommand.ClientCommand command) {
LoggerUtil.info(String.format("add command: group=%s, command=%s: ", group, JSON.toJSONString(command)));
RpcCommand remoteCommand = RpcCommandUtil.stringToCommand(getCommands(group));
if (remoteCommand == null) {
remoteCommand = new RpcCommand();
}
List<RpcCommand.ClientCommand> clientCommandList = remoteCommand.getClientCommandList();
if (clientCommandList == null) {
clientCommandList = new ArrayList<RpcCommand.ClientCommand>();
}
// 该方法只在流量切换界面被调用,此时指令序号默认是0
int index = getRpcCommandMaxIndex(remoteCommand);
command.setIndex(index + 1);
clientCommandList.add(command);
remoteCommand.setClientCommandList(clientCommandList);
return setCommand(group, remoteCommand);
}
/**
* 更新指定group的某条指令
*
* @param command
* @param group
* @return
*/
@Override
public boolean updateCommand(String group, RpcCommand.ClientCommand command) {
LoggerUtil.info(String.format("update command: group=%s, command=%s: ", group, JSON.toJSONString(command)));
RpcCommand remoteCommand = RpcCommandUtil.stringToCommand(getCommands(group));
if (remoteCommand == null) {
LoggerUtil.info("update failed, command not found");
return false;
}
List<RpcCommand.ClientCommand> clientCommandList = remoteCommand.getClientCommandList();
if (clientCommandList == null) {
LoggerUtil.info("update failed, command not found");
return false;
}
boolean found = false;
for (RpcCommand.ClientCommand cmd : clientCommandList) {
if (cmd.getIndex().equals(command.getIndex())) {
clientCommandList.remove(cmd);
clientCommandList.add(command);
found = true;
break;
}
}
if (!found) {
LoggerUtil.info("update failed, command not found");
return false;
}
remoteCommand.setClientCommandList(clientCommandList);
return setCommand(group, remoteCommand);
}
/**
* 删除指定group的某条指令
*
* @param group
* @param index
* @return
*/
@Override
public boolean deleteCommand(String group, int index) {
LoggerUtil.info(String.format("delete command: group=%s, index=%d: ", group, index));
RpcCommand remoteCommand = RpcCommandUtil.stringToCommand(getCommands(group));
if (remoteCommand == null) {
LoggerUtil.info("delete failed, command not found");
return false;
}
List<RpcCommand.ClientCommand> clientCommandList = remoteCommand.getClientCommandList();
if (clientCommandList == null) {
LoggerUtil.info("delete failed, command not found");
return false;
}
boolean found = false;
for (RpcCommand.ClientCommand cmd : clientCommandList) {
if (cmd.getIndex() == index) {
clientCommandList.remove(cmd);
found = true;
break;
}
}
if (!found) {
LoggerUtil.info("delete failed, command not found");
return false;
}
remoteCommand.setClientCommandList(clientCommandList);
return setCommand(group, remoteCommand);
}
/**
* 获取指令集中最大的指令序号
*
* @param rpcCommand
* @return
*/
@Override
public int getRpcCommandMaxIndex(RpcCommand rpcCommand) {
return 0;
}
/**
* 预览指令
*
* @param group
* @param clientCommand
* @param previewIP
* @return
*/
@Override
public List<JSONObject> previewCommand(String group, RpcCommand.ClientCommand clientCommand, String previewIP) {
return null;
}
/**
* 根据group和clientCommand生成指令
*
* @param group
* @param clientCommand
* @return
*/
@Override
public RpcCommand buildCommand(String group, RpcCommand.ClientCommand clientCommand) {
RpcCommand rpcCommand = new RpcCommand();
List<RpcCommand.ClientCommand> commandList = new ArrayList<RpcCommand.ClientCommand>();
commandList.add(clientCommand);
rpcCommand.setClientCommandList(commandList);
return rpcCommand;
}
/**
* 获取指令操作记录
*
* @return
*/
@Override
public List<OperationRecord> getAllRecord() {
List<OperationRecord> records;
if (recordMapper != null) {
records = recordMapper.selectAll();
} else {
return null;
}
return records;
}
}