// Copyright © 2015 HSL <https://www.hsl.fi> // This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses. package fi.hsl.parkandride; import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.sql.Connection; import javax.inject.Inject; import javax.sql.DataSource; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Profile; import com.querydsl.sql.Configuration; import com.querydsl.sql.codegen.DefaultNamingStrategy; import com.querydsl.sql.codegen.MetaDataExporter; import fi.hsl.parkandride.config.JdbcConfiguration; /** * NOTES: * - expected to be run from parkandride-application module */ @org.springframework.context.annotation.Configuration @EnableAutoConfiguration @Import(JdbcConfiguration.class) @Profile(FeatureProfile.EXPORT_QTYPES) public class ExportQTypes { public static final String NAME_PREFIX = "Q"; public static final String TARGET_FOLDER = "src/generated/java"; public static final String PACKAGE_NAME = "fi.hsl.parkandride.back.sql"; public static void main(String[] args) { SpringApplication application = new SpringApplication(ExportQTypes.class); application.setWebEnvironment(false); application.setAdditionalProfiles("export_qtypes"); application.run(args); } @Inject DataSource dataSource; @Inject Configuration configuration; @Bean public CommandLineRunner runner() { return args -> { MetaDataExporter exporter = new MetaDataExporter(); exporter.setPackageName(PACKAGE_NAME); exporter.setInnerClassesForKeys(false); exporter.setSpatial(true); exporter.setNamePrefix(NAME_PREFIX); exporter.setNamingStrategy(new DefaultNamingStrategy()); exporter.setTargetFolder(new File(TARGET_FOLDER)); exporter.setConfiguration(configuration); Path packageDir = FileSystems.getDefault().getPath(TARGET_FOLDER, PACKAGE_NAME.replace(".", "/")); try (Connection conn = dataSource.getConnection()) { deleteOldQTypes(packageDir); exporter.export(conn.getMetaData()); deleteUnusedQTypes(packageDir, "QGeometryColumns.java", "QSchemaVersion.java", "QSpatialRefSys.java"); } System.out.println("Export done"); }; } private static void deleteOldQTypes(Path packageDir) throws IOException { Files.walkFileTree(packageDir, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { if (path.getFileName().toString().startsWith(NAME_PREFIX)) { Files.delete(path); } return FileVisitResult.CONTINUE; } }); } private static void deleteUnusedQTypes(Path packageDir, String... filesToRemove) throws IOException { for (String filename : filesToRemove) { Files.delete(packageDir.resolve(filename)); } } }