/* * Copyright 2008-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.hasor.rsf.protocol.rsf.v1; /** * RSF 1.0 Request 二进制传输协议 * --------------------------------------------------------bytes =13 * byte[1] version RSF版本(0xC1 or 0x81) * byte[8] requestID 请求ID * byte[1] keepData 保留区 * byte[3] contentLength 内容大小(max ~ 16MB) * --------------------------------------------------------bytes =14 * byte[2] servicesName-(attr-index) 远程服务名 * byte[2] servicesGroup-(attr-index) 远程服务分组 * byte[2] servicesVersion-(attr-index) 远程服务版本 * byte[2] servicesMethod-(attr-index) 远程服务方法名 * byte[2] serializeType-(attr-index) 序列化策略 * byte[4] clientTimeout 远程客户端超时时间 * --------------------------------------------------------bytes =1 ~ 1021 * byte[1] paramCount 参数总数 * byte[4] ptype-0-(attr-index,attr-index) 参数类型1 * byte[4] ptype-1-(attr-index,attr-index) 参数类型2 * ... * --------------------------------------------------------bytes =1 ~ 1021 * byte[1] optionCount 选项参数总数 * byte[4] attr-0-(attr-index,attr-index) 选项参数1 * byte[4] attr-1-(attr-index,attr-index) 选项参数2 * ... * --------------------------------------------------------bytes =6 ~ 8192 * byte[2] attrPool-size (0~4095) 池大小 0x0FFF * byte[4] att-length 属性1大小 * byte[4] att-length 属性2大小 * ... * --------------------------------------------------------bytes =n * dataBody 数据内容 * bytes[...] * * @version : 2014年10月25日 * @author 赵永春(zyc@hasor.net) */ public class RequestBlock extends PoolBlock { private byte rsfHead = 0; //byte[1] RSF头 private long requestID = 0; //byte[8] 请求ID private short serviceName = 0; //byte[2] 远程服务名 private short serviceGroup = 0; //byte[2] 远程服务分组 private short serviceVersion = 0; //byte[2] 远程服务版本 private short targetMethod = 0; //byte[2] 远程服务方法名 private short serializeType = 0; //byte[2] 序列化策略 private int clientTimeout = 0; //byte[4] 远程客户端超时时间 private int[] paramData = {}; //(attr-index,attr-index) private int[] optionMap = {}; //(attr-index,attr-index) // public RequestBlock() { } // public byte getVersion() { return (byte) (this.rsfHead & 0x0F); } /**获取协议版本。*/ public byte getHead() { return this.rsfHead; } /**设置协议版本。*/ public void setHead(byte rsfHead) { this.rsfHead = rsfHead; } /**获取请求ID。*/ public long getRequestID() { return this.requestID; } /**设置请求ID。*/ public void setRequestID(long requestID) { this.requestID = requestID; } /**获取服务名*/ public short getServiceName() { return this.serviceName; } /**设置服务名*/ public void setServiceName(short serviceName) { this.serviceName = serviceName; } /**获取服务分组*/ public short getServiceGroup() { return this.serviceGroup; } /**设置服务分组*/ public void setServiceGroup(short serviceGroup) { this.serviceGroup = serviceGroup; } /**获取服务版本*/ public short getServiceVersion() { return this.serviceVersion; } /**设置服务版本*/ public void setServiceVersion(short serviceVersion) { this.serviceVersion = serviceVersion; } /**获取调用的方法名*/ public short getTargetMethod() { return this.targetMethod; } /**设置调用的方法名*/ public void setTargetMethod(short targetMethod) { this.targetMethod = targetMethod; } /**获取序列化类型*/ public short getSerializeType() { return this.serializeType; } /**设置序列化类型*/ public void setSerializeType(short serializeType) { this.serializeType = serializeType; } /**获取远程客户端调用超时时间。*/ public int getClientTimeout() { return this.clientTimeout; } /**设置远程客户端调用超时时间。*/ public void setClientTimeout(int clientTimeout) { this.clientTimeout = clientTimeout; } // /**添加请求参数。*/ public void addParameter(short paramType, short paramData) { int pType = paramType << 16; int pData = paramData; int mergeData = (pType | pData); this.addParameter(mergeData); } /**添加请求参数。*/ public void addParameter(int mergeData) { this.paramData = ArrayUtils.add(this.paramData, mergeData); } /**获取请求参数类型列表。*/ public short[] getParameterTypes() { short[] pTypes = new short[this.paramData.length]; for (int i = 0; i < this.paramData.length; i++) { int mergeData = this.paramData[i]; pTypes[i] = (short) (mergeData >>> 16); } return pTypes; } /**获取请求参数类型列表。*/ public short[] getParameterValues() { short[] pDatas = new short[this.paramData.length]; for (int i = 0; i < this.paramData.length; i++) { pDatas[i] = (short) (PoolMaxSize & this.paramData[i]); } return pDatas; } /**获取请求参数类型列表。*/ public int[] getParameters() { return this.paramData; } /**添加选项。*/ public void addOption(short paramType, short paramData) { int pType = paramType << 16; int pData = paramData; int mergeData = (pType | pData); this.addOption(mergeData); } /**添加选项。*/ public void addOption(int mergeData) { this.optionMap = ArrayUtils.add(this.optionMap, mergeData); } /**获取选项Key集合。*/ public short[] getOptionKeys() { short[] optKeys = new short[this.optionMap.length]; for (int i = 0; i < this.optionMap.length; i++) { int mergeData = this.optionMap[i]; optKeys[i] = (short) (mergeData >>> 16); } return optKeys; } /**获取选项数据*/ public short[] getOptionValues() { short[] optDatas = new short[this.optionMap.length]; for (int i = 0; i < this.optionMap.length; i++) { optDatas[i] = (short) (0x0000FFFF & this.optionMap[i]); } return optDatas; } /**获取Option。*/ public int[] getOptions() { return this.optionMap; } }