package jpasearch.repository.query.selector;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import jpasearch.repository.query.Path;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
public class TermSelector<FROM, TO> implements SingleSelector<FROM, TO, TermSelector<FROM, TO>> {
private static final long serialVersionUID = 201308010800L;
private final List<Path<FROM, ?>> paths;
private List<TO> selected = new ArrayList<>();
private boolean orMode = true;
private Integer searchSimilarity = null;
private boolean notMode = false;
TermSelector(Path<FROM, ?> path) {
paths = new ArrayList<>();
paths.add(path);
}
TermSelector(List<Path<FROM, ?>> paths) {
this.paths = new ArrayList<>(paths);
}
private TermSelector(TermSelector<FROM, TO> toCopy) {
paths = new ArrayList<>(toCopy.paths);
selected = new ArrayList<>(toCopy.selected);
orMode = toCopy.orMode;
searchSimilarity = toCopy.searchSimilarity;
}
@Override
public TermSelector<FROM, TO> copy() {
return new TermSelector<FROM, TO>(this);
}
public List<String> getPaths() {
List<String> paths = new ArrayList<>();
for (Path<FROM, ?> path : this.paths) {
paths.add(path.getPath());
}
return paths;
}
public Integer getSearchSimilarity() {
return searchSimilarity;
}
public void setSearchSimilarity(Integer searchSimilarity) {
this.searchSimilarity = searchSimilarity;
}
public boolean isOrMode() {
return orMode;
}
public void setOrMode(boolean orMode) {
this.orMode = orMode;
}
public TermSelector<FROM, TO> or() {
setOrMode(true);
return this;
}
public TermSelector<FROM, TO> and() {
setOrMode(false);
return this;
}
/**
* Get the possible candidates for property.
*/
public List<TO> getSelected() {
return selected;
}
public void setSelected(TO selected) {
this.selected = Arrays.asList(selected);
}
/**
* Set the possible candidates for property.
*/
public void setSelected(List<TO> selected) {
this.selected = selected;
}
@SuppressWarnings("unchecked")
public TermSelector<FROM, TO> selected(TO... selected) {
setSelected(Arrays.asList(selected));
return this;
}
public boolean isNotEmpty() {
if ((selected == null) || selected.isEmpty()) {
return false;
}
for (TO word : selected) {
if ((word instanceof String) && StringUtils.isNotBlank((String) word)) {
return true;
} else if (word != null) {
return true;
}
}
return false;
}
public void clearSelected() {
if (selected != null) {
selected.clear();
}
}
public boolean isNotMode() {
return notMode;
}
public void setNotMode(boolean notMode) {
this.notMode = notMode;
}
public TermSelector<FROM, TO> notMode(boolean notMode) {
setNotMode(notMode);
return this;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}