package com.cwa.protobuf;
import com.cwa.gamecore.action.IAction;
import com.cwa.gamecore.session.GameSession;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.protobuf.MessageLite;
import org.apache.log4j.Logger;
/**
* IAction实现。将逻辑转发给ProtobufAction。
*/
public class ProtobufGameAction implements IAction<ProtobufGameMessage> {
private static Logger logger = Logger.getLogger(ProtobufGameAction.class);
@Override
public void execute(GameSession session, ProtobufGameMessage req) {
MessageLite pbReq = req.getMessage();
if (logger.isDebugEnabled()) {
logger.debug("Protobuf request: ");
logger.debug(toJSON(pbReq));
}
ProtobufGameSession pbSession = new ProtobufGameSession(req.msgId, session);
if (logger.isDebugEnabled()) {
logger.debug("Role ID: ##### " + pbSession.safeGetRoleId() + " #####");
}
ProtobufAction pbAction = ProtobufSupport.getAction(req.msgId);
MessageLite pbResp = pbAction.execute(pbSession, pbReq);
if (logger.isDebugEnabled()) {
logger.debug("Protobuf response: ");
logger.debug(toJSON(pbResp));
}
ProtobufGameMessage resp = new ProtobufGameMessage();
resp.setMessage(pbResp);
session.write(resp);
}
// TODO optimize
private String toJSON(Object obj) {
Gson gson = new GsonBuilder()
.setExclusionStrategies(MyExclusionStrategy)
.setPrettyPrinting()
.create();
return gson.toJson(obj);
}
private static ExclusionStrategy MyExclusionStrategy = new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
if (! f.getName().endsWith("_")) {
return true;
}
if (f.getName().startsWith("bitField")) {
return true;
}
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
};
}