/*
* Copyright 2010-2017 Boxfuse GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.flywaydb.core.internal.util;
import org.flywaydb.core.api.FlywayException;
/**
* A location to load migrations from.
*/
public final class Location implements Comparable<Location> {
/**
* The prefix for classpath locations.
*/
private static final String CLASSPATH_PREFIX = "classpath:";
/**
* The prefix for filesystem locations.
*/
public static final String FILESYSTEM_PREFIX = "filesystem:";
/**
* The prefix part of the location. Can be either classpath: or filesystem:.
*/
private String prefix;
/**
* The path part of the location.
*/
private String path;
/**
* Creates a new location.
*
* @param descriptor The location descriptor.
*/
public Location(String descriptor) {
String normalizedDescriptor = descriptor.trim().replace("\\", "/");
if (normalizedDescriptor.contains(":")) {
prefix = normalizedDescriptor.substring(0, normalizedDescriptor.indexOf(":") + 1);
path = normalizedDescriptor.substring(normalizedDescriptor.indexOf(":") + 1);
} else {
prefix = CLASSPATH_PREFIX;
path = normalizedDescriptor;
}
if (isClassPath()) {
path = path.replace(".", "/");
if (path.startsWith("/")) {
path = path.substring(1);
}
} else {
if (!isFileSystem()) {
throw new FlywayException("Unknown prefix for location (should be either filesystem: or classpath:): "
+ normalizedDescriptor);
}
}
if (path.endsWith("/")) {
path = path.substring(0, path.length() - 1);
}
}
/**
* Checks whether this denotes a location on the classpath.
*
* @return {@code true} if it does, {@code false} if it doesn't.
*/
public boolean isClassPath() {
return CLASSPATH_PREFIX.equals(prefix);
}
/**
* Checks whether this denotes a location on the filesystem.
*
* @return {@code true} if it does, {@code false} if it doesn't.
*/
public boolean isFileSystem() {
return FILESYSTEM_PREFIX.equals(prefix);
}
/**
* Checks whether this location is a parent of this other location.
*
* @param other The other location.
* @return {@code true} if it is, {@code false} if it isn't.
*/
public boolean isParentOf(Location other) {
return (other.getDescriptor() + "/").startsWith(getDescriptor() + "/");
}
/**
* @return The prefix part of the location. Can be either classpath: or filesystem:.
*/
public String getPrefix() {
return prefix;
}
/**
* @return The path part of the location.
*/
public String getPath() {
return path;
}
/**
* @return The complete location descriptor.
*/
public String getDescriptor() {
return prefix + path;
}
@SuppressWarnings("NullableProblems")
public int compareTo(Location o) {
return getDescriptor().compareTo(o.getDescriptor());
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Location location = (Location) o;
return getDescriptor().equals(location.getDescriptor());
}
@Override
public int hashCode() {
return getDescriptor().hashCode();
}
/**
* @return The complete location descriptor.
*/
@Override
public String toString() {
return getDescriptor();
}
}