Skip to content

Commit

Permalink
Refactor expression visitor (#2808)
Browse files Browse the repository at this point in the history
* Refactoring Expression Visitor so all expression types have visit methods.

* Added BooleanExpression class
  • Loading branch information
aklish committed Oct 4, 2022
1 parent 4ce3ae6 commit 3afee02
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public ExpressionResult evaluate(EvaluationMode mode) {

@Override
public <T> T accept(ExpressionVisitor<T> visitor) {
return visitor.visitExpression(this);
return visitor.visitAnyFieldExpression(this);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright 2022, Yahoo Inc.
* Licensed under the Apache License, Version 2.0
* See LICENSE file in project root for terms.
*/

package com.yahoo.elide.core.security.permissions.expressions;

import static org.fusesource.jansi.Ansi.ansi;

import com.yahoo.elide.core.security.permissions.ExpressionResult;
import org.fusesource.jansi.Ansi;

/**
* Expression that returns always true (PASS) or false (FAILURE).
*/
public class BooleanExpression implements Expression {
private boolean value;
public BooleanExpression(boolean value) {
this.value = value;
}
@Override
public ExpressionResult evaluate(EvaluationMode mode) {
if (value == true) {
return ExpressionResult.PASS;
}
return ExpressionResult.FAIL;
}

@Override
public <T> T accept(ExpressionVisitor<T> visitor) {
return visitor.visitBooleanExpression(this);
}

@Override
public String toString() {
Ansi.Color color = value ? Ansi.Color.GREEN : Ansi.Color.RED;
String label = value ? "SUCCESS" : "FAILURE";
return ansi().fg(color).a(label).reset().toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
*/
package com.yahoo.elide.core.security.permissions.expressions;

import static org.fusesource.jansi.Ansi.ansi;
import com.yahoo.elide.core.security.permissions.ExpressionResult;
import org.fusesource.jansi.Ansi;

/**
* Interface describing an expression.
Expand Down Expand Up @@ -37,37 +35,7 @@ public enum EvaluationMode {
* Static Expressions that return PASS or FAIL.
*/
public static class Results {
public static final Expression SUCCESS = new Expression() {
@Override
public ExpressionResult evaluate(EvaluationMode ignored) {
return ExpressionResult.PASS;
}

@Override
public <T> T accept(ExpressionVisitor<T> visitor) {
return visitor.visitExpression(this);
}

@Override
public String toString() {
return ansi().fg(Ansi.Color.GREEN).a("SUCCESS").reset().toString();
}
};
public static final Expression FAILURE = new Expression() {
@Override
public ExpressionResult evaluate(EvaluationMode ignored) {
return ExpressionResult.FAIL;
}

@Override
public <T> T accept(ExpressionVisitor<T> visitor) {
return visitor.visitExpression(this);
}

@Override
public String toString() {
return ansi().fg(Ansi.Color.RED).a("FAILURE").reset().toString();
}
};
public static final Expression SUCCESS = new BooleanExpression(true);
public static final Expression FAILURE = new BooleanExpression(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
* @param <T> The return type of the visitor
*/
public interface ExpressionVisitor<T> {
T visitExpression(Expression expression);
T visitSpecificFieldExpression(SpecificFieldExpression expression);
T visitAnyFieldExpression(AnyFieldExpression expression);
T visitBooleanExpression(BooleanExpression expression);
T visitCheckExpression(CheckExpression checkExpression);
T visitAndExpression(AndExpression andExpression);
T visitOrExpression(OrExpression orExpression);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public ExpressionResult evaluate(EvaluationMode mode) {

@Override
public <T> T accept(ExpressionVisitor<T> visitor) {
return visitor.visitExpression(this);
return visitor.visitSpecificFieldExpression(this);
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,24 @@

package com.yahoo.elide.core.security.visitors;

import com.yahoo.elide.core.security.permissions.expressions.AndExpression;
import com.yahoo.elide.core.security.permissions.expressions.CheckExpression;
import com.yahoo.elide.core.security.permissions.expressions.Expression;
import com.yahoo.elide.core.security.permissions.expressions.ExpressionVisitor;
import com.yahoo.elide.core.security.permissions.expressions.NotExpression;
import com.yahoo.elide.core.security.permissions.expressions.OrExpression;
import com.yahoo.elide.core.security.permissions.expressions.*;

/**
* Expression Visitor to normalize Permission expression.
*/
public class PermissionExpressionNormalizationVisitor implements ExpressionVisitor<Expression> {
@Override
public Expression visitExpression(Expression expression) {
public Expression visitSpecificFieldExpression(SpecificFieldExpression expression) {
return expression;
}

@Override
public Expression visitAnyFieldExpression(AnyFieldExpression expression) {
return expression;
}

@Override
public Expression visitBooleanExpression(BooleanExpression expression) {
return expression;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,7 @@
import com.yahoo.elide.core.security.checks.Check;
import com.yahoo.elide.core.security.checks.FilterExpressionCheck;
import com.yahoo.elide.core.security.checks.UserCheck;
import com.yahoo.elide.core.security.permissions.expressions.AndExpression;
import com.yahoo.elide.core.security.permissions.expressions.CheckExpression;
import com.yahoo.elide.core.security.permissions.expressions.Expression;
import com.yahoo.elide.core.security.permissions.expressions.ExpressionVisitor;
import com.yahoo.elide.core.security.permissions.expressions.NotExpression;
import com.yahoo.elide.core.security.permissions.expressions.OrExpression;
import com.yahoo.elide.core.security.permissions.expressions.*;
import com.yahoo.elide.core.type.Type;

import java.util.Objects;
Expand Down Expand Up @@ -199,7 +194,17 @@ private Operator operator(FilterExpression expression) {
}

@Override
public FilterExpression visitExpression(Expression expression) {
public FilterExpression visitSpecificFieldExpression(SpecificFieldExpression expression) {
return NO_EVALUATION_EXPRESSION;
}

@Override
public FilterExpression visitAnyFieldExpression(AnyFieldExpression expression) {
return NO_EVALUATION_EXPRESSION;
}

@Override
public FilterExpression visitBooleanExpression(BooleanExpression expression) {
return NO_EVALUATION_EXPRESSION;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ public ExpressionResult evaluate(EvaluationMode ignored) {

@Override
public <T> T accept(ExpressionVisitor<T> visitor) {
return visitor.visitExpression(this);
return null;
}
}
}

0 comments on commit 3afee02

Please sign in to comment.