EEPLAT学习
eeplat:Open Source Metadata PaaS
開始学习的时候仅仅是下了整个项目而且跑通,顺手在这个平台自己主动化的建立 了个管理系统,接下来開始深入研究这个开源平台
所谓元数据(metadata)即描写叙述数据的数据(data about data),在EEPlat中,对于描写叙述业务系统(包含业务数据、逻辑和UI)的元数据我们称之为模型(model)或声明式业务对象(Declarative Domain Object),以下图文中元数据、模型、声明式业务对象的概念能够互相替换,例如以下图:
元模型体系
在模型的基础上,EEPlat又进行了进一步的抽象,称之为元模型(metamodel),这样又进一步提高了系统的灵活性和可扩展性。 EEPlat拥有世界率先的元模型体系。元模型是声明式业务对象的模型,声明式业务对象由元模型描写叙述。EEPlat元模型体系是对企业信息化、电子政务等信息化领域业务的高度抽象,拥有自描写叙述和动态扩展特性,能准确得完毕业务领域模型的描写叙述。 元模型从承担职责的角度分为功能元模型、业务对象元模型、服务元模型、规则元模型、工作流元模型、组织元模型、UI元模型等。
业务对象元模型主要描写叙述业务功能的静态结构,服务元模型主要完毕业务逻辑,同一时候负责业务对象元模型之间的交互;工作流元模型主要完毕业务流程及业务对象元模型的协作;组织元模型通过组织元模型之间的职责关系能够实现灵活的组织结构,UI元模型是菜单、面板、表格、表格元素、功能树等的UI模型的元模型,能够实现复杂的界面表现,例如以下图:
- EEPlat元模型是声明式业务对象的模型,是对信息管理系统的合理抽象。在元模型体系下,声明式业务对象是通过元数据(配置数据)进行描写叙述。
- 声明式业务对象在EEPlat运行引擎的引导下形成用户可用的界面、逻辑等构成的业务系统,本质上运行引擎对EEPlat元数据的解析。
- 相应于OMG提出的MOF,EEPlat仅仅有三层:
- 信息层(information layer):利用EEPlat开发的信息管理系统
- 模型层(model layer):声明式业务对象
- 元模型层(metamodel layer):EEplat元模型
总线的基本概念
- 数据总线是业务对象之间共享数据、交换数据的唯一媒介。
- 数据总线存在存、取两种操作。
- 数据总线的生命周期是是Session,也就是说从用户会话開始到用户会话结束数据总线是一贯和连续的。
- 数据总线是线程独享的、线程安全的,一个线程对数据总线的改变不会影响到其它线程对数据总线的使用,每一个线程都是使用的总线的副本。
数据总线的构成方式
数据总线有以下几部分构成,每一个组成部分我们称之为节点:
FORM节点
FORM的构建
FORM的类型是BOInstance。 FORM指对HTTP GET的QueryString的封装或对HTTP POST 数据的封装,它能够是界面上FORM的值,也能够是通过AJAX方式传递的參数。如/mvccontroller/a=1&b=2&c=3,那么FORM的构建过程是这种: BOInstance form = new BOInstance(); form.putValue(“a”,”1”); form.putValue(“b”,”2”); form.putValue(“c”,”3”);
FORM的获取
DOService的參数是如何获取FORM的值的?
首先,參数的类型是FORM,确定是从总线的FORM中取值。 其次,查看參数是否配置了属性?
- 假设配置了属性
假设parameterValue得到的是null,參数还会依照“没有配置属性”取值。
- 假设没有配置属性
假设parameterValue得到的是null,參数会查看是否配置了默认值,假设配置了默认值则取默认值,否则直接返回null。
当使用API时,能够通过SessionContext.getInstance().getFormInstance()获取Form 节点
USER节点
USER的构建
USER的类型是BOInstance。 FORM指对登陆用户封装,USER是在登陆自己定义动作里面创建的。
//service 是指依据username、password查询登陆用户的服务 users = service.invokeSelect(); if (users != null && users.size() > 0) { BOInstance user = (BOInstance) users.get(0); SessionContext us = (SessionContext) request.getSession().getAttribute( "userInfo"); if(us == null){ us = new SessionContext(); request.getSession().setAttribute("userInfo", us); } /////为用户加入他的岗位: user.putValue("stationuid", user.getValue("fdgangweiid")); ///为用户加入他所在的部门: user.putValue("deptuid", "tt"); us.setUser(user); }
USER的更改
例: 把当前username改为admin,界面皮肤改为red
- WEBService 方式
/eeplat/servicecontroller?dataBus=setUserContext&contextKey=username&contextValue=admin& contextKey=skin&contextValue=red
- 代码方式
SessionContext.getInstance().getUser().putValue("username", "admin"); SessionContext.getInstance().getUser().putValue("skin", "red");
USER的获取
參数关于对USER获取有5中类型各自是:
- TYPE_LOGIN_ID:
获取登陆用户的UID,假设为空则返回’666666’。
- TYPE_LOGIN_NAME:
获取登陆用户的名称,假设为空则返回null。
- TYPE_LOGIN_MAIN_DEPT:
获取用户所在的部门uid。USER在构建过程中必须加入deptuid的值才干够获取到,否则返回null。
- TYPE_LOGIN_MAIN_STATION:
获取用户的岗位uid。USER在构建过程中必须加入stationuid的值才干够获取到,否则返回null。
- TYPE_LOGIN_KEY:
依据缺省值里面的配置返回USER在构建过程中相应的值,能够得到USER里面的全部的值。能够用这样的类型得到前四种类型的值,前四种类型事实上是这样的类型的特例,如TYPE_LOGIN_MAIN_STATION 这个类型能够用TYPE_LOGIN_KEY 取代,仅仅要在缺省值里面配置字符串’stationuid’;而且还要更灵活,假设表达岗位不用stationuid, 我们仅仅要在缺省值里面配置相应的字符串。
当使用API时,能够通过SessionContext.getInstance().getUser()获取User节点
GLOBAL节点
注意,以下描写叙述的GLOBAL节点内容,仅仅有EEPlat 2014或兴许版本号才支持。
创建:
- WEBService 方式
- 代码方式
获取:
- WEBService 方式
- 代码方式
ECHO_STR节点
创建: SessionContext.getInstance().getThreadContext().setEchoValue(echoValue)
获取:
- WEBService 方式
/eeplat/servicecontroller?dataBus=getContext
- 代码方式
SEARCH_LIST节点
创建:
- WEBService方式
/eeplat/servicecontroller?dataBus=setContextColl&contextKey=?contextValue=?&contexValue=?
- 代码方式
SessionContext.getInstance().getThreadContext().setInstances(paras)
获取:
- WEBService方式
/eeplat/servicecontroller?dataBus= getContextColl
- 代码方式
SessionContext.getInstance().getThreadContext().getInstances()
CURRENT节点
- 代码方式
获取当前业务对象被选择的数据:
SessionContext.getInstance().get("业务对象ID或业务对象")
把数据设置为当前选择:SessionContext.getInstance().put("业务对象ID或业务对象",BOInstance)
- WEBService方式
见下述“总线操作”。
总线操作
如果webmodule名称为:eeplat,总线的操作一般不单独进行,为了降低网络调用,一般和面板操作和服务操作放在一起进行。总线操作中 URL:/eeplat/mvccontroller 和 /eeplat/servicecontroller操作是等效的,以下以/eeplat/servicecontroller为例,如果操作的业务对象UID分别为class0001,class0002,class0003…名称分别为classanole1, classanole2, classanole...业务对象的数据的UID为instance1, instance2, instance3…。
总线操作通常是指对总线的CURRENT节点进行的操作。
第一类Restful WebService总线写操作
/eeplat/servicecontroller? callType=initOnly&contextClassUid=class0001contextInstanceUid=instance1
这个URL表示更新总线上的业务对象class0001的值为instance1。 initOnly表示仅仅操作总线不做其他动作。
第一类Restful WebService总线写操作方式仅仅有对总线的写操作,没有读操作。
第二类Restful WebService总线写操作
新的參数
- dataBus
对总线的操作类型
- contextKey
总线上键的名称,一般指的是业务对象的名称,注意contextClassUid是业务对象的uid.
- contextValue
总线上相应于键的值,和contextInstanceUid概念基本一致。
总线操作的分类
- 总线操作按读写分为:总线读操作,总线写操作
- 按操作内容的不同分为:
- 平台级操作:操作的内容是业务对象、业务对象实例。
- 用户级操作:操作的内容是自己定义的JSON格式对象。
总线写操作
- 平台级操作:支持批量写操作,能够同一时候更新多个业务对象的总线上的值。如:
/eeplat/servicecontroller? callType=initOnly &dataBus=setContext&contextKey=classanole1&contextValue=instance1&contextKey= classanole2&contextValue= instance2 在这里,contextKey是业务对象的主键, contextValue是业务对象实例的主键;假设contextKey和contextValue仅仅写一对,就是对单个对象的的总线操作。
- 用户级操作:能够在总线上写入自己定义的数据结构,而且键也能够不是业务对象的主键。如:
/eeplat/servicecontroller?callType=initOnly&dataBus=setContext&contextCustKey=menumodel&contextCustValue={'value':'500000'} 在这里,contextCustKey能够不是业务对象的主键, contextCustValue必须是json格式的字符串。
总线读操作
- 平台级操作:
获取总线上业务对象相应的实例的UID
/eeplat/servicecontroller?dataBus=getContext&contextKey=classanole1
获取总线上业务对象相应的实例的完整信息(JSON格式)/eeplat/servicecontroller?dataBus=getFullContext&contextKey=classanole1
- 用户级操作:
/eeplat/servicecontroller?dataBus=getFullContext&contextCustKey=classanole1 /eeplat/servicecontroller?dataBus=getCustContext&contextCustKey=classanole1 这两种写法等效,都是获取用户自己定义数据的完整信息(JSON格式)
JAVA代码操作
读操作
DOBO theBO = DOBO.getByName("业务对象名称");//或者去业务对象 BOInstance bi = theBO.getCorrInstance(); 或 BOInstance bi = DOGlobals.getInstance().getSessoinContext().get(theBO); 或 BOInstance bi = DOGlobals.getInstance().getSessoinContext().get(theBO.getObjUid());
写操作
DOBO theBO = DOBO.getByName("业务对象名称");//或者去业务对象 theBO.refreshContext(boinstance); 或 DOGlobals.getInstance().getSessoinContext().put(业务对象, boinstance) 或 DOGlobals.getInstance().getSessoinContext().put(业务对象ID, boinstance)
面板操作
如果webmodule名称为:wd,面板的ID为:0000001;面板Name为:pane_anole
依据面板ID获取面板的内容
/eeplat/mvccontroller?paneModelUid=0000001
依据面板Name获取面板的内容
/eeplat/pane_anole.pml
服务操作
服务操作的数据类型所有是json格式的字符串。如果webmodule名称为:wd:
基本URL及传递參数
- 基本URL为:/eeplat/servicecontroller
- 传递參数採用标准URL的方式,如
/eeplat/servicecontroller? contextServiceName=test&userName=anole&password=anolesoft
怎样调用服务
- 以ID的方式调用(ID为0000001)
/eeplat/servicecontroller? contextServiceUid=0000001
- 以Name 的方式调用(服务名称为test):
查询操作类型
- 查询返回的结果是以数组组织的数据
[{‘id’:’china’,’location’:’beijing’},{},{}] /eeplat/servicecontroller? contextServiceName=test &callType=sa
- 查询返回的结果是like map方式的结构的数据
- 查询返回的结果是所有以数组方式组织的数据,只是是返回业务对象的id和name两个值
- 仅仅返回一个值
- 查询分页
上述url表示获取第10页的数据,每页含有50条数据。
改动操作类型
- 仅仅运行当前的服务(不运行相应的规则),返回的结果是一条json记录数据
/eeplat/servicecontroller? contextServiceName=test&callType=us
- 运行当前的服务包含规则:
返回的结果是一个json 字符串:格式为 {‘returnPath’:’’, //运行服务后界面上须要连接的路径(能够是多个) ’ targetPane’:’’, //路径所显示的目标面板 (能够是多个)
‘returnValue’:’’}//返回数据总线上ECHO_STR节点的值
调用JAVA Class
如果须要调用的类全名为:com.exedosoft.Hello,Hello必须实现com.exedosoft.plat.action.Action接口。 以下介绍有返回值的情况,如果不须要返回记录,以下的三种调用类型任选其一就能够。
返回的结果是一条记录
/eeplat/servicecontroller? userDefineClass=com.exedosoft.Hello&callType=as
返回的结果被存放在总线的 GLOBAL_UID节点中。 所以com.exedosoft.Hello 须要调用
SessionContext.getInstance().getThreadContext().setInstance(bi);对总线赋值。
返回的结果是以数组组织的多条记录
/eeplat/servicecontroller? userDefineClass=com.exedosoft.Hello&callType=aa
返回的结果被存放在总线的 SEARCH_LIST节点中。 所以com.exedosoft.Hello 须要调用
SessionContext.getInstance().getThreadContext().setInstances(list);对总线赋值。
仅仅返回一个值
/eeplat/servicecontroller? userDefineClass=com.exedosoft.Hello&callType=ao
SessionContext.getInstance().getThreadContext().setEchoStr(list)
返回的结果是Echo_str