/* * Created on 2004-12-01 * */ package org.hibernate.tool.hbm2x; import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.hibernate.mapping.Component; import org.hibernate.mapping.MetaAttribute; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; import org.hibernate.mapping.RootClass; import org.hibernate.mapping.SingleTableSubclass; import org.hibernate.tool.NonReflectiveTestCase; import org.hibernate.tool.hbm2x.pojo.BasicPOJOClass; import org.hibernate.tool.hbm2x.pojo.ImportContext; import org.hibernate.tool.hbm2x.pojo.ImportContextImpl; import org.hibernate.tool.hbm2x.pojo.NoopImportContext; import org.hibernate.tool.hbm2x.pojo.POJOClass; /** * @author max * */ public class Hbm2JavaTest extends NonReflectiveTestCase { private ArtifactCollector artifactCollector; public Hbm2JavaTest(String name) { super( name, "hbm2javaoutput" ); } protected void setUp() throws Exception { super.setUp(); Exporter exporter = new POJOExporter( getCfg(), getOutputDir() ); artifactCollector = new ArtifactCollector(); exporter.setArtifactCollector(artifactCollector); exporter.start(); } public void testFileExistence() { assertFileAndExists( new File( getOutputDir(), "org/hibernate/tool/hbm2x/Customer.java" ) ); assertFileAndExists( new File( getOutputDir(), "org/hibernate/tool/hbm2x/LineItem.java" ) ); assertFileAndExists( new File( getOutputDir(), "org/hibernate/tool/hbm2x/Order.java" ) ); assertFileAndExists( new File( getOutputDir(), "org/hibernate/tool/hbm2x/Train.java" ) ); assertFileAndExists( new File( getOutputDir(), "org/hibernate/tool/hbm2x/Passenger.java" ) ); assertFileAndExists( new File( getOutputDir(), "org/hibernate/tool/hbm2x/Product.java" ) ); assertFileAndExists( new File( getOutputDir(), "generated/BaseHelloWorld.java" ) ); assertFileAndExists( new File( getOutputDir(), "HelloUniverse.java" ) ); assertFileAndExists( new File( getOutputDir(), "org/hibernate/tool/hbm2x/FatherComponent.java" ) ); assertFileAndExists( new File( getOutputDir(), "org/hibernate/tool/hbm2x/ChildComponent.java" ) ); assertEquals(15, artifactCollector.getFileCount("java")); } // TODO Re-enable this test: HBX-1248 public void testCompilable() { // File file = new File( "compilable" ); // file.mkdir(); // // ArrayList<String> list = new ArrayList<String>(); // list.add( new File( "src/testoutputdependent/HelloWorld.java" ) // .getAbsolutePath() ); // TestHelper.compile( getOutputDir(), file, TestHelper.visitAllFiles( // getOutputDir(), list ) ); // // TestHelper.deleteDir( file ); } /** HBX-606 */ // TODO Implement HBX-606 so that the following test succeeds // public void testParentComponentFailureExpected() { // // File file = new File( getOutputDir(), "org/hibernate/tool/hbm2x/FatherComponent.java" ); // // assertEquals("test", findFirstString("testParent", file)); // } public void testNoFreeMarkerLeftOvers() { assertEquals( null, findFirstString( "$", new File( getOutputDir(), "org/hibernate/tool/hbm2x/Customer.java" ) ) ); assertEquals( null, findFirstString( "$", new File( getOutputDir(), "org/hibernate/tool/hbm2x/LineItem.java" ) ) ); assertEquals( null, findFirstString( "$", new File( getOutputDir(), "org/hibernate/tool/hbm2x/Order.java" ) ) ); assertEquals( null, findFirstString( "$", new File( getOutputDir(), "org/hibernate/tool/hbm2x/Product.java" ) ) ); assertEquals( null, findFirstString( "$", new File( getOutputDir(), "org/hibernate/tool/hbm2x/Address.java" ) ) ); } protected String getBaseForMappings() { return "org/hibernate/tool/hbm2x/"; } protected String[] getMappings() { return new String[] { "Customer.hbm.xml", "Order.hbm.xml", "LineItem.hbm.xml", "Product.hbm.xml", "HelloWorld.hbm.xml", "Train.hbm.xml", "Passenger.hbm.xml" }; } public void testPackageName() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass classMapping = getMetadata().getEntityBinding("org.hibernate.tool.hbm2x.Order"); POJOClass pc = c2j.getPOJOClass(classMapping); assertEquals( "org.hibernate.tool.hbm2x", pc.getPackageName() ); assertEquals( "package org.hibernate.tool.hbm2x;", pc.getPackageDeclaration() ); assertEquals( "did not honor generated-class", "package generated;", c2j.getPOJOClass( getMetadata().getEntityBinding("HelloWorld" )).getPackageDeclaration()); } // TODO Re-enable this test: HBX-1242 public void testFieldNotThere() { // assertEquals(null,findFirstString("notgenerated", new File( getOutputDir(), // "HelloUniverse.java" ))); } public void testJavaDoc() { Cfg2JavaTool c2j = new Cfg2JavaTool(); assertEquals( " * test", c2j.toJavaDoc( "test", 0 ) ); assertEquals( " * test", c2j.toJavaDoc( "test", 2 ) ); assertEquals( " * test\n * me", c2j.toJavaDoc( "test\nme", 2 ) ); PersistentClass local = getMetadata().getEntityBinding( "HelloWorld" ); POJOClass pc = c2j.getPOJOClass(local); assertEquals( " * Hey there", pc.getClassJavaDoc( "fallback", 0 ) ); assertEquals( " * Test Field Description", pc.getFieldJavaDoc( local.getIdentifierProperty(), 0 ) ); } public void testExtraCode() { Cfg2JavaTool c2j = new Cfg2JavaTool(); assertFalse( c2j.hasMetaAttribute( getMetadata().getEntityBinding( "HelloWorld" ), "class-code" ) ); PersistentClass classMapping = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Order" ); assertEquals( "// extra code line 1\n// extra code line 2\n{ Collator.getInstance(); }", c2j.getPOJOClass(classMapping).getExtraClassCode() ); } public void testScope() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Order" ); assertEquals( "public strictfp", c2j.getClassModifiers( pc ) ); assertEquals( "public", c2j.getClassModifiers( getMetadata().getEntityBinding( "HelloWorld" ) ) ); } public void testDeclarationType() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Order" ); assertEquals( "class", c2j.getPOJOClass(pc).getDeclarationType() ); assertEquals( "interface", c2j.getPOJOClass(getMetadata().getEntityBinding( "HelloWorld" ) ).getDeclarationType() ); } public void testTypeName() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Order" ); Property property = pc.getProperty( "lineItems" ); assertEquals( "java.util.Collection", c2j.getJavaTypeName( property, false ) ); } public void testUseRawTypeNullability() { Cfg2JavaTool c2j = new Cfg2JavaTool( /*true*/ ); PersistentClass pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Product" ); Property property = pc.getProperty( "numberAvailable" ); assertFalse( property.getValue().isNullable() ); assertEquals( "typename should be used when rawtypemode", "int", c2j .getJavaTypeName( property, false ) ); property = pc.getProperty( "minStock" ); assertTrue( property.getValue().isNullable() ); assertEquals( "typename should be used when rawtypemode", "long", c2j .getJavaTypeName( property, false ) ); property = pc.getProperty( "otherStock" ); assertFalse( property.getValue().isNullable() ); assertEquals( "type should still be overriden by meta attribute", "java.lang.Integer", c2j.getJavaTypeName( property, false ) ); property = pc.getIdentifierProperty(); assertFalse( property.getValue().isNullable() ); assertEquals( "wrappers should be used by default", "long", c2j .getJavaTypeName( property, false ) ); pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Customer" ); Component identifier = (Component) pc.getIdentifier(); assertFalse( ((Property) identifier.getPropertyIterator().next() ) .getValue().isNullable() ); assertEquals( "long", c2j.getJavaTypeName( property, false ) ); } public void testExtendsImplements() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Order" ); assertEquals( null, c2j.getPOJOClass(pc).getExtends() ); POJOClass entityPOJOClass = c2j.getPOJOClass(getMetadata().getEntityBinding( "HelloWorld" )); assertEquals( "Comparable", entityPOJOClass.getExtends() ); assertEquals( "should be interface which cannot have implements", null, entityPOJOClass.getImplements() ); assertEquals( "should be interface which cannot have implements", "", entityPOJOClass.getImplementsDeclaration() ); PersistentClass base = new RootClass(null); base.setClassName( "Base" ); PersistentClass sub = new SingleTableSubclass( base, null ); sub.setClassName( "Sub" ); assertEquals( null, c2j.getPOJOClass(base).getExtends() ); assertEquals( "Base", c2j.getPOJOClass(sub).getExtends() ); Map<String, MetaAttribute> m = new HashMap<String, MetaAttribute>(); MetaAttribute attribute = new MetaAttribute( "extends" ); attribute.addValue( "x" ); attribute.addValue( "y" ); m.put( attribute.getName(), attribute ); attribute = new MetaAttribute( "interface" ); attribute.addValue( "true" ); m.put( attribute.getName(), attribute ); sub.setMetaAttributes( m ); assertEquals( "Base,x,y", c2j.getPOJOClass(sub).getExtends() ); m = new HashMap<String, MetaAttribute>(); attribute = new MetaAttribute( "implements" ); attribute.addValue( "intf" ); m.put( attribute.getName(), attribute ); base.setMetaAttributes( m ); assertEquals( "intf,java.io.Serializable", c2j.getPOJOClass(base).getImplements() ); } public void testDeclarationName() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Order" ); PersistentClass hw = getMetadata().getEntityBinding( "HelloWorld" ); POJOClass epc = c2j.getPOJOClass(pc); assertEquals( "Order", epc.getDeclarationName() ); epc = c2j.getPOJOClass(hw); assertEquals( "BaseHelloWorld", epc.getDeclarationName() ); } public void testAsArguments() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Order" ); assertEquals( "java.util.Calendar orderDate, java.math.BigDecimal total, org.hibernate.tool.hbm2x.Customer customer, java.util.Collection lineItems", c2j.asParameterList( pc.getPropertyIterator(), false, new NoopImportContext() )); assertEquals( "orderDate, total, customer, lineItems", c2j.asArgumentList( pc.getPropertyIterator() ) ); } public void testPropertiesForFullConstructor() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "HelloWorld" ); POJOClass pjc = c2j.getPOJOClass(pc); List<Property> wl = pjc.getPropertiesForFullConstructor(); assertEquals( 3, wl.size() ); PersistentClass uni = getMetadata().getEntityBinding( "HelloUniverse" ); pjc = c2j.getPOJOClass(uni); List<Property> local = pjc.getPropertyClosureForFullConstructor(); assertEquals( 6, local.size() ); for(int i=0;i<wl.size();i++) { assertEquals( i + " position should be the same", local.get( i ), wl.get( i ) ); } } public void testToString() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "HelloWorld" ); POJOClass pjc = c2j.getPOJOClass(pc); assertTrue( pjc.needsToString() ); Iterator<Property> iter = pjc.getToStringPropertiesIterator(); // in HelloWorld.hbm.xml there're 2 Properties for toString assertEquals( "id", (iter.next() ).getName() ); assertEquals( "hello", (iter.next() ).getName() ); assertFalse( iter.hasNext() ); pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Order" ); pjc = c2j.getPOJOClass(pc); assertFalse( pjc.needsToString() ); pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Customer" ); Component c = (Component) pc.getProperty( "addressComponent" ) .getValue(); POJOClass cc = c2j.getPOJOClass(c); assertTrue( cc.needsToString() ); iter = cc.getToStringPropertiesIterator(); // in Customer.hbm.xml there's 1 Property for toString assertEquals( "city", (iter.next() ).getName() ); assertFalse( iter.hasNext() ); } public void testImportOfSameName() { ImportContext ic = new ImportContextImpl("foobar"); assertEquals("CascadeType", ic.importType("javax.persistence.CascadeType")); assertEquals("org.hibernate.annotations.CascadeType", ic.importType("org.hibernate.annotations.CascadeType")); assertTrue("The hibernate annotation should not be imported to avoid name clashes", ic.generateImports().indexOf("hibernate")<0); } public void testImporter() { ImportContext context = new ImportContextImpl( "org.hibernate" ); assertEquals("byte", context.importType("byte")); assertEquals("Session", context.importType("org.hibernate.Session")); assertEquals("Long", context.importType("java.lang.Long")); assertEquals("org.test.Session", context.importType("org.test.Session")); assertEquals("Entity", context.importType("org.test.Entity")); assertEquals("org.other.test.Entity", context.importType("org.other.test.Entity")); assertEquals("Collection<org.marvel.Hulk>", context.importType("java.util.Collection<org.marvel.Hulk>")); assertEquals("Map<java.lang.String, org.marvel.Hulk>", context.importType("java.util.Map<java.lang.String, org.marvel.Hulk>")); assertEquals("Collection<org.marvel.Hulk>[]", context.importType("java.util.Collection<org.marvel.Hulk>[]")); assertEquals("Map<java.lang.String, org.marvel.Hulk>", context.importType("java.util.Map<java.lang.String, org.marvel.Hulk>")); String string = context.generateImports(); assertTrue(string.indexOf("import org.hibernate.Session;")<0); assertTrue(string.indexOf("import org.test.Entity;")>0); assertTrue("Entity can only be imported once", string.indexOf("import org.other.test.Entity;")<0); assertFalse(string.indexOf("<")>=0); assertEquals("Outer.Entity", context.importType("org.test.Outer$Entity")); assertEquals("org.other.test.Outer.Entity", context.importType("org.other.test.Outer$Entity")); assertEquals("Collection<org.marvel.Outer.Hulk>", context.importType("java.util.Collection<org.marvel.Outer$Hulk>")); assertEquals("Map<java.lang.String, org.marvel.Outer.Hulk>", context.importType("java.util.Map<java.lang.String, org.marvel.Outer$Hulk>")); assertEquals("Collection<org.marvel.Outer.Hulk>[]", context.importType("java.util.Collection<org.marvel.Outer$Hulk>[]")); assertEquals("Map<java.lang.String, org.marvel.Outer.Hulk>", context.importType("java.util.Map<java.lang.String, org.marvel.Outer$Hulk>")); //assertEquals("Test.Entry", context.importType("org.hibernate.Test.Entry")); what should be the behavior for this ? assertEquals("Test.Entry", context.importType("org.hibernate.Test$Entry")); assertEquals("Map.Entry", context.importType("java.util.Map$Entry")); assertEquals("Entry", context.importType("java.util.Map.Entry")); // we can't detect that it is the same class here unless we try an load all strings so we fall back to default class name. assertEquals("List<java.util.Map.Entry>", context.importType( "java.util.List<java.util.Map$Entry>" )); assertEquals("List<org.hibernate.Test.Entry>", context.importType( "java.util.List<org.hibernate.Test$Entry>" )); string = context.generateImports(); assertTrue(string.indexOf("import java.util.Map")>=0); assertTrue(string.indexOf("import java.utilMap$")<0); assertTrue(string.indexOf("$")<0); } public void testEqualsHashCode() { Cfg2JavaTool c2j = new Cfg2JavaTool(); PersistentClass pc = getMetadata().getEntityBinding( "org.hibernate.tool.hbm2x.Customer" ); POJOClass pjc = c2j.getPOJOClass((Component) pc.getProperty("addressComponent").getValue()); assertTrue( pjc.needsEqualsHashCode() ); Iterator<Property> iter = pjc.getEqualsHashCodePropertiesIterator(); // in HelloWorld.hbm.xml there're 2 Properties for toString assertEquals( "streetAddress1", iter.next().getName() ); assertEquals( "city", iter.next().getName() ); assertEquals( "verified", iter.next().getName() ); assertFalse( iter.hasNext() ); } // TODO Re-enable this test: HBX-1249 public void testGenerics() { // File file = new File(getOutputDir(), "genericsoutput"); // POJOExporter exporter = new POJOExporter( getCfg(), file ); // artifactCollector = new ArtifactCollector(); // exporter.setArtifactCollector(artifactCollector); // exporter.getProperties().setProperty("jdk5", "true"); // exporter.start(); // // File cfile = new File( getOutputDir(), "genericscompilable" ); // cfile.mkdir(); // // ArrayList<String> list = new ArrayList<String>(); // list.add( new File( "src/testoutputdependent/HelloWorld.java" ) // .getAbsolutePath() ); // TestHelper.compile( file, cfile, TestHelper.visitAllFiles( // file, list ), "1.5", "" ); // // TestHelper.deleteDir( cfile ); // // // TestHelper.deleteDir(file); } /*public void testDynamicComponent() { PersistentClass classMapping = getCfg().getClassMapping("org.hibernate.tool.hbm2x.Customer"); assertEquals("java.util.Map", new Cfg2JavaTool().getJavaTypeName(classMapping.getProperty("dynaMap"))); } */ public void testCapitializaiton() { assertEquals("Mail", BasicPOJOClass.beanCapitalize("Mail")); assertEquals("Mail", BasicPOJOClass.beanCapitalize("mail")); assertEquals("eMail", BasicPOJOClass.beanCapitalize("eMail")); assertEquals("EMail", BasicPOJOClass.beanCapitalize("EMail")); } public void testUserTypes() { PersistentClass classMapping = getMetadata().getEntityBinding("org.hibernate.tool.hbm2x.Customer"); Property property = classMapping.getProperty("customDate"); assertEquals("java.sql.Date", new Cfg2JavaTool().getJavaTypeName(property, false)); } }