在 floodlight 中创建各种openflow message 和 action 等採用的是简单工厂方式。BasicFactory类(实现OFMessageFactory接口。)会依据消息的类型创建不同的对象,达到更好的封装效果。此外这里调用的是枚举类型的方法。以下是详细代码:

----------工厂接口,还有OFActionFactory。约束须要详细工厂完毕的事情
public interface OFMessageFactory
{
      // 依据消息类型得到详细的实例
      public OFMessage
getMessage(OFType t);

      // 尝试从ChannelBuffer中解析出尽可能多的OFMessage,从position開始,止于一个解析的消息之后
      public List <OFMessage>
parseMessage(ChannelBuffer data)
               throws MessageParseException;

      // 得到负责创建openflow action
的工厂
      public OFActionFactory
getActionFactory();
}

---------工厂类
   //创建 openflow message和action
public class BasicFactory implements OFMessageFactory,
OFActionFactory,
          OFStatisticsFactory, OFVendorDataFactory {
      @Override
      public OFMessage
getMessage(OFType t) {
           return t.newInstance(); //
调用枚举类型的方法
     }

      @Override
      public List<OFMessage>
parseMessage(ChannelBuffer data)
               throws MessageParseException
{
          List<OFMessage> msglist = new ArrayList<OFMessage>();
          OFMessage msg = null ;

           while (data.readableBytes()
>= OFMessage.MINIMUM_LENGTH ) {
              data.markReaderIndex(); //
标记读指针,注意ChannelBuffer和ByteBuffer的差别
              msg = this .parseMessageOne(data);
               if (msg
== null ) {
                   data.resetReaderIndex(); //
假设失败则恢复read index
                    break ;
              } else {
                   msglist.add(msg); //
成功解析。则将其增加列表
              }
          }

           if (msglist.size()
== 0) {
               return null ;
          }
           return msglist;
     }

      public OFMessage
parseMessageOne(ChannelBuffer data)
               throws MessageParseException
{
           try {
              OFMessage demux = new OFMessage();
              OFMessage ofm = null ;

               if (data.readableBytes()
< OFMessage.MINIMUM_LENGTH )
                    return ofm;

              data.markReaderIndex();
               //
调用基类方法,得到OF header的字段如长度和消息类型
              demux.readFrom(data);
              data.resetReaderIndex();

               //
假设ChannelBuffer中不足一个消息长度,则返回空
               if (demux.getLengthU()
> data.readableBytes())
                    return ofm;
               //
否则依据类型。创建对应的消息对象
              ofm = getMessage(demux.getType());
               if (ofm
== null )
                    return null ;
               //
假设对应的消息类中有OFActionFactory成员,就用当前类设置它
               if (ofm instanceof OFActionFactoryAware)
{
                   ((OFActionFactoryAware) ofm).setActionFactory(this );
              }
               if (ofm instanceof OFMessageFactoryAware)
{
                   ((OFMessageFactoryAware) ofm).setMessageFactory(this );
              }
               if (ofm instanceof OFStatisticsFactoryAware)
{
                   ((OFStatisticsFactoryAware) ofm).setStatisticsFactory(this );
              }
               if (ofm instanceof OFVendorDataFactoryAware)
{
                   ((OFVendorDataFactoryAware) ofm).setVendorDataFactory(this );
              }
               //
最后调用详细类的readFrom。从ChannelBuffer解析出该消息
              ofm.readFrom(data);
               if (OFMessage. class.equals(ofm.getClass()))
{
                    //
advance the position for un-implemented messages
                   data.readerIndex(data.readerIndex()
                             + (ofm.getLengthU() - OFMessage.MINIMUM_LENGTH ));
              }

               return ofm;
          } catch (Exception
e) {
               throw new MessageParseException(e);
          }
     }

// 以下的action和statistics 与上面类似。 
         @Override
      public OFAction
getAction(OFActionType t) {
           return t.newInstance();
     }

      @Override
      public List<OFAction>
parseActions(ChannelBuffer data, int length)
{
           return parseActions(data,
length, 0);
     }

      @Override
      public List<OFAction>
parseActions(ChannelBuffer data, int length, int limit)
{
          List<OFAction> results = new ArrayList<OFAction>();
          OFAction demux = new OFAction();
          OFAction ofa;
           int end
= data.readerIndex() + length;

           while (limit
== 0 || results.size() <= limit) {
               if ((data.readableBytes()
< OFAction.MINIMUM_LENGTH || (data
                        .readerIndex() + OFAction.MINIMUM_LENGTH )
> end))
                    return results;

              data.markReaderIndex();
              demux.readFrom(data);
              data.resetReaderIndex();

               if ((demux.getLengthU()
> data.readableBytes() || (data
                        .readerIndex() + demux.getLengthU()) > end))
                    return results;

              ofa = getAction(demux.getType());
              ofa.readFrom(data);
               if (OFAction. class.equals(ofa.getClass()))
{
                    //
advance the position for un-implemented messages
                   data.readerIndex(data.readerIndex()
                             + (ofa.getLengthU() - OFAction.MINIMUM_LENGTH ));
              }
              results.add(ofa);
          }

           return results;
     }

      
      @Override
      public OFActionFactory
getActionFactory() {
           return this ;
     }
}  

Floodlight 中创建消息对象的方法的更多相关文章

  1. Javascript 中创建自定义对象的方法(设计模式)

    Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. var ...

  2. JavaScript中创建自定义对象的方法

    本文内容参考JavaScript高级程序设计(第3版)第6章:面向对象的程序设计 ECMA-262中把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”我所理解的就是对象就是一个结构 ...

  3. java4中创建内对象的方法

    在java程序中,对象可以被显式地或者隐式地创建.四种显式的创建对象的方式:     ● 用new语句创建对象     ● 运用反射手段,调用java.lang.Class 或者 java.lang. ...

  4. JS中创建自定义对象的方法

    1.直接给对象扩充属性和方法: 2.对象字面量: 3.工厂方式: 4.构造函数方式: 5.原型方式: 6.混合方式. <script> // 1.直接给对象扩充属性和方法; var cat ...

  5. 通常Struts框架会自动地从action mapping中创建action对象

    开发者不必在Spring中去注册action,尽管可以这么去做,通常Struts框架会自动地从action mapping中创建action对象 struts2-spring-plugin-x-x-x ...

  6. JavaScript -- 时光流逝(三):js中的 String 对象的方法

    JavaScript -- 知识点回顾篇(三):js中的 String 对象的方法 (1) anchor(): 创建 HTML 锚. <script type="text/javasc ...

  7. Java中创建实例化对象的几种方式

    Java中创建实例化对象有哪些方式? ①最常见的创建对象方法,使用new语句创建一个对象.②通过工厂方法返回对象,例:String s =String.valueOf().(工厂方法涉及到框架)③动用 ...

  8. 几种创建XMLHttpRequest对象的方法

    XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head ...

  9. spring中创建bean对象的三种方式以及作用范围

    时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...

随机推荐

  1. lpa标签传播算法解说及代码实现

    package lpa; import java.util.Arrays; import java.util.HashMap; import java.util.Map; public class L ...

  2. HDU 4358

    看了题解那个弱化版后,马上就去做了HDU 3333这道题,发现有可用的地方.于是往这方面想,主要是处理如何确定一个数出现K次的问题.想到了从左往右把每个数出现的次数记下来,但感觉不是这样,呃,再看别人 ...

  3. 经验之谈—OAuth授权流程图

    事实上我们在开发中,常常须要解决获得用户的一些特定的数据,比方:能够选择使用微博登陆.使用QQ登陆等等.然后我们间接的获得用户的头像.昵称等信息.这些都涉及到OAuth授权的内容 OAuth授权有这么 ...

  4. Swift开发教程--怎样自己定义TabBarItem的图片显示

    在做项目的时候,假设使用系统的UITabBarController的时候,底部的tab自己定义图片显示是蓝色和灰色的.这不是我们所想要的效果. 假设想显示自己定义的按下和弹起的图片效果.这个时候就须要 ...

  5. ios基础-分辨率适配

    (一)分辨率定义 分辨率,是指单位长度内包括的像素点的数量,它的单位通常为像素/英寸(ppi).描写叙述分辨率的单位有:(dpi点每英寸).lpi(线每英寸)和ppi(像素每英寸). (二)ios分辨 ...

  6. vehicle time series data analysis

    以HADOOP为代表的云计算提供的仅仅是一个算法执行环境,为大数据的并行计算提供了在现有软硬件水平下最好的(近似)方法.并不能解决大数据应用中的全部问题.从详细应用而言,通过物联网方式接入IT圈的数据 ...

  7. uva 10534 Wavio Sequence LIS

    // uva 10534 Wavio Sequence // // 能够将题目转化为经典的LIS. // 从左往右LIS记作d[i],从右往左LIS记作p[i]; // 则最后当中的min(d[i], ...

  8. Oracle 单表选择率

    听了猫大师的课,对Oracle CBO又加深了一步理解: 单表选择率: selectivity=1/ndv*a4nulls ocard来自dba_tables.num_rows ndv 来自dba_t ...

  9. Java RTTI(类型信息)(.class 类对象)

    RTTI:Run-Time Type Information,关键词在 Run-Time,运行时的,而非编译期确定的关于类型的信息.运行时的类型信息(RunTime Type Information) ...

  10. .NET序列化工具Jil、Json.NET和Protobuf的简单测评

    前一段时间逛园子的时候发现有人比较了Jil.Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅. 前期准备 依赖类库的话,可以通过Nuget在公共组件库总下载,这 ...