首页>代码>深入浅出hibernate书籍的源代码下载>/深入浅出Hibernate源码/samples-dist/tools/ext-tools/src/java/net/sf/hibernate/tool/hbm2java/CodeGenerator.java
/*
 * $Id: CodeGenerator.java,v 1.7.2.1 2004/07/22 21:26:28 maxcsaucdk Exp $
 */
package net.sf.hibernate.tool.hbm2java;


import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import net.sf.hibernate.MappingException;
import net.sf.hibernate.util.DTDEntityResolver;

import org.apache.commons.collections.MultiHashMap;
import org.apache.commons.collections.MultiMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXParseException;


/**
 *
 */
public class CodeGenerator {

    private static final Log log = LogFactory.getLog(CodeGenerator.class);
    
      public static void main(String[] args) {
          
          if(args.length==0) {
              System.err.println("No arguments provided. Nothing to do. Exit.");
              System.exit(-1);              
          }
        try {
            ArrayList mappingFiles = new ArrayList();
    
            SAXBuilder builder = new SAXBuilder(true);
            builder.setEntityResolver( new DTDEntityResolver() );
            
            builder.setErrorHandler( new ErrorHandler() {
    			public void error(SAXParseException error) {
    				log.error("Error parsing XML: " + error.getSystemId() + '(' + error.getLineNumber() + ')',error);
    			}
    			public void fatalError(SAXParseException error) { 
    				error(error); 
    			}
    			public void warning(SAXParseException error) {
    				log.warn("Warning parsing XML: " + error.getSystemId() + '(' + error.getLineNumber() + ')' );
    			}
            } );
            
            String outputDir = null;
    
            List generators = new ArrayList();
    
            MultiMap globalMetas = new MultiHashMap();
            // parse command line parameters
            for (int i = 0; i < args.length; i++) {
                if (args[i].startsWith("--")) {
    
                    if ( args[i].startsWith("--config=") ) {
                        // parse config xml file
                    	builder.setValidation(false);
                        Document document = builder.build( new File( args[i].substring(9) ) );
                        globalMetas = MetaAttributeHelper.loadAndMergeMetaMap(document.getRootElement(), null);
                        Iterator generateElements = document.getRootElement().getChildren("generate").iterator();
                        
                        while (generateElements.hasNext()) {
                            generators.add( new Generator( (Element) generateElements.next() ) );
                        }
                        builder.setValidation(true);
                    }
                    else if ( args[i].startsWith("--output=") ) {
                    	outputDir = args[i].substring(9);
                    }
                    	
                } 
                else {
                    mappingFiles.add( args[i] );
                }
            }
    
            // if no config xml file, add a default generator
            if (generators.size() == 0) {
                generators.add( new Generator() );
            }
    		
            HashMap classMappings = new HashMap();
            builder.setValidation(true);
    		for ( Iterator iter = mappingFiles.iterator(); iter.hasNext(); ) {
            	// parse the mapping file
				File file = new File( (String) iter.next() );
			
				Document document = builder.build( file);
            	
            	Element rootElement = document.getRootElement();
            	
            	org.jdom.Attribute a = rootElement.getAttribute("package");
            	String pkg = null;
            	if(a!=null) {
            		pkg = a.getValue();
            	}
                MappingElement me = new MappingElement(rootElement, null/**TODO-hbm2java: - should be config.xml**/);
            	Iterator classElements = rootElement.getChildren("class").iterator();
                MultiMap mm = MetaAttributeHelper.loadAndMergeMetaMap(rootElement, globalMetas);
                handleClass(pkg,me, classMappings, classElements, mm, false);
        	    
				classElements = rootElement.getChildren("subclass").iterator();
				handleClass(pkg,me,classMappings, classElements, mm, true);
				
				classElements = rootElement.getChildren("joined-subclass").iterator();
				handleClass(pkg,me,classMappings, classElements, mm, true);
    		}
    
            // generate source files
            for ( Iterator iterator = generators.iterator(); iterator.hasNext(); ) {
            	Generator g = (Generator) iterator.next();
            	g.setBaseDirName(outputDir);
                g.generate(classMappings);
            }
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }

	private static void handleClass(String classPackage, MappingElement me, HashMap classMappings, Iterator classElements, MultiMap mm, boolean extendz) throws MappingException {
		while ( classElements.hasNext() ) {
			Element clazz = (Element) classElements.next();
			
			if(!extendz) {
		    	ClassMapping cmap = new ClassMapping(classPackage, clazz, me, mm);
		    	cmap.storeIn(classMappings);		    	
			} else {				
				String ex = clazz.getAttributeValue("extends");
				if(ex==null) {
					throw new MappingException("Missing extends attribute on <" + clazz.getName() + " name=" + clazz.getAttributeValue("name") + ">" );
				}
				ClassMapping superclass = (ClassMapping) classMappings.get(ex);
				if(superclass == null) {
					throw new MappingException("Cannot extend unmapped class " + ex);					
				}
				ClassMapping subclassMapping = new ClassMapping(classPackage, me, superclass.getClassName(), superclass, clazz, mm);
				subclassMapping.storeIn(classMappings);
			}
		}
	}
}






最近下载更多
shancjb  LV1 2020年5月25日
oaggao  LV1 2020年2月7日
qq893051835  LV1 2019年9月13日
ytx012  LV1 2019年7月11日
Zionism  LV6 2019年5月5日
DevLegal  LV2 2018年10月15日
lianghao1  LV1 2018年10月13日
张兆生  LV26 2018年7月25日
adminsht  LV2 2017年9月6日
dagf113225  LV68 2017年3月24日
最近浏览更多
liang85  LV1 2023年6月30日
moomin709  LV24 2022年3月29日
无敌是都么寂寞 2021年11月15日
暂无贡献等级
blueskyroof  LV9 2021年1月12日
那一年你在哪  LV13 2020年12月26日
shancjb  LV1 2020年5月25日
zxmiii  LV3 2020年4月18日
pmj2510  LV10 2020年4月16日
陈小弟  LV2 2020年3月27日
张言昊  LV9 2020年3月12日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友