package org.jboss.tools.hibernate.runtime.v_5_2.internal;
import java.io.File;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Iterator;
import java.util.Properties;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.jaxb.spi.Binding;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.DefaultNamingStrategy;
import org.hibernate.cfg.JDBCMetaDataConfiguration;
import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
import org.hibernate.dialect.Dialect;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Table;
import org.hibernate.tool.util.MetadataHelper;
import org.jboss.tools.hibernate.runtime.common.IFacade;
import org.jboss.tools.hibernate.runtime.common.IFacadeFactory;
import org.jboss.tools.hibernate.runtime.spi.IConfiguration;
import org.jboss.tools.hibernate.runtime.spi.IDialect;
import org.jboss.tools.hibernate.runtime.spi.IMappings;
import org.jboss.tools.hibernate.runtime.spi.INamingStrategy;
import org.jboss.tools.hibernate.runtime.spi.IPersistentClass;
import org.jboss.tools.hibernate.runtime.spi.IReverseEngineeringStrategy;
import org.jboss.tools.hibernate.runtime.spi.ISessionFactory;
import org.jboss.tools.hibernate.runtime.spi.ITable;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.xml.sax.EntityResolver;
import org.xml.sax.helpers.DefaultHandler;
public class ConfigurationFacadeTest {
private static final String TEST_HBM_XML_STRING =
"<!DOCTYPE hibernate-mapping PUBLIC" +
" '-//Hibernate/Hibernate Mapping DTD 3.0//EN'" +
" 'http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd'>" +
"<hibernate-mapping package='org.jboss.tools.hibernate.runtime.v_5_2.internal'>" +
" <class name='ConfigurationFacadeTest$Foo'>" +
" <id name='id'/>" +
" </class>" +
"</hibernate-mapping>";
static class Foo {
public String id;
}
private static final IFacadeFactory FACADE_FACTORY = new FacadeFactoryImpl();
private IConfiguration configurationFacade = null;
private Configuration configuration = null;
@Before
public void setUp() {
configuration = new Configuration();
configurationFacade = FACADE_FACTORY.createConfiguration(configuration);
}
@Test
public void testGetProperty() {
Assert.assertNull(configurationFacade.getProperty("foo"));
configuration.setProperty("foo", "bar");
Assert.assertEquals("bar", configurationFacade.getProperty("foo"));
}
@Test
public void testSetProperty() {
Assert.assertNull(configuration.getProperty("foo"));
configurationFacade.setProperty("foo", "bar");
Assert.assertEquals("bar", configuration.getProperty("foo"));
}
@Test
public void testSetProperties() {
Properties testProperties = new Properties();
Assert.assertNotSame(testProperties, configuration.getProperties());
Assert.assertSame(
configurationFacade,
configurationFacade.setProperties(testProperties));
Assert.assertSame(testProperties, configuration.getProperties());
}
@Test
public void testAddFile() throws Exception {
File testFile = File.createTempFile("test", "hbm.xml");
PrintWriter printWriter = new PrintWriter(testFile);
printWriter.write(TEST_HBM_XML_STRING);
printWriter.close();
MetadataSources metadataSources = MetadataHelper.getMetadataSources(configuration);
Assert.assertTrue(metadataSources.getXmlBindings().isEmpty());
Assert.assertSame(
configurationFacade,
configurationFacade.addFile(testFile));
Assert.assertFalse(metadataSources.getXmlBindings().isEmpty());
Binding<?> binding = metadataSources.getXmlBindings().iterator().next();
Assert.assertEquals(testFile.getAbsolutePath(), binding.getOrigin().getName());
Assert.assertTrue(testFile.delete());
}
@Test
public void testSetEntityResolver() {
EntityResolver testResolver = new DefaultHandler();
ConfigurationFacadeImpl facade = (ConfigurationFacadeImpl)configurationFacade;
Assert.assertNull(facade.entityResolver);
configurationFacade.setEntityResolver(testResolver);
Assert.assertSame(testResolver, facade.entityResolver);
}
@Test
public void testGetEntityResolver() {
EntityResolver testResolver = new DefaultHandler();
ConfigurationFacadeImpl facade = (ConfigurationFacadeImpl)configurationFacade;
Assert.assertNotSame(testResolver, configurationFacade.getEntityResolver());
facade.entityResolver = testResolver;
Assert.assertSame(testResolver, configurationFacade.getEntityResolver());
}
@Test
public void testSetNamingStrategy() {
INamingStrategy namingStrategy = FACADE_FACTORY.createNamingStrategy(new DefaultNamingStrategy());
ConfigurationFacadeImpl facade = (ConfigurationFacadeImpl)configurationFacade;
Assert.assertNotSame(namingStrategy, facade.namingStrategy);
configurationFacade.setNamingStrategy(namingStrategy);
Assert.assertSame(namingStrategy, facade.namingStrategy);
}
@Test
public void testAddProperties() {
Assert.assertNull(configuration.getProperty("foo"));
Properties testProperties = new Properties();
testProperties.put("foo", "bar");
configurationFacade.addProperties(testProperties);
Assert.assertEquals("bar", configuration.getProperty("foo"));
}
@Test
public void testConfigure() {
String fooClassName =
"org.jboss.tools.hibernate.runtime.v_5_2.internal.test.Foo";
Metadata metadata = MetadataHelper.getMetadata(configuration);
Assert.assertNull(metadata.getEntityBinding(fooClassName));
configurationFacade.configure();
metadata = MetadataHelper.getMetadata(configuration);
Assert.assertNotNull(metadata.getEntityBinding(fooClassName));
}
@Test
public void testCreateMappings() {
IMappings mappingsFacade = configurationFacade.createMappings();
Assert.assertNotNull(mappingsFacade);
Object object = ((IFacade)mappingsFacade).getTarget();
Assert.assertNull(object);
}
@Test
public void testBuildMappings() throws Exception {
ConfigurationFacadeImpl facade = (ConfigurationFacadeImpl)configurationFacade;
Assert.assertNull(facade.mappings);
configurationFacade.buildMappings();
Assert.assertNotNull(facade.mappings);
MappingsFacadeImpl mappings = (MappingsFacadeImpl)facade.mappings;
Assert.assertSame(configurationFacade, mappings.configuration);
}
@Test
public void testBuildSessionFactory() throws Throwable {
ISessionFactory sessionFactoryFacade =
configurationFacade.buildSessionFactory();
Assert.assertNotNull(sessionFactoryFacade);
Object sessionFactory = ((IFacade)sessionFactoryFacade).getTarget();
Assert.assertNotNull(sessionFactory);
Assert.assertTrue(sessionFactory instanceof SessionFactory);
}
@Test
public void testGetClassMappings() {
configurationFacade = FACADE_FACTORY.createConfiguration(configuration);
Iterator<IPersistentClass> iterator = configurationFacade.getClassMappings();
Assert.assertFalse(iterator.hasNext());
configuration.configure();
configurationFacade = FACADE_FACTORY.createConfiguration(configuration);
iterator = configurationFacade.getClassMappings();
IPersistentClass persistentClassFacade = iterator.next();
Assert.assertEquals(
"org.jboss.tools.hibernate.runtime.v_5_2.internal.test.Foo",
persistentClassFacade.getClassName());
}
@Test
public void testSetPreferBasicCompositeIds() {
JDBCMetaDataConfiguration configuration = new JDBCMetaDataConfiguration();
configurationFacade = FACADE_FACTORY.createConfiguration(configuration);
// the default is false
Assert.assertTrue(configuration.preferBasicCompositeIds());
configurationFacade.setPreferBasicCompositeIds(false);
Assert.assertFalse(configuration.preferBasicCompositeIds());
}
@Test
public void testSetReverseEngineeringStrategy() {
JDBCMetaDataConfiguration configuration = new JDBCMetaDataConfiguration();
configurationFacade = FACADE_FACTORY.createConfiguration(configuration);
ReverseEngineeringStrategy reverseEngineeringStrategy = new DefaultReverseEngineeringStrategy();
IReverseEngineeringStrategy strategyFacade =
FACADE_FACTORY.createReverseEngineeringStrategy(reverseEngineeringStrategy);
Assert.assertNotSame(
reverseEngineeringStrategy,
configuration.getReverseEngineeringStrategy());
configurationFacade.setReverseEngineeringStrategy(strategyFacade);
Assert.assertSame(
reverseEngineeringStrategy,
configuration.getReverseEngineeringStrategy());
}
@Test
public void testReadFromJDBC() throws Exception {
Connection connection = DriverManager.getConnection("jdbc:h2:mem:test");
Statement statement = connection.createStatement();
statement.execute("CREATE TABLE FOO(id int primary key, bar varchar(255))");
JDBCMetaDataConfiguration jdbcMdCfg = new JDBCMetaDataConfiguration();
jdbcMdCfg.setProperty("hibernate.connection.url", "jdbc:h2:mem:test");
configurationFacade = FACADE_FACTORY.createConfiguration(jdbcMdCfg);
Metadata metadata = jdbcMdCfg.getMetadata();
Iterator<?> iterator = metadata.getEntityBindings().iterator();
jdbcMdCfg = new JDBCMetaDataConfiguration();
jdbcMdCfg.setProperty("hibernate.connection.url", "jdbc:h2:mem:test");
configurationFacade = FACADE_FACTORY.createConfiguration(jdbcMdCfg);
Assert.assertFalse(iterator.hasNext());
configurationFacade.readFromJDBC();
metadata = jdbcMdCfg.getMetadata();
iterator = metadata.getEntityBindings().iterator();
PersistentClass persistentClass = (PersistentClass)iterator.next();
Assert.assertEquals("Foo", persistentClass.getClassName());
statement.execute("DROP TABLE FOO");
connection.close();
}
@Test
public void testGetClassMapping() {
configurationFacade = FACADE_FACTORY.createConfiguration(configuration);
Assert.assertNull(configurationFacade.getClassMapping(
"org.jboss.tools.hibernate.runtime.v_5_2.internal.test.Foo"));
configuration.configure();
configurationFacade = FACADE_FACTORY.createConfiguration(configuration);
Assert.assertNotNull(configurationFacade.getClassMapping(
"org.jboss.tools.hibernate.runtime.v_5_2.internal.test.Foo"));
}
@Test
public void testGetNamingStrategy() {
INamingStrategy strategy = FACADE_FACTORY.createNamingStrategy(new DefaultNamingStrategy());
ConfigurationFacadeImpl facade = (ConfigurationFacadeImpl)configurationFacade;
Assert.assertNull(facade.getNamingStrategy());
facade.namingStrategy = strategy;
Assert.assertSame(strategy, facade.getNamingStrategy());
}
@Test
public void testGetTableMappings() throws Exception {
Connection connection = DriverManager.getConnection("jdbc:h2:mem:test");
Statement statement = connection.createStatement();
statement.execute("CREATE TABLE FOO(id int primary key, bar varchar(255))");
JDBCMetaDataConfiguration jdbcMdCfg = new JDBCMetaDataConfiguration();
jdbcMdCfg.setProperty("hibernate.connection.url", "jdbc:h2:mem:test");
configurationFacade = FACADE_FACTORY.createConfiguration(jdbcMdCfg);
Iterator<ITable> iterator = configurationFacade.getTableMappings();
Assert.assertFalse(iterator.hasNext());
jdbcMdCfg.readFromJDBC();
configurationFacade = FACADE_FACTORY.createConfiguration(jdbcMdCfg);
iterator = configurationFacade.getTableMappings();
Table table = (Table)((IFacade)iterator.next()).getTarget();
Assert.assertEquals("FOO", table.getName());
statement.execute("DROP TABLE FOO");
connection.close();
}
@Test
public void testGetDialect() {
configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
IDialect dialectFacade = configurationFacade.getDialect();
Assert.assertNotNull(dialectFacade);
Dialect dialect = (Dialect)((IFacade)dialectFacade).getTarget();
Assert.assertEquals("org.hibernate.dialect.H2Dialect", dialect.getClass().getName());
}
@Test
public void testGetDefaultCatalogName() {
Assert.assertNull(configurationFacade.getDefaultCatalogName());
}
@Test
public void testGetDefaultSchemaName() {
Assert.assertNull(configurationFacade.getDefaultSchemaName());
}
}