SpaboBI调用一个document的后端分析

 版本: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");

}

 

猜你喜欢

转载自lehsyh.iteye.com/blog/2142707