⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generatejavasource.java

📁 xml生成javabean,基于dom的解析xml
💻 JAVA
字号:
package com.jpmorgan.neo.neoclient.mds.slcv5.parser;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * parse the message.xml file and generate java source code
 */
public class GenerateJavaSource {

	private static final Logger log = Logger.getLogger(GenerateJavaSource.class);
	
	private static Hashtable messages = new Hashtable();
	
	private String SRC_PATH = "src/";
	
	private String superClass = "com.jpmorgan.neo.neoclient.mds.slcv5.parser.Message;";
	
	private HashMap dataTypeMapping = new HashMap();
	
	/**
	 * parse mappingfile
	 * @param mappingfile
	 */
	public void parse(String mappingfile) {
		File file = new File(mappingfile);
		SAXReader saxReader = new SAXReader();
		Document document = null;
		try {
			document = saxReader.read(file);
			Element root = document.getRootElement();
			List msgs = root.elements();
			Iterator<Element> iterator = msgs.iterator();
			while(iterator.hasNext()) {
				Element msg = iterator.next();
				messages.put(msg.attributeValue("id"), msg);
			}
		} catch (DocumentException e) {
			log.error("parse err:" + e.getMessage());
		}
		//data type mapping
		dataTypeMapping.put("CHAR", "String");
    	dataTypeMapping.put("INT", "int");
    	dataTypeMapping.put("NUM", "double");
    	dataTypeMapping.put("Repeat", "ArrayList");
  
	}
    
	/**
	 * generate all the java source by the message.xml
	 *
	 */
	public void generateJavaSrcAll() {
		Iterator iterator = messages.keySet().iterator();
		while(iterator.hasNext()) {
			generateJavaSrcByMsgId((String) iterator.next());
		}
	}
	
	
	/**
	 * generate java source code by message id
	 * @param msgId
	 */
	public void generateJavaSrcByMsgId(String msgId) {
		if(msgId != null && messages.containsKey(msgId)) {
			generateJavaSrcByMsgElement((Element)messages.get(msgId));
		}
	}
	
	/**
	 * generate java source code by message element
	 * @param msgElement
	 */
	private void generateJavaSrcByMsgElement(Element msgElement) {
		HashMap fields = new HashMap();
	    List<Element> subElements = msgElement.elements();
	   
	    
		String classname = msgElement.attributeValue("class");
		log.debug("calss: " + classname);
		String packageStr = classname.substring(0, classname.lastIndexOf('.'));
		log.debug("package: " + packageStr);
		String fileName = classname.substring(packageStr.length() + 1);
		String pathStr = SRC_PATH + packageStr.replace('.', '/');
		log.debug(pathStr);
		File path = new File(pathStr);
		File file = new File(pathStr + "/" + fileName + ".java");
		if(!path.exists()) {
			path.mkdir();
		}
		if(file.exists()) {
			log.debug("overwrie old file");
		}
		FileOutputStream outputStream = null;
		try {
			outputStream = new FileOutputStream(pathStr + "/" + fileName + ".java");
		} catch (FileNotFoundException e) {
			log.error(e.getMessage());
		}
		
		PrintWriter writer = new PrintWriter(outputStream, true);
		
		writer.println("package " + packageStr + ";");
		writer.println();
		writer.println("import " + superClass);
		String repeat = null;
		for(int i = 0; i < subElements.size(); i++) {
	    	Element field = subElements.get(i);
	    	repeat = field.attributeValue("Repeat");
	    	if(repeat == null)
	    		continue;
	    	log.debug("repeat===" + repeat.trim() );
	    	if("true".equals(repeat.trim())) {
	    		log.debug("..........");
	    		writer.println("import java.util.ArrayList;");
	    		i = subElements.size();
	    	}
		}
		writer.println();
		writer.println("public class " + fileName + "  extends Message {\n");

	    //create field
		 Iterator<Element> iterator = subElements.iterator();
	    while(iterator.hasNext()) {
	    	Element field = iterator.next();
	    	String name = field.attributeValue("Name").trim();
	    	name = name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
	    	repeat = field.attributeValue("Repeat");
	    	if(repeat != null) repeat = repeat.trim();
	    	String dataType = null;
	    	if("true".equals(repeat)) {
	    		dataType = "Repeat";
	    	} else {
	    	    dataType = field.attributeValue("DataType").trim();
	    	}
	    	if(!dataTypeMapping.containsKey(dataType)) continue;
	    	generateClassField(writer, name, dataType);
	    }
	    
	    generateClassConstruct(writer, fileName, msgElement.attributeValue("id"));
	    
	    //create method
	    for(int i = 0; i < subElements.size(); i++) {
	    	Element field = subElements.get(i);
	    	String name = field.attributeValue("Name").trim();
	    	name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
	    	String dataType = field.attributeValue("DataType").trim();
	    	repeat = field.attributeValue("Repeat");
	    	if(repeat != null) repeat = repeat.trim();
//	    	String dataType = null;
	    	if("true".equals(repeat)) {
	    		dataType = "Repeat";
	    	} else {
	    	    dataType = field.attributeValue("DataType").trim();
	    	}
	    	if(!dataTypeMapping.containsKey(dataType)) continue;
	    	generateClassMethod(writer, name, dataType);
	    }
	    
	    writer.println("}");
	    writer.close();
	}
	
	/**
	 * generate class field code
	 * @param writer
	 * @param fieldName
	 * @param dataType
	 */
    private void generateClassField(PrintWriter writer, String fieldName, String dataType) {
    	StringBuffer field = new StringBuffer();
    	field.append("    private ")
    	     .append(dataTypeMapping.get(dataType))
    	     .append(" ")
    	     .append(fieldName)
    	     .append(";");
    	writer.println(field.toString());
        writer.println();
    }
    
    /**
     * generate class construct code
     * @param writer
     * @param classname
     * @param message_id
     */
    private void generateClassConstruct(PrintWriter writer, String classname,  String message_id) {
    	StringBuffer stringBuffer = new StringBuffer();
    	stringBuffer.append("    public ").append(classname).append("() {\n");
    	stringBuffer.append("        super(\"").append(message_id).append("\");\n");
    	stringBuffer.append("    }\n");
    	writer.println(stringBuffer.toString());
    }
    
    /**
     * generate class method code
     * @param writer
     * @param fieldName
     * @param dataType
     */
    private void generateClassMethod(PrintWriter writer, String fieldName, String dataType) {
    	//write get method
    	StringBuffer method = new StringBuffer();
    	method.append("    public ").append(dataTypeMapping.get(dataType)).append(" get");
    	String method_commn_str = Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
    	method.append(method_commn_str);
    	method.append("() {\n");
    	method.append("        return ").append(fieldName).append(";\n");
    	method.append("    }\n");
    	writer.print(method.toString());
    	
    	writer.println();
    	
    	//write set method
    	method = new StringBuffer();
    	method.append("    public void set");
    	method.append(method_commn_str);
    	method.append("(").append(dataTypeMapping.get(dataType)).append(" ").append(fieldName).append(") {\n");
    	method.append("        this.").append(fieldName).append(" = ").append(fieldName).append(";\n");
    	method.append("    }\n");
    	writer.print(method.toString());
    	writer.println();
    }

	public String getSuperClass() {
		return superClass;
	}

	public void setSuperClass(String superClass) {
		this.superClass = superClass;
	}
    
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -