版本:spagobi 4.2
通用处理过程:
1)前端调用AdapterHTTP的servlet进行统一接收请求,调用service();
2)由协调器DispatcherManager找到对应的派发器 coordinator (CoordinatorIFace);
coordinator = DispatcherManager.getCoordinator(requestContext);
//【】根据请求参数类型的不同,找到不同的协调器来处理请求。
// ACTION_NAME通过ActionDispatcher创建ActionCoordinator;PAGE_NAME通过ModuleDispatcher创建ModuleCoordinator
3)具体的协调器coordinator处理请求,调用service()。
coordinator.service(serviceRequest, serviceResponse);
//也就是ActionCoordinator.service(serviceRequest, serviceResponse); //参数是ACTION_NAME时调用
//或者 ModuleCoordinator.service(serviceRequest, serviceResponse); //参数是PAGE_NAME时调用
4) 在具体的协调器coordinator处理逻辑中,创建具体的请求处理类。
ActionIFace action = ActionFactory.getAction(getRequestContainer());
//创建ACTION_NAME对应的action类实例(或者PAGE_NAME对应的页面处理类实例)//这里根据请求scope的不同,可能进行缓存创建的处理类实例。
// scope=“SESSION” 时,则从缓存找 action = (ActionIFace)sessionContainer.getAttribute("AF_ACTION_" + actionName);
5)对于ActionCoordinator还要进行用户是否有权执行这个action,如果不能执行,则抛异常结束。 ModuleCoordinator则不用判断。
首先要看该action是否在不需校验的列表中,
SecurityConfigurationSingleton.getInstance() .isActionChecked(getBusinessName());
//eg:查看 GET_ROLES_FOR_EXECUTION_ACTION是否在排除的action列表名单中,这个列表在conf/config/security.xml
如果在列表名单中,则判断分支结束,进入下一步操作(进入第6部操作);如果不在,则进行用户有权校验:
isActionAuthorized = userProfile.isAbleToExecuteAction(getBusinessName());
如果没有执行的权限,则抛异常提前结束,如果有权限执行,则下一步操作(进入第6部操作)。
6)校验协调器进行有效性校验后,执行真正处理业务的具体的类实例。
ACTION_NAME:
if (ValidationCoordinator.validate(getBusinessType(), getBusinessName(), this)) {
invokeServiceBusiness(action, serviceRequest, serviceResponse); // action
}
PAGE_NAME:
if (ValidationCoordinator.validate(getBusinessType(), getBusinessName(), this)) {
page.service(serviceRequest, serviceResponse);
}
7)进行具体业务处理类进行处理。
参数ACTION_NAME或PAGE_NAME对应的类的实例的具体业务方法的处理。。。
一、调用执行action的角色判断: GET_ROLES_FOR_EXECUTION_ACTION
整体处理过程:AdapterHTTP根据参数选择协调器Coordinator (ActionCoordinator 和 ModuleCoordinator),在在协调器中创建类实例,并处理业务逻辑,获取用户所拥有的能执行该报表的角色列表,处理完后以json的方式返回给前端。
1) 页面请求位置:/web-content/js/src/ext/sbi/execution/RoleSelectionPage.js //52行
2)首先调用 /SpagoBI/servlet/AdapterHTTP?ACTION_NAME=GET_ROLES_FOR_EXECUTION_ACTION& LIGHT_NAVIGATOR_DISABLED=TRUE
这里传递的参数比较多:
请求参数除了上面两个外,在post里有:
OBJECT_ID |
149 |
OBJECT_LABEL |
DEMO_CHART_SALES |
isFromCross |
false |
处理过程:
在AdapterHTTP中拿到协调器(ActionCoordinator 和 ModuleCoordinator),协调器主要根据url参数来解析出来该请求需要调用哪个协调器来处理,并封装了url的参数。在该协调器的service()方法中
1.1 获取 ACTION_NAME对应的类实例。
ActionIFace action = ActionFactory.getAction(getRequestContainer()); // line 89 用的是action工厂类
中通过工厂方法获取GetRolesForExecutionAction类,其中该工厂类中通过xml配置(<CONFIGURATOR path="/WEB-INF/conf/analiticalmodel/actions.xml" />)找属性为“ACTIONS.ACTION”,name=“GET_ROLES_FOR_EXECUTION_ACTION” 找到GetRolesForExecutionAction类,并且如果xml配置的scope=“request”,则每次都新创建,如果scope=“SESSION”,则创建后就把它放到sessionContainer容器中,下次通过 action = (ActionIFace)sessionContainer.getAttribute("AF_ACTION_" + actionName);来获取该action实例;否 则从applicationContainer拿去这个实例。
1.2 调用ACTION_NAME对应的类实例的service()方法(doService()方法)。
1.2.1 从request获取报表参数,获取报表数据库信息。
documentId和documentLabel (也就是上面的OBJECT_ID和OBJECT_LABEL)
obj = DAOFactory.getBIObjectDAO().loadBIObjectByLabel(documentLabel); //76
从SBI_OBJECTS、SBI_ENGINES和SBI_DATA_SOURCE三张表中查询一个SbiObjects实例出来,然后转换为BIObject对象,这样就把和该报表相关的对象信息、所用到的引擎信息 和 数据源信息都查询出来了。(同时也会把sbi_obj_func和sbi_obj_par的值查出来)
1.2.2检索该用户所拥有的角色集合中能执行该报表的role列表。
roleNames = ObjectsAccessVerifier.getCorrectRolesForExecution(obj.getId(), profile);// 97
correctRoles = DAOFactory.getBIObjectDAO()
.getCorrectRolesForExecution(objectId, profile);
String permission = ObjectsAccessVerifier.getPermissionFromDocumentState(objectState); //963
// objectState = "REL"
根据在sbi_object的STATE_CD字段值来指定拥有的role,
1)、[查询哪些角色可以执行该报表,There are [4] roles that can execut doc [149] depending on its location]
2)、从所有可执行该报表的角色中,遍历看是否该用户拥有的角色是否在里面。
BIObjectDAOHibImpl.getCorrectRoles: There is one available modality for role [/spagobi/admin] on parameter [70]
3)、求用户拥有的role集合和可访问该document的role集合的交集;
if (allRolesWithPermission.contains(role)) userRolesWithPermission.add(role); //set1和set2求交集,筛选出来用户角色中能访问该document的role子集合。
4)遍历所有满足执行该document的角色name的list,并查询出对应的role封装成role对象的list。
roles = new ArrayList();
Iterator it = roleNames.iterator();
while(it.hasNext()) {
String roleName = (String)it.next();
try {
Role role = DAOFactory.getRoleDAO().loadByName(roleName);
roles.add(role);
} catch (EMFUserError error) {
logger.error("Role with name equals to [" + roleName + "] not found");
throw new SpagoBIServiceException(SERVICE_NAME, "Role with name equals to [" + roleName + "] not found", error);
}
}
5) 最终将满足执行该报表的role的list以json的方式传递给前端。
【】 二、启动执行流程。START_EXECUTION_PROCESS_ACTION
页面:web-content/js/src/ext/sbi/execution/ExecutionWizard.js // 176行
请求:http://localhost:8080/SpagoBI/servlet/AdapterHTTP?ACTION_NAME=START_EXECUTION_PROCESS_ACTION &LIGHT_NAVIGATOR_DISABLED=TRUE
除了上面两个参数,在post中参数:
OBJECT_ID |
149 |
OBJECT_LABEL |
DEMO_CHART_SALES |
ROLE |
/spagobi/admin |
isFromCross |
false |
isPossibleToComeBackToRolePage |
false |
响应:
{"execContextId":"852c541d544c11e4a543055f86358ffb"}
在ActionCoordinator封装了businessName和businesstype的实例,调用service()方法,
2.1 工厂类中创建ACTION_NAME=START_EXECUTION_PROCESS_ACTION对应类StartNewExecutionProcess实例;
2.2 该实例执行service()方法中,查询该document具体表信息,封装成BIObject实例;
obj = DAOFactory.getBIObjectDAO().loadBIObjectByLabel(documentLabel);
2.3 检索该用户能执行该document的子角色集合// retrive roles for execution
roles = ObjectsAccessVerifier.getCorrectRolesForExecution(obj.getId(), profile);
同样,查询用户user的角色role集合;查询能执行该document的role集合;
(注:2.2和2.3在上一步GetRolesForExecutionAction中也执行过)
2.4 StartNewExecutionProcess实例中创建一个执行实例 // create new execution instance
ExecutionInstance instance
同时创建BIObject
this.object = DAOFactory.getBIObjectDAO().loadBIObjectForExecutionByIdAndRole(biobjectId, executionRole);// 128
该对象包括了BIObjectParameter的查询(字典lov)
这里分析下一个报表中参数加载的过程:
首先根据报表的id到sbi_obj_par这个中间表中找该报表总共会有多少个参数项,然后在sbi_paramter表中找到具体的参数信息(也即是sbi_obj_par是sbi_object和sbi_paramter的中间表,多对多的关系),而sbi_paruse是一个关联表,它对应着sbi_paramter和sbi_lov,而sbi_lov是个字典数据集,也就是sbi_paramter中的参数的数据集都来自sbi_lov,有了数据集,那么前端页面展示就缺少了用什么来装载这个数据,所以在sbi_paruse定义了装载这些数据集的组件(eg:COMBOBOX或List等),这样一个参数在前端页面就有了可选的数据集,而且有了用什么组件来装载这些数据集,用户通过操作html组件就能选到这些数据集中的一个值。而前端组件中,默认哪些该被选中,或者勾选上,这就是sbi_paruse_ck表的作用了。
把instance封装好后放在上下文内,最后只将executionContextId传递到前端(也就是只把创建的这个实例的id传递给前端,自己则存在context上下文中),在前端根据executionContextId取instance。此后的所有url的post参数中都有这个SBI_EXECUTION_ID的身影。
三、获取参数,为前端渲染过滤查询面板做准备。 GET_PARAMETERS_FOR_EXECUTION_ACTION
页面: web-content/js/src/ext/sbi/execution/ParametersPanel.js // 96
请求:http://localhost:8080/SpagoBI/servlet/AdapterHTTP?ACTION_NAME=GET_PARAMETERS_FOR_EXECUTION_ACTION
&LIGHT_NAVIGATOR_DISABLED=TRUE&CONTEST=undefined
参数除了上面的参数,还有post的参数:
OBJECT_ID |
149 |
OBJECT_LABEL |
DEMO_CHART_SALES |
ROLE |
/spagobi/admin |
SBI_EXECUTION_ID |
55c5a950545811e4a543055f86358ffb |
isFromCross |
false |
isPossibleToComeBackToRolePage |
false |
响应:
{
"id": "state",
"label": "State",
"type": "STRING",
"selectionType": "COMBOBOX",
"enableMaximizer": false,
"typeCode": "QUERY",
"mandatory": false,
"multivalue": false,
"visible": true,
"valuesCount": 21,
"objParameterIds": [
],
"dependencies": [
],
"parameterUseId": 70,
"defaultValues": [
{
"value": "AL",
"description": "AL"
}
]
},
{
"id": "indicator",
"label": "Analysis",
"type": "STRING",
"selectionType": "COMBOBOX",
"enableMaximizer": false,
"typeCode": "FIX_LOV",
"mandatory": false,
"multivalue": false,
"visible": true,
"valuesCount": 3,
"objParameterIds": [
],
"dependencies": [
],
"parameterUseId": 71,
"defaultValues": [
{
"value": "UNIT_SALES",
"description": "Unit Sales"
}
]
}
【】在响应json中,最外层数组中,每个{}就是一个过滤项,其中defaultValues就是选中的默认值,selectionType为前端要渲染的组件类型。
在生成的GetParameterValuesForExecutionAction类实例的doService()方法中,
1) 首先获取上一步生成的instance实例,从这个实例中拿到BIObject实例,然后从这个biobject实例中得到参数list:
List parameters = document.getBiObjectParameters();
将list中每一个对象转换为ParameterForExecution对象放到新list中,如下代码:
while (it.hasNext()) {
BIObjectParameter parameter = (BIObjectParameter) it.next();
parametersForExecution.add( new ParameterForExecution(parameter) );
}
注意:这里从新封装的ParameterForExecution中主要包括解析出来的,前端用的html组件类型(eg:combox)等,还有哪些查询字段,以及每个查询字段中,哪些是默认选中的值的初始化等。
2)将这个list以json的方式返回给前端。
【】四、获取快照action 。 GET_SNAPSHOTS_ACTION
页面:web-content/js/src/ext/sbi/execution/SnapshotsPanel.js // 48
请求:http://localhost:8080/SpagoBI/servlet/AdapterHTTP?ACTION_NAME=GET_SNAPSHOTS_ACTION &LIGHT_NAVIGATOR_DISABLED=TRUE
post中的参数:
OBJECT_ID |
149 |
OBJECT_LABEL |
DEMO_CHART_SALES |
ROLE |
/spagobi/admin |
SBI_EXECUTION_ID |
852c541d544c11e4a543055f86358ffb |
isFromCross |
false |
isPossibleToComeBackToRolePage |
false |
响应:
{"results":[]}
在生成的GetSnapshotsAction类实例的doService()方法中,
1) 首先获取上一步生成的instance实例,拿到封装的BIObject的id,查询快照列表:
snapshotsList = DAOFactory.getSnapshotDAO().getSnapshots(biobjectId);
只查询该报表相关的快照list, 单表操作sbi_snapshots
2)将snapshotsList 以json方式返回到前端。
五、获取subObject的action 。 GET_SUBOBJECTS_ACTION
页面:web-content/js/src/ext/sbi/execution/SubobjectsPanel.js //49
请求:http://localhost:8080/SpagoBI/servlet/AdapterHTTP?ACTION_NAME=GET_SUBOBJECTS_ACTION &LIGHT_NAVIGATOR_DISABLED=TRUE
除了上面两个参数,还有post参数:
OBJECT_ID |
149 |
OBJECT_LABEL |
DEMO_CHART_SALES |
ROLE |
/spagobi/admin |
SBI_EXECUTION_ID |
55c5a950545811e4a543055f86358ffb |
isFromCross |
false |
isPossibleToComeBackToRolePage |
false |
响应:
{"results":[]}
在生成的GetSubObjectsAction类实例的doService()方法中,
1) 首先获取上一步生成的instance实例,拿到封装的BIObject的id,
if (userProfile.isAbleToExecuteAction(SpagoBIConstants.DOCUMENT_MANAGEMENT_ADMIN)) {
//"DocumentAdminManagement"
subObjectsList = DAOFactory.getSubObjectDAO().getSubObjects(biobjectId);
} else {
subObjectsList = DAOFactory.getSubObjectDAO().getAccessibleSubObjects(biobjectId, userProfile);
}
单表操作sbi_subobjects
2)将list以json的方式返回给前端。
【】六、获取ViewPoints的action 。GET_VIEWPOINTS_ACTION
页面:web-content/js/src/ext/sbi/execution/ViewpointsPanel.js //44
请求:http://localhost:8080/SpagoBI/servlet/AdapterHTTP?ACTION_NAME=GET_VIEWPOINTS_ACTION &LIGHT_NAVIGATOR_DISABLED=TRUE
除了上面的参数,还有post参数:
OBJECT_ID |
149 |
OBJECT_LABEL |
DEMO_CHART_SALES |
ROLE |
/spagobi/admin |
SBI_EXECUTION_ID |
55c5a950545811e4a543055f86358ffb |
isFromCross |
false |
isPossibleToComeBackToRolePage |
false |
响应:
{"results":[]}
在生成的GetViewpointsAction类实例的doService()方法中,
1) 首先获取上一步生成的instance实例,拿到封装的BIObject的id,
viewpointDAO = DAOFactory.getViewpointDAO();
viewpoints = viewpointDAO.loadAccessibleViewpointsByObjId(biobjectId, getUserProfile());
执行的hsql:
String hql = "from SbiViewpoints vp where vp.sbiObject.biobjId = ? and (vp.vpScope = 'Public' or vp.vpScope = 'PUBLIC' or "+ "vp.vpOwner = ?)";
Query hqlQuery = aSession.createQuery(hql);
hqlQuery.setInteger(0, objId.intValue());
hqlQuery.setString(1, (String)((UserProfile)userProfile).getUserId());
2)将结果list以json的方式传递到前端。
【】七、获取执行的url。GET_URL_FOR_EXECUTION_ACTION
页面:web-content/js/src/ext/sbi/execution/DocumentPage.js //227
请求:http://localhost:8080/SpagoBI/servlet/AdapterHTTP?ACTION_NAME=GET_URL_FOR_EXECUTION_ACTION&LIGHT_NAVIGATOR_DISABLED=TRUE
除了url的参数外,在post中参数:
OBJECT_ID |
149 |
OBJECT_LABEL |
DEMO_CHART_SALES |
PARAMETERS |
{"state":"AL","state_field_visible_description":"AL"} |
ROLE |
/spagobi/admin |
SBI_EXECUTION_ID |
852c541d544c11e4a543055f86358ffb |
isFromCross |
false |
isPossibleToComeBackToRolePage |
false |
响应:
{"url":"http://localhost:8080/SpagoBI/servlet/AdapterHTTP?NEW_SESSION=TRUE&user_id=biadmin&PAGE=ExecuteBIObjectPage&TITLE_VISIBLE=FALSE &TOOLBAR_VISIBLE=FALSE&OBJECT_LABEL=DEMO_CHART_SALES &ROLE=/spagobi/admin&RUN_ANYWAY=TRUE &IGNORE_SUBOBJECTS_VIEWPOINTS_SNAPSHOTS=TRUE &SBI_EXECUTION_ID=852c541d544c11e4a543055f86358ffb&LIGHT_NAVIGATOR_ID=cb1c69df-924f-4e28-a167-923c90bdf96f &state=AL&isFromCross=false&SBI_ENVIRONMENT=DOCBROWSER"}
在生成的GetUrlForExecutionAction类实例的doService()方法中,
1) 首先获取上一步生成的instance实例,拿到封装的BIObject
2)校验PARAMETERS的各个参数值是否符合类型(eg:emai)。
3)获取前半部分url。
String url = executionInstance.getExecutionUrl(locale);
注意:拼接成的url中,
http://localhost:8080/SpagoBI/servlet/AdapterHTTP?NEW_SESSION=TRUE&user_id=biadmin:这一部分是基准baseurl;
PAGE=ExecuteBIObjectPage&TITLE_VISIBLE=FALSE &TOOLBAR_VISIBLE=FALSE&OBJECT_LABEL=DEMO_CHART_SALES &ROLE=/spagobi/admin&RUN_ANYWAY=TRUE &IGNORE_SUBOBJECTS_VIEWPOINTS_SNAPSHOTS=TRUE &SBI_EXECUTION_ID=47881c55546511e493679b75d769a0f2 &LIGHT_NAVIGATOR_ID=cb1c69df-924f-4e28-a167-923c90bdf96f :参数中,蓝色部分是从变量中拿到,其它都是固定的值,LIGHT_NAVIGATOR_ID是uuid随机生成的;
state=AL&isFromCross=false&SBI_ENVIRONMENT=DOCBROWSER : state是从biobject的parameters的list遍历各个参数对象出来的;isFromCross是从前端传递过来的的;SBI_ENVIRONMENT是从前端传递过来的,如果该参数没有,则指定为DOCBROWSER 。
4)将url以json格式传递到前端。
【】八、获取note的action。GET_NOTES_ACTION
前端页面:/web-content/js/src/ext/sbi/execution/toolbar/DocumentExecutionPageToolbar.js // 188
请求:http://localhost:8080/SpagoBI/servlet/AdapterHTTP?ACTION_NAME=GET_NOTES_ACTION&LIGHT_NAVIGATOR_DISABLED=TRUE
其它post参数:
MESSAGE |
GET_LIST_NOTES |
SBI_EXECUTION_ID |
852c541d544c11e4a543055f86358ffb |
响应:
{"results":[],"totalCount":0}
在生成的GetNotesAction类实例的doService()方法中,
1) 首先获取上一步生成的instance实例,拿到封装的BIObject,获取一个加密串execIdentifier;
2)查询出List<ObjNote>,遍历list,如果当前objNote的owner和user的id一致(eg:userid=“biadmin”),则将当前objNote的isDeletable置为true;否则如果当前报表是公共的,则将isDeletable置为false。
3)将设置后的list以json的方式返回到前端。
【】九、执行拼装的url。PAGE=ExecuteBIObjectPage
页面:/web-content/js/execution.js //55
/web-content/js/src/sdk/services.js //28
请求:url=http://localhost:8080/SpagoBI/servlet/AdapterHTTPNEW_SESSION=TRUE&user_id=biadmin&
PAGE=ExecuteBIObjectPage&TITLE_VISIBLE=FALSE&TOOLBAR_VISIBLE=FALSE&
OBJECT_LABEL=DEMO_CHART_SALES&ROLE=/spagobi/admin
&RUN_ANYWAY=TRUE&IGNORE_SUBOBJECTS_VIEWPOINTS_SNAPSHOTS=TRUE
&SBI_EXECUTION_ID=852c541d544c11e4a543055f86358ffb
&LIGHT_NAVIGATOR_ID=03f5c94c-28ff-4d97-adb6-f768639a3cca&state=AL
&isFromCross=false&SBI_ENVIRONMENT=DOCBROWSER
过程:
businessType = “page”
businessName=“ExecuteBIObjectPage”
用ModuleCoordinate协调器来处理页面请求(businessType = “page”),在service()方法中,
1)创建page处理实例。
PageIFace page = PageFactory.getPage(getRequestContainer(), getBusinessName()); //84 用page工厂创建
创建page处理类实例,默认创建DefaultPage类实例。
2)调用DefaultPage的service()方法处理。
1、创建businessName=“ExecuteBIObjectPage”对应的模块类ExecuteBIObjectModule。工厂方法创建。
1.1 在ExecuteBIObjectModule类中创建执行实例ExecutionInstance,同时加载报表的BIObject(engieer、paramter等)。
// instantiates a new Execution controller for the current execution
ExecutionInstance instance = createExecutionInstance(id, role, profile, request, modality);
1.2 从执行实例ExecutionInstance获取引擎engine信息,并反射创建该引擎。
(eg: SpagoBIChartInternalEngine)
String className = engine.getClassName();
internalEngine = (InternalEngineIFace) Class.forName(className).newInstance();
1.3启动引擎实例执行(也就是在ExecuteBIObjectModule中调用了真正的前端引擎)
// starts engine's execution
if (subObj != null)
internalEngine.executeSubObject(this.getRequestContainer(), obj, response, subObj);
else
internalEngine.execute(this.getRequestContainer(), obj, response);
1.4 调用具体引擎的execute()方法。(在具体引擎中才加载chart配置)
该方法主要根据sbi_object 和sbi_object_template、sbi_binary_contents表中读取studio上传的xml文件,找出chart的类型,组织成前端布局的div属性以及chart的config的json数据,在前端创建chart的div框和chart对象创建。
这里的config如下:
{"chart":{"defaultSeriesType":"bar","zoomType":"xy"},"title":{"text":"Sales"},"subtitle":{"text":"Year: 2012 - State: AL "},"legend":{"enabled":false},"xAxis":{"TITLE":"Family","alias":"FAMILY","title":{"text":""}},"yAxis":[{"alias":"SALES","min":0.0,"title":{"text":"Values (USD)"}}],"plotOptions":{"bar":{"enableMouseTracking":true,"dataLabels":{"enabled":true,"formatter":"numberFormat(2,\",\",\".\")"}}},"series":[{"name":"Sales","alias":"FAMILY,SALES","color":"red"}],"tooltip":{"formatter":"userFunction( this.series.name +\" : \" + Highcharts.numberFormat(this.point.y,2, \",\", \".\") + \" $\" )","style":{"color":"#26783f","fontSize":"12px","padding":"2px"}},"drill":{"document":"DEMO_WATERFALL_01","param":[{"name":"indicator","type":"ABSOLUTE","value":"SALES"}]}}
十、调用数据来渲染刚生成的前端组件。EXECUTE_DATASETS_ACTION
请求:
http://localhost:8080/SpagoBI/servlet/AdapterHTTP?ACTION_NAME=EXECUTE_DATASETS_ACTION &SBI_EXECUTION_ID=f364be3a551411e48d10bde50be672cd&LIGHT_NAVIGATOR_DISABLED=TRUE&MESSAGE_DET=DATASET_EXEC&id=47&label=DS_DEMO42_003&dsTypeCd=Query&trasfTypeCd=&start=-1&limit=-1&pars=[{%22name%22:%22state%22,%22value%22:%22AL%22}]&_dc=1413452464619
参数:
ACTION_NAME |
EXECUTE_DATASETS_ACTION |
LIGHT_NAVIGATOR_DISABLED |
TRUE |
MESSAGE_DET |
DATASET_EXEC |
SBI_EXECUTION_ID |
852c541d544c11e4a543055f86358ffb |
_dc |
1413454731745 |
dsTypeCd |
Query |
id |
47 |
label |
DS_DEMO42_003 |
limit |
-1 |
pars |
[{"name":"state","value":"AL"}] |
start |
-1 |
trasfTypeCd |
|
处理逻辑在ExecuteDatasets类的service(),核心代码如下:
Integer dsId = getAttributeAsInteger(DataSetConstants.ID);
JSONObject dataSetJSON =getJSONDatasetResult(dsId, profile);
根据dsId 和用户配置,获取该文档的数据,json格式为:
{
"metaData": {
"totalProperty": "results",
"root": "rows",
"id": "id",
"fields": [
"recNo",
{
"name": "column_1",
"header": "FAMILY",
"dataIndex": "column_1",
"type": "string"
},
{
"name": "column_2",
"header": "UNIT_SALES",
"dataIndex": "column_2",
"type": "float"
},
{
"name": "column_3",
"header": "SALES",
"dataIndex": "column_3",
"type": "float"
},
{
"name": "column_4",
"header": "COSTS",
"dataIndex": "column_4",
"type": "float"
}
]
},
"results": 3,
"rows": [
{
"id": 1,
"column_1": "Drink",
"column_2": "2227.0",
"column_3": "4411.13",
"column_4": "1754.71"
},
{
"id": 2,
"column_1": "Food",
"column_2": "17257.0",
"column_3": "36909.33",
"column_4": "14782.3"
},
{
"id": 3,
"column_1": "Non-Consumable",
"column_2": "4583.0",
"column_3": "9811.59",
"column_4": "3942.73"
}
]
}
八、sesson过时action。 SESSION_EXPIRED_ACTION
public void service(SourceBean request, SourceBean response) throws Exception {
logger.debug("IN");
logger.debug("OUT");
}