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());