package com.contrastsecurity.cassandra.migration.config;
import com.contrastsecurity.cassandra.migration.logging.Log;
import com.contrastsecurity.cassandra.migration.logging.LogFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* The locations to scan recursively for migrations.
*
* <p>The location type is determined by its prefix.
* Unprefixed locations or locations starting with {@code classpath:} point to a package on the classpath and may
* contain both cql and java-based migrations.
* Locations starting with {@code filesystem:} point to a directory on the filesystem and may only contain cql
* migrations.</p>
*
* (default: db/migration)
*/
public class ScriptsLocations {
private static final Log LOG = LogFactory.getLog(ScriptsLocations.class);
private final List<ScriptsLocation> locations = new ArrayList<>();
public ScriptsLocations(String... rawLocations) {
List<ScriptsLocation> normalizedLocations = new ArrayList<>();
for (String rawLocation : rawLocations) {
normalizedLocations.add(new ScriptsLocation(rawLocation));
}
Collections.sort(normalizedLocations);
for (ScriptsLocation normalizedLocation : normalizedLocations) {
if (locations.contains(normalizedLocation)) {
LOG.warn("Discarding duplicate location '" + normalizedLocation + "'");
continue;
}
ScriptsLocation parentLocation = getParentLocationIfExists(normalizedLocation, locations);
if (parentLocation != null) {
LOG.warn("Discarding location '" + normalizedLocation + "' as it is a sublocation of '" + parentLocation + "'");
continue;
}
locations.add(normalizedLocation);
}
}
/**
* @return The locations.
*/
public List<ScriptsLocation> getLocations() {
return locations;
}
/**
* Retrieves this location's parent within this list, if any.
*
* @param location The location to check.
* @param finalLocations The list to search.
* @return The parent location. {@code null} if none.
*/
private ScriptsLocation getParentLocationIfExists(ScriptsLocation location, List<ScriptsLocation> finalLocations) {
for (ScriptsLocation finalLocation : finalLocations) {
if (finalLocation.isParentOf(location)) {
return finalLocation;
}
}
return null;
}
}