001package org.avaje.dbmigration.runner;
002
003import org.avaje.classpath.scanner.Resource;
004import org.avaje.classpath.scanner.ResourceFilter;
005import org.avaje.classpath.scanner.Scanner;
006import org.avaje.dbmigration.MigrationConfig;
007import org.avaje.dbmigration.MigrationVersion;
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}