package org.rzo.netty.ahessian.rpc.message; import java.util.Map; import org.jboss.netty.channel.Channel; import org.rzo.netty.ahessian.Constants; import org.rzo.netty.ahessian.io.OutputStreamEncoder; import org.rzo.netty.ahessian.session.ServerSessionFilter; /** * message used for requesting a remote invocation */ public class HessianRPCCallMessage implements Constants, GroupedMessage { /** The _method. */ String _method; /** The _args. */ Object[] _args; /** The _headers. */ Map<Object, Object> _headers; transient OutputStreamEncoder _outputStreamEncoder; boolean _hasSessionFilter = false; transient boolean _isServer = false; /** * Gets the headers. * * @return the headers */ public Map<Object, Object> getHeaders() { return _headers; } /** * Instantiates a new hessian rpc call message. * * @param method the method * @param args the args * @param headers the headers */ public HessianRPCCallMessage(String method, Object[] args, Map<Object, Object> headers, OutputStreamEncoder outputStreamEncoder) { _method = method; _args = args; _headers = headers; _outputStreamEncoder = outputStreamEncoder; } /** * Gets the method. * * @return the method */ public String getMethod() { return _method; } /** * Gets the args. * * @return the args */ public Object[] getArgs() { return _args; } public String toString() { StringBuffer sb = new StringBuffer(); sb.append("HessianRPCCallMessage"); if (_headers != null && _headers.get(CALL_ID_HEADER_KEY) != null) { sb.append('#'); sb.append(_headers.get(CALL_ID_HEADER_KEY)); } sb.append('['); sb.append(_method); sb.append('('); if (_args != null) for (int i=0; i<_args.length; i++) { sb.append(_args[i].toString()); if (i != _args.length-1) sb.append(','); } sb.append(")]"); return sb.toString(); } public boolean isValid() { boolean result = false; if (!_hasSessionFilter || !_isServer) result = (_outputStreamEncoder != null && _outputStreamEncoder.getBuffer() != null && _outputStreamEncoder.getBuffer().getContext() != null && _outputStreamEncoder.getBuffer().getContext().getChannel().isConnected()); else if (_outputStreamEncoder != null && _outputStreamEncoder.getBuffer() != null && _outputStreamEncoder.getBuffer().getContext() != null) { ServerSessionFilter session = ServerSessionFilter.getServerSessionFilter(_outputStreamEncoder.getBuffer().getContext()); result = session == null || session.isValid(); } return result; } public Channel getChannel() { if (_outputStreamEncoder != null && _outputStreamEncoder.getBuffer() != null && _outputStreamEncoder.getBuffer().getContext() != null) return _outputStreamEncoder.getBuffer().getContext().getChannel(); return null; } public void setHasSessionFilter(boolean hasSessionFilter) { _hasSessionFilter = hasSessionFilter; _headers.put(HAS_SESSION_FILTER_HEADER_KEY, _hasSessionFilter); } public void setServer(boolean isServer) { _isServer = isServer; } public Integer getGroup() { if (_headers == null || _headers.get(GROUP_HEADER_KEY) == null) return 0; return (Integer) _headers.get(GROUP_HEADER_KEY); } }