diff --git a/querydsl-docs/src/main/docbook/en-US/content/tutorials/sql.xml b/querydsl-docs/src/main/docbook/en-US/content/tutorials/sql.xml index b2b7c7277..26603fd4d 100644 --- a/querydsl-docs/src/main/docbook/en-US/content/tutorials/sql.xml +++ b/querydsl-docs/src/main/docbook/en-US/content/tutorials/sql.xml @@ -159,7 +159,8 @@ schemaPattern - a schema name pattern in LIKE pattern form; must match the schema name as it is stored in the database; + a schema name pattern in LIKE pattern form; must match the schema name as it is stored in the database, + multiple can be separated by comma (default: null) diff --git a/querydsl-sql-codegen/src/main/java/com/querydsl/sql/codegen/MetaDataExporter.java b/querydsl-sql-codegen/src/main/java/com/querydsl/sql/codegen/MetaDataExporter.java index 664536543..22f76132e 100644 --- a/querydsl-sql-codegen/src/main/java/com/querydsl/sql/codegen/MetaDataExporter.java +++ b/querydsl-sql-codegen/src/main/java/com/querydsl/sql/codegen/MetaDataExporter.java @@ -28,6 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; import com.google.common.io.Files; import com.mysema.codegen.CodeWriter; import com.mysema.codegen.JavaWriter; @@ -188,6 +189,7 @@ public class MetaDataExporter { SpatialSupport.addSupport(module); } + classes.clear(); typeMappings = module.get(TypeMappings.class); queryTypeFactory = module.get(QueryTypeFactory.class); serializer = module.get(Serializer.class); @@ -229,26 +231,32 @@ public class MetaDataExporter { typesArray = types.toArray(new String[types.size()]); } + List schemas = Arrays.asList(schemaPattern); + if (schemaPattern != null && schemaPattern.contains(",")) { + schemas = ImmutableList.copyOf(schemaPattern.split(",")); + } + List tables = Arrays.asList(tableNamePattern); if (tableNamePattern != null && tableNamePattern.contains(",")) { - for (String table : tableNamePattern.split(",")) { - ResultSet tables = md.getTables(null, schemaPattern, table.trim(), typesArray); - try { - while (tables.next()) { - handleTable(md, tables); - } - } finally { - tables.close(); - } + tables = ImmutableList.copyOf(tableNamePattern.split(",")); + } + + for (String schema : schemas) { + schema = schema != null ? schema.trim() : null; + for (String table : tables) { + table = table != null ? table.trim() : null; + handleTables(md, schema, table, typesArray); } - } else { - ResultSet tables = md.getTables(null, schemaPattern, tableNamePattern, typesArray); - try { - while (tables.next()) { - handleTable(md, tables); - } - } finally { - tables.close(); + } + } + + private void handleTables(DatabaseMetaData md, String schemaPattern, String tablePattern, String[] types) throws SQLException { + ResultSet tables = md.getTables(null, schemaPattern, tablePattern, types); + try { + while (tables.next()) { + handleTable(md, tables); } + } finally { + tables.close(); } } @@ -396,7 +404,7 @@ public class MetaDataExporter { } else { String packageName = normalizePackage(module.getPackageName(), schemaAndTable); String path = packageName.replace('.', '/') + "/" + type.getSimpleName() + fileSuffix; - write(serializer,new File(targetFolder, path), type); + write(serializer, new File(targetFolder, path), type); } } catch (IOException e) { @@ -405,7 +413,10 @@ public class MetaDataExporter { } private void write(Serializer serializer, File targetFile, EntityType type) throws IOException { - classes.add(targetFile.getPath()); + if (!classes.add(targetFile.getPath())) { + throw new IllegalStateException("Attempted to write multiple times to " + + targetFile.getPath() + ", please check your configuration"); + } StringWriter w = new StringWriter(); CodeWriter writer = createScalaSources ? new ScalaWriter(w) : new JavaWriter(w); serializer.serialize(type, SimpleSerializerConfig.DEFAULT, writer); diff --git a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/ExportBaseTest.java b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/ExportBaseTest.java index c8c281c06..8fcd0a7a2 100644 --- a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/ExportBaseTest.java +++ b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/ExportBaseTest.java @@ -13,26 +13,28 @@ */ package com.querydsl.sql.codegen; -import java.io.File; import java.sql.SQLException; import org.junit.AfterClass; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import com.querydsl.sql.Connections; public abstract class ExportBaseTest { + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + @Test public void export() throws SQLException { - File folder = new File("target", getClass().getSimpleName()); - folder.mkdirs(); NamingStrategy namingStrategy = new DefaultNamingStrategy(); MetaDataExporter exporter = new MetaDataExporter(); exporter.setSpatial(true); exporter.setSchemaPattern(getSchemaPattern()); exporter.setPackageName("test"); - exporter.setTargetFolder(folder); + exporter.setTargetFolder(folder.getRoot()); exporter.setNamingStrategy(namingStrategy); exporter.export(Connections.getConnection().getMetaData()); } diff --git a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/ExportH2TwoSchemasTest.java b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/ExportH2TwoSchemasTest.java index 6502dc99a..139382f75 100644 --- a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/ExportH2TwoSchemasTest.java +++ b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/ExportH2TwoSchemasTest.java @@ -11,8 +11,10 @@ import java.sql.Statement; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; +import org.junit.rules.TemporaryFolder; import com.google.common.base.Charsets; import com.google.common.io.Resources; @@ -22,6 +24,9 @@ import com.querydsl.sql.Connections; @Category(H2.class) public class ExportH2TwoSchemasTest { + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + @BeforeClass public static void setUpClass() throws Exception { Connections.initH2(); @@ -29,7 +34,7 @@ public class ExportH2TwoSchemasTest { Statement stmt = Connections.getStatement(); stmt.execute("create schema if not exists newschema"); stmt.execute("create table if not exists " + - "newschema.SURVEY(ID2 int auto_increment, NAME2 varchar(30), NAME3 varchar(30))"); + "newschema.SURVEY2(ID2 int auto_increment, NAME2 varchar(30), NAME3 varchar(30))"); } @AfterClass @@ -39,17 +44,15 @@ public class ExportH2TwoSchemasTest { @Test public void export() throws SQLException, MalformedURLException, IOException { - File folder = new File("target", getClass().getSimpleName()); - folder.mkdirs(); NamingStrategy namingStrategy = new DefaultNamingStrategy(); MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern(null); exporter.setPackageName("test"); - exporter.setTargetFolder(folder); + exporter.setTargetFolder(folder.getRoot()); exporter.setNamingStrategy(namingStrategy); exporter.export(Connections.getConnection().getMetaData()); - String contents = Resources.toString(new File(folder, "test/QSurvey.java").toURI().toURL(), + String contents = Resources.toString(new File(folder.getRoot(), "test/QSurvey.java").toURI().toURL(), Charsets.UTF_8); assertTrue(contents.contains("id")); assertTrue(contents.contains("name")); diff --git a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataExporterAllTest.java b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataExporterAllTest.java index ccc2c6d08..723d7176f 100644 --- a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataExporterAllTest.java +++ b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataExporterAllTest.java @@ -17,6 +17,7 @@ import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import com.google.common.base.Objects; import com.google.common.collect.Lists; import com.mysema.codegen.SimpleCompiler; import com.querydsl.codegen.BeanSerializer; @@ -76,9 +77,8 @@ public class MetaDataExporterAllTest { for (boolean withOrdinalPositioning : booleans) { for (boolean exportColumns : booleans) { for (boolean schemaToPackage : booleans) { - if (withBeans) { - if (!beanPrefix.isEmpty() || !beanSuffix.isEmpty() || - beanPackageName != null) { + if (withBeans && beanPackageName == null) { + if (Objects.equal(namePrefix, beanPrefix) && Objects.equal(nameSuffix, beanSuffix)) { continue; } } diff --git a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataExporterTest.java b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataExporterTest.java index d702ea19e..eb4a0d044 100644 --- a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataExporterTest.java +++ b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataExporterTest.java @@ -18,28 +18,21 @@ import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import java.sql.*; -import java.util.Arrays; -import java.util.List; 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.codegen.Serializer; import com.querydsl.core.util.FileUtils; public class MetaDataExporterTest { - private static final List BEAN_SERIALIZERS = Arrays.asList( - new BeanSerializer()); - private static Connection connection; - private Serializer beanSerializer; - private boolean clean = true; private boolean exportColumns = false; @@ -50,6 +43,9 @@ public class MetaDataExporterTest { private JavaCompiler compiler = new SimpleCompiler(); + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + @BeforeClass public static void setUpClass() throws ClassNotFoundException, SQLException { Class.forName("org.h2.Driver"); @@ -141,14 +137,14 @@ public class MetaDataExporterTest { @Test public void normalSettings_repetition() throws SQLException { - test("Q", "", "", "", defaultNaming, "target/1", false, false, false); + test("Q", "", "", "", defaultNaming, folder.getRoot(), false, false, false); - File file = new File("target/1/test/QEmployee.java"); + File file = new File(folder.getRoot(), "test/QEmployee.java"); long lastModified = file.lastModified(); assertTrue(file.exists()); clean = false; - test("Q", "", "", "", defaultNaming, "target/1", false, false, false); + test("Q", "", "", "", defaultNaming, folder.getRoot(), false, false, false); assertEquals(lastModified, file.lastModified()); } @@ -158,14 +154,14 @@ public class MetaDataExporterTest { exporter.setSchemaPattern("PUBLIC"); exporter.setNamePrefix("Q"); exporter.setPackageName("test"); - exporter.setTargetFolder(new File("target/7")); + exporter.setTargetFolder(folder.getRoot()); exporter.setNamingStrategy(new DefaultNamingStrategy()); exporter.setBeanSerializer(new BeanSerializer()); exporter.setBeanPackageName("test2"); exporter.export(metadata); - assertTrue(new File("target/7/test/QDateTest.java").exists()); - assertTrue(new File("target/7/test2/DateTest.java").exists()); + assertTrue(new File(folder.getRoot(), "test/QDateTest.java").exists()); + assertTrue(new File(folder.getRoot(), "test2/DateTest.java").exists()); } @Test @@ -173,10 +169,36 @@ public class MetaDataExporterTest { MetaDataExporter exporter = new MetaDataExporter(); exporter.setSchemaPattern("PUBLIC"); exporter.setPackageName("test"); - exporter.setTargetFolder(new File("target/8")); + exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); - assertTrue(new File("target/8/test/QDateTest.java").exists()); + 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 @@ -185,13 +207,28 @@ public class MetaDataExporterTest { exporter.setSchemaPattern("PUBLIC"); exporter.setTableNamePattern("RESERVED,UNDERSCORE,BEANGEN1"); exporter.setPackageName("test"); - exporter.setTargetFolder(new File("target/82")); + exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); - assertTrue(new File("target/82/test/QBeangen1.java").exists()); - assertTrue(new File("target/82/test/QReserved.java").exists()); - assertTrue(new File("target/82/test/QUnderscore.java").exists()); - assertFalse(new File("target/82/test/QDefinstance.java").exists()); + 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 @@ -201,10 +238,10 @@ public class MetaDataExporterTest { exporter.setPackageName("test"); exporter.setNamePrefix(""); exporter.setNameSuffix("Type"); - exporter.setTargetFolder(new File("target/9")); + exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); - assertTrue(new File("target/9/test/DateTestType.java").exists()); + assertTrue(new File(folder.getRoot(), "test/DateTestType.java").exists()); } @Test @@ -214,11 +251,11 @@ public class MetaDataExporterTest { exporter.setPackageName("test"); exporter.setNamePrefix(""); exporter.setNameSuffix("Type"); - exporter.setTargetFolder(new File("target/10")); + exporter.setTargetFolder(folder.getRoot()); exporter.setExportForeignKeys(false); exporter.export(metadata); - assertTrue(new File("target/10/test/DateTestType.java").exists()); + assertTrue(new File(folder.getRoot(), "test/DateTestType.java").exists()); } @Test @@ -229,11 +266,11 @@ public class MetaDataExporterTest { exporter.setNamePrefix(""); exporter.setBeanPrefix("Bean"); exporter.setBeanSerializer(new BeanSerializer()); - exporter.setTargetFolder(new File("target/a")); + exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); - assertTrue(new File("target/a/test/DateTest.java").exists()); - assertTrue(new File("target/a/test/BeanDateTest.java").exists()); + assertTrue(new File(folder.getRoot(), "test/DateTest.java").exists()); + assertTrue(new File(folder.getRoot(), "test/BeanDateTest.java").exists()); } @Test @@ -244,33 +281,32 @@ public class MetaDataExporterTest { exporter.setNamePrefix(""); exporter.setBeanSuffix("Bean"); exporter.setBeanSerializer(new BeanSerializer()); - exporter.setTargetFolder(new File("target/b")); + exporter.setTargetFolder(folder.getRoot()); exporter.export(metadata); - assertTrue(new File("target/b/test/DateTest.java").exists()); - assertTrue(new File("target/b/test/DateTestBean.java").exists()); + 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 { + 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(new File("target/b1")); - exporter.setBeansTargetFolder(new File("target/b2")); + exporter.setTargetFolder(folder.getRoot()); + exporter.setBeansTargetFolder(folder.newFolder("beans")); exporter.export(metadata); - assertTrue(new File("target/b1/test/DateTest.java").exists()); - assertTrue(new File("target/b2/test/DateTestBean.java").exists()); + 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, String target, boolean withBeans, + NamingStrategy namingStrategy, File targetDir, boolean withBeans, boolean withInnerClasses, boolean withOrdinalPositioning) throws SQLException { - File targetDir = new File(target); if (clean) { try { if (targetDir.exists()) { @@ -295,7 +331,7 @@ public class MetaDataExporterTest { exporter.setNamingStrategy(namingStrategy); exporter.setSchemaToPackage(schemaToPackage); if (withBeans) { - exporter.setBeanSerializer(beanSerializer); + exporter.setBeanSerializer(new BeanSerializer()); } if (withOrdinalPositioning) { exporter.setColumnComparatorClass(OrdinalPositionComparator.class); @@ -306,7 +342,7 @@ public class MetaDataExporterTest { int compilationResult = compiler.run(null, System.out, System.err, classes.toArray(new String[classes.size()])); if (compilationResult != 0) { - Assert.fail("Compilation Failed for " + target); + Assert.fail("Compilation Failed for " + targetDir.getAbsolutePath()); } } diff --git a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataSerializerTest.java b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataSerializerTest.java index d2d31f928..2d100aff7 100644 --- a/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataSerializerTest.java +++ b/querydsl-sql-codegen/src/test/java/com/querydsl/sql/codegen/MetaDataSerializerTest.java @@ -13,7 +13,6 @@ */ package com.querydsl.sql.codegen; -import java.io.File; import java.sql.SQLException; import java.util.Set; @@ -21,7 +20,9 @@ import javax.tools.JavaCompiler; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import com.mysema.codegen.SimpleCompiler; import com.querydsl.codegen.BeanSerializer; @@ -29,6 +30,9 @@ import com.querydsl.sql.AbstractJDBCTest; public class MetaDataSerializerTest extends AbstractJDBCTest { + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + @Override @Before public void setUp() throws SQLException, ClassNotFoundException { @@ -77,7 +81,7 @@ public class MetaDataSerializerTest extends AbstractJDBCTest { exporter.setBeanSerializerClass(BeanSerializer.class); exporter.setNamePrefix(namePrefix); exporter.setPackageName("test"); - exporter.setTargetFolder(new File("target/cust1")); + exporter.setTargetFolder(folder.getRoot()); exporter.setNamingStrategy(namingStrategy); exporter.export(connection.getMetaData());