在公司某一模块开发中,可以获取全部字段,但是需要取出某些不需要的字段,于是采取动态方法结合xml,将不需要的字段写在xml里面.或者根据下拉框中的值动态的获取某一个筛选条件集合sql筛选出需要的条件
前提准备
文件名:xxxxxxx.xml
<?xml version="1.0" encoding="UTF-8"?> <events><alter-table><column string="255" number="bigint" ip="26"/></alter-table><index-fields><field name="DEVID" display="设备ID"/><field name="DEVIP" display="设备IP"/><field name="RESOURCEID" display="资源ID"/><field name="ALTERGROUP" display="告警分组名称"/></index-fields><noAssign-fields><field name="EVENTID"/><field name="DEVIP"/><field name="KPI"/><field name="TYPE"/></noAssign-fields><!--快速过滤--><filters><param id="11" text="全部"><where><![CDATA[ and TENANTID = 11]]></where></param><param id="12" text="确认"><where><![CDATA[ and TENANTID = 12]]></where></param><param id="13" text="未确认"><where><![CDATA[ and TENANTID = 13]]></where></param><param id="14" text="处于维护期"><where><![CDATA[ and TENANTID = 14]]></where></param><param id="15" text="未处于维护期"><where><![CDATA[ and TENANTID = 15]]></where></param><param id="16" text="最近1小时"><where><![CDATA[ and TENANTID = 16]]></where></param><param id="17" text="最近4小时"><where><![CDATA[ and TENANTID = 17]]></where></param><param id="18" text="最近8小时"><where><![CDATA[ and TENANTID = 18]]></where></param></filters><dataType-groups><!--数据类型分组--><!--与基础信息保持一致,例如:1.字符串,2.数字,100.日期类型,110.IP--><dataType-group type="1"><groupItems size="500"></groupItems><!--不参与聚合的字段--><unableFields><field name="EVENTID"/><field name="OPTLOG"/><field name="SUMMARY"/><field name="FALUTIMPACT"/></unableFields></dataType-group><dataType-group type="2"><groupItems size="500"></groupItems><!--不参与聚合的字段--><unableFields><field name="DEVID"/><field name="TALLY"/></unableFields></dataType-group><dataType-group type="100"><groupItems><item name="最近1小时"><content><![CDATA[AND TIMESTAMPDOFF(SEDCOND,%S,NOW()) <= (1*60*60)]]></content></item><item name="最近4小时"><content><![CDATA[AND TIMESTAMPDOFF(SEDCOND,%S,NOW()) <= (4*60*60)]]></content></item><item name="最近8小时"><content><![CDATA[AND TIMESTAMPDOFF(SEDCOND,%S,NOW()) <= (8*60*60)]]></content></item></groupItems><!--不参与聚合的字段--><unableFields><field name="DEVID"/><field name="TALLY"/></unableFields></dataType-group><dataType-group type="110"><!--不参与聚合的字段--><groupItems></groupItems><unableFields><field name="DEVID"/><field name="TALLY"/></unableFields></dataType-group></dataType-groups> </events>
结合filters及完整代码实例分析流程流程
public class EventConfiguration{private List<FilterData> filterDatas;private static EventConfiguration _instance = null;private int stringFieldLength = 255;private String numberFieldType ="bigint";private int ipFieldLength =255;private Map<String,String> indexField;private Set<String> noAssignFields;private List<EvtDataTypeGroupEntity> evtDataTypeGroups;public EventConfiguration() {}/*** 获取事件配置的实例* @return 事件配置的实例*/public static final EventConfiguration getInstance(){if (_instance == null){synchronized (EventConfiguration.class){if (_instance == null){_instance = new EventConfiguration();_instance.loadXML();}}}return _instance;}public void loadXML() {//创建SAXReader对象SAXReader reader = new SAXReader();Document doc = null;try {//读取配置文件doc = reader.read(new File("C:\\Users\\Ausware01\\Desktop\\spring-course\\spring-beanInjection\\src\\main\\resources\\iSmartOne-events.xml"));} catch (DocumentException e) {e.printStackTrace();}/*** * 为什么能将Node转为Element: interface Element extends Branch extends Node 父类转 * 为子类**/Element column = (Element) doc.selectSingleNode("events/alter-table/column");Element indexFields = (Element) doc.selectSingleNode("events/index-fields");Element nodeAssingFields = (Element) doc.selectSingleNode("events/noAssign-fields");//读取的内容见下面图形1Element filters = (Element) doc.selectSingleNode("events/filters");Element dataTypeGroups = (Element) doc.selectSingleNode("events/dataType-groups");parseFilters(filters);parseColumn(column);parseIndexFields(indexFields);parseNodeAssingFields(nodeAssingFields);parseDataTypeGroups(dataTypeGroups);}private void parseDataTypeGroups(Element dataTypeGroups) {evtDataTypeGroups = new ArrayList<>();List<Element> elements = dataTypeGroups.elements("dataType-group");System.out.println(elements);elements.forEach( ele ->{EvtDataTypeGroupEntity evtDataTypeGroupEntity = new EvtDataTypeGroupEntity();//获取Type属性if (org.apache.commons.lang3.StringUtils.isNumeric(ele.attributeValue("type"))) {evtDataTypeGroupEntity.setType(ele.attributeValue("type"));}//获取size属性Element groupItems = ele.element("groupItems");if (org.apache.commons.lang3.StringUtils.isNumeric(groupItems.attributeValue("size"))) {evtDataTypeGroupEntity.setSize(Integer.valueOf(groupItems.attributeValue("size")));}//获取item属性List<Element> items = groupItems.elements("item");if (!ObjectUtils.isEmpty(items)) {ArrayList<Map<String, String>> gorupItems = new ArrayList<>();items.forEach(item ->{HashMap<String, String> map = new HashMap<>();String name = item.attributeValue("name");map.put("name",name);Node content = item.selectSingleNode("content");if (content == null){map.put("content", org.apache.commons.lang3.StringUtils.EMPTY);}else {String textTrim = ((Element) content).getTextTrim();map.put("content",textTrim);}gorupItems.add(map);});evtDataTypeGroupEntity.setGroupItems(gorupItems);}//获取unableFields属性Element unableField = ele.element("unableFields");List<Element> unableFields = unableField.elements("field");if (!ObjectUtils.isEmpty(unableFields)){List<String> unableList = new ArrayList<>();unableFields.forEach(item ->{String name = item.attributeValue("name");unableList.add(name);});evtDataTypeGroupEntity.setUnableFields(unableList);}evtDataTypeGroups.add(evtDataTypeGroupEntity);});}private void parseNodeAssingFields(Element nodeAssingFields) {List<Element> elements = nodeAssingFields.elements("field");noAssignFields = new HashSet<>();elements.forEach(item->{noAssignFields.add(item.attributeValue("name"));});}private void parseIndexFields(Element indexFields) {List<Element> elements = indexFields.elements("field");indexField = new HashMap<>();for (Element element : elements) {String name = element.attributeValue("name");String value = element.attributeValue("value");indexField.put(name,value);}}private void parseColumn(Element column) {stringFieldLength = Integer.parseInt(column.attributeValue("string"));numberFieldType = column.attributeValue("number");ipFieldLength = Integer.parseInt(column.attributeValue("ip"));}public void parseFilters(Element filters){//读取的内容见下面的图形2List<Element> params = filters.elements("param");filterDatas = new ArrayList<>();params.forEach(element->{Node whereNode = element.selectSingleNode("where");filterDatas.add(new FilterData(element.attributeValue("id"), //读取的内容见下面的图形3
element.attributeValue("text"), ((Element)whereNode).getTextTrim()));});}public String getWhereStringById(String id){if (StringUtils.isEmpty(id)){return new String("");}return filterDatas.parallelStream().filter(f -> id.equals(f.getId())).findAny().orElseGet(FilterData::new).getWhere();}public List<FilterData> getFilterDatas() {return filterDatas;}public void setFilterDatas(List<FilterData> filterDatas) {this.filterDatas = filterDatas;}public Map<String, String> getIndexField() {return indexField;}public void setIndexField(Map<String, String> indexField) {this.indexField = indexField;}public int getStringFieldLength() {return stringFieldLength;}public void setStringFieldLength(int stringFieldLength) {this.stringFieldLength = stringFieldLength;}public String getNumberFieldType() {return numberFieldType;}public void setNumberFieldType(String numberFieldType) {this.numberFieldType = numberFieldType;}public int getIpFieldLength() {return ipFieldLength;}public void setIpFieldLength(int ipFieldLength) {this.ipFieldLength = ipFieldLength;}public Set<String> getNoAssignFields() {return noAssignFields;}public void setNoAssignFields(Set<String> noAssignFields) {this.noAssignFields = noAssignFields;}public List<EvtDataTypeGroupEntity> getEvtDataTypeGroups() {return evtDataTypeGroups;}public void setEvtDataTypeGroups(List<EvtDataTypeGroupEntity> evtDataTypeGroups) {this.evtDataTypeGroups = evtDataTypeGroups;}
}
- 图形1:
- 图形2
- 图形3