|
最近一段时间,在研究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来说,只能在调用方法的前后进行额外的处理,那么对于这种对于方法中间结果的处理,有比较好的方法么~~~
|
|