📄 message.java
字号:
package com.tseg.ocs.data;
import java.util.*;
import diameter.MessageHeader;
import diameter.AVP;
import java.lang.Iterable;
import java.util.Iterator;
public class Message
{
public enum decode_status
{
decoded,
not_enough,
garbage
};
public MessageHeader hdr;//消息头
private ArrayList avp;//消息中所包含的avp列表
//下面依次定义两个内部类Subset和AVPIterator
//用于获得指定code及vendor_id的avp的字节
private class Subset implements Iterable
{
Message msg;
int code;
int vendor_id;
final Message this$0;
Subset(Message message1, int i, int j)
{
super();
this$0 = Message.this;
msg = message1;
code = i;
vendor_id = j;
}
public Iterator iterator()
{
return msg.iterator(code, vendor_id);
}
}//end of inner class Subset
private class AVPIterator implements Iterator
{
private ListIterator i;
private int code;
private int vendor_id;
final Message this$0;
AVPIterator(ListIterator listiterator, int j, int k)
{
super();
this$0 = Message.this;
i = listiterator;
code = j;
vendor_id = k;
}
//返回下一个指定code及vendor_id的avp在avpContainer中的位置
public boolean hasNext()
{
while(i.hasNext())
{
AVP avp1 = (AVP)i.next();
if(avp1.code == code && (vendor_id == 0 || avp1.vendor_id == vendor_id))
{
i.previous();
return true;
}
}
return false;
}
//取得avpContainer中的下一个avp,并返回之
public AVP next()
{
return (AVP)i.next();
}
public void remove()
{
i.remove();
}
}//end of inner class AVPIterator
public Message()
{
hdr = new MessageHeader();
avp = new ArrayList();
}
public Message(MessageHeader messageheader)
{
hdr = new MessageHeader(messageheader);
avp = new ArrayList();
}
public Message(Message message)
{
//由已有的消息构造Message实例
this(message.hdr);
AVP avp1;
for(Iterator iterator1 = message.avp.iterator(); iterator1.hasNext(); )
{
avp1 = (AVP)iterator1.next();
avp.add(new AVP(avp1));
}
}
public Iterator iterator()
{
return avp.iterator();
}
//查找avp code为i的avp的集合
public Iterator iterator(int i)
{
return iterator(i, 0);
}
public Iterator iterator(int i, int j)
{
return new AVPIterator(avp.listIterator(), i, j);
}
//获得消息长度
public int encodeSize()
{
int i = 0;
i += hdr.encodeSize();
for(Iterator iterator1 = avp.iterator(); iterator1.hasNext();)
{
AVP avp1 = (AVP)iterator1.next();
i += avp1.encodeSize();
}
return i;
}
public void encode(byte abyte0[])
{
int i = encodeSize();//首先获得消息长度 i
int j = 0;
j += hdr.encode(abyte0, j, i);//首先将消息头hdr编码入字节数组abyte0
//接下来将所有的avp编码入字节数组abyte0
for(Iterator iterator1 = avp.iterator(); iterator1.hasNext();)
{
AVP avp1 = (AVP)iterator1.next();
j += avp1.encode(abyte0, j);
}
}
//加入类图说明中
public byte[] encode()
{
int i = encodeSize();
byte abyte0[] = new byte[i];
int j = 0;
j += hdr.encode(abyte0, j, i);
for(Iterator iterator1 = avp.iterator(); iterator1.hasNext();)
{
AVP avp1 = (AVP)iterator1.next();
j += avp1.encode(abyte0, j);
}
return abyte0;
}
//取得消息长度 messageLength
public static int decodeSize(byte abyte0[], int i)
{
int j = packunpack.unpack32(abyte0, i) & 0xffffff;
return j;
}
public decode_status decode(byte abyte0[])
{
return decode(abyte0, 0, abyte0.length);
}
//对字节数组abyte0进行解析
public decode_status decode(byte abyte0[], int i, int j)
{
if(j < 4)
{
return decode_status.not_enough;
}
//version必须为1
if(packunpack.unpack8(abyte0, i) != 1)
{
return decode_status.garbage;
}
int k = decodeSize(abyte0, i);//取得消息长度
if((k & 3) != 0)
{
return decode_status.garbage;
}
if(k < 20)
{
return decode_status.garbage;
}
if(j < 20)
{
return decode_status.not_enough;
}
if(k == -1)
{
return decode_status.garbage;
}
if(j < k)
{
return decode_status.not_enough;
}
hdr.decode(abyte0, i);//首先解析得到消息头实例hdr
if(hdr.version != 1)
{
return decode_status.garbage;
}
//开始解析avp列表
i += 20;
int l = j - 20;
int i1 = l / 16;//最多的avp个数
ArrayList arraylist = new ArrayList(i1);
int j1;
for(; l > 0; l -= j1)
{
if(l < 8)
{
return decode_status.garbage;
}
j1 = AVP.decodeSize(abyte0, i, l);//获得下一个avp的长度
//对j1进行合法性校验
if(j1 == 0)
{
return decode_status.garbage;
}
if(j1 > l)
{
return decode_status.garbage;
}
AVP avp1 = new AVP();
if(!avp1.decode(abyte0, i, j1))
{
return decode_status.garbage;
}
arraylist.add(avp1);
i += j1;
}
if(l != 0)
{
return decode_status.garbage;
} else
{
avp = arraylist;
return decode_status.decoded;
}
}
public int size()
{
return avp.size();
}
//对avpContainer进行容量扩充
public void ensureCapacity(int i)
{
avp.ensureCapacity(i);
}
public AVP get(int i)
{
return new AVP((AVP)avp.get(i));
}
public void clear()
{
avp.clear();
}
public void add(AVP avp1)
{
avp.add(avp1);
}
public void add(int i, AVP avp1)
{
avp.add(i, avp1);
}
public void remove(int i)
{
avp.remove(i);
}
public Iterable avps()
{
return avp;
}
public void prepareResponse(Message message)
{
hdr.prepareResponse(message.hdr);
}
public Iterable subset(int i)
{
return subset(i, 0);
}
public Iterable subset(int i, int j)
{
return new Subset(this, i, j);
}
public AVP find(int i)
{
return find(i, 0);
}
public AVP find(int i, int j)
{
for(Iterator iterator1 = avp.iterator(); iterator1.hasNext();)
{
AVP avp1 = (AVP)iterator1.next();
if(avp1.code == i && avp1.vendor_id == j)
{
return avp1;
}
}
return null;
}
//Avp code为i的avp第一次在消息中出现的位置
int find_first(int code)
{
int j = 0;
for(Iterator iterator1 = avp.iterator(); iterator1.hasNext();)
{
AVP avp1 = (AVP)iterator1.next();
if(avp1.code == code)
{
return j;
}
j++;
}
return -1;
}
//Avp code为i的avp在消息中出现的次数
int count(int code)
{
int j = 0;
Iterator iterator1 = avp.iterator();
do
{
if(!iterator1.hasNext())
{
break;
}
AVP avp1 = (AVP)iterator1.next();
if(avp1.code == code)
{
j++;
}
} while(true);
return j;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -