⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 message.java

📁 提供对diameter消息,avp的封装解析功能的工具类
💻 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 + -