java mina FundTradeProtocolEncoder

来源:互联网 发布:java错误无法加载主类 编辑:程序博客网 时间:2024/06/05 10:16
package com.pingan.emall.biz.communication.handler;


import com.paic.pafa.app.biz.service.BusinessServiceException;
import com.pingan.emall.dto.MidRequestDTO;
import com.pingan.emall.util.fund.BlowFish;
import com.pingan.emall.util.fund.CRCHelper;
import com.pingan.emall.util.fund.FundTradeConstants;
import java.nio.ByteOrder;
import java.nio.charset.Charset;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;


/**
 *  证券MID通讯请求编码器, 接收MidRequestDTO对象请求, 根据MidRequestDTO 中的functionId生成
 *  对应的MID请求报文, 创建IoBuffer将MID请求报文以字节流的格式发送出去。
 * 
 * @author LICHAO844
 * 
 */
public class FundTradeProtocolEncoder implements ProtocolEncoder {


private Charset charset;
private static final Logger LOG = Logger.getLogger(FundTradeProtocolEncoder.class);
private static final String SOH = "|";

public FundTradeProtocolEncoder(Charset charset) {
this.charset = charset == null ? Charset.defaultCharset() : charset;
}

@Override
public void encode(IoSession session, Object obj,
ProtocolEncoderOutput out) throws Exception {
if (obj instanceof MidRequestDTO) {
MidRequestDTO request = (MidRequestDTO) obj;
String functionId = request.getFunctionId();
if (StringUtils.isEmpty(functionId)) {
throw new BusinessServiceException("FunctionId not set for mid request");
}

String requestPackage = "";
if (FundTradeConstants.FUNCTION_SIGN_IN.equals(functionId)) {
requestPackage = request.getPackage();
} else {
String decWorksKey = request.getHeader().getCrc();
if (StringUtils.isEmpty(decWorksKey)) {
throw new BusinessServiceException("Workskey not set for mid request");
}


if (!FundTradeConstants.FUNCTION_NEXT_PACKAGE.equals(functionId)) {
for (int i = 0; i < request.getBodyParams().size(); i++) {
String param = request.getBodyParams().get(i);
String[] temp = StringUtils.split(param, SOH);
if (temp.length == 2 && "1".equals(temp[1])) {
// 密码加密
param = BlowFish.encrypt(StringUtils.rightPad(temp[0], 8, ' '),decWorksKey.getBytes(charset));
request.getBodyParams().set(i, param);
}
}
}

String data = request.getPackage();
request.getHeader().setCrc(CRCHelper.crcCode(data, charset));
requestPackage = request.getPackage();
}


send(out, requestPackage.getBytes(charset));

if (LOG.isInfoEnabled()) {
String markedLog = FundTradeLogger.getMarkedOutLog(functionId, requestPackage, session);
LOG.info(markedLog);
}
}
}


@Override
public void dispose(IoSession iosession) throws Exception {
}


private void send(ProtocolEncoderOutput out, byte[] bytes) {
IoBuffer buffer = IoBuffer.allocate(bytes.length).setAutoExpand(true);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.put(bytes);
buffer.flip();
out.write(buffer);
}
}
0 0
原创粉丝点击