public void testDom4jSave() { Session pojos = openSession(); Transaction txn = pojos.beginTransaction(); prepareTestData(pojos); org.hibernate.Session dom4j = pojos.getSession(EntityMode.DOM4J); Element stock = DocumentFactory.getInstance().createElement("stock"); stock.addElement("tradeSymbol").setText("IBM"); Element val = stock.addElement("currentValuation").addElement("valuation"); val.appendContent(stock); val.addElement("valuationDate").setText(new java.util.Date().toString()); val.addElement("value").setText("121.00"); dom4j.save(Stock.class.getName(), stock); dom4j.flush(); txn.rollback(); pojos.close(); assertTrue(!pojos.isOpen()); assertTrue(!dom4j.isOpen()); prettyPrint(stock); }
// 根据指定的元素创建一个Document @SuppressWarnings("unchecked") private static Document createDocument(Element element) { Document document = DocumentHelper.createDocument(); Element root = document.addElement(element.getName()); List<Attribute> attrs = element.attributes(); // 添加element元素的属性到根元素结点 if (attrs != null) { for (Attribute attr : attrs) { root.addAttribute(attr.getName(), attr.getValue()); } } root.appendContent(element); return document; }
/** * 获取单个对象属性的性能数据 * * @param objId 对象ID * @param objattrId 对象属性ID * @param attrType 类型 * @param fetchSize 获取性能数据的条数 * @return 性能数据XML * @throws Exception 异常 */ public String getPerfDataByObjAttr(int objId, int objattrId, int attrType, int fetchSize) throws Exception { // 定义一个Document作为返回结果 Document resultDoc = DocumentHelper.parseText( "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSource></DataSource>"); // 调用接口获取性能数据 Map<Integer, List<QueryResult>> values = CollDataQuery.getInstance().query(objId, fetchSize, new int[] {objattrId}); // 组装数据 if (values != null && values.size() > 0) { Element ele = resultDoc.getRootElement().addElement("Data"); ele.addAttribute("OBJATTR_ID", String.valueOf(objattrId)); List<QueryResult> resultLst = values.get(objattrId); if (resultLst != null && resultLst.size() > 0) { List<String> arr = new ArrayList<String>(); arr.add(String.valueOf(objattrId)); List<ValueTableEntity> valueTables = getValueTableByObjAttrIds(arr); // 循环读取每个QueryResult对象,并转化为指定XML格式 ele.appendContent( queryResultListToXml( resultLst, String.valueOf(objattrId), "", String.valueOf(fetchSize), String.valueOf(attrType), valueTables) .getRootElement()); } } return resultDoc.asXML(); }
/** * 查询SNMP历史数据 * * @param objId 对象ID * @param startTime 开始时间(单位是秒) * @param endTime 结束时间(单位是秒) * @param objAttrIds 对象属性id列表 * @return 结果 * @throws Exception 异常 */ public String querySNMPHistoryData(int objId, long startTime, long endTime, String objAttrIds) throws Exception { String result = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSources></DataSources>"; if (!StringUtil.isNullOrEmpty(objAttrIds)) { String[] arr = objAttrIds.split(","); Map<Integer, List<QueryResult>> values = CollDataQuery.getInstance() .query(objId, startTime, endTime, ArrayUtils.stringToIntArray(arr)); if (values != null) { // 查询要格式化值的对象属性 List<Map<String, String>> lst = new SqlQueryUtil() .getLst( "SELECT A.OBJATTR_ID,A.ATTRIB_TYPE,B.VALUE_TYPE FROM BMP_OBJATTRIB A LEFT JOIN BMP_ATTRIBUTE B ON A.ATTRIB_ID = B.ATTRIB_ID WHERE B.VALUE_TYPE > 0 AND B.VALUE_TYPE IS NOT NULL AND A.OBJATTR_ID IN (" + objAttrIds + ")"); // 查询枚举信息 List<String> valueObjAttrArr = ArrayUtils.stringToStringArrayList(arr); List<ValueTableEntity> valueTables = getValueTableByObjAttrIds(valueObjAttrArr); // 组装 Document result_doc = DocumentHelper.parseText(result); String objattrId; String attribType = ""; String valueType = ""; List<ValueTableEntity> valueLst; for (Map.Entry<Integer, List<QueryResult>> entry : values.entrySet()) { objattrId = entry.getKey().toString(); Element ele = result_doc.getRootElement().addElement("Data"); ele.addAttribute("OBJATTR_ID", objattrId); valueLst = new ArrayList<ValueTableEntity>(); if (lst != null && lst.size() > 0 && valueTables.size() > 0) { for (Map<String, String> map : lst) { if (objattrId.equals(map.get("OBJATTR_ID"))) { attribType = map.get("ATTRIB_TYPE"); valueType = map.get("VALUE_TYPE"); for (ValueTableEntity entity : valueTables) { if (valueType.equals(String.valueOf(entity.getValueType()))) { valueLst.add(entity); } } break; } } } // 循环读取每个QueryResult对象,并转化为指定XML格式 ele.appendContent( queryResultListToXml( entry.getValue(), entry.getKey().toString(), "", "", attribType, valueLst) .getRootElement()); } result = result_doc.asXML(); } } return result; }
/** * 获取其他类型的对象的性能数据 * * @param objXml 固定界面的对象的XML * @param type 对象类型 * @param objID 对象ID * @return 性能数据XML * @throws Exception 异常 */ public String getElseObjCollValue(String objXml, String type, int objID) throws Exception { // 定义一个Document作为返回结果 Document result_doc = DocumentHelper.parseText( "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSource></DataSource>"); // 解析objXml,获取从哪些表获取哪些数据等信息 Document doc = DocumentHelper.parseText(objXml); List list = doc.selectNodes("ElseObject/" + type + "/DataTable"); if (list != null) { Iterator it = list.iterator(); while (it.hasNext()) { // 解析要查询的表及数据条数 Element tableEle = (Element) it.next(); String table = tableEle.attribute("table").getValue(); String collValueNum = tableEle.attribute("collValueNum").getValue(); // 在结果Document的根节点下添加表节点 Element ele = result_doc.getRootElement().addElement("DATA_TABLE"); ele.addAttribute("TABLE_NAME", table); // DVB_C类型的对象属性与其他类型的查询方式不同 // 获取最近的collValueNum个采集时间 String cmd = ""; if ("DVB_C".equals(type)) { cmd = sqlExecutor .getSqlParser() .getSelectCommandString( table, Integer.parseInt(collValueNum), false, "COLL_TIME", null, "ORDER BY COLL_TIME DESC", new SqlCondition( "FREQ_ID", "SELECT FREQ_ID FROM NMP_OBJDVBCTS WHERE OBJ_ID=" + objID + "", SqlLogicType.And, SqlRelationType.In, SqlParamType.UnKnow, true)); } else { cmd = sqlExecutor .getSqlParser() .getSelectCommandString( table, Integer.parseInt(collValueNum), false, "COLL_TIME", null, "ORDER BY COLL_TIME DESC", new SqlCondition( "OBJ_ID", String.valueOf(objID), SqlLogicType.And, SqlRelationType.Equal, SqlParamType.Numeric)); } // 将采集时间存入List final List<String> timeList = new ArrayList<String>(); DefaultDal.read( cmd, new IReadHandle() { @Override public void handle(ResultSet timeRS) throws Exception { while (timeRS.next()) { timeList.add(timeRS.getString("COLL_TIME")); } } }); // 针对每个采集时间,从指定的表中获取数据 if (timeList != null && timeList.size() > 0) { for (int k = 0; k < timeList.size(); k++) { // 如果是第一条,添加最大时间 if (k == 0) { ele.addAttribute("max_time", timeList.get(k)); } Document coll = null; if ("DVB_C".equals(type)) { coll = sqlExecutor.fill( "SELECT * FROM " + table + " WHERE FREQ_ID IN (SELECT FREQ_ID FROM NMP_OBJDVBCTS WHERE OBJ_ID=" + String.valueOf(objID) + ") AND COLL_TIME='" + timeList.get(k) + "'", "DataTable", table); } else { coll = sqlExecutor.fill( "SELECT * FROM " + table + " WHERE OBJ_ID=" + String.valueOf(objID) + " AND COLL_TIME='" + timeList.get(k) + "'", "DataTable", table); } // 组装结果 ele.appendContent(coll.getRootElement()); } } } } return result_doc.asXML(); }
/** * 获取所有对象属性的性能数据 主要用于获取拓扑图中的性能数据和性能面板中的性能数据 * * @param objXml 要获取性能数据的各对象属性及参数的XML * @return 返回性能数据XML * @throws Exception 异常 */ public String getObjAttrsPerfData(String objXml) throws Exception { // 用于组装返回结果 Document result_doc = DocumentHelper.parseText( "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSource></DataSource>"); // 根据传递过来的XML获取要采集哪些对象属性的值 Document doc = DocumentHelper.parseText(objXml); // 根据传过来的objXml组装QueryParam if (doc != null) { // 获取所有的Item,每个Item下是一个对象的所有要获取性能数据的对象属性相关参数 List list = doc.selectNodes("/PerfObjects/Item"); if (list != null) { Iterator it = list.iterator(); if (it != null) { while (it.hasNext()) { Element itemEle = (Element) it.next(); String objId = itemEle.attribute("objId").getValue(); // 获取该对象下的所有要获取性能数据的对象属性相关参数 List<Element> child = itemEle.elements("PerfObject"); if (child != null && child.size() > 0) { List<QueryParam> para = new ArrayList<QueryParam>(); List<String> valueObjAttrArr = new ArrayList<String>(); // 组装QueryParam for (Element e : child) { String objAttrId = e.attribute("objAttrId").getValue(); String attrType = e.attribute("attrType").getValue(); String fetchSize = e.attribute("fetchSize").getValue(); valueObjAttrArr.add(objAttrId); QueryParam qp = new QueryParam(); qp.setObjId(Integer.parseInt(objId)); qp.setObjAttrId(Integer.parseInt(objAttrId)); qp.setAttrType(Integer.parseInt(attrType)); qp.setFetchSize(Integer.parseInt(fetchSize)); para.add(qp); } // 调用接口获取性能数据 QueryParam[] arr = para.toArray(new QueryParam[para.size()]); Map<Integer, List<QueryResult>> values = CollDataQuery.getInstance().query(Integer.valueOf(objId), arr); // 组装结果 if (values != null && values.size() > 0) { // 查询要格式化值的对象属性 List<Map<String, String>> lst = new SqlQueryUtil() .getLst( "SELECT A.OBJATTR_ID,A.ATTRIB_TYPE,B.VALUE_TYPE FROM BMP_OBJATTRIB A LEFT JOIN BMP_ATTRIBUTE B ON A.ATTRIB_ID = B.ATTRIB_ID WHERE B.VALUE_TYPE > 0 AND B.VALUE_TYPE IS NOT NULL AND A.OBJATTR_ID IN (" + StringUtils.join(valueObjAttrArr, ',') + ")"); // 查询枚举信息 List<ValueTableEntity> valueTables = getValueTableByObjAttrIds(valueObjAttrArr); // 组装 String attribType = ""; String valueType = ""; List<ValueTableEntity> valueLst; for (Element e : child) { String objAttrId = e.attribute("objAttrId").getValue(); String objAttrName = e.attribute("objAttrName").getValue(); String bindId = e.attribute("bindId").getValue(); String index = e.attribute("index").getValue(); String fetchSize = e.attribute("fetchSize").getValue(); Element ele = result_doc.getRootElement().addElement("Data"); ele.addAttribute("bindId", bindId); ele.addAttribute("index", index); ele.addAttribute("objAttrId", objAttrId); ele.addAttribute("objAttrName", objAttrName); List<QueryResult> resultLst = values.get(Integer.valueOf(objAttrId)); // 判断是否需要格式化值 valueLst = new ArrayList<ValueTableEntity>(); if (lst != null && lst.size() > 0 && valueTables.size() > 0) { for (Map<String, String> map : lst) { if (objAttrId.equals(map.get("OBJATTR_ID"))) { attribType = map.get("ATTRIB_TYPE"); valueType = map.get("VALUE_TYPE"); for (ValueTableEntity entity : valueTables) { if (valueType.equals(String.valueOf(entity.getValueType()))) { valueLst.add(entity); } } break; } } } // 将结果转化为指定格式XML字符串 ele.appendContent( queryResultListToXml( resultLst, objAttrId, objAttrName, fetchSize, attribType, valueLst) .getRootElement()); } } } } } } } return result_doc.asXML(); }
/** * 获取某对象的某属性的性能数据,可能为多个对象属性 * * @param objId 对象ID * @param attrId 属性ID * @param fetchSize 获取性能数据的条数 * @return 性能数据XML * @throws Exception 异常 */ public String getPerfDataByObjAndAttrib(int objId, int attrId, int fetchSize) throws Exception { // 定义一个Document作为返回结果 Document result_doc = DocumentHelper.parseText( "<?xml version=\"1.0\" encoding=\"UTF-8\"?><DataSource></DataSource>"); // 先查询该对象该属性下所有的对象属性 List<ObjAttribEntity> lst = ClassWrapper.wrapTrans(ObjAttribDal.class) .getByObjIdAndAttribId(objId, attrId, new Integer[] {1}); if (lst != null && lst.size() > 0) { List<QueryParam> para = new ArrayList<QueryParam>(); // 对所有对象属性组装QueryParam,并保存到List for (ObjAttribEntity entity : lst) { QueryParam qp = new QueryParam(); qp.setObjId(objId); qp.setObjAttrId(entity.getObjAttrId()); qp.setAttrType(entity.getAttribType()); qp.setFetchSize(fetchSize); para.add(qp); } // 调用接口取性能数据 QueryParam[] arr = para.toArray(new QueryParam[para.size()]); Map<Integer, List<QueryResult>> values = CollDataQuery.getInstance().query(Integer.valueOf(objId), arr); // 根据结果组装XML if (values != null && values.size() > 0) { // 获取该属性枚举信息 List<String> attrIdArr = new ArrayList<String>(); attrIdArr.add(String.valueOf(attrId)); List<ValueTableEntity> valueTables = getValueTableByAttrIds(attrIdArr); // 组装 for (ObjAttribEntity entity : lst) { String objattrId = String.valueOf(entity.getObjAttrId()); String objattrName = String.valueOf(entity.getAttribType()); Element ele = result_doc.getRootElement().addElement("Data"); ele.addAttribute("OBJATTR_ID", objattrId); ele.addAttribute("OBJATTR_NAME", objattrName); List<QueryResult> resultLst = values.get(Integer.valueOf(objattrId)); // 循环读取每个QueryResult对象,并转化为指定XML格式 ele.appendContent( queryResultListToXml( resultLst, objattrId, objattrName, String.valueOf(fetchSize), String.valueOf(entity.getAttribType()), valueTables) .getRootElement()); } } } return result_doc.asXML(); }