/*
* Created on 07-Dec-2004
*
*/
package org.hibernate.tool.hbm2x;
import java.io.File;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.cfg.JDBCMetaDataConfiguration;
import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringSettings;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.tool.JDBCMetaDataBinderTestCase;
import org.hibernate.tool.test.TestHelper;
/**
* @author max
*
*/
public class GenerateFromJDBCTest extends JDBCMetaDataBinderTestCase {
public GenerateFromJDBCTest() {
super("genfromjdbc");
}
protected String[] getCreateSQL() {
return new String[] {
"create table master ( id char not null, name varchar(20), primary key (id) )",
"create table child ( childid char not null, masterref char, primary key (childid), foreign key (masterref) references master(id) )"
};
}
protected String[] getDropSQL() {
return new String[] {
"drop table child",
"drop table master",
};
}
protected void configure(JDBCMetaDataConfiguration cfg2configure) {
DefaultReverseEngineeringStrategy configurableNamingStrategy = new DefaultReverseEngineeringStrategy();
configurableNamingStrategy.setSettings(new ReverseEngineeringSettings(configurableNamingStrategy).setDefaultPackageName("org.reveng").setCreateCollectionForForeignKey(false));
cfg2configure.setReverseEngineeringStrategy(configurableNamingStrategy);
}
public void testGenerateJava() throws SQLException, ClassNotFoundException {
POJOExporter exporter = new POJOExporter(cfg,getOutputDir());
exporter.start();
exporter = new POJOExporter(cfg,getOutputDir());
exporter.getProperties().setProperty("ejb3", "true");
exporter.start();
TestHelper.deleteDir(getOutputDir());
}
public void testGenerateMappings() {
TestHelper.deleteDir(getOutputDir());
Exporter exporter = new HibernateMappingExporter(cfg, getOutputDir());
exporter.start();
assertFileAndExists(new File(getOutputDir(), "org/reveng/Child.hbm.xml"));
File file = new File(getOutputDir(), "GeneralHbmSettings.hbm.xml");
assertTrue(file + " should not exist", !file.exists() );
MetadataSources metadataSources = new MetadataSources();
metadataSources.addFile(new File(getOutputDir(), "org/reveng/Child.hbm.xml") );
metadataSources.addFile(new File(getOutputDir(), "org/reveng/Master.hbm.xml") );
Metadata metadata = metadataSources.buildMetadata();
assertNotNull(metadata.getEntityBinding("org.reveng.Child") );
assertNotNull(metadata.getEntityBinding("org.reveng.Master") );
TestHelper.deleteDir(getOutputDir());
}
public void testGenerateCfgXml() throws DocumentException {
Exporter exporter = new HibernateConfigurationExporter(cfg,getOutputDir());
exporter.start();
assertFileAndExists(new File(getOutputDir(), "hibernate.cfg.xml"));
SAXReader xmlReader = this.getSAXReader();
Document document = xmlReader.read(new File(getOutputDir(), "hibernate.cfg.xml"));
// Validate the Generator and it has no arguments
XPath xpath = DocumentHelper.createXPath("//hibernate-configuration/session-factory/mapping");
List<?> list = xpath.selectNodes(document);
Element[] elements = new Element[list.size()];
for (int i = 0; i < list.size(); i++) {
elements[i] = (Element)list.get(i);
}
assertEquals(2,elements.length);
for (int i = 0; i < elements.length; i++) {
Element element = elements[i];
assertNotNull(element.attributeValue("resource"));
assertNull(element.attributeValue("class"));
}
}
public void testGenerateAnnotationCfgXml() throws DocumentException {
HibernateConfigurationExporter exporter = new HibernateConfigurationExporter(cfg,getOutputDir());
exporter.getProperties().setProperty("ejb3", "true");
exporter.start();
assertFileAndExists(new File(getOutputDir(), "hibernate.cfg.xml"));
SAXReader xmlReader = this.getSAXReader();
Document document = xmlReader.read(new File(getOutputDir(), "hibernate.cfg.xml"));
// Validate the Generator and it has no arguments
XPath xpath = DocumentHelper.createXPath("//hibernate-configuration/session-factory/mapping");
List<?> list = xpath.selectNodes(document);
Element[] elements = new Element[list.size()];
for (int i = 0; i < list.size(); i++) {
elements[i] = (Element)list.get(i);
}
assertEquals(2, elements.length);
for (int i = 0; i < elements.length; i++) {
Element element = elements[i];
assertNull(element.attributeValue("resource"));
assertNotNull(element.attributeValue("class"));
}
}
private SAXReader getSAXReader() {
SAXReader xmlReader = new SAXReader();
xmlReader.setValidation(true);
return xmlReader;
}
public void testGenerateDoc() {
DocExporter exporter = new DocExporter(cfg,getOutputDir());
exporter.start();
TestHelper.deleteDir(getOutputDir());
}
public void testPackageNames() {
Iterator<PersistentClass> iter = cfg.getMetadata().getEntityBindings().iterator();
while (iter.hasNext() ) {
PersistentClass element = iter.next();
assertEquals("org.reveng", StringHelper.qualifier(element.getClassName() ) );
}
}
}