Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Cfg2HbmToolTest.java =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Cfg2HbmToolTest.java (revision 0) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Cfg2HbmToolTest.java (revision 0) @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2007-2008 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributor: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ +package org.hibernate.tool.hbm2x.hbm2hbmxml; + +import org.hibernate.mapping.JoinedSubclass; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.RootClass; +import org.hibernate.mapping.SingleTableSubclass; +import org.hibernate.mapping.Subclass; +import org.hibernate.mapping.UnionSubclass; +import org.hibernate.tool.hbm2x.Cfg2HbmTool; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * @author Dmitry Geraskov + * + */ +public class Cfg2HbmToolTest extends TestCase { + + public void testNeedsTable(){ + Cfg2HbmTool c2h = new Cfg2HbmTool(); + PersistentClass pc = new RootClass(); + assertTrue(c2h.needsTable(pc)); + assertTrue(c2h.needsTable(new JoinedSubclass(pc))); + assertTrue(c2h.needsTable(new UnionSubclass(pc))); + assertFalse(c2h.needsTable(new Subclass(pc))); + assertFalse(c2h.needsTable(new SingleTableSubclass(pc))); + } + + public static Test suite() { + return new TestSuite(Cfg2HbmToolTest.class); + } + +} Property changes on: D:\workspaces\RedHat\hibernate-ganymede\hibernateext_tools\src\test\org\hibernate\tool\hbm2x\hbm2hbmxml\Cfg2HbmToolTest.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Author Id Revision Date Name: svn:eol-style + native Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Order.hbm.xml =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Order.hbm.xml (revision 0) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Order.hbm.xml (revision 0) @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + STATUS + ORDERS + + org.hibernate.tool.hbm2x.hbm2hbmxml.Order$Status + + + + Property changes on: D:\workspaces\RedHat\hibernate-ganymede\hibernateext_tools\src\test\org\hibernate\tool\hbm2x\hbm2hbmxml\Order.hbm.xml ___________________________________________________________________ Name: svn:mime-type + text/xml Name: svn:eol-style + native Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Aliens.hbm.xml =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Aliens.hbm.xml (revision 16054) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Aliens.hbm.xml (working copy) @@ -18,6 +18,9 @@ + + + Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/AbstractTest.java =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/AbstractTest.java (revision 0) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/AbstractTest.java (revision 0) @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2007-2009 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributor: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ +package org.hibernate.tool.hbm2x.hbm2hbmxml; + +import java.io.File; +import java.util.Iterator; +import java.util.List; + +import junit.framework.Test; +import junit.framework.TestSuite; + +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.cfg.Configuration; +import org.hibernate.mapping.Backref; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.tool.NonReflectiveTestCase; +import org.hibernate.tool.hbm2x.Exporter; +import org.hibernate.tool.hbm2x.HibernateMappingExporter; + +/** + * @author Dmitry Geraskov + * + */ +public class AbstractTest extends NonReflectiveTestCase { + + private String mappingFile = "Car.hbm.xml"; + + private Exporter hbmexporter; + + /** + * @param name + */ + public AbstractTest(String name) { + super(name, "cfg2hbmoutput"); + } + + protected String[] getMappings() { + return new String[] { + mappingFile + }; + } + + protected void setUp() throws Exception { + super.setUp(); + + hbmexporter = new HibernateMappingExporter(getCfg(), getOutputDir() ); + hbmexporter.start(); + } + + public void testAllFilesExistence() { + assertFileAndExists(new File(getOutputDir().getAbsolutePath(), getBaseForMappings() + "Car.hbm.xml") ); + assertFileAndExists(new File(getOutputDir().getAbsolutePath(), getBaseForMappings() + "CarPart.hbm.xml") ); + } + + public void testAbstractPresent() { + File outputXml = new File(getOutputDir().getAbsolutePath() + "/org/hibernate/tool/hbm2x/hbm2hbmxml/CarPart.hbm.xml"); + assertFileAndExists(outputXml); + + SAXReader xmlReader = this.getSAXReader(); + + Document document; + try { + document = xmlReader.read(outputXml); + XPath xpath = DocumentHelper.createXPath("//hibernate-mapping/class"); + List list = xpath.selectNodes(document); + assertEquals("Expected to get one class element", 1, list.size()); + Element node = (Element) list.get(0); + assertNotNull("Abstract attrinute was not exported.", node.attribute( "abstract" )); + assertEquals(node.attribute( "abstract" ).getText(),"true"); + } catch (DocumentException e) { + fail("Can't parse file " + outputXml.getAbsolutePath()); + } + } + + public void testReadable() { + Configuration cfg = new Configuration(); + + cfg.addFile(new File(getOutputDir(), getBaseForMappings() + "Car.hbm.xml")); + cfg.addFile(new File(getOutputDir(), getBaseForMappings() + "CarPart.hbm.xml")); + + cfg.buildMappings(); + } + + protected String getBaseForMappings() { + return "org/hibernate/tool/hbm2x/hbm2hbmxml/"; + } + + public static Test suite() { + return new TestSuite(AbstractTest.class); + } + +} Property changes on: D:\workspaces\RedHat\hibernate-ganymede\hibernateext_tools\src\test\org\hibernate\tool\hbm2x\hbm2hbmxml\AbstractTest.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Author Id Revision Date Name: svn:eol-style + native Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Cfg2HbmAllTests.java =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Cfg2HbmAllTests.java (revision 16054) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Cfg2HbmAllTests.java (working copy) @@ -19,6 +19,9 @@ suite.addTest(InheritanceTest.suite()); suite.addTest(SetElementTest.suite()); suite.addTest(BackrefTest.suite()); + suite.addTest(Cfg2HbmToolTest.suite()); + suite.addTest(AbstractTest.suite()); + suite.addTest(TypeParamsTest.suite()); //$JUnit-END$ return suite; } Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/TypeParamsTest.java =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/TypeParamsTest.java (revision 0) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/TypeParamsTest.java (revision 0) @@ -0,0 +1,187 @@ +/******************************************************************************* + * Copyright (c) 2007-2009 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Contributor: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ +package org.hibernate.tool.hbm2x.hbm2hbmxml; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; + +import junit.framework.Test; +import junit.framework.TestSuite; + +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.cfg.Configuration; +import org.hibernate.tool.NonReflectiveTestCase; +import org.hibernate.tool.hbm2x.Exporter; +import org.hibernate.tool.hbm2x.HibernateMappingExporter; + +/** + * @author Dmitry Geraskov + * + */ +public class TypeParamsTest extends NonReflectiveTestCase { + + private String mappingFile = "Order.hbm.xml"; + + private Exporter hbmexporter; + + /** + * @param name + */ + public TypeParamsTest(String name) { + super(name, "cfg2hbmoutput"); + } + + + protected String[] getMappings() { + return new String[] { + mappingFile + }; + } + + protected void setUp() throws Exception { + super.setUp(); + + hbmexporter = new HibernateMappingExporter(getCfg(), getOutputDir() ); + hbmexporter.start(); + } + + public void testAllFilesExistence() { + assertFileAndExists(new File(getOutputDir().getAbsolutePath(), getBaseForMappings() + mappingFile) ); + } + + public void testReadable() { + Configuration cfg = new Configuration(); + cfg.addFile(new File(getOutputDir(), getBaseForMappings() + "Order.hbm.xml")); + cfg.buildMappings(); + } + + public void testTypeParamsElements() throws DocumentException { + File outputXml = new File(getOutputDir(), getBaseForMappings() + mappingFile); + assertFileAndExists(outputXml); + + SAXReader xmlReader = getSAXReader(); + + Document document = xmlReader.read(outputXml); + + XPath xpath = DocumentHelper.createXPath("//hibernate-mapping/class/property"); + List list = xpath.selectNodes(document); + assertEquals("Expected to get one property element", 1, list.size()); + Element node = (Element) list.get(0); + assertEquals(node.attribute( "name" ).getText(),"status"); + + list = node.elements("type"); + assertEquals("Expected to get one type element", 1, list.size()); + + list = ((Element) list.get(0)).elements("param"); + assertEquals("Expected to get 5 params elements", list.size(), 5); + + Map params = new HashMap(); + for (int i = 0; i < list.size(); i++) { + Element param = (Element) list.get(i); + params.put(param.attribute( "name" ).getText(), param.getText()); + } + + Set> set = params.entrySet(); + assertEquals("Expected to get 5 different params elements", set.size(), 5); + + assertTrue("Can't find 'catalog' param", + set.contains(new TestEntry("catalog", ""))); + + assertTrue("Can't find 'column' param", + set.contains(new TestEntry("column", "STATUS"))); + + assertTrue("Can't find 'table' param", + set.contains(new TestEntry("table", "ORDERS"))); + + assertTrue("Can't find 'schema' param", + set.contains(new TestEntry("schema", ""))); + + assertTrue("Can't find 'enumClass' param", + set.contains(new TestEntry("enumClass", "org.hibernate.tool.hbm2x.hbm2hbmxml.Order$Status"))); + + } + + protected String getBaseForMappings() { + return "org/hibernate/tool/hbm2x/hbm2hbmxml/"; + } + + public static Test suite() { + return new TestSuite(TypeParamsTest.class); + } + +} + +class TestEntry implements Entry{ + + private Object key; + + private Object value; + + public TestEntry(Object key, Object value){ + this.key = key; + this.value = value; + } + + public Object getKey() { + return key; + } + + public Object getValue() { + return value; + } + + public Object setValue(Object value) { + return this.value = value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!(obj instanceof Entry)){ + return false; + } + + Entry other = (Entry) obj; + if (key == null) { + if (other.getKey() != null) + return false; + } else if (!key.equals(other.getKey())) + return false; + if (value == null) { + if (other.getValue() != null) + return false; + } else if (!value.equals(other.getValue())) + return false; + return true; + } + + + +} Property changes on: D:\workspaces\RedHat\hibernate-ganymede\hibernateext_tools\src\test\org\hibernate\tool\hbm2x\hbm2hbmxml\TypeParamsTest.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Author Id Revision Date Name: svn:eol-style + native Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/InheritanceTest.java =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/InheritanceTest.java (revision 16054) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/InheritanceTest.java (working copy) @@ -16,6 +16,7 @@ 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.cfg.Configuration; @@ -82,9 +83,24 @@ } catch (DocumentException e) { fail("Can't parse file " + outputXml.getAbsolutePath()); } - } + } + + public void testDiscriminator() throws DocumentException { + File outputXml = new File(getOutputDir().getAbsolutePath() + "/org/hibernate/tool/hbm2x/hbm2hbmxml/Animal.hbm.xml"); + assertFileAndExists(outputXml); + SAXReader xmlReader = this.getSAXReader(); + Document document = xmlReader.read(outputXml); + XPath xpath = DocumentHelper.createXPath("//hibernate-mapping/class/discriminator"); + List list = xpath.selectNodes(document); + assertEquals("Expected to get one discriminator element", 1, list.size()); + + Element node = (Element) list.get(0); + assertEquals(node.attribute( "type" ).getText(), "string"); + + } + protected String getBaseForMappings() { return "org/hibernate/tool/hbm2x/hbm2hbmxml/"; } Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Car.hbm.xml =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Car.hbm.xml (revision 16054) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Car.hbm.xml (working copy) @@ -16,7 +16,7 @@ - + Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/CarPart.java =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/CarPart.java (revision 16054) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/CarPart.java (working copy) @@ -3,7 +3,7 @@ /** * @author Paco Hern�ndez */ -public class CarPart implements java.io.Serializable { +public abstract class CarPart implements java.io.Serializable { private long id; private String partName; Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/java/org/hibernate/tool/hbm2x/Cfg2HbmTool.java =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/java/org/hibernate/tool/hbm2x/Cfg2HbmTool.java (revision 16054) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/java/org/hibernate/tool/hbm2x/Cfg2HbmTool.java (working copy) @@ -17,12 +17,10 @@ import org.hibernate.engine.query.sql.NativeSQLQueryReturn; import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn; import org.hibernate.mapping.Any; -import org.hibernate.mapping.Backref; import org.hibernate.mapping.Collection; import org.hibernate.mapping.Column; import org.hibernate.mapping.Component; import org.hibernate.mapping.Formula; -import org.hibernate.mapping.IndexBackref; import org.hibernate.mapping.JoinedSubclass; import org.hibernate.mapping.ManyToOne; import org.hibernate.mapping.OneToMany; @@ -312,7 +310,7 @@ } public String getFetchMode(Property property) { FetchMode fetchMode = property.getValue().getFetchMode(); - return fetchMode.toString().toLowerCase(); + return (fetchMode== null) ? null : fetchMode.toString().toLowerCase(); } @@ -381,17 +379,21 @@ public boolean isImportData(Configuration cfg) { return !(cfg.getImports().isEmpty()); } - + public boolean needsDiscriminator(PersistentClass clazz) { + return clazz instanceof RootClass + && (clazz.getDiscriminator() != null); + } + public boolean needsDiscriminatorValue(PersistentClass clazz) { return clazz instanceof Subclass && !(clazz instanceof UnionSubclass) && !(clazz instanceof JoinedSubclass); } public boolean needsTable(PersistentClass clazz) { - return !(clazz instanceof org.hibernate.mapping.Subclass - && clazz instanceof org.hibernate.mapping.SingleTableSubclass); + return !((clazz instanceof SingleTableSubclass) || + ((clazz != null) && (clazz.getClass() == Subclass.class))); } public boolean isSubclass(PersistentClass clazz) { Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/templates/hbm/property.hbm.ftl =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/templates/hbm/property.hbm.ftl (revision 16054) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/templates/hbm/property.hbm.ftl (working copy) @@ -1,6 +1,5 @@ update="false" @@ -28,5 +27,12 @@ <#foreach column in property.columnIterator> <#include "column.hbm.ftl"> + + <#if c2h.isSimpleValue(property) && property.value.typeParameters?exists> + <#foreach entry in property.value.typeParameters.entrySet()> + ${entry.value} + + + Index: D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/templates/hbm/persistentclass.hbm.ftl =================================================================== --- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/templates/hbm/persistentclass.hbm.ftl (revision 16184) +++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/templates/hbm/persistentclass.hbm.ftl (working copy) @@ -27,7 +27,7 @@ <#if clazz.hasSelectBeforeUpdate()> select-before-update="true" -<#if c2h.needsDiscriminator(clazz)> +<#if c2h.needsDiscriminatorValue(clazz)> discriminator-value="${clazz.discriminatorValue}" <#if clazz.isExplicitPolymorphism()> @@ -38,7 +38,7 @@ <#elseif !clazz.isLazy()> lazy="false" -<#if clazz.abstract?exists && clazz.abstract> +<#if clazz.isAbstract()?exists && clazz.isAbstract()> abstract="true" <#if c2h.isClassLevelOptimisticLockMode(clazz)> @@ -102,6 +102,15 @@ +<#if c2h.needsDiscriminator(clazz)> + + <#foreach column in clazz.discriminator.columnIterator> + <#include "column.hbm.ftl"> + + + + + <#-- version has to be done explicitly since Annotation's does not list version first --> <#if pojo.hasVersionProperty()> <#assign property=clazz.getVersion()/>