fi.hsl.parkandride.ExportQTypes.java Source code

Java tutorial

Introduction

Here is the source code for fi.hsl.parkandride.ExportQTypes.java

Source

// 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));
        }
    }
}