职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 387|回复: 6

如何在不改变源码的情况下对方法中间产生值进行处理

[复制链接]
只学java 发表于 2011-8-22 09:42 | 显示全部楼层 |阅读模式
最近一段时间,在研究jpivot+mondrian的olap方案,因为技术选型已经定下来了,而需求上面很多东西jpicot暂时没有直接提供实现,只有对jpicot进行封装改造。

里面涉及到一个很常见的需求,就是jpivot原生的生成报表中,对于表头是没有进行排序的,这样在很多情况下,比如有对时间维度进行统计的时候,会出现时间上是乱序的,因为短时间不可能去改mondrian的代码,所以只好直接在标签返回的时候对生成的一个中间结果进行强制排序,这个时候就出现了一个问题。

比如,原始代码是这样的

Java代码  
public int doEndTag() throws JspException {   
        logger.info("enter " + ref);   
  
        try {   
            RequestContext context = RequestContext.instance();   
            Object x = context.getModelReference(getRef());   
          。。。   
            Renderable comp = (Renderable) x;   
  
            if (comp instanceof Visible && !((Visible) comp).isVisible())   
                return EVAL_PAGE;   
  
            if (comp instanceof RoleExprHolder) {   
                String roleExpr = ((RoleExprHolder) comp).getRoleExpr();   
                if (!context.isUserInRole(roleExpr))   
                    return EVAL_PAGE;   
            }   
  
            
            createPredefinedParameters(context);   
  
            Transformer transformer = XmlUtils.getTransformer(pageContext.getSession(), xslUri, xslCache);   
            setXslParameters(context, transformer);   
  
            Document document = comp.render(context);   
  
            setXmlParameters(document);   
  
            DOMSource source = new DOMSource(document);   
            StringWriter sw = new StringWriter();   
            StreamResult result = new StreamResult(sw);   
               
            transformer.transform(source, result);   
            sw.flush();   
  
            pageContext.getOut().write(sw.toString());   
  
            parameters.clear();   
            logger.info("leave " + ref);   
            return EVAL_PAGE;   
        } catch (Exception e) {   
          。。。   
        }   
    }  

public int doEndTag() throws JspException {
        logger.info("enter " + ref);

        try {
            RequestContext context = RequestContext.instance();
            Object x = context.getModelReference(getRef());
          。。。
            Renderable comp = (Renderable) x;

            if (comp instanceof Visible && !((Visible) comp).isVisible())
                return EVAL_PAGE;

            if (comp instanceof RoleExprHolder) {
                String roleExpr = ((RoleExprHolder) comp).getRoleExpr();
                if (!context.isUserInRole(roleExpr))
                    return EVAL_PAGE;
            }

         
            createPredefinedParameters(context);

            Transformer transformer = XmlUtils.getTransformer(pageContext.getSession(), xslUri, xslCache);
            setXslParameters(context, transformer);

            Document document = comp.render(context);

            setXmlParameters(document);

            DOMSource source = new DOMSource(document);
            StringWriter sw = new StringWriter();
            StreamResult result = new StreamResult(sw);
            
            transformer.transform(source, result);
            sw.flush();

            pageContext.getOut().write(sw.toString());

            parameters.clear();
            logger.info("leave " + ref);
            return EVAL_PAGE;
        } catch (Exception e) {
          。。。
        }
    }
现在的方法是在doucument中直接排序,变成
Java代码  
  Document document = comp.render(context);   
  
            setXmlParameters(document);   
document=DocumentSort.sort(document);   
  
            DOMSource source = new DOMSource(document);  

  Document document = comp.render(context);

            setXmlParameters(document);
document=DocumentSort.sort(document);

            DOMSource source = new DOMSource(document);  
但是这样一来,就必须要直接改动源码,不方便日后的升级和维护,而对于动态代理或者aop来说,只能在调用方法的前后进行额外的处理,那么对于这种对于方法中间结果的处理,有比较好的方法么~~~



月上萧萧 发表于 2011-8-22 09:42 | 显示全部楼层
jp里面有个reuslt 的chain,你在那个result chain里面去加入sorting就ok了

这样的话 你还能通过 页面控制按什么排序

