/* * 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 java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static org.hamcrest.Matchers.stringContainsInOrder; import static org.junit.Assert.assertThat; import java.io.IOException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Set; 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.google.common.io.Files; import com.mysema.codegen.SimpleCompiler; import com.querydsl.codegen.BeanSerializer; import com.querydsl.sql.AbstractJDBCTest; import com.querydsl.sql.Configuration; import com.querydsl.sql.SQLTemplates; import com.querydsl.sql.types.AbstractType; public class MetaDataSerializerTest extends AbstractJDBCTest { public static class CustomNumber { } @Rule public TemporaryFolder folder = new TemporaryFolder(); @Override @Before public void setUp() throws SQLException, ClassNotFoundException { super.setUp(); statement.execute("drop table employee if exists"); statement.execute("drop table survey if exists"); statement.execute("drop table date_test if exists"); statement.execute("drop table date_time_test if exists"); statement.execute("drop table spaces if exists"); // survey statement.execute("create table survey (id int, name varchar(30), " + "CONSTRAINT PK_survey PRIMARY KEY (id, name))"); // date_test statement.execute("create table date_test (d date)"); // date_time statement.execute("create table date_time_test (dt datetime)"); // spaces statement.execute("create table spaces (\"spaces \n 1\" date)"); // employee statement.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, " + "\"123abc\" int," + "survey_name varchar(30), " + "CONSTRAINT PK_employee PRIMARY KEY (id), " + "CONSTRAINT FK_survey FOREIGN KEY (survey_id, survey_name) REFERENCES survey(id,name), " + "CONSTRAINT FK_superior FOREIGN KEY (superior_id) REFERENCES employee(id))"); } @Test public void normal_serialization() throws SQLException { String namePrefix = "Q"; NamingStrategy namingStrategy = new DefaultNamingStrategy(); // customization of serialization MetaDataExporter exporter = new MetaDataExporter(); exporter.setBeanSerializerClass(BeanSerializer.class); exporter.setNamePrefix(namePrefix); exporter.setPackageName("test"); exporter.setTargetFolder(folder.getRoot()); exporter.setNamingStrategy(namingStrategy); exporter.export(connection.getMetaData()); compile(exporter); // validation of output try { // assertMethodsPresent("test/QSurvey.java", // variable + schema constructor " public QSurvey(String variable, String schema) {\n" + " super(Survey.class, forVariable(variable), schema, \"SURVEY\");\n" + " addMetadata();\n" + " }" ); } catch (IOException ex) { throw new RuntimeException(ex); } } @Test public void customized_serialization() throws SQLException { String namePrefix = "Q"; Configuration conf = new Configuration(SQLTemplates.DEFAULT); conf.register("EMPLOYEE", "ID", new AbstractType<CustomNumber>(0) { @Override public Class<CustomNumber> getReturnedClass() { return CustomNumber.class; } @Override public CustomNumber getValue(ResultSet rs, int startIndex) throws SQLException { throw new UnsupportedOperationException(); } @Override public void setValue(PreparedStatement st, int startIndex, CustomNumber value) throws SQLException { throw new UnsupportedOperationException(); } }); NamingStrategy namingStrategy = new DefaultNamingStrategy(); // customization of serialization MetaDataExporter exporter = new MetaDataExporter(); exporter.setBeanSerializerClass(BeanSerializer.class); exporter.setNamePrefix(namePrefix); exporter.setPackageName("test"); exporter.setTargetFolder(folder.getRoot()); exporter.setNamingStrategy(namingStrategy); exporter.setConfiguration(conf); exporter.export(connection.getMetaData()); compile(exporter); // validation of output try { // assertMethodsPresent("test/QSurvey.java", // variable + schema constructor " public QSurvey(String variable, String schema) {\n" + " super(Survey.class, forVariable(variable), schema, \"SURVEY\");\n" + " addMetadata();\n" + " }" ); } catch (IOException ex) { throw new RuntimeException(ex); } } private void compile(MetaDataExporter exporter) { JavaCompiler compiler = new SimpleCompiler(); Set<String> classes = exporter.getClasses(); int compilationResult = compiler.run(null, null, null, classes.toArray(new String[classes.size()])); if (compilationResult == 0) { System.out.println("Compilation is successful"); } else { Assert.fail("Compilation Failed"); } } private void assertMethodsPresent(String path, String... methods) throws IOException { String content = Files.toString(folder.getRoot().toPath().resolve(path).toFile(), UTF_8); assertThat(content, stringContainsInOrder(asList(methods))); } }