/*****************************************************************************
* *
* This file is part of the tna framework distribution. *
* Documentation and updates may be get from biaoping.yin the author of *
* this framework *
* *
* Sun Public License Notice: *
* *
* The contents of this file are subject to the Sun Public License Version *
* 1.0 (the "License"); you may not use this file except in compliance with *
* the License. A copy of the License is available at http://www.sun.com *
* *
* The Original Code is tag. The Initial Developer of the Original *
* Code is biaoping yin. Portions created by biaoping yin are Copyright *
* (C) 2000. All Rights Reserved. *
* *
* GNU Public License Notice: *
* *
* Alternatively, the contents of this file may be used under the terms of *
* the GNU Lesser General Public License (the "LGPL"), in which case the *
* provisions of LGPL are applicable instead of those above. If you wish to *
* allow use of your version of this file only under the terms of the LGPL *
* and not to allow others to use your version of this file under the SPL, *
* indicate your decision by deleting the provisions above and replace *
* them with the notice and other provisions required by the LGPL. If you *
* do not delete the provisions above, a recipient may use your version of *
* this file under either the SPL or the LGPL. *
* *
* biaoping.yin (yin-bp@163.com) *
* Author of Learning Java *
* *
*****************************************************************************/
package com.frameworkset.common.tag.pager.tags;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import org.apache.log4j.Logger;
import com.frameworkset.common.tag.pager.DataInfo;
import com.frameworkset.common.tag.pager.ObjectDataInfoImpl;
import com.frameworkset.util.StringUtil;
/**
* 从给定的session或者request或者pageContext中获取给定名称的值对象
* 用cellTag显示属性的值,
* 用list tag显示类型为list,set的属性中的对象的属性值.
*
* 如果本标签作为一个分页/列表标签的嵌套标签使用时,
* 可设置colName,property属性,不要设置其他几个属性
* @author biaoping.ying
* @version 1.0
* 2004-9-10
*/
public class DetailTag extends PagerDataSet implements FieldHelper{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(DetailTag.class);
/**详细显示页的显示的字段信息,以逗号分隔*/
protected String field;
/**详细显示页的显示的字段显示名称,以逗号分隔*/
protected String title;
/**详细显示页的显示的字段显示宽度,以逗号分隔*/
protected String width;
protected boolean exportMeta;
protected boolean wapflag = false;
/**
* 指定内置变量beaninfo的变量名称
*/
protected String beaninfoName = "beaninfo";
/**
* 重载父类的方法,分析详细显示页的显示的字段信息为字段数组
* @return 包含信息字段的数组
*/
public String[] getFields() {
if(field == null)
return null;
return StringUtil.split(field,",");
}
public String[] getTitles()
{
if(title == null)
return null;
return StringUtil.split(title,",");
}
/* (non-Javadoc)
* @see com.frameworkset.common.tag.pager.tags.FieldHelper#getWidths()
*/
public String[] getWidths() {
if(width == null)
return null;
return StringUtil.split(width,",");
}
// public void init() throws LoadDataException
// {
// this.pagerContext = new PagerContext(this.request, this.response,
// this.pageContext,this);
//
// // /*
// // * id的值为“pager“,备份先前的页面得上下文环境,然后再将当前得上下文设置到request或pageContext中
// // */
// // if(REQUEST.equals(scope))
// // {
// // this.oldPager = (PagerContext)request.getAttribute(id);
// // request.setAttribute(id,pagerContext);
// // }
//
// // }
// // else
// // {
// // log.debug("DoStartTag pager_info_" + id);
// // pageContext.setAttribute("pager_info_" + id,this);
// // }
//
// pagerContext.setIsList(this.isList);
//
// pagerContext.setField(this.field);
//// pagerContext.setForm(this.form);
// pagerContext.setId(this.getId());
//// pagerContext.setNavindex(this.navindex);
//// pagerContext.setPromotion(this.promotion);
//// pagerContext.setScope(this.scope);
// pagerContext.setTitle(this.title);
//// pagerContext.setMaxIndexPages(this.maxIndexPages);
//// pagerContext.setMaxItems(this.maxItems);
//// pagerContext.setMaxPageItems(this.maxPageItems);
// pagerContext.setWapflag(this.wapflag);
// pagerContext.setWidth(this.width);
//// pagerContext.setIsOffset(this.isOffset);
// pagerContext.setDbname(this.dbname);
// pagerContext.setStatement(this.statement);
// pagerContext.setColName(this.colName);
// pagerContext.setProperty(this.property);
// pagerContext.setRequestKey(this.requestKey);
// pagerContext.setSessionKey(this.sessionKey);
// pagerContext.setPageContextKey(this.pageContextKey);
//// pagerContext.setData(this.data);
//// pagerContext.setUrl(url);
//
//// pagerContext.setUri();
//
// // params = 0;
// // offset = 0;
// // itemCount = 0;
//
//// // 设置是否是升序还是降序
//// String desc_key = pagerContext.getKey("desc");
////
//// String t_desc = request.getParameter(desc_key);
//// boolean desc = false;
//// if (t_desc != null && t_desc.equals("false"))
//// desc = false;
//// else if (t_desc != null && t_desc.equals("true"))
//// desc = true;
////
//// pagerContext.setDesc(desc);
//// // 设置排序关键字,首先通过request.getParameter获取
////
//// String sortKey_key = pagerContext.getKey("sortKey");
////
//// String t_sortKey = request.getParameter(sortKey_key);
//// // 如果获取到的sortKey为空时,通过request.getAttribute获取
//// if (t_sortKey == null)
//// t_sortKey = (String) request.getAttribute(sortKey_key);
//// // 如果上面获取到的sortKey不为null时,设置sortKey
//// if (t_sortKey != null)
//// pagerContext.setSortKey(t_sortKey);
//
//
//// pagerContext.setDataInfo();
//
// pagerContext.init();
// }
public int doStartTag() throws JspException{
try
{
push();
setVariable();
if(this.pagerContext == null)
{
try {
init();
} catch (LoadDataException e) {
if(e.getCause() == null)
log.debug(e.getMessage());
else
log.debug(e.getCause().getMessage());
// return SKIP_BODY;
}
catch (Throwable e) {
if(e.getCause() == null)
log.debug(e.getMessage());
else
log.debug(e.getCause().getMessage());
// return SKIP_BODY;
}
}
/**
* 设置对象的原模型
*/
// setMeta();
// this.flag = true;
initField(pagerContext.getFields());
/**
* 得到页面上要显示的值对象中字段
*
*/
try {
DataInfo dataInfo = pagerContext.getDataInfo();
if (dataInfo == null)
{
loadClassDataNull();
}
else if(dataInfo instanceof ObjectDataInfoImpl)
{
Object data = dataInfo.getObjectData();
// if(data instanceof Collection)
// loadClassData((Collection)data);
// else if(data instanceof Iterator)
// loadClassData((Iterator)data);
if(data instanceof Map)
{
this.loadClassData((Map)data,null);
}
else
{
loadClassData(data,data.getClass());
}
}
// else if(dataInfo instanceof DefaultDataInfoImpl)
// {
// loadClassData(dataInfo);
// }
else if(dataInfo instanceof DataInfo)
loadClassData(dataInfo, pagerContext.ListMode());
// /**
// * 以下的代码对取到的数据(及当前页面数据)进行排序
// */
// sortKey = pagerContext.getSortKey();
} catch (LoadDataException e) {
if(e.getCause() == null)
log.info(e.getMessage());
else
log.info(e.getCause().getMessage());
// e.printStackTrace();
}
catch (Throwable e) {
if(e.getCause() == null)
log.info(e.getMessage());
else
log.info(e.getCause().getMessage());
// e.printStackTrace();
}
// super.fields = getFields();
// String scope = null;
// if(getColName() == null)
// {
// if(statement != null && !statement.equals(""))
// scope = DB_SCOPE;
// else if(sessionKey != null)
// scope = SESSION_SCOPE;
// else if(pageContextKey != null)
// scope = PAGECONTEXT_SCOPE;
// else if(requestKey != null)
// scope = REQUEST_SCOPE;//loadObject(requestKey);
//
// }
// /**
// * 如果本标签作为一个分页/列表标签的嵌套标签使用时,可设置colName,property属性,不要设置其他几个属性
// */
// else
// {
// scope = COLUMN_SCOPE;
// }
// try {
// loadObject(scope);
// } catch (LoadDataException e) {
// // TODO Auto-generated catch block
//
// log.info(e.getMessage());
// //e.printStackTrace();
// //return EVAL_BODY_INCLUDE;
// }
if (size() == 0)
this.rowid = -1;
else
{
rowid = 0;
this.currentValueObject = this.getClassDataValue(rowid);
}
return EVAL_BODY_INCLUDE;
}
catch(Exception e)
{
log.debug("",e);
return EVAL_BODY_INCLUDE;
// throw new JspException(e);
}
//return SKIP_BODY;
}
public void setVariable()
{
// if(id != null && !id.trim().equals(""))
// {
// pageContext.setAttribute("beaninfo_" + id,this);
//
// }
// else
{
pageContext.setAttribute(this.getBeaninfoName() ,this);
}
}
// /**
// * 根据不同的范围获取数据对象
// * @param scope
// * @throws LoadDataException
// */
// protected void loadObject(String scope)
// throws LoadDataException
// {
// Object dataInfo = null;
// if(scope.equals(DB_SCOPE))
// dataInfo = new DefaultDataInfoImpl();
// else if(scope.equals(REQUEST_SCOPE))
// {
// dataInfo = request.getAttribute(requestKey);
// }
// else if(scope.equals(SESSION_SCOPE))
// {
// dataInfo = session.getAttribute(sessionKey);
// }
// else if(scope.equals(PAGECONTEXT_SCOPE))
// {
// dataInfo = pageContext.getAttribute(pageContextKey);
// }
// else if(scope.equals(COLUMN_SCOPE))
// {
// PagerDataSet dataSet =
// searchDataSet(this, PagerDataSet.class);
//
// //System.out.println("dataSet:" + dataSet);
// //System.out.println("dataSet.getRowid():" + dataSet.getRowid());
// /**
// * 根据调用getProperty()方法返回值判断当前列是否为bean
// * 如果为空,表示字段为collection
// *
// * 否则表示字段是一个javabean,getProperty()返回的值为该对象的一个属性,类型为collection
// */
//
// if (getProperty() == null) {
//
// dataInfo =
// dataSet.getValue(
// dataSet.getRowid(),
// getColName());
//
// //System.out.println("dataInfo.size:" + dataInfo.size());
// } else {
// dataInfo =
// dataSet.getValue(
// dataSet.getRowid(),
// getColName(),
// getProperty());
// }
//
// }
// else
// throw new LoadDataException("load from "+ scope +" error: this scope not support!");
////notified by biaoping.yin on 2005.10.9 8:29
//// if (dataInfo == null)
//// throw new LoadDataException("load "+ scope +" error:dataInfo == null || dataInfo.size() == 0");
// try {
// loadClassData(dataInfo);
// } catch (LoadDataException e) {
//
// log.info(e.getMessage());
// e.printStackTrace();
// }
// }
// private void clear()
// {
// if(getNeedClear().equals("true"))
// {
// if(requestKey != null)
// request.removeAttribute(requestKey);
// else if(sessionKey != null)
// session.removeAttribute(sessionKey);
// else if(pageContextKey != null)
// pageContext.removeAttribute(pageContextKey);
// }
// }
public int doEndTag() throws JspException
{
return EVAL_PAGE;
}
/**
* 恢复父DetailTag变量
*
*/
protected void recoverParentBeanInfo()
{
if(stack.size() > 0)
{
DetailTag beaninfo = getParentBeanInfo();
if(beaninfo != null)
this.pageContext.setAttribute(beaninfo.getBeaninfoName(),beaninfo);
// this.pageContext.setAttribute("rowid",dataSet.getRowid() + "");
}
}
/**
* 获取父beaninfo对象实例
* @return DetailTag
*/
private DetailTag getParentBeanInfo()
{
int size = stack.size();
int count = size - 1;
while(count >= 0)
{
Object beaninfo = stack.elementAt(count);
if(beaninfo instanceof DetailTag)
{
return (DetailTag)beaninfo;
}
count --;
}
return null;
}
public void removeVariable()
{
// if(id != null && !id.trim().equals(""))
// {
// pageContext.removeAttribute("beaninfo_" + id);
//
// }
// else
{
pageContext.removeAttribute(this.getBeaninfoName(),PageContext.PAGE_SCOPE);
}
super.removeVariable();
}
/**
* @return Returns the field.
*/
public String getField() {
return field;
}
/**
* @param field The field to set.
*/
public void setField(String field) {
this.field = field;
}
/**
* @return Returns the title.
*/
public String getTitle() {
return title;
}
/**
* @param title The title to set.
*/
public void setTitle(String title) {
this.title = title;
}
/**
* @return Returns the width.
*/
public String getWidth() {
return width;
}
/**
* @param width The width to set.
*/
public void setWidth(String width) {
this.width = width;
}
public int getInt(String field)
{
return super.getInt(0,field.trim());
}
public String getString(String field)
{
return super.getString(0,field.trim());
}
public String getString(String field,String defaultValue)
{
String retValue = getString(0,field.trim());
return retValue == null?defaultValue:retValue;
}
public int getInt(String field,int index)
{
return super.getInt(field.trim(),index);
}
public String getString(String field,int index)
{
return super.getString(field.trim(),index);
}
public String getString(String field,String defaultValue,int index)
{
String retValue = getString(field.trim(),defaultValue,index);
return retValue ;
}
public int doAfterBody() {
// if (this.rowid < this.size() - 1) {
// rowid++;
// if(id != null && !id.trim().equals(""))
// {
// pageContext.setAttribute("rowid_" + id,rowid + "");
// }
// else
// {
// pageContext.setAttribute("rowid",rowid + "");
// }
// return EVAL_BODY_AGAIN;
// } else
{
this.currentValueObject = null;
return SKIP_BODY;
}
}
/**
* @param exportMeta The exportMeta to set.
*/
public void setExportMeta(boolean exportMeta) {
this.exportMeta = exportMeta;
}
/**
* 重写父类中方法,判断是否导出数据到文件中
* @return boolean
*/
protected boolean isExportMeta()
{
//如果是嵌套在分页/列表中的详细信息直接使用父类的方法,否则根据属性的配置来
//判断是否导出数据
if(getColName() != null)
return super.isExportMeta();
else
return this.exportMeta;
}
public boolean isWapflag() {
return wapflag;
}
public void setWapflag(boolean wapflag) {
this.wapflag = wapflag;
}
public String getBeaninfoName() {
return beaninfoName;
}
public void setBeaninfoName(String beaninfoName) {
this.beaninfoName = beaninfoName;
}
@Override
public void doFinally() {
// super.doEndTag();
try
{
super.clear();
this.pagerContext = null;
// pretoken= null;
// endtoken= null;
//
// if(flag)
// {
removeVariable();
beaninfoName = "beaninfo";
//恢复父beaninfo实例
recoverParentBeanInfo();
// }
// this.request = null;
// this.session = null;
// this.response = null;
enablecontextmenu = false;
// this.out = null;
// flag = false;
sqlparamskey = "sql.params.key";
//begin clear some field by biaoping.yin on 2015.3.8 如果不清除,可能导致标签工作beaninfo.getOrigineObject()不能正确工作
this.colName = null;
this.property = null;
this.softparser = true;
this.type = "";
sessionKey = null;
requestKey = null;
this.needClear = false;
pageContextKey = null;
this.statement = null;
this.dbname = null;
this.declare = true;
this.request = null;
this.response = null;
this.out = null;
this.currentValueObject = null;
//end clear some field by biaoping.yin on 2015.3.8
}
catch(Exception e)
{
}
super.doFinally();
}
}