/* * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.querydsl.sql.codegen; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import java.sql.*; import java.util.Set; import javax.tools.JavaCompiler; import org.junit.*; import org.junit.rules.TemporaryFolder; import com.mysema.codegen.SimpleCompiler; import com.querydsl.codegen.BeanSerializer; import com.querydsl.core.util.FileUtils; public class MetaDataExporterTest { private static Connection connection; private boolean clean = true; private boolean exportColumns = false; private boolean schemaToPackage = false; private DatabaseMetaData metadata; private JavaCompiler compiler = new SimpleCompiler(); @Rule public TemporaryFolder folder = new TemporaryFolder(); @BeforeClass public static void setUpClass() throws ClassNotFoundException, SQLException { Class.forName("org.h2.Driver"); String url = "jdbc:h2:mem:testdb" + System.currentTimeMillis(); connection = DriverManager.getConnection(url, "sa", ""); createTables(connection); } static void createTables(Connection connection) throws SQLException { Statement stmt = connection.createStatement(); try { // reserved words stmt.execute("create table reserved (id int, while int)"); stmt.execute("create table class (id int)"); // underscore stmt.execute("create table underscore (e_id int, c_id int)"); // bean generation stmt.execute("create table beangen1 (\"SEP_Order\" int)"); // default instance clash stmt.execute("create table definstance (id int, definstance int, definstance1 int)"); // class with pk and fk classes stmt.execute("create table pkfk (id int primary key, pk int, fk int)"); // camel case stmt.execute("create table \"camelCase\" (id int)"); stmt.execute("create table \"vwServiceName\" (id int)"); // simple types stmt.execute("create table date_test (d date)"); stmt.execute("create table date_time_test (dt datetime)"); // complex type stmt.execute("create table survey (id int, name varchar(30))"); // new line stmt.execute("create table \"new\nline\" (id int)"); stmt.execute("create table newline2 (id int, \"new\nline\" int)"); stmt.execute("create table employee(" + "id INT, " + "firstname VARCHAR(50), " + "lastname VARCHAR(50), " + "salary DECIMAL(10, 2), " + "datefield DATE, " + "timefield TIME, " + "superior_id int, " + "survey_id int, " + "survey_name varchar(30), " + "CONSTRAINT PK_employee PRIMARY KEY (id), " + "CONSTRAINT FK_superior FOREIGN KEY (superior_id) REFERENCES employee(id))"); // multi key stmt.execute("create table multikey(id INT, id2 VARCHAR, id3 INT, CONSTRAINT pk_multikey PRIMARY KEY (id, id2, id3) )"); // M_PRODUCT_BOM_ID stmt.execute("create table product(id int, " + "m_product_bom_id int, " + "m_productbom_id int, " + "constraint product_bom foreign key (m_productbom_id) references product(id))"); } finally { stmt.close(); } } @AfterClass public static void tearDownClass() throws SQLException { connection.close(); } @Before public void setUp() throws ClassNotFoundException, SQLException { metadata = connection.getMetaData(); } private static final NamingStrategy defaultNaming = new DefaultNamingStrategy(); private static final NamingStrategy originalNaming = new OriginalNamingStrategy(); private String beanPackageName = null; @Test public void normalSettings_repetition() throws SQLException { test("Q", "", "", "", defaultNaming, folder.getRoot(), false, false, false); File file = new File(folder.getRoot(), "test/QEmployee.java"); long lastModified = file.lastModified(); assertTrue(file.exists()); clean = false; test("Q", "", "", "", defaultNaming, folder.getRoot(), false, false, false); assertEquals(lastModified, file.lastModified()); } @Test public void explicit_configuration() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setNamePrefix("Q"); exporter.setPackageName("test"); exporter.setTargetFolder(folder.getRoot()); exporter.setNamingStrategy(new DefaultNamingStrategy()); exporter.setBeanSerializer(new BeanSerializer()); exporter.setBeanPackageName("test2"); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/QDateTest.java").exists()); assertTrue(new File(folder.getRoot(), "test2/DateTest.java").exists()); } @Test public void minimal_configuration() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setPackageName("test"); exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/QDateTest.java").exists()); } @Test public void minimal_configuration_with_schemas() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC2,PUBLIC"); exporter.setPackageName("test"); exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/QDateTest.java").exists()); } @Test public void minimal_configuration_with_schemas_and_tables() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC2,PUBLIC"); exporter.setTableNamePattern("RESERVED,UNDERSCORE,BEANGEN1"); exporter.setPackageName("test"); exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/QBeangen1.java").exists()); assertTrue(new File(folder.getRoot(), "test/QReserved.java").exists()); assertTrue(new File(folder.getRoot(), "test/QUnderscore.java").exists()); assertFalse(new File(folder.getRoot(), "test/QDefinstance.java").exists()); } @Test public void minimal_configuration_with_tables() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setTableNamePattern("RESERVED,UNDERSCORE,BEANGEN1"); exporter.setPackageName("test"); exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/QBeangen1.java").exists()); assertTrue(new File(folder.getRoot(), "test/QReserved.java").exists()); assertTrue(new File(folder.getRoot(), "test/QUnderscore.java").exists()); assertFalse(new File(folder.getRoot(), "test/QDefinstance.java").exists()); } @Test(expected = IllegalStateException.class) public void minimal_configuration_with_duplicate_tables() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setTableNamePattern("%,%"); exporter.setPackageName("test"); exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/QBeangen1.java").exists()); assertTrue(new File(folder.getRoot(), "test/QReserved.java").exists()); assertTrue(new File(folder.getRoot(), "test/QUnderscore.java").exists()); assertFalse(new File(folder.getRoot(), "test/QDefinstance.java").exists()); } @Test public void minimal_configuration_with_suffix() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setPackageName("test"); exporter.setNamePrefix(""); exporter.setNameSuffix("Type"); exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/DateTestType.java").exists()); } @Test public void minimal_configuration_without_keys() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setPackageName("test"); exporter.setNamePrefix(""); exporter.setNameSuffix("Type"); exporter.setTargetFolder(folder.getRoot()); exporter.setExportForeignKeys(false); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/DateTestType.java").exists()); } @Test public void minimal_configuration_only_direct_foreign_keys() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setPackageName("test"); exporter.setNamePrefix(""); exporter.setNameSuffix("Type"); exporter.setTargetFolder(folder.getRoot()); exporter.setExportInverseForeignKeys(false); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/DateTestType.java").exists()); } @Test public void minimal_configuration_with_bean_prefix() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setPackageName("test"); exporter.setNamePrefix(""); exporter.setBeanPrefix("Bean"); exporter.setBeanSerializer(new BeanSerializer()); exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/DateTest.java").exists()); assertTrue(new File(folder.getRoot(), "test/BeanDateTest.java").exists()); } @Test public void minimal_configuration_with_bean_suffix() throws SQLException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setPackageName("test"); exporter.setNamePrefix(""); exporter.setBeanSuffix("Bean"); exporter.setBeanSerializer(new BeanSerializer()); exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/DateTest.java").exists()); assertTrue(new File(folder.getRoot(), "test/DateTestBean.java").exists()); } @Test public void minimal_configuration_with_bean_folder() throws SQLException, IOException { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setPackageName("test"); exporter.setNamePrefix(""); exporter.setBeanSuffix("Bean"); exporter.setBeanSerializer(new BeanSerializer()); exporter.setTargetFolder(folder.getRoot()); exporter.setBeansTargetFolder(folder.newFolder("beans")); exporter.export(metadata); assertTrue(new File(folder.getRoot(), "test/DateTest.java").exists()); assertTrue(new File(folder.getRoot(), "beans/test/DateTestBean.java").exists()); } private void test(String namePrefix, String nameSuffix, String beanPrefix, String beanSuffix, NamingStrategy namingStrategy, File targetDir, boolean withBeans, boolean withInnerClasses, boolean withOrdinalPositioning) throws SQLException { if (clean) { try { if (targetDir.exists()) { FileUtils.delete(targetDir); } } catch (IOException e) { throw new RuntimeException(e); } } MetaDataExporter exporter = new MetaDataExporter(); exporter.setColumnAnnotations(exportColumns); exporter.setSchemaPattern("PUBLIC"); exporter.setNamePrefix(namePrefix); exporter.setNameSuffix(nameSuffix); exporter.setBeanPrefix(beanPrefix); exporter.setBeanSuffix(beanSuffix); exporter.setInnerClassesForKeys(withInnerClasses); exporter.setPackageName("test"); exporter.setBeanPackageName(beanPackageName); exporter.setTargetFolder(targetDir); exporter.setNamingStrategy(namingStrategy); exporter.setSchemaToPackage(schemaToPackage); if (withBeans) { exporter.setBeanSerializer(new BeanSerializer()); } if (withOrdinalPositioning) { exporter.setColumnComparatorClass(OrdinalPositionComparator.class); } exporter.export(metadata); Set<String> classes = exporter.getClasses(); int compilationResult = compiler.run(null, System.out, System.err, classes.toArray(new String[classes.size()])); if (compilationResult != 0) { Assert.fail("Compilation Failed for " + targetDir.getAbsolutePath()); } } }