/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.eas.server.mina.platypus;
import com.eas.client.threetier.Request;
import com.eas.client.threetier.platypus.PlatypusRequestReader;
import com.eas.client.threetier.platypus.RequestEnvelope;
import com.eas.client.threetier.platypus.RequestsTags;
import com.eas.proto.CoreTags;
import com.eas.proto.ProtoReader;
import com.eas.proto.ProtoUtil;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
/**
*
* @author pk
*/
public class RequestDecoder extends CumulativeProtocolDecoder {
public RequestDecoder() {
super();
}
@Override
protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
String ticket = null;
String userName = null;
String password = null;
int tag;
int start = in.position();
do {
if (in.remaining() < 5) {
in.position(start);
return false;
}
tag = in.get() & 0xff;
int tagSize = in.getInt();
if (in.remaining() < tagSize) {
in.position(start);
return false;
}
if (tag == CoreTags.TAG_SESSION_TICKET) {
byte[] ticketBuf = new byte[tagSize];
in.get(ticketBuf);
ticket = new String(ticketBuf, ProtoUtil.CHARSET_4_STRING_SERIALIZATION_NAME);
}else if (tag == CoreTags.TAG_USER_NAME) {
byte[] userNameBuf = new byte[tagSize];
in.get(userNameBuf);
userName = new String(userNameBuf, ProtoUtil.CHARSET_4_STRING_SERIALIZATION_NAME);
}else if (tag == CoreTags.TAG_PASSWORD) {
byte[] passwordBuf = new byte[tagSize];
in.get(passwordBuf);
password = new String(passwordBuf, ProtoUtil.CHARSET_4_STRING_SERIALIZATION_NAME);
} else {
in.skip(tagSize);
}
} while (tag != RequestsTags.TAG_REQUEST_END);
int position = in.position();
int limit = in.limit();
try {
in.position(start);
in.limit(position);
ProtoReader requestReader = new ProtoReader(in.slice().asInputStream());
Request request = PlatypusRequestReader.read(requestReader);
out.write(new RequestEnvelope(request, userName, password, ticket, null));
return true;
} finally {
in.position(position);
in.limit(limit);
}
}
}