/*
* $Id: CodeGenerator.java,v 1.7 2004/03/22 20:41:47 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);
// 这个循环是错误2
// 改成只处理class映射
for ( Iterator iter = mappingFiles.iterator(); iter.hasNext(); ) {
// parse the mapping file
File file = new File( (String) iter.next() );
log.debug(file.getAbsolutePath());
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);
}
// 复制了上一个循环
// 处理subclass和joined-class映射
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**/);
MultiMap mm = MetaAttributeHelper.loadAndMergeMetaMap(rootElement, globalMetas);
Iterator 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);
classMappings.put(cmap.getFullyQualifiedName(),cmap);
} 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);
superclass.addSubClass(subclassMapping);
}
}
}
}
|