mirror of
https://github.com/querydsl/querydsl.git
synced 2026-07-03 21:07:49 +08:00
Merge pull request #1793 from querydsl/i1766
Add support for multiple schemas
This commit is contained in:
commit
353cf01864
@ -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>
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
@ -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"));
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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());
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user