package com.norteksoft.tags.search; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.Tag; import javax.servlet.jsp.tagext.TagSupport; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.norteksoft.bs.options.entity.Option; import com.norteksoft.bs.options.entity.OptionGroup; import com.norteksoft.mms.form.entity.ListColumn; import com.norteksoft.mms.form.entity.ListView; import com.norteksoft.mms.form.service.FormHtmlParser; import com.norteksoft.mms.form.service.ListColumnManager; import com.norteksoft.mms.form.service.ListViewManager; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.product.util.JsonParser; import com.norteksoft.product.util.freemarker.TagUtil; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.LocaleProvider; import com.opensymphony.xwork2.TextProvider; import com.opensymphony.xwork2.TextProviderFactory; public class SearchTag extends TagSupport { private static final long serialVersionUID = 1L; private Log log = LogFactory.getLog(SearchTag.class); private String tableId; private String listTableCode; private String submitForm; private String url; @SuppressWarnings("unused") private Integer fixedSearchSign;//如果有固定查询先显示固定查询的标记 private ListColumnManager listColumnManager; private ListViewManager listViewManager; private FormHtmlParser formHtmlParser; @Override public int doStartTag() throws JspException { try { ((HttpServletRequest)this.pageContext.getRequest()).setCharacterEncoding("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } JspWriter out=pageContext.getOut(); try { log.debug("read templet begin"); out.print(readScriptTemplet()); log.debug("read templet over"); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return Tag.EVAL_PAGE; } @Override public int doEndTag() throws JspException { return Tag.EVAL_PAGE; } private String readScriptTemplet() throws Exception{ List<ObjectField> fieldList = new ArrayList<ObjectField>(); String fieldString = getFieldListByCode(listTableCode); //判断是否高级查询从mms中取值 String advancedSearch = getSearchPropertyByCode(listTableCode,"isAdvancedQuery"); //判断是否弹框从mms中取值 String containerId = getSearchPropertyByCode(listTableCode,"isContainerIdQuery"); dealWithFieldString(fieldString, fieldList); List<ObjectField> fixedFields = new ArrayList<ObjectField>(); for (ObjectField field : fieldList) { if(field.getFixedField()){ fixedFields.add(field); } } String jsonStr = JsonParser.object2Json(fieldList); Map<String, Object> root=new HashMap<String, Object>(); root.put("webRoot", this.pageContext.getServletContext().getContextPath()); root.put("tableId", tableId); root.put("submitForm", submitForm); root.put("url", url); root.put("containerId", containerId); root.put("advancedSearch", advancedSearch); //root.put("rushZoon", rushZoon); root.put("fieldList", jsonStr); root.put("fixedField", fixedFields); root.put("fixedSearchSign", fixedFields.size()); root.put("textProvider", textProvider); log.debug("templet parameter set begin"); // String result = FtlUtil.renderFile(root, "search.ftl"); String result = TagUtil.getContent(root, "search/search.ftl"); log.debug("templet parameter set over"); return result; } //[{enName:groupName,chName:工作流名称,propertyType:STRING,fixedField:false},{enName:title,chName:任务名称,propertyType:STRING,fixedField:true},{enName:name,chName:环节名称,propertyType:STRING,fixedField:false},{enName:createDate,chName:生成日期,propertyType:DATE,fixedField:true},{enName:creatorName,chName:流程发起人,propertyType:STRING,fixedField:true}] private void dealWithFieldString(String fieldString, List<ObjectField> fieldList) { int endIndex = 0; while((endIndex = fieldString.indexOf("}"))>=0){ int beginIndex = fieldString.indexOf("{"); String partStr = fieldString.substring(beginIndex+1, endIndex); //partStr = enName:groupName,chName:工作流名称,propertyType:STRING,fixedField:false,optionsCode:*** ObjectField field = new ObjectField(); String[] elements = partStr.split(","); for (String element : elements) { //element = enName:groupName String[] part = element.split(":"); if("enName".equals(part[0].trim())){ field.setEnName(part[1].trim()); }else if("chName".equals(part[0].trim())){ field.setChName(part[1].trim()); }else if("propertyType".equals(part[0].trim())){ field.setPropertyType(PropertyType.valueOf(part[1].trim())); }else if("fixedField".equals(part[0].trim())){ field.setFixedField(Boolean.valueOf(part[1].trim())); }else if("optionsCode".equals(part[0].trim())){ field.setOptionsCode(part[1].trim()); }else if("enumName".equals(part[0].trim())){ field.setEnumName(part[2].trim()); }else if("keyValue".equals(part[0].trim())){ field.setKeyValue(part[1].trim().replace("$", ":").replace("#", ",")); }else if("beanName".equals(part[0].trim())){ field.setBeanName(part[1].trim().replace("$", ":").replace("#", ",")); }else if("optionGroup".equals(part[0].trim())){ field.setOptionGroup(part[1].trim()); } } if(field.getPropertyType() == PropertyType.BOOLEAN){ List<Option> options = new ArrayList<Option>(); Option option = new Option(); option.setName(textProvider.getText("common.yes")); option.setValue("true"); options.add(option); option = new Option(); option.setName(textProvider.getText("common.no")); option.setValue("false"); options.add(option); field.setDefaultValues(options); }else if(field.getPropertyType() == PropertyType.ENUM){ try { Object[] objs = Class.forName(field.getEnumName()).getEnumConstants(); List<Option> options = new ArrayList<Option>(); Option option = null; for(Object obj : objs){ option = new Option(); options.add(option); option.setName(textProvider.getText(BeanUtils.getProperty(obj, "code"))); option.setValue(obj.toString()); } field.setDefaultValues(options); } catch (Exception e) { log.debug("Enum error:", e); } }else if(field.getPropertyType() == PropertyType.STRING){ String keyValue = field.getKeyValue(); String beanName = field.getBeanName(); String optionGroup = field.getOptionGroup(); if(beanName != null && !"".equals(beanName.trim()) && beanName.contains("beanname")){//接口 beanName = beanName.substring(8, beanName.length()); String[] property = beanName.split(","); field.setDefaultValues(createOption(property)); }else if(keyValue != null && !"".equals(keyValue.trim())){//键值对 String[] property = keyValue.split(","); field.setDefaultValues(createOption(property)); }else if(optionGroup != null && !"".equals(optionGroup.trim())){//选项组 String[] property = getOptionGroupByCode(optionGroup).split(","); field.setDefaultValues(createOption(property)); } } fieldList.add(field); fieldString = fieldString.replace("{" + partStr + "}", ""); //[,,,,] } } private final transient TextProvider textProvider = new TextProviderFactory().createInstance(getClass(), new LocaleProvider(){ public Locale getLocale() { ActionContext ctx = ActionContext.getContext(); if (ctx != null) { return ctx.getLocale(); } else { log.debug("Action context not initialized"); return null; } }}); //通过列表编号获得想要查询的字段信息 private String getFieldListByCode(String ListTableCode){ String fieldString="["; listColumnManager = (ListColumnManager)ContextUtils.getBean("listColumnManager"); List<ListColumn> ListColumns = listColumnManager.getQueryColumnsByCode(ListTableCode); listViewManager = (ListViewManager)ContextUtils.getBean("listViewManager"); formHtmlParser = (FormHtmlParser)ContextUtils.getBean("formHtmlParser"); ListView listView = listViewManager.getListViewByCode(ListTableCode); Boolean isStandard = listView.getStandard(); for(ListColumn listColumn : ListColumns){ //值设置 String valueSet = listColumn.getValueSet(); String enName = listColumn.getTableColumn().getName(); //自定义表单在字段名前面加dt_ if(isStandard==false){enName="dt_"+enName;} String chName = formHtmlParser.getInternation(listColumn.getHeaderName()); String propertyType = listColumn.getTableColumn().getDataType().toString(); if("TEXT".equals(propertyType)){ propertyType = "STRING"; }else if("CLOB".equals(propertyType)||"BLOB".equals(propertyType)||"COLLECTION".equals(propertyType)){ continue; } if(StringUtils.isNotEmpty(listColumn.getQuerySettingValue())&&listColumn.getQuerySettingValue().contains("FIXED")){//固定查询 String fixedField = "true"; fieldString = fillFieldString(fieldString,propertyType,enName,chName,fixedField,valueSet,listColumn); }else if(StringUtils.isNotEmpty(listColumn.getQuerySettingValue())&&listColumn.getQuerySettingValue().contains("CUSTOM")){//自定义查询 String fixedField = "false"; fieldString = fillFieldString(fieldString,propertyType,enName,chName,fixedField,valueSet,listColumn); } } if(fieldString.length()>1){ fieldString = fieldString.substring(0,fieldString.length()-1); fieldString += "]"; }else{ fieldString = ""; } return fieldString; } //通过列表编号判断属性 private String getSearchPropertyByCode(String ListTableCode,String searchType){ String sign = ""; listViewManager = (ListViewManager)ContextUtils.getBean("listViewManager"); ListView listView = listViewManager.getListViewByCode(ListTableCode); Boolean propertyBoolean = null; if(searchType=="isAdvancedQuery"){ propertyBoolean = listView.getAdvancedQuery(); }else if(searchType=="isContainerIdQuery"){ if(listView.getPopUp()==null||listView.getPopUp()){//数据库中没值或者是弹出式查询时 propertyBoolean = false; }else{ propertyBoolean = true; } } if(propertyBoolean){ sign = "true"; }else{ sign = "false"; } return sign; } //通过值设置获得选项组 private String getOptionGroupByCode(String valueSet){ StringBuilder opitions=new StringBuilder(); com.norteksoft.product.api.entity.OptionGroup group = ApiFactory.getSettingService().getOptionGroupByCode(valueSet); if(group!=null){ int i=0; List<com.norteksoft.product.api.entity.Option> ops=ApiFactory.getSettingService().getOptionsByGroup(group.getId()); for(com.norteksoft.product.api.entity.Option op:ops){ i++; opitions.append(op.getValue()) .append(":") .append(op.getName()); if(i<ops.size()){ opitions.append(","); } } } return opitions.toString(); } //通过值设置和列获得接口 private String getOPtionByListColumnAndValueSet(ListColumn listColumn,String valueSet){ formHtmlParser = (FormHtmlParser)ContextUtils.getBean("formHtmlParser"); String colName = listColumn.getTableColumn().getName(); String getOptions = formHtmlParser.getOptionsByBeanName(valueSet, colName, null); return getOptions; } //生成option private List<Option> createOption(String[] property){ List<Option> options = new ArrayList<Option>(); Option option = null; for (String p : property) { option = new Option(); String[] part = p.split(":"); options.add(option); option.setName(part[1].trim()); option.setValue(part[0].trim()); } return options; } private String fillFieldString(String fieldString,String propertyType,String enName,String chName,String fixedField,String valueSet,ListColumn listColumn){ if("ENUM".equals(propertyType)){//枚举的值设置 fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",enumName:"+valueSet+"},"; }else if("STRING".equals(propertyType) && valueSet != null && !"".equals(valueSet.trim())){ if(valueSet.contains("beanname")){//接口 String bneannameValSet = getOPtionByListColumnAndValueSet(listColumn, valueSet); bneannameValSet = bneannameValSet.replace(",", "#").replace("\'", ""); bneannameValSet = bneannameValSet.replace(":", "$"); fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",beanName:beanname"+bneannameValSet+",optionsCode:exist"+"},"; }else if(valueSet.contains(":")){//键值对 valueSet = valueSet.replace(",", "#"); valueSet = valueSet.replace(":", "$"); valueSet = valueSet.replace("'", ""); fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",keyValue:"+valueSet+",optionsCode:exist"+"},"; }else{//选项组 //valueSet = valueSet.replace(":", "$"); fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",optionGroup:"+valueSet+",optionsCode:exist"+"},"; } }else{ fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+"},"; } return fieldString; } public void setTableId(String tableId) { this.tableId = tableId; } public String getListTableCode() { return listTableCode; } public void setListTableCode(String listTableCode) { this.listTableCode = listTableCode; } public void setSubmitForm(String submitForm) { this.submitForm = submitForm; } public void setUrl(String url) { this.url = url; } public void setFixedSearchSign(Integer fixedSearchSign) { this.fixedSearchSign = fixedSearchSign; } }