Merge pull request #1793 from querydsl/i1766

Add support for multiple schemas
This commit is contained in:
Timo Westkämper 2016-02-29 22:20:23 +02:00
commit 353cf01864
7 changed files with 131 additions and 74 deletions

View File

@ -159,7 +159,8 @@
</row>
<row>
<entry>schemaPattern</entry>
<entry>a schema name pattern in LIKE pattern form; must match the schema name as it is stored in the database;
<entry>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)</entry>
</row>
<row>

View File

@ -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<String> schemas = Arrays.asList(schemaPattern);
if (schemaPattern != null && schemaPattern.contains(",")) {
schemas = ImmutableList.copyOf(schemaPattern.split(","));
}
List<String> 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);

View File

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

View File

@ -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"));

View File

@ -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;
}
}

View File

@ -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<Serializer> BEAN_SERIALIZERS = Arrays.<Serializer>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());
}
}

View File

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