package org.jboss.tools.hibernate.runtime.v_5_0.internal;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.hibernate.cfg.PojoMetaDataConfiguration;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.RootClass;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table;
import org.hibernate.tool.Version;
import org.hibernate.tool.hbm2x.AbstractExporter;
import org.hibernate.tool.hbm2x.Cfg2HbmTool;
import org.hibernate.tool.hbm2x.Cfg2JavaTool;
import org.hibernate.tool.hbm2x.TemplateHelper;
import org.hibernate.tool.hbm2x.pojo.EntityPOJOClass;
import org.hibernate.tool.hbm2x.pojo.POJOClass;
import org.jboss.tools.hibernate.runtime.common.IFacade;
import org.jboss.tools.hibernate.runtime.common.IFacadeFactory;
import org.jboss.tools.hibernate.runtime.spi.IExportPOJODelegate;
import org.jboss.tools.hibernate.runtime.spi.IHibernateMappingExporter;
import org.jboss.tools.hibernate.runtime.spi.IPOJOClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class HibernateMappingExporterFacadeTest {
private static final IFacadeFactory FACADE_FACTORY = new FacadeFactoryImpl();
private static final File TMP_DIR = new File(System.getProperty("java.io.tmpdir"));
private IHibernateMappingExporter hibernateMappingExporterFacade = null;
private HibernateMappingExporterExtension hibernateMappingExporter = null;
@Before
public void setUp() throws Exception {
hibernateMappingExporter = new HibernateMappingExporterExtension(
FACADE_FACTORY, null, null);
hibernateMappingExporterFacade =
FACADE_FACTORY.createHibernateMappingExporter(hibernateMappingExporter);
}
@Test
public void testStart() throws Exception {
PojoMetaDataConfiguration configuration = new PojoMetaDataConfiguration();
RootClass persistentClass = new RootClass(null);
Table table = new Table("FOO");
Column keyColumn = new Column("BAR");
SimpleValue key = new SimpleValue(configuration.getMetadataImplementor());
key.setTypeName("String");
key.addColumn(keyColumn);
key.setTable(table);
persistentClass.setClassName("Foo");
persistentClass.setEntityName("Foo");
persistentClass.setJpaEntityName("Foo");
persistentClass.setTable(table);
persistentClass.setIdentifier(key);
configuration.addClass(persistentClass);
hibernateMappingExporter.setConfiguration(configuration);
final File outputDir = new File(TMP_DIR, "HibernateMappingExporterFacadeTest.testStart");
outputDir.mkdir();
hibernateMappingExporter.setOutputDirectory(outputDir);
final File fooHbmXml = new File(outputDir, "Foo.hbm.xml");
// First without a 'delegate' exporter
Assert.assertFalse(fooHbmXml.exists());
hibernateMappingExporterFacade.start();
Assert.assertTrue(fooHbmXml.exists());
Assert.assertTrue(fooHbmXml.delete());
// Now set a 'delegate' and invoke 'start' again
final File dummyDir = new File(outputDir, "dummy");
dummyDir.mkdir();
Assert.assertTrue(dummyDir.exists());
IExportPOJODelegate delegate = new IExportPOJODelegate() {
@Override
public void exportPOJO(Map<Object, Object> map, IPOJOClass pojoClass) {
Assert.assertTrue(dummyDir.delete());
Map<String, Object> m = new HashMap<>();
for (Object key : map.keySet()) {
m.put((String)key, map.get(key));
}
hibernateMappingExporter.superExportPOJO(
m,(POJOClass)((IFacade)pojoClass).getTarget());
}
};
Field delegateField = HibernateMappingExporterExtension.class.getDeclaredField("delegateExporter");
delegateField.setAccessible(true);
delegateField.set(hibernateMappingExporter, delegate);
hibernateMappingExporterFacade.start();
Assert.assertFalse(dummyDir.exists());
Assert.assertTrue(fooHbmXml.exists());
Assert.assertTrue(fooHbmXml.delete());
Assert.assertTrue(outputDir.exists());
}
@Test
public void testGetOutputDirectory() {
Assert.assertNull(hibernateMappingExporterFacade.getOutputDirectory());
File file = new File("testGetOutputDirectory");
hibernateMappingExporter.setOutputDirectory(file);
Assert.assertSame(file, hibernateMappingExporterFacade.getOutputDirectory());
}
@Test
public void testSetOutputDirectory() {
Assert.assertNull(hibernateMappingExporter.getOutputDirectory());
File file = new File("testSetOutputDirectory");
hibernateMappingExporterFacade.setOutputDirectory(file);
Assert.assertSame(file, hibernateMappingExporter.getOutputDirectory());
}
@Test
public void testSetExportPOJODelegate() throws Exception {
IExportPOJODelegate delegate = new IExportPOJODelegate() {
@Override
public void exportPOJO(Map<Object, Object> map, IPOJOClass pojoClass) {}
};
Field delegateField = HibernateMappingExporterExtension.class.getDeclaredField("delegateExporter");
delegateField.setAccessible(true);
Assert.assertNull(delegateField.get(hibernateMappingExporter));
hibernateMappingExporterFacade.setExportPOJODelegate(delegate);
Assert.assertSame(delegate, delegateField.get(hibernateMappingExporter));
}
@Test
public void testExportPOJO() throws Exception {
RootClass persistentClass = new RootClass(null);
Table rootTable = new Table();
rootTable.setName("FOO");
persistentClass.setTable(rootTable);
persistentClass.setEntityName("Foo");
persistentClass.setClassName("Foo");
IPOJOClass pojoClass =
FACADE_FACTORY.createPOJOClass(
new EntityPOJOClass(persistentClass, new Cfg2JavaTool()));
Map<Object, Object> additionalContext = new HashMap<Object, Object>();
Cfg2HbmTool c2h = new Cfg2HbmTool();
additionalContext.put("date", new Date().toString());
additionalContext.put("version", Version.getDefault().toString());
additionalContext.put("c2h", c2h);
final File outputDir = new File(TMP_DIR, "HibernateMappingExporterFacadeTest.testExportPOJO");
outputDir.mkdir();
hibernateMappingExporter.setOutputDirectory(outputDir);
Method setTemplateHelperMethod = AbstractExporter.class.getDeclaredMethod(
"setTemplateHelper",
new Class[] { TemplateHelper.class });
setTemplateHelperMethod.setAccessible(true);
TemplateHelper templateHelper = new TemplateHelper();
templateHelper.init(null, new String[0]);
setTemplateHelperMethod.invoke(hibernateMappingExporter, new Object[] { templateHelper });
final File fooHbmXml = new File(outputDir, "Foo.hbm.xml");
Assert.assertFalse(fooHbmXml.exists());
hibernateMappingExporterFacade.exportPOJO(additionalContext, pojoClass);
Assert.assertTrue(fooHbmXml.exists());
fooHbmXml.delete();
outputDir.delete();
}
}