正式推荐我的一个开源项目2-自定义编译器

在项目里面有时有这样的场景,我们需要一个权限表来控制权限,当满足权限表条件时,阻止用户操作并返回错误信息,表的结构类似:

这时有一种传统方式是,我们用mybatis之类的工具,写一段sql,每次用这段sql校验权限:

SELECT * from permission_test where `condition1` = #{condition1} and `condition2` = #{condition2}

另外一种方式是,我们将table编译为一段可执行代码,然后每次执行这段代码,这段代码类似:

那么这2种方式的效率相差多大呢,楼主写了一段测试代码:

执行结果是,compiledtester的执行时间总是1ms,而sqltester的执行时间则在800ms左右。

那么,compiledtester是怎么生成的呢?本文将简单介绍这个生成机制。

本文用到了楼主的开源项目 autogrammer : http://git.oschina.net/notebook

它的jar包可以在published项目下面下载到。

本文所用主要代码可以在这里 http://www.oschina.net/code/snippet_573815_50916 看到

首先有一个接口类 DBDataTester 这个类里面有2种实现,一种是传统的数据库实现SqlDataTester,另外一种是编译为java代码 DBDataTesterImpl 类的实现。

主要编译代码

我们的思路是,从数据库里面把所有的record读取出来,然后利用autogrammer提供的功能编译这些record,最终生成目标代码。

编译java代码相关的知识你可以从这篇文章里面学到:

http://www.oschina.net/code/snippet_573815_50891

我们从数据库里面读取的record可以看作如下语句:

condition (name:"condition1", data:"condition1-1")

condition (name:"condition2", data:"condition1-2")

end (data: "错误数据1")

......

第一步:autogrammer要实现自定义编译器,首先需要你定义语法。代码中文法放在 yp/published/grammer/Grammer.txt 中:

其中,第三句表示,一个condition可以规约为一个conditionlist

第二句表示,一个conditionlist 和 condition 可以规约为一个 conditionlist

这样我们的文法就支持condition的无线罗列了

第一句表示,当遇到一个end时,表明当前句子结束(类似于编程语句中的;)此时会对整个句子进行编译,生成一段代码

类似:

if ("condition1-1".equals(data.getCondition1()) && "condition2-1".equals(data.getCondition2())) {

return "错误数据1";

}

第二步:有了文法以后,我们就需要一个词法分析器,这个词法分析器可以从数据库中读取数据,然后转化为文法中所对应的token流。

词法分析器需要继承,并实现TokenReader接口

public class DBTokenReader implements TokenReader

它的关键代码在这里:

第三步,我们需要针对我们定义的语法注册处理函数

public class ConditionHandler extends DefaultExecuteHandler

注册编译最开始的初始化函数:主要初始化ExecutePram

注册编译结束的函数:这里利用ExecuteParam 编译最终实现类DBDataTesterImpl

注册各个规约语句的处理函数

处理函数中,tokenWordList为一个List<TokenWord>, 里面的成员就是 "->" 左边的值(condition),

originalWord为 "->" 右边的值(conditionlist)。每一个tokenWord都有一个Object data成员可以放入自定义对象。

paramContext则是本次编译执行的参数。

最后,当我们凑齐了 语法文件,词法分析器,以及相关handler之后,就可以进行编译过程。在主要编译代码中,我们可以看到首先我们根据语法文件生成一个StateTable,然后生成自己的TokenReader,ExecuteHandler,最终利用3者生成一个ExecuteContext并且执行编译的过程。

再次贴出链接:

主要代码:http://www.oschina.net/code/snippet_573815_50916

编译java代码相关介绍: http://www.oschina.net/code/snippet_573815_50891

项目地址:http://git.oschina.net/notebook

其中本项目用到的是autogrammer,jar包在published项目下面。

时间: 2024-08-01 02:33:43

正式推荐我的一个开源项目2-自定义编译器的相关文章

正式推荐我的一个开源项目,可以处理网页抓取,语法分析

autogrammerspider项目,今天在[www.taobao.com]上面测试成功了,这个项目可以大大缓解你抓取网页时,分析网页的痛苦. 目前在功能,效率上面虽然还有很大的提升空间,但是基本运行已经问题不大.我今天正式介绍这个项目,希望各位有兴趣的话可以用用,提出宝贵意见,如果真的需要什么功能的话也可以告诉我,我会尽快完善. 这个东西的使用如下, 首先配置特征文件,放在resource, autospider下面, 特征文件的内容如下: 在这个特征文件里面有3个地方需要注意, 一个是最上

如何参与一个开源项目!

1.首先在github上注册一个自己的账号 2.然后在左上部分搜索一个开源项目,比如说我的项目syj-ratelimit 3.进入项目之后,单击右上角的fork按钮,github就会在你的帐户下fork一个同样的项目. 4.此时点击右上角自己的头像,可以看到一个your repositories,点击进入就可以看到刚才的那个项目了 5.现在你就可以在这个项目里取发挥你的个人才智进行修改bug.开发新功能等各种方式的贡献了 6.当你贡献完毕后就可以把你的贡献推荐给这个项目的开发者了.再次打开git

www808888webcom基金的一个开源项目19908836661也是apache基金的一个开源

Flume也是apache基金的一个开源项目,由cloudera公司开发的一款分布式.高可靠.高可用的日志传输工具.其以agent为一个单位,agent由source.channel和sink构成.一个agent最少由一个source.channel和sink构成,数量可以自由组合 Source主要用来收集源数据,并对源数据进行反序列化.Source在读取数据文件时,会遍历日志文件中的每一行,并把这一行封装在一个event当中,一个event包含一个header和一个body,header是一个

如何熟悉一个开源项目?

参考来源: http://www.lai18.com/content/436209.html 你有个任务,需要用到某个开源项目:或者老大交代你一个事情,让你去了解某个东西.怎么下手呢?如何开始呢?我的习惯是这样: 1.首先,查找和阅读该项目的博客和资料,通过google你能找到某个项目大体介绍的博客,快速阅读一下就能对项目的目的.功能.基本使用有个大概的了解. 2.阅读项目的文档,重点关注类似Getting started.Example之类的文档,从中学习如何下载.安装.甚至基本使用该项目所需

怎样在Github参与一个开源项目

转载:http://www.csdn.net/article/2014-04-14/2819293-Contributing-to-Open-Source-on-GitHub 最近一年开源项目特别的热,很多技术大会或论坛都以开源项目作为主题进行探讨,可见这是一种趋势.而Github作为开源项目的著名托管地,可谓无人不知,越来越多的个人和公司纷纷加入到Github的大家族里来,为开源尽一份绵薄之力.对于个人来讲,你把自己的项目托管到Github上并不表示你参与了Github开源项目,只能说你开源了

一个开源项目中用到的bash shell脚本

请看系统鸟瞰图: 因为笔者所在的地方并无可用的宽带和Wifi,所以暂且只能采用上图中的联网方法,使用ssh走手机GPRS流量的方法进行远程操作云风典藏官网的服务器,以完成所有任务.  关于云风典藏的更多信息,请看文章<四个月的隐居和一个新的开源项目——云风典藏>. 第一步:SSH安全设置  服务器现在由我们全部负责,远程登录的安全为重中之重.  1.创建一普通用户,以后只使用此用户来远程登录系统:  2.修改root密码:  3.修改sshd的配置: 1 #vim sshd_config fi

给各位聚聚和大大介绍一个开源项目 Expression2Sql

一.Expression2Sql介绍 Expression2Sql是一个可以将Expression表达式树解析成Transact-SQL的开源项目.简单易用,几分钟即可上手使用,因为博主在设计Expression2Sql的时候就尽可能的按照Transact-SQL的语法语义风格来设计,只要调用者熟悉基本的Transact-SQL语法即可迅速开码,大大降低了学习Expression2Sql的成本,甚至零成本.对象化操作,链式编程,任意组装sql,自动生成表别名,参数化赋值,防止sql注入,支持多数

IO Visor:又一个开源项目横空出世

日前,Linux组织宣布成立开源项目IO Visor,该项目主要针对Linux内核的输入/输出请求任务.这个项目听上去似乎很深奥,事实上该项目与网络有很大的相关性.IO Visor无需借助网络硬件就可以创建整个网络的拓扑. 在实际应用场景中,IO Visor通过增加Linux内核中运行的元件数量可以有效地提高虚拟交换机等网络元件的性能.在去年VMware主办的 Open vSwitch大会上就讨论过这个问题,当时围绕"将一些数据包处理移出Linux内核是否会更好?"展开讨论. 创建IO

一个开源项目的想法

最近因为受到工作上的启发,还有Konrad先生的框架的启发,想要自己动手写一个javascript的框架. 现在设想的框架是mvc模型,纯javascript,加上一些预定义css界面元素.面向Cordova端移动应用开发. 名字叫XJ框架 计划: 现在这里建立一个开源代码库 有空就进行初步架构的开发 稳定代码