Floodlight 中创建消息对象的方法

在 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 中创建消息对象的方法,布布扣,bubuko.com

时间: 2024-10-06 20:44:45

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

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

本文内容参考JavaScript高级程序设计(第3版)第6章:面向对象的程序设计 ECMA-262中把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”我所理解的就是对象就是一个结构体,结构体中有一些它的基本属性以及对结构体处理的方法,把它们封装起来称为一个整体.JS中所有的对象都是基于一个引用类型创建,这个引用类型可以是原生类型,如Array,Date等,也可以是开发人员自定义的类型. 下面主要总结下JS中创建对象的几种模式,分析他们各自的优缺点. 1. 工厂模式 /****

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

Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. 1 var student = new Object(); 2 student.name = "xiao ming"; 3 student.age = 20; 4 student.getName = function () { 5 alert(this.name); 6 } 熟悉javascrip

三种创建XMLHttpRequest对象的方法

XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples&

本地C代码中创建Java对象

创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法. 以Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构造方法,所以它的实例化必然是在JNI的c中实现的. BitmapFactory.java中提供了得到Bitmap的方法,时序简化为: BitmapFactory.java ->BitmapFactory.cpp -> GraphicsJNI::createBitmap()  [graphics.cpp] GraphicsJNI::cre

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

时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数函数,则对象无法创建. <bean id="one" class="sdnu.machi.one"></bean> 如果one.class中没有默认构造函数则会报

在JavaScript中重写jQuery对象的方法

jQuery是一个很好的类库,它给我们解决了很多的客户端编程,任何东西都不是万能的,当它不能满足我们的需求时我们需要对它进行重写,同时也不要影响其原有的功能或者修改其原有的功能:我现在的web应用程序大多数时候的数据交互都是通过Ajax来完成的,这样就可以将一些隐藏字段的数据保存在HTML标签的属性中,使HTML标签的代码量减少,如:ID,Timestamp等等,这些不需要用户输入但又不得不提交的字段,通过表单提交的做法是 <input name="ID" value="

JavaScript中创建字典对象(dictionary)实例

这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象仅仅是个数组,无法提供通过关键字来获取保存的数据,jQuery源码中提供了一种非常好的方式来解决这个问题,先看一下源码: 复制代码代码如下: function createCache() { var keys = []; function cache(key, value) {  // Use (k

在Javascript 中创建JSON对象--例程分析

作者:iamlaosong 要想用程序从网页上抓数据,需要熟悉HTML和JavaScript语言,这里有一个在Javascript 中创建JSON对象的例程,学习并掌握其内容,在此对此例程做个注释,记录我掌握的知识,以备将来验证是否正确. 程序很简单,分三部分: 1.<h2>部分:用大字符显示标题: 2.<p>部分:显示一段信息的结构,但无内容,内容在后面添加: 3.<scrip>部分:Javascript程序,先定义了一个JSON结构的变量JSONObject,然后,

R中创建not-yet-evaluated对象

create not-yet-evaluated object在R中创建 not-yet-evaluated(就是some code we will evaluated later!!)对象;然后执行的时候需要调用eval(参数中提供执行环境)或者do.ca()执行: do.call()作用就是 do.call( "someRFunction",aListOfArgs) <=> someRFuncion( aListOfArgs ); do.call() is constr