package tw.com.entity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
public class SearchCriteria {
private static final Logger logger = LoggerFactory.getLogger(SearchCriteria.class);
private String env = "";
private String project = "";
private Optional<Integer> buildNumber = Optional.empty();
private Optional<Integer> index = Optional.empty();
private Optional<Integer> updateIndex = Optional.empty();
public SearchCriteria() {
}
public SearchCriteria(ProjectAndEnv projectAndEnv) {
if (projectAndEnv.hasEnv()) {
env = projectAndEnv.getEnv();
}
if (projectAndEnv.hasProject()) {
project = projectAndEnv.getProject();
}
if (projectAndEnv.hasBuildNumber()) {
buildNumber = Optional.of(projectAndEnv.getBuildNumber());
}
}
public SearchCriteria withEnv(String env) {
this.env = env;
return this;
}
public boolean matches(StackEntry entry) {
logger.debug("checking " + entry + " against " + this);
if (haveEnv()) {
if (!env.equals(entry.getEnvTag().getEnv())) {
return false;
}
}
if (haveBuild()) {
if (!entry.hasBuildNumber()) {
return false; // can't match if entry has no build number
}
if (!buildNumber.get().equals(entry.getBuildNumber())) {
return false;
}
}
if (haveProject()) {
if (!project.equals(entry.getProject())) {
return false;
}
}
if (index.isPresent()) {
if (!entry.hasIndex()) {
return false;
}
if (!index.get().equals(entry.getIndex())) {
return false;
}
}
if (updateIndex.isPresent()) {
if (!entry.hasUpdateIndex()) {
return false;
}
if (!entry.getUpdateIndex().contains(updateIndex.get())) {
return false;
}
}
return true;
}
public SearchCriteria withBuild(int buildNumber) {
this.buildNumber = Optional.of(buildNumber);
return this;
}
public SearchCriteria withIndex(Integer index) {
this.index = Optional.of(index);
return this;
}
public SearchCriteria withUpdateIndex(int index) {
this.updateIndex = Optional.of(index);
return this;
}
public SearchCriteria withProject(String project) {
this.project = project;
return this;
}
private boolean haveProject() {
return !project.isEmpty();
}
public boolean haveBuild() {
return buildNumber.isPresent();
}
private boolean haveEnv() {
return !env.isEmpty();
}
public List<StackEntry> matches(List<StackEntry> entries) {
List<StackEntry> matched = new LinkedList<>();
for(StackEntry entry : entries) {
if (matches(entry)) {
matched.add(entry);
}
}
return matched;
}
@Override
public String toString() {
return "SearchCriteria{" +
"env='" + env + '\'' +
", buildNumber=" + buildNumber +
", project='" + project + '\'' +
", index=" + index +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SearchCriteria criteria = (SearchCriteria) o;
if (env != null ? !env.equals(criteria.env) : criteria.env != null) return false;
if (buildNumber != null ? !buildNumber.equals(criteria.buildNumber) : criteria.buildNumber != null)
return false;
if (project != null ? !project.equals(criteria.project) : criteria.project != null) return false;
return !(index != null ? !index.equals(criteria.index) : criteria.index != null);
}
@Override
public int hashCode() {
int result = env != null ? env.hashCode() : 0;
result = 31 * result + (buildNumber != null ? buildNumber.hashCode() : 0);
result = 31 * result + (project != null ? project.hashCode() : 0);
result = 31 * result + (index != null ? index.hashCode() : 0);
return result;
}
}