001package io.ebean.dbmigration.runner; 002 003import io.ebean.dbmigration.MigrationConfig; 004import io.ebean.dbmigration.MigrationVersion; 005import org.avaje.classpath.scanner.Resource; 006import org.avaje.classpath.scanner.ResourceFilter; 007import org.avaje.classpath.scanner.Scanner; 008import org.slf4j.Logger; 009import org.slf4j.LoggerFactory; 010 011import java.util.ArrayList; 012import java.util.Collections; 013import java.util.List; 014 015/** 016 * Loads the DB migration resources and sorts them into execution order. 017 */ 018public class LocalMigrationResources { 019 020 private static final Logger logger = LoggerFactory.getLogger(LocalMigrationResources.class); 021 022 //private final ServerConfig serverConfig; 023 024 private final MigrationConfig migrationConfig; 025 026 private final List<LocalMigrationResource> versions = new ArrayList<LocalMigrationResource>(); 027 028 /** 029 * Construct with configuration options. 030 */ 031 public LocalMigrationResources(MigrationConfig migrationConfig) { 032 //this.serverConfig = serverConfig; 033 this.migrationConfig = migrationConfig; 034 } 035 036 /** 037 * Read all the migration resources (SQL scripts) returning true if there are versions. 038 */ 039 public boolean readResources() { 040 041 String migrationPath = migrationConfig.getMigrationPath(); 042 043 ClassLoader classLoader = migrationConfig.getClassLoader(); 044 045 Scanner scanner = new Scanner(classLoader); 046 List<Resource> resourceList = scanner.scanForResources(migrationPath, new Match(migrationConfig)); 047 048 logger.debug("resources: {}", resourceList); 049 050 for (Resource resource : resourceList) { 051 String filename = resource.getFilename(); 052 if (filename.endsWith(migrationConfig.getApplySuffix())) { 053 int pos = filename.lastIndexOf(migrationConfig.getApplySuffix()); 054 String mainName = filename.substring(0, pos); 055 056 MigrationVersion migrationVersion = MigrationVersion.parse(mainName); 057 LocalMigrationResource res = new LocalMigrationResource(migrationVersion, resource.getLocation(), resource); 058 versions.add(res); 059 } 060 } 061 062 Collections.sort(versions); 063 return !versions.isEmpty(); 064 } 065 066 /** 067 * Return the list of migration resources in version order. 068 */ 069 public List<LocalMigrationResource> getVersions() { 070 return versions; 071 } 072 073 074 /** 075 * Filter used to find the migration scripts. 076 */ 077 private static class Match implements ResourceFilter { 078 079 private final MigrationConfig migrationConfig; 080 081 Match(MigrationConfig migrationConfig) { 082 this.migrationConfig = migrationConfig; 083 } 084 085 @Override 086 public boolean isMatch(String name) { 087 return name.endsWith(migrationConfig.getApplySuffix()); 088 } 089 } 090}