介绍
之前写过JAVA+XSLT相关的技术博客,最近研究了一个开源工具包org.codehaus.groovy,处理VO对象和XML文件映射非常方便。简言之:将VO对象中的属性(包括Collection, Map),通过groovy模板,映射XML文件。
Maven pom.xml
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.3.0</version> </dependency>
VO类:
package shuai.study.groovy.demo.vo; import java.util.LinkedHashMap; import java.util.Map; /** * @author shengshu * */ public class MeasurementVO { private String dn = null; private String measurementType = null; private Map<String, Integer> counterMap = new LinkedHashMap<String, Integer>(); public String getDn() { return this.dn; } public void setDn(String dn) { this.dn = dn; } public String getMeasurementType() { return this.measurementType; } public void setMeasurementType(String measurementType) { this.measurementType = measurementType; } public Map<String, Integer> getCounterMap() { return this.counterMap; } public void setCounterMap(Map<String, Integer> counterMap) { this.counterMap = counterMap; } }
Collection类:
package shuai.study.groovy.demo.collection; import java.util.LinkedList; import java.util.List; import shuai.study.groovy.demo.vo.MeasurementVO; /** * @author shengshu * */ public class MeasurementCollection { List<MeasurementVO> MeasurementVoList = new LinkedList<MeasurementVO>(); public List<MeasurementVO> getMeasurementVoList() { return this.MeasurementVoList; } public void setMeasurementVoList(MeasurementVO measurementVO) { this.MeasurementVoList.add(measurementVO); } }
groovy模板文件:
<?xml version="1.0"?> <OMeS> <PMSetup> <PMMOResult> <% def measurementVoList=measurementCollection.getMeasurementVoList(); for (measurementVo in measurementVoList) { def dn=measurementVo.getDn(); def measurementType=measurementVo.getMeasurementType();%> <MO> <DN>${dn}</DN> </MO> <PMTarget measurementType="${measurementType}"> <% def counterMap=measurementVo.getCounterMap(); counterMap.each { def counterKey=it.key; def counterValue=it.value;%> <${counterKey}>${counterValue}</${counterKey}> <%}%> </PMTarget> <%}%> </PMMOResult> </PMSetup> </OMeS>
Transfer类:
package shuai.study.groovy.demo.transfer; import groovy.text.SimpleTemplateEngine; import groovy.text.Template; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.IOUtils; import org.codehaus.groovy.control.CompilationFailedException; import shuai.study.groovy.demo.collection.MeasurementCollection; /** * @author shengshu * */ public class MeasurementTransfer { private static MeasurementTransfer measurementTransfer = null; private Template template = null; public static MeasurementTransfer getMeasurementTransfer() { if (measurementTransfer == null) { synchronized (MeasurementTransfer.class) { if (measurementTransfer == null) { measurementTransfer = new MeasurementTransfer(); } } } return measurementTransfer; } private MeasurementTransfer() { File measurementTemplateFile = new File("/demo/groovy/template/measurementTemplate.xml"); if (!measurementTemplateFile.exists()) { throw new NullPointerException("Measurement template file " + measurementTemplateFile + " is null"); } try { template = new SimpleTemplateEngine().createTemplate(measurementTemplateFile); } catch (CompilationFailedException cfe) { cfe.printStackTrace(); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } } public void transfer(MeasurementCollection measurementCollection, File outputFile) { Map<String, MeasurementCollection> measurementCollectionMap = new HashMap<String, MeasurementCollection>(); measurementCollectionMap.put("measurementCollection", measurementCollection); Writer writer = null; try { FileWriter fileWriter = new FileWriter(outputFile); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); writer = template.make(measurementCollectionMap).writeTo(bufferedWriter); } catch (IOException ioe) { ioe.printStackTrace(); } finally { IOUtils.closeQuietly(writer); } } }Executer启动类:
package shuai.study.groovy.demo; import java.io.File; import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import shuai.study.groovy.demo.collection.MeasurementCollection; import shuai.study.groovy.demo.transfer.MeasurementTransfer; import shuai.study.groovy.demo.vo.MeasurementVO; /** * @author shengshu * */ public class MeasurementExecuter { public static void main(String[] args) { Map<String, Integer> counterMap = new LinkedHashMap<String, Integer>(); counterMap.put("nbrOfProvModify", 100); counterMap.put("nbrOfProvCreate", 300); counterMap.put("nbrOfProvDelete", 500); MeasurementVO measurementVO = new MeasurementVO(); measurementVO.setDn("PLMN-PLMN/IPS-1/CNODE-2/STYP-3"); measurementVO.setMeasurementType("PERFMGMT"); measurementVO.setCounterMap(counterMap); MeasurementCollection measurementCollection = new MeasurementCollection(); measurementCollection.setMeasurementVoList(measurementVO); File measurementOutputFile = new File("/demo/groovy/output/measurementOutput.xml"); try { FileUtils.touch(measurementOutputFile); } catch (IOException ioe) { ioe.printStackTrace(); } MeasurementTransfer measurementTransfer = MeasurementTransfer.getMeasurementTransfer(); measurementTransfer.transfer(measurementCollection, measurementOutputFile); } }
Output运行输出文件:
<?xml version="1.0"?> <OMeS> <PMSetup> <PMMOResult> <MO> <DN>PLMN-PLMN/IPS-1/CNODE-2/STYP-3</DN> </MO> <PMTarget measurementType="PERFMGMT"> <nbrOfProvModify>100</nbrOfProvModify> <nbrOfProvCreate>300</nbrOfProvCreate> <nbrOfProvDelete>500</nbrOfProvDelete> </PMTarget> </PMMOResult> </PMSetup> </OMeS>