OriginSpec.java
package jasper.repository.spec;
import jasper.domain.proj.HasOrigin;
import org.springframework.data.jpa.domain.Specification;
import static org.apache.commons.lang3.StringUtils.isBlank;
public class OriginSpec {
public static <T extends HasOrigin> Specification<T> isOrigin(String origin) {
if (origin.equals("@*")) return any();
if (isBlank(origin) || origin.equals("@")) {
return (root, query, cb) ->
cb.equal(
root.get("origin"),
"");
} else if (origin.endsWith(".*")) {
return isUnderOrigin(origin);
} else {
return (root, query, cb) ->
cb.equal(
root.get("origin"),
origin);
}
}
public static <T extends HasOrigin> Specification<T> isUnderOrigin(String origin) {
if (isBlank(origin) || origin.equals("@") || origin.equals("@*")) return any();
var rootOrigin = origin.endsWith(".*") ? origin.substring(0, origin.length() - 2) : origin;
return (root, query, cb) ->
cb.or(
cb.equal(
root.get("origin"),
rootOrigin),
cb.like(
root.get("origin"),
rootOrigin + ".%"));
}
public static <T extends HasOrigin> Specification<T> isNesting(int nesting) {
return (root, query, cb) ->
cb.equal(
cb.function("origin_nesting", Integer.class, root.get("origin")),
nesting);
}
public static <T extends HasOrigin> Specification<T> any() {
return (root, query, cb) -> cb.conjunction();
}
public static <T extends HasOrigin> Specification<T> none() {
return (root, query, cb) -> cb.disjunction();
}
}