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/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/Order.java
===================================================================
--- D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Order.java	(revision 0)
+++ D:/workspaces/RedHat/hibernate-ganymede/hibernateext_tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Order.java	(revision 0)
@@ -0,0 +1,30 @@
+package org.hibernate.tool.hbm2x.hbm2hbmxml;
+
+import java.io.Serializable;
+
+public class Order
+    implements Serializable
+{
+    private static final long serialVersionUID = -5451107485769007079L;
+
+    public enum Status {OPEN,CANCELLED,PROCESSING,SHIPPED}
+
+    long orderId;
+
+    Status status = Status.OPEN;
+
+    public long getOrderId() {
+        return orderId;
+    }                    
+    public void setOrderId(long id) {
+        this.orderId = id;
+    }     
+
+    public Status getStatus() {
+        return status;
+    }
+    public void setStatus(Status status) {
+        this.status = status;
+    }
+
+}
Property changes on: D:\workspaces\RedHat\hibernate-ganymede\hibernateext_tools\src\test\org\hibernate\tool\hbm2x\hbm2hbmxml\Order.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/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();
 	}
 
 
@@ -390,8 +388,8 @@
 
 
 	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"
 #if>
@@ -28,5 +27,12 @@
   <#foreach column in property.columnIterator>
         <#include "column.hbm.ftl">
   #foreach>	
+  
+  	<#if c2h.isSimpleValue(property) && property.value.typeParameters?exists>
+  		<#foreach entry in property.value.typeParameters.entrySet()>
+              		${entry.value}
+           	#foreach>
+  	#if>
+  
   
 
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)
@@ -38,7 +38,7 @@
 <#elseif !clazz.isLazy()>
     lazy="false"
 #if>
-<#if clazz.abstract?exists && clazz.abstract>
+<#if clazz.isAbstract()?exists && clazz.isAbstract()>
     abstract="true"
 #if>
 <#if c2h.isClassLevelOptimisticLockMode(clazz)>