Refactor RSQL serach fields related classes (2) (#1835)
Signed-off-by: Marinov Avgustin <Avgustin.Marinov@bosch.com>
This commit is contained in:
@@ -25,10 +25,10 @@ import cz.jirutka.rsql.parser.ast.ComparisonNode;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
|
public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
|
||||||
|
|
||||||
private final Class<A> fieldNameProvider;
|
private final Class<A> rsqlQueryFieldType;
|
||||||
|
|
||||||
@Value
|
@Value
|
||||||
public class RsqlField {
|
protected class RsqlField {
|
||||||
|
|
||||||
A enumValue;
|
A enumValue;
|
||||||
String[] subAttributes;
|
String[] subAttributes;
|
||||||
@@ -39,22 +39,22 @@ public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected AbstractRSQLVisitor(final Class<A> fieldNameProvider) {
|
protected AbstractRSQLVisitor(final Class<A> rsqlQueryFieldType) {
|
||||||
this.fieldNameProvider = fieldNameProvider;
|
this.rsqlQueryFieldType = rsqlQueryFieldType;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected RsqlField getRsqlField(final ComparisonNode node) {
|
protected RsqlField getRsqlField(final ComparisonNode node) {
|
||||||
final String[] graph = node.getSelector().split(RsqlQueryField.SUB_ATTRIBUTE_SPLIT_REGEX);
|
final String[] graph = node.getSelector().split(RsqlQueryField.SUB_ATTRIBUTE_SPLIT_REGEX);
|
||||||
final String enumName = graph.length == 0 ? node.getSelector() : graph[0];
|
final String enumName = graph.length == 0 ? node.getSelector() : graph[0];
|
||||||
log.debug("get field identifier by name {} of enum type {}", enumName, fieldNameProvider);
|
log.debug("get field identifier by name {} of enum type {}", enumName, rsqlQueryFieldType);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final A enumValue = Enum.valueOf(fieldNameProvider, enumName.toUpperCase());
|
final A enumValue = Enum.valueOf(rsqlQueryFieldType, enumName.toUpperCase());
|
||||||
final String[] subAttributes = enumValue.getSubAttributes(node.getSelector());
|
final String[] subAttributes = enumValue.getSubAttributes(node.getSelector());
|
||||||
|
|
||||||
// validate
|
// validate
|
||||||
if (enumValue.isMap()) {
|
if (enumValue.isMap()) {
|
||||||
// enum.key
|
// <enum>.<key>
|
||||||
if (subAttributes.length != 2) {
|
if (subAttributes.length != 2) {
|
||||||
throw new RSQLParameterUnsupportedFieldException(
|
throw new RSQLParameterUnsupportedFieldException(
|
||||||
"The syntax of the given map search parameter field {" + node.getSelector() + "} is wrong. Syntax is: <enum name>.<key name>");
|
"The syntax of the given map search parameter field {" + node.getSelector() + "} is wrong. Syntax is: <enum name>.<key name>");
|
||||||
@@ -92,8 +92,7 @@ public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
|
|||||||
* @return Exception with prepared message extracted from the comparison node.
|
* @return Exception with prepared message extracted from the comparison node.
|
||||||
*/
|
*/
|
||||||
private RSQLParameterUnsupportedFieldException createRSQLParameterUnsupportedException(
|
private RSQLParameterUnsupportedFieldException createRSQLParameterUnsupportedException(
|
||||||
@NotNull final ComparisonNode node,
|
@NotNull final ComparisonNode node, final Exception rootException) {
|
||||||
final Exception rootException) {
|
|
||||||
return new RSQLParameterUnsupportedFieldException(String.format(
|
return new RSQLParameterUnsupportedFieldException(String.format(
|
||||||
"The given search parameter field {%s} does not exist, must be one of the following fields %s",
|
"The given search parameter field {%s} does not exist, must be one of the following fields %s",
|
||||||
node.getSelector(), getExpectedFieldList()), rootException);
|
node.getSelector(), getExpectedFieldList()), rootException);
|
||||||
@@ -106,7 +105,7 @@ public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getExpectedFieldList() {
|
private List<String> getExpectedFieldList() {
|
||||||
final List<String> expectedFieldList = Arrays.stream(fieldNameProvider.getEnumConstants())
|
final List<String> expectedFieldList = Arrays.stream(rsqlQueryFieldType.getEnumConstants())
|
||||||
.filter(enumField -> enumField.getSubEntityAttributes().isEmpty()).map(enumField -> {
|
.filter(enumField -> enumField.getSubEntityAttributes().isEmpty()).map(enumField -> {
|
||||||
final String enumFieldName = enumField.name().toLowerCase();
|
final String enumFieldName = enumField.name().toLowerCase();
|
||||||
if (enumField.isMap()) {
|
if (enumField.isMap()) {
|
||||||
@@ -116,7 +115,7 @@ public abstract class AbstractRSQLVisitor<A extends Enum<A> & RsqlQueryField> {
|
|||||||
}
|
}
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
final List<String> expectedSubFieldList = Arrays.stream(fieldNameProvider.getEnumConstants())
|
final List<String> expectedSubFieldList = Arrays.stream(rsqlQueryFieldType.getEnumConstants())
|
||||||
.filter(enumField -> !enumField.getSubEntityAttributes().isEmpty()).flatMap(enumField -> {
|
.filter(enumField -> !enumField.getSubEntityAttributes().isEmpty()).flatMap(enumField -> {
|
||||||
final List<String> subEntity = enumField
|
final List<String> subEntity = enumField
|
||||||
.getSubEntityAttributes().stream().map(fieldName -> enumField.name().toLowerCase()
|
.getSubEntityAttributes().stream().map(fieldName -> enumField.name().toLowerCase()
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ import cz.jirutka.rsql.parser.ast.RSQLVisitor;
|
|||||||
* {@link RSQLVisitor} implementation which validates the nodes (fields) based
|
* {@link RSQLVisitor} implementation which validates the nodes (fields) based
|
||||||
* on a given {@link RsqlQueryField} for a given entity type.
|
* on a given {@link RsqlQueryField} for a given entity type.
|
||||||
*
|
*
|
||||||
* @param <A>
|
* @param <A> The type the {@link RsqlQueryField} refers to.
|
||||||
* The type the {@link RsqlQueryField} refers to.
|
|
||||||
*/
|
*/
|
||||||
public class FieldValidationRsqlVisitor<A extends Enum<A> & RsqlQueryField> extends AbstractRSQLVisitor<A>
|
public class FieldValidationRsqlVisitor<A extends Enum<A> & RsqlQueryField> extends AbstractRSQLVisitor<A>
|
||||||
implements RSQLVisitor<Void, String> {
|
implements RSQLVisitor<Void, String> {
|
||||||
@@ -30,8 +29,7 @@ public class FieldValidationRsqlVisitor<A extends Enum<A> & RsqlQueryField> exte
|
|||||||
/**
|
/**
|
||||||
* Constructs the visitor and initializes it.
|
* Constructs the visitor and initializes it.
|
||||||
*
|
*
|
||||||
* @param fieldNameProvider
|
* @param fieldNameProvider The {@link RsqlQueryField} to use for validation.
|
||||||
* The {@link RsqlQueryField} to use for validation.
|
|
||||||
*/
|
*/
|
||||||
public FieldValidationRsqlVisitor(final Class<A> fieldNameProvider) {
|
public FieldValidationRsqlVisitor(final Class<A> fieldNameProvider) {
|
||||||
super(fieldNameProvider);
|
super(fieldNameProvider);
|
||||||
@@ -58,5 +56,4 @@ public class FieldValidationRsqlVisitor<A extends Enum<A> & RsqlQueryField> exte
|
|||||||
node.getChildren().forEach(child -> child.accept(this, param));
|
node.getChildren().forEach(child -> child.accept(this, param));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user