不过还涉及jp原有ui的改动,挺复杂的

当然还需要加相关的comp的问题

而且。。。。你就别相信jp这东西会更新了,刚看了一下。。。。还是三年前那个版本。。。

话说我当年 发表于 2011-8-22 09:42 | 显示全部楼层
humaeks 写道
jp里面有个reuslt 的chain,你在那个result chain里面去加入sorting就ok了

这样的话 你还能通过 页面控制按什么排序

不过还涉及jp原有ui的改动,挺复杂的

当然还需要加相关的comp的问题

而且。。。。你就别相信jp这东西会更新了,刚看了一下。。。。还是三年前那个版本。。。



兄弟能具体说下这个chain在哪么,jpivot都没一个指南,就提供个api~~~
现在更悲剧的是jpivot没更新了,但是mondrian在更新自己的时候,按照自己的需要把jpivot给改了,还不给源码~~~

北大青鸟 发表于 2011-8-22 09:43 | 显示全部楼层
love_ai87 写道
humaeks 写道
jp里面有个reuslt 的chain,你在那个result chain里面去加入sorting就ok了

这样的话 你还能通过 页面控制按什么排序

不过还涉及jp原有ui的改动,挺复杂的

当然还需要加相关的comp的问题

而且。。。。你就别相信jp这东西会更新了,刚看了一下。。。。还是三年前那个版本。。。



兄弟能具体说下这个chain在哪么,jpivot都没一个指南,就提供个api~~~
现在更悲剧的是jpivot没更新了,但是mondrian在更新自己的时候,按照自己的需要把jpivot给改了,还不给源码~~~


jp有个xml文件 配置 comp的,在里面可以加入相关的comp

然后你查 getResult(Result result) 这个方法,就会见到那个 chain

jp貌似已经全停了。。。之前dev的mail list也是没东西的

话说我当年 发表于 2011-8-22 09:43 | 显示全部楼层
humaeks 写道
love_ai87 写道
humaeks 写道
jp里面有个reuslt 的chain,你在那个result chain里面去加入sorting就ok了

这样的话 你还能通过 页面控制按什么排序

不过还涉及jp原有ui的改动,挺复杂的

当然还需要加相关的comp的问题

而且。。。。你就别相信jp这东西会更新了,刚看了一下。。。。还是三年前那个版本。。。



兄弟能具体说下这个chain在哪么,jpivot都没一个指南,就提供个api~~~
现在更悲剧的是jpivot没更新了,但是mondrian在更新自己的时候,按照自己的需要把jpivot给改了,还不给源码~~~


jp有个xml文件 配置 comp的,在里面可以加入相关的comp

然后你查 getResult(Result result) 这个方法,就会见到那个 chain

jp貌似已经全停了。。。之前dev的mail list也是没东西的


没办法啊,之前的老项目就是用的这个,到处都找不到资料,看的头都疼了~
谢谢你了~~


叫我小乖 发表于 2011-8-22 09:43 | 显示全部楼层
love_ai87 写道
humaeks 写道
love_ai87 写道
humaeks 写道
jp里面有个reuslt 的chain,你在那个result chain里面去加入sorting就ok了

这样的话 你还能通过 页面控制按什么排序

不过还涉及jp原有ui的改动,挺复杂的

当然还需要加相关的comp的问题

而且。。。。你就别相信jp这东西会更新了,刚看了一下。。。。还是三年前那个版本。。。



兄弟能具体说下这个chain在哪么,jpivot都没一个指南,就提供个api~~~
现在更悲剧的是jpivot没更新了,但是mondrian在更新自己的时候,按照自己的需要把jpivot给改了,还不给源码~~~


jp有个xml文件 配置 comp的,在里面可以加入相关的comp

然后你查 getResult(Result result) 这个方法,就会见到那个 chain

jp貌似已经全停了。。。之前dev的mail list也是没东西的


没办法啊,之前的老项目就是用的这个,到处都找不到资料,看的头都疼了~
谢谢你了~~



我手头也没有代码了。有问题再讨论呗


会玩就好 发表于 2011-8-22 09:43 | 显示全部楼层
asm动态修改字节码
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-16 18:51 , Processed in 0.125636 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表