package j2ee.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Tld文件生成器
* @author kht
*/
public class TldFileCreator {
public static final Integer REQUIRED_FIELD = 1;
public static final Integer P_FIELD = 0;
/*
* 存放不希望被添加到tld文件中的属性
*/
private static List<String> noWantDefinedFields = new ArrayList<String>();
/*
* 存放必须设置的属性
*/
private static List<String> requiredFields = new ArrayList<String>();
/**
* 批量设置不想被添加到tld文件中的属性
* @author kht
* @param noWantDefinedFields
*/
public static void setNoWantDefinedFields(List<String> noWantDefinedFields){
for(int i=0;noWantDefinedFields!=null&&i<noWantDefinedFields.size();i++){
TldFileCreator.noWantDefinedFields.add(noWantDefinedFields.get(i));
}
}
/**
* 批量设置必须填写的属性
* @author kht
* @param requiredFields
*/
public static void setRequiredFields(List<String> requiredFields){
for(int i=0;requiredFields!=null&&i<requiredFields.size();i++){
TldFileCreator.requiredFields.add(requiredFields.get(i));
}
}
/**
* 生成Tld文件
* @author kht
* @param fileName 文件名
* @param fileCreatePath 保存路径
* @param shortName tag shortname
* @param tagObjMap 以tag的name为键,类路径为值的哈希表
*/
public static void createTld(String fileName,String fileCreatePath,String shortName,Map<String,String> tagObjMap){
initNoWantDefinedField();
StringBuffer sgb = createTagFileHeader(shortName);
sgb = createTagFileBody(sgb, tagObjMap);
sgb = createTagFileFooter(sgb);
fileOutput(fileName, fileCreatePath, sgb);
}
/*
* 输出tld文件
* @param fileName
* @param fileCreatePath
* @param tagFile
*/
private static void fileOutput(String fileName,String fileCreatePath,StringBuffer tagFile){
BufferedOutputStream bos = null;
try{
bos = new BufferedOutputStream(new FileOutputStream(new File(fileCreatePath+fileName+".tld")));
bos.write(tagFile.toString().getBytes());
}catch(IOException e){
e.printStackTrace();
}finally{
try {
bos.close();
} catch (IOException e) {
}
}
}
/**
* 得到需要添加到标签库中的属性
* 只能提取当前对象内部定义的属性,不能得到父类的属性
* 可以通过第二个参数传入父类的属性
* key为处理方式 value为属性列表
*/
protected static Map<Integer,Set<String>> getTagDefineFields(Object obj,Map<Integer,Set<String>> fieldNameMap){
Field[] fields = null;
if(obj!=null&&(fields=obj.getClass().getDeclaredFields()).length>0){
Map<Integer,Set<String>> map = fieldNameMap;
if(map==null) map = new HashMap<Integer,Set<String>>();
for(int i=0;i<fields.length;i++){
String fieldName = fields[i].getName();
if(noWantDefinedFields.contains(fieldName)) continue;
if(requiredFields.contains(fieldName)){
Set<String> rfList = map.get(TldFileCreator.REQUIRED_FIELD);
if(rfList==null){
rfList = new HashSet<String>();
map.put(TldFileCreator.REQUIRED_FIELD, rfList);
}
rfList.add(fieldName);
}else{
Set<String> pfList = map.get(TldFileCreator.P_FIELD);
if(pfList==null){
pfList = new HashSet<String>();
map.put(TldFileCreator.P_FIELD, pfList);
}
pfList.add(fieldName);
}
}
return map;
}
return fieldNameMap;
}
/**
* 得到该标签对象的所有要添加的属性
* @param obj
* @return
*/
protected static Map<Integer,Set<String>> getTagObjAllFields(Object obj){
return getTagDefineFields(obj, null);
}
/**
* 创建文件体
*/
private static StringBuffer createTagFileBody(StringBuffer sgf,Map<String,String> tagObjMap){
Set<String> keySet = tagObjMap.keySet();
for(String name : keySet){
String clazz = tagObjMap.get(name);
try {
Object obj = Class.forName(clazz).newInstance();
Map<Integer,Set<String>> fieldsMap = getTagObjAllFields(obj);
if(fieldsMap!=null){
sgf.append("\t<tag>");
sgf.append("\n");
sgf.append("\t\t<name>"+name+"</name>");
sgf.append("\n");
sgf.append("\t\t<tagclass>"+clazz+"</tagclass>");
sgf.append("\n");
Set<String> fields = fieldsMap.get(TldFileCreator.REQUIRED_FIELD);
if(fields!=null&&fields.size()>0){
for(String attr : fields){
sgf.append("\t\t<attribute>");
sgf.append("\n");
sgf.append("\t\t\t<name>"+attr+"</name>");
sgf.append("\n");
sgf.append("\t\t\t<required>true</required>");
sgf.append("\n");
sgf.append("\t\t\t<rtexprvalue>false</rtexprvalue>");sgf.append("\n");
sgf.append("\t\t</attribute>");sgf.append("\n");
}
}
fields = fieldsMap.get(TldFileCreator.P_FIELD);
if(fields!=null&&fields.size()>0){
for(String attr : fields){
sgf.append("\t\t<attribute>");sgf.append("\n");
sgf.append("\t\t\t<name>"+attr+"</name>");sgf.append("\n");
sgf.append("\t\t\t<required>false</required>");sgf.append("\n");
sgf.append("\t\t\t<rtexprvalue>false</rtexprvalue>");sgf.append("\n");
sgf.append("\t\t</attribute>");sgf.append("\n");
}
}
sgf.append("\t</tag>");
sgf.append("\n");sgf.append("\n");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return sgf;
}
/**
* 创建头部内容
* @return
*/
protected static StringBuffer createTagFileHeader(String shortName){
StringBuffer sgb = new StringBuffer();
sgb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sgb.append("\n");
sgb.append("<!DOCTYPE taglib PUBLIC \"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN\"");
sgb.append("\n");
sgb.append("\"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd\">");
sgb.append("\n\n");
sgb.append("<taglib>");
sgb.append("\n");
sgb.append("\t<tlibversion>1.0</tlibversion>");
sgb.append("\n");
sgb.append("\t<jspversion>1.1</jspversion>");
sgb.append("\n");
sgb.append("\t<shortname>"+shortName+"</shortname>");
sgb.append("\n");
return sgb;
}
/**
* 创建尾部内容
* @param sgb
* @return
*/
protected static StringBuffer createTagFileFooter(StringBuffer sgb){
sgb.append("</taglib>");
return sgb;
}
/**
* 初始化不想被添加到tld文件的属性
*/
protected static void initNoWantDefinedField(){
noWantDefinedFields.add("serialVersionUID");
}
public static void main(String[] args) {
String classPrefix = "j2ee.tag.sftd.";
List<String> requiredField = new ArrayList<String>();
requiredField.add("id");
setRequiredFields(requiredField);
List<String> noWantDefinedFields = new ArrayList<String>();
noWantDefinedFields.add("TODAY_SELE_VALUE");
noWantDefinedFields.add("YESTODAY_SELE_VALUE");
noWantDefinedFields.add("TOMORROW_SELE_VALUE");
noWantDefinedFields.add("MONTH_BEGIN_SELE_VALUE");
noWantDefinedFields.add("MONTH_AFTER_SELE_VALUE");
noWantDefinedFields.add("PREFIX");
noWantDefinedFields.add("COMBO_PREFIX");
setNoWantDefinedFields(noWantDefinedFields);
Map<String,String> tagObjMap = new HashMap<String,String>();
//SFTD.tld file
tagObjMap.put("checkBoxSingle", classPrefix+"CheckBox"+"Tag");
tagObjMap.put("DropDownDefinedList", classPrefix+"DropDownDefinedList"+"Tag");
tagObjMap.put("DropDownLookup", classPrefix+"DropDownLookup"+"Tag");
tagObjMap.put("DropDownMulti", classPrefix+"DropDownMulti"+"Tag");
tagObjMap.put("FilterItem", classPrefix+"FilterItem"+"Tag");
tagObjMap.put("HierarchyGrid2", classPrefix+"HierarchyGrid2"+"Tag");
tagObjMap.put("HierarchyGrid", classPrefix+"HierarchyGrid"+"Tag");
tagObjMap.put("LookupDependency", classPrefix+"LookupDependency"+"Tag");
tagObjMap.put("RadioButtonDefinedList", classPrefix+"RadioButtonDefinedList"+"Tag");
tagObjMap.put("Scheduler", classPrefix+"Scheduler"+"Tag");
tagObjMap.put("SingleRecordGrid", classPrefix+"SingleRecordGrid"+"Tag");
tagObjMap.put("SliderControl", classPrefix+"SliderControl"+"Tag");
tagObjMap.put("SuperEditGrid", classPrefix+"SuperEditGrid"+"Tag");
tagObjMap.put("SuperGrid", classPrefix+"SuperGrid"+"Tag");
tagObjMap.put("SuperGroupingGrid", classPrefix+"SuperGroupingGrid"+"Tag");
tagObjMap.put("TextBoxDateKeyword", classPrefix+"TextBoxDateKeyword"+"Tag");
tagObjMap.put("TextBoxDate", classPrefix+"TextBoxDate"+"Tag");
tagObjMap.put("TextBoxDefinedList", classPrefix+"TextBoxDefinedList"+"Tag");
tagObjMap.put("TextBoxDouble", classPrefix+"TextBoxDouble"+"Tag");
tagObjMap.put("TextBoxInt", classPrefix+"TextBoxInt"+"Tag");
tagObjMap.put("TextBoxLong", classPrefix+"TextBoxLong"+"Tag");
tagObjMap.put("TextBoxLookupDrop", classPrefix+"TextBoxLookupDrop"+"Tag");
tagObjMap.put("TextBoxLookup", classPrefix+"TextBoxLookup"+"Tag");
tagObjMap.put("TextBoxMoney", classPrefix+"TextBoxMoney"+"Tag");
tagObjMap.put("TextBoxString", classPrefix+"TextBoxString"+"Tag");
tagObjMap.put("UploadControl", classPrefix+"UploadControl"+"Tag");
tagObjMap.put("ValueimageColumnCollection", classPrefix+"ValueimageColumnCollection"+"Tag");
tagObjMap.put("ValueimageColumn", classPrefix+"ValueimageColumn"+"Tag");
tagObjMap.put("Valueimage", classPrefix+"Valueimage"+"Tag");
tagObjMap.put("CommonView", classPrefix+"CommonView"+"Tag");
createTld("SFTD", "f:\\", "sftd", tagObjMap);
//SFTL.tld file
classPrefix = "j2ee.tag.sftl.";
tagObjMap = new HashMap<String,String>();
tagObjMap.put("BarBreadCrumbs", classPrefix+"BarBreadCrumbs"+"Tag");
tagObjMap.put("BarButtons", classPrefix+"BarButtons"+"Tag");
tagObjMap.put("BarErrorHandler", classPrefix+"BarErrorHandler"+"Tag");
tagObjMap.put("BarFooter", classPrefix+"BarFooter"+"Tag");
tagObjMap.put("BarPanRecords", classPrefix+"BarPanRecords"+"Tag");
tagObjMap.put("ButtonControl", classPrefix+"ButtonControl"+"Tag");
tagObjMap.put("Buttons", classPrefix+"Buttons"+"Tag");
tagObjMap.put("ColumnControl", classPrefix+"ColumnControl"+"Tag");
tagObjMap.put("PageFrame", classPrefix+"PageFrame"+"Tag");
tagObjMap.put("Page", classPrefix+"Page"+"Tag");
tagObjMap.put("PanelControl", classPrefix+"PanelControl"+"Tag");
tagObjMap.put("PopupLink", classPrefix+"PopupLink"+"Tag");
tagObjMap.put("RowControl", classPrefix+"RowControl"+"Tag");
tagObjMap.put("Sections", classPrefix+"Sections"+"Tag");
tagObjMap.put("Section", classPrefix+"Section"+"Tag");
tagObjMap.put("SetupGroup", classPrefix+"SetupGroup"+"Tag");
tagObjMap.put("Sliders", classPrefix+"Sliders"+"Tag");
tagObjMap.put("SubPanel", classPrefix+"SubPanel"+"Tag");
tagObjMap.put("TPColumn", classPrefix+"TPColumn"+"Tag");
createTld("SFTL", "F:\\", "sftl", tagObjMap);
}
}
分享到:
相关推荐
嵌入式八股文面试题库资料知识宝典-华为的面试试题.zip
训练导控系统设计.pdf
嵌入式八股文面试题库资料知识宝典-网络编程.zip
人脸转正GAN模型的高效压缩.pdf
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
少儿编程scratch项目源代码文件案例素材-鸡蛋.zip
嵌入式系统_USB设备枚举与HID通信_CH559单片机USB主机键盘鼠标复合设备控制_基于CH559单片机的USB主机模式设备枚举与键盘鼠标数据收发系统支持复合设备识别与HID
嵌入式八股文面试题库资料知识宝典-linux常见面试题.zip
面向智慧工地的压力机在线数据的预警应用开发.pdf
基于Unity3D的鱼类运动行为可视化研究.pdf
少儿编程scratch项目源代码文件案例素材-霍格沃茨魔法学校.zip
少儿编程scratch项目源代码文件案例素材-金币冲刺.zip
内容概要:本文深入探讨了HarmonyOS编译构建子系统的作用及其技术细节。作为鸿蒙操作系统背后的关键技术之一,编译构建子系统通过GN和Ninja工具实现了高效的源代码到机器代码的转换,确保了系统的稳定性和性能优化。该系统不仅支持多系统版本构建、芯片厂商定制,还具备强大的调试与维护能力。其高效编译速度、灵活性和可扩展性使其在华为设备和其他智能终端中发挥了重要作用。文章还比较了HarmonyOS编译构建子系统与安卓和iOS编译系统的异同,并展望了其未来的发展趋势和技术演进方向。; 适合人群:对操作系统底层技术感兴趣的开发者、工程师和技术爱好者。; 使用场景及目标:①了解HarmonyOS编译构建子系统的基本概念和工作原理;②掌握其在不同设备上的应用和优化策略;③对比HarmonyOS与安卓、iOS编译系统的差异;④探索其未来发展方向和技术演进路径。; 其他说明:本文详细介绍了HarmonyOS编译构建子系统的架构设计、核心功能和实际应用案例,强调了其在万物互联时代的重要性和潜力。阅读时建议重点关注编译构建子系统的独特优势及其对鸿蒙生态系统的深远影响。
嵌入式八股文面试题库资料知识宝典-奇虎360 2015校园招聘C++研发工程师笔试题.zip
嵌入式八股文面试题库资料知识宝典-腾讯2014校园招聘C语言笔试题(附答案).zip
双种群变异策略改进RWCE算法优化换热网络.pdf
内容概要:本文详细介绍了基于瞬时无功功率理论的三电平有源电力滤波器(APF)仿真研究。主要内容涵盖并联型APF的工作原理、三相三电平NPC结构、谐波检测方法(ipiq)、双闭环控制策略(电压外环+电流内环PI控制)以及SVPWM矢量调制技术。仿真结果显示,在APF投入前后,电网电流THD从21.9%降至3.77%,显著提高了电能质量。 适用人群:从事电力系统研究、电力电子技术开发的专业人士,尤其是对有源电力滤波器及其仿真感兴趣的工程师和技术人员。 使用场景及目标:适用于需要解决电力系统中谐波污染和无功补偿问题的研究项目。目标是通过仿真验证APF的有效性和可行性,优化电力系统的电能质量。 其他说明:文中提到的仿真模型涉及多个关键模块,如三相交流电压模块、非线性负载、信号采集模块、LC滤波器模块等,这些模块的设计和协同工作对于实现良好的谐波抑制和无功补偿至关重要。
内容概要:本文探讨了在工业自动化和物联网交汇背景下,构建OPC DA转MQTT网关软件的需求及其具体实现方法。文中详细介绍了如何利用Python编程语言及相关库(如OpenOPC用于读取OPC DA数据,paho-mqtt用于MQTT消息传递),完成从OPC DA数据解析、格式转换到最终通过MQTT协议发布数据的关键步骤。此外,还讨论了针对不良网络环境下数据传输优化措施以及后续测试验证过程。 适合人群:从事工业自动化系统集成、物联网项目开发的技术人员,特别是那些希望提升跨协议数据交换能力的专业人士。 使用场景及目标:适用于需要在不同通信协议间建立高效稳定的数据通道的应用场合,比如制造业生产线监控、远程设备管理等。主要目的是克服传统有线网络限制,实现在不稳定无线网络条件下仍能保持良好性能的数据传输。 其他说明:文中提供了具体的代码片段帮助理解整个流程,并强调了实际部署过程中可能遇到的问题及解决方案。
基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档
少儿编程scratch项目源代码文件案例素材-火柴人终极之战.zip