### CEL Java Hello World Example Source: https://github.com/google/cel-java/blob/main/README.md A basic Java example demonstrating how to compile and evaluate a CEL expression using CelCompiler and CelRuntime. It shows setting up the environment, compiling an expression, and evaluating it with input variables. ```java import dev.cel.common.CelAbstractSyntaxTree; import dev.cel.common.CelValidationException; import dev.cel.common.types.SimpleType; import dev.cel.compiler.CelCompiler; import dev.cel.compiler.CelCompilerFactory; import dev.cel.runtime.CelEvaluationException; import dev.cel.runtime.CelRuntime; import dev.cel.runtime.CelRuntimeFactory; import java.util.Map; public class HelloWorld { // Construct the compilation and runtime environments. // These instances are immutable and thus trivially thread-safe and amenable to caching. private static final CelCompiler CEL_COMPILER = CelCompilerFactory.standardCelCompilerBuilder().addVar("my_var", SimpleType.STRING).build(); private static final CelRuntime CEL_RUNTIME = CelRuntimeFactory.standardCelRuntimeBuilder().build(); public void run() throws CelValidationException, CelEvaluationException { // Compile the expression into an Abstract Syntax Tree. CelAbstractSyntaxTree ast = CEL_COMPILER.compile("my_var + '!'").getAst(); // Plan an executable program instance. CelRuntime.Program program = CEL_RUNTIME.createProgram(ast); // Evaluate the program with an input variable. String result = (String) program.eval(Map.of("my_var", "Hello World")); System.out.println(result); // 'Hello World!' } } ``` -------------------------------- ### Bash - Verify Java and Bazel Installation Source: https://github.com/google/cel-java/blob/main/codelab/README.md Commands to verify that Java Development Kit (JDK) and Bazel are installed and accessible in the system's PATH. These tools are prerequisites for the CEL-Java codelab. ```bash java --version ``` ```bash bazel ``` -------------------------------- ### CelOptimizer Initialization Source: https://github.com/google/cel-java/blob/main/codelab/README.md Initializes the CelOptimizer with standard builders, including the compiler and runtime instances. This setup is necessary for performing AST optimizations. ```java private static final CelOptimizer CEL_OPTIMIZER = CelOptimizerFactory.standardCelOptimizerBuilder(CEL_COMPILER, CEL_RUNTIME) .build(); ``` -------------------------------- ### Bash - Clone CEL-Java Repository and Run Tests Source: https://github.com/google/cel-java/blob/main/codelab/README.md Instructions for cloning the CEL-Java GitHub repository and running the initial set of tests for the codelab exercises. This setup step ensures the development environment is ready. ```bash git clone git@github.com:google/cel-java.git cd cel-java ``` ```bash bazel test //codelab/src/test/codelab:Exercise1Test --test_output=errors ``` -------------------------------- ### Constructing AttributeContext.Request Proto Source: https://github.com/google/cel-java/blob/main/codelab/README.md Example of constructing a protobuf object `AttributeContext.Request` using a CEL expression. It demonstrates setting nested fields and using input variables like `jwt` and `now`. The example also shows how to set the expected output message for validation. ```java import com.google.api.expr.v1alpha1.StructTypeReference; import com.google.protobuf.Struct; import com.google.protobuf.Value; import com.google.rpc.context.AttributeContext; import dev.cel.common.CelAbstractSyntaxTree; import dev.cel.common.CelValidationException; import dev.cel.compiler.CelCompiler; import dev.cel.compiler.CelCompilerFactory; import dev.cel.common.types.CelType; import dev.cel.common.types.CelType.Message; import dev.cel.common.types.CelType.Primitive; import dev.cel.common.types.CelType.String; import dev.cel.common.types.CelType.Null; import dev.cel.common.types.CelType.Null.NullType; import dev.cel.common.types.CelType.Any; import dev.cel.common.types.CelType.List; import dev.cel.common.types.CelType.Map; import dev.cel.common.types.CelType.Function; import dev.cel.common.types.CelType.Error; import dev.cel.common.types.CelType.TypeParam; import dev.cel.common.types.CelType.TypeParam.TypeParamKind; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel.common.types.CelType.TypeParam.TypeParamKind.TypeParamKindEnum; import dev.cel. ``` -------------------------------- ### CEL Java Extensions Examples Source: https://github.com/google/cel-java/blob/main/README.md Illustrates the usage of various canonical extensions provided by CEL-Java for string manipulation, mathematical operations, Protocol Buffers, and local bindings. ```java // String manipulation 'hello hello'.replace('he', 'we') // returns 'wello wello' 'hello hello hello'.split(' ') // returns ['hello', 'hello', 'hello'] // Math extensions math.greatest(-42.0, -21.5, -100.0) // -21.5 math.least(-42.0, -21.5, -100.0) // -100.0 // Proto extensions proto.getExt(msg, google.expr.proto2.test.int32_ext) // returns int value // Local bindings cel.bind(a, 'hello', cel.bind(b, 'world', a + b + b + a)) // "helloworldworldhello" ``` -------------------------------- ### CEL Expression Examples Source: https://github.com/google/cel-java/blob/main/README.md Demonstrates the common syntax of CEL across Java, Go, and TypeScript for various checks like resource name prefixes, time window calculations, and list filtering. ```java resource.name.startsWith("/groups/"+auth.claims.group) ``` ```go request.time - resource.age < duration("24h") ``` ```typescript auth.claims.email_verified && resources.all(r, r.startsWith(auth.claims.email)) ``` -------------------------------- ### CEL Java Environment Setup Source: https://github.com/google/cel-java/blob/main/README.md Illustrates two ways to set up the CEL environment in Java: a simple standard builder and a more common approach using separate CelCompilerFactory and CelRuntimeFactory for granular control over type-checking and runtime configurations. ```java Cel cel = CelFactory.standardCelBuilder().build(); ``` ```java // Example environment for the following expression: // resource.name.startsWith('/groups/' + group) CelCompiler cel = CelCompilerFactory.standardCelCompilerBuilder() .setStandardMacros(CelStandardMacro.HAS) .setContainer("google.rpc.context.AttributeContext") .addMessageTypes(AttributeContext.getDescriptor()) .addVar("resource", StructTypeReference.create("google.rpc.context.AttributeContext.Resource")) .addVar("group", SimpleType.STRING) .build(); ``` -------------------------------- ### Error Reporting Example Source: https://github.com/google/cel-java/blob/main/README.md Demonstrates how CEL provides friendly error messages with pointers to the exact location of issues in the source code. ```sh ERROR: :1:40: undefined field 'undefined' | TestAllTypes{single_int32: 1, undefined: 2} | .......................................^ ``` -------------------------------- ### CEL Environment Setup Source: https://github.com/google/cel-java/blob/main/codelab/README.md Sets up the standard CEL environment for expression compilation and evaluation in Java. It configures CelOptions and builds immutable CelCompiler and CelRuntime instances, which are thread-safe and can be cached. ```java private static final CelOptions CEL_OPTIONS = CelOptions.current().build(); private static final CelCompiler CEL_COMPILER = CelCompilerFactory.standardCelCompilerBuilder() .setOptions(CEL_OPTIONS) .build(); private static final CelRuntime CEL_RUNTIME = CelRuntimeFactory.standardCelRuntimeBuilder() .setOptions(CEL_OPTIONS) .build(); ``` -------------------------------- ### Standard CEL Compiler and Runtime Setup Source: https://github.com/google/cel-java/blob/main/codelab/README.md Demonstrates the static initialization of a standard CEL compiler and runtime. The compiler is configured with a variable 'x' of type INT and a 'request' variable of type AttributeContext.Request. The runtime is also configured with the same message types. ```java import com.google.api.expr.cel.common.types.SimpleType; import com.google.api.expr.cel.common.types.StructTypeReference; import com.google.api.expr.cel.compiler.CelCompiler; import com.google.api.expr.cel.compiler.CelCompilerFactory; import com.google.api.expr.cel.runtime.CelRuntime; import com.google.api.expr.cel.runtime.CelRuntimeFactory; import com.google.rpc.context.AttributeContext; // ... inside a class, e.g., Exercise8 private static final CelCompiler CEL_COMPILER = CelCompilerFactory.standardCelCompilerBuilder() .addVar("x", SimpleType.INT) .addVar( "request", StructTypeReference.create("google.rpc.context.AttributeContext.Request")) .addMessageTypes(AttributeContext.Request.getDescriptor()) .build(); private static final CelRuntime CEL_RUNTIME = CelRuntimeFactory.standardCelRuntimeBuilder() .addMessageTypes(AttributeContext.Request.getDescriptor()) .build(); ``` -------------------------------- ### String Index Finding Source: https://github.com/google/cel-java/blob/main/extensions/src/main/java/dev/cel/extensions/README.md Finds the first occurrence of a substring within a string, returning its zero-based index or -1 if not found. An optional offset can specify the starting position for the search. An empty search string returns the starting index. ```cel .indexOf() -> .indexOf(, ) -> // Examples: // 'hello mellow'.indexOf('') // returns 0 // 'hello mellow'.indexOf('ello') // returns 1 // 'hello mellow'.indexOf('jello') // returns -1 // 'hello mellow'.indexOf('', 2) // returns 2 // 'hello mellow'.indexOf('ello', 2) // returns 7 // 'hello mellow'.indexOf('ello', 20) // error ``` -------------------------------- ### Java - Basic CEL Compilation and Evaluation Source: https://github.com/google/cel-java/blob/main/codelab/README.md Demonstrates the fundamental steps of compiling a CEL expression into an Abstract Syntax Tree (AST) and then evaluating that AST. This is the starting point for using CEL in Java applications. ```java final class Exercise1 { /** * Compile the input {@code expression} and produce an AST. This method parses and type-checks the * given expression to validate the syntax and type-agreement of the expression. * * @throws IllegalArgumentException If the expression is malformed due to syntactic or semantic * errors. */ @SuppressWarnings("DoNotCallSuggester") CelAbstractSyntaxTree compile(String expression) { throw new UnsupportedOperationException("To be implemented"); } /** * Evaluates the compiled AST. * * @throws IllegalArgumentException If the compiled expression in AST fails to evaluate. */ @SuppressWarnings("DoNotCallSuggester") Object eval(CelAbstractSyntaxTree ast) { throw new UnsupportedOperationException("To be implemented"); } } ``` -------------------------------- ### Get First List Element Source: https://github.com/google/cel-java/blob/main/extensions/src/main/java/dev/cel/extensions/README.md Returns an optional containing the first value from the list, or optional.None if the list is empty. ```CEL .first() -> // Examples: [1, 2, 3].first().value() == 1 [].first().orValue('test') == 'test' ``` -------------------------------- ### Slice List Source: https://github.com/google/cel-java/blob/main/extensions/src/main/java/dev/cel/extensions/README.md Returns a new sub-list using the provided start (inclusive) and end (exclusive) indexes. ```CEL .slice(, ) -> // Examples: [1,2,3,4].slice(1, 3) // return [2, 3] [1,2,3,4].slice(2, 4) // return [3, 4] ``` -------------------------------- ### Mixed Literals Validation Test Setup Source: https://github.com/google/cel-java/blob/main/codelab/README.md Sets up a test case to validate a CEL expression containing a list with mixed literal types (integer and string). It compiles the expression and prepares to validate the resulting AST. ```java import com.google.api.expr.cel.compiler.CelAbstractSyntaxTree; import com.google.api.expr.cel.validator.CelValidationResult; // Assuming exercise8 is an instance of a class that provides compile and validate methods // and has access to CelCompiler and CelRuntime. public class Exercise8Test { // Assume exercise8 is initialized elsewhere in the test class private Exercise8 exercise8; @Test public void validate_listHasMixedLiterals_throws() throws Exception { CelAbstractSyntaxTree ast = exercise8.compile("3 in [1, 2, '3']"); // Note that `CelValidationResult` is the same result class used for the compilation path. // This means you could alternatively invoke `.getAst()` and handle `CelValidationException` as // usual. CelValidationResult validationResult = exercise8.validate(ast); // Further assertions would follow here to check validationResult. } } ``` -------------------------------- ### CEL Logical OR Short-Circuiting (Success Cases) Source: https://github.com/google/cel-java/blob/main/codelab/README.md Illustrates CEL's commutative logical operators, specifically the OR operator, and how it short-circuits evaluation to return a logical result even when a branch encounters an error. This example shows successful evaluations. ```java /** * Demonstrates CEL's unique feature of commutative logical operators. * *

If a logical operation can short-circuit a branch that results in an error, CEL evaluation * will return the logical result instead of propagating the error. */ @Test @TestParameters("{expression: 'true || true', expectedResult: true}") @TestParameters("{expression: 'true || false', expectedResult: true}") @TestParameters("{expression: 'false || true', expectedResult: true}") @TestParameters("{expression: 'false || false', expectedResult: false}") @TestParameters("{expression: 'true || (1 / 0 > 2)', expectedResult: true}") @TestParameters({"expression: '(1 / 0 > 2) || true', expectedResult: true}") public void evaluate_logicalOrShortCircuits_success(String expression, boolean expectedResult) { Object evaluatedResult = exercise3.compileAndEvaluate(expression); assertThat(evaluatedResult).isEqualTo(expectedResult); } ``` -------------------------------- ### CEL Error for Unknown Overload Source: https://github.com/google/cel-java/blob/main/codelab/README.md This is an example of an error message encountered in CEL when a function overload is not found in the runtime environment. It indicates that the 'contains' function with the signature 'map_contains_key_value' is missing. ```cel > evaluation error at :28: [internal] Unknown overload id 'map_contains_key_value' for function 'contains' ``` -------------------------------- ### Creating MessageLiteDescriptor Instances Source: https://github.com/google/cel-java/blob/main/protobuf/src/main/java/dev/cel/protobuf/templates/cel_lite_descriptor_template.txt This snippet illustrates the creation of `MessageLiteDescriptor` objects. Each message descriptor is initialized with its proto type name and a list of its field descriptors. It also includes a supplier for the message's builder, if available. ```java descriptors.add( new MessageLiteDescriptor( "${descriptor_metadata.protoTypeName}", fieldDescriptors, <#if descriptor_metadata.javaClassName??> ${descriptor_metadata.javaClassName}::newBuilder <#else> () -> null ) ); ``` -------------------------------- ### Get Last List Element Source: https://github.com/google/cel-java/blob/main/extensions/src/main/java/dev/cel/extensions/README.md Returns an optional containing the last value from the list, or optional.None if the list is empty. This is syntactic sugar for accessing the element at index list.size()-1. ```CEL .last() -> // Examples: [1, 2, 3].last().value() == 3 [].last().orValue('test') == 'test' ``` -------------------------------- ### Initializing the CEL Validator Source: https://github.com/google/cel-java/blob/main/codelab/README.md Shows how to statically initialize a CEL validator by providing the previously configured CEL compiler and runtime instances to the validator builder. ```java import com.google.api.expr.cel.validator.CelValidator; import com.google.api.expr.cel.validator.CelValidatorFactory; // ... assuming CEL_COMPILER and CEL_RUNTIME are defined as above // Just like the compiler and runtime, the validator and optimizer can be statically // initialized as their instances are immutable. private static final CelValidator CEL_VALIDATOR = CelValidatorFactory.standardCelValidatorBuilder(CEL_COMPILER, CEL_RUNTIME) .build(); ``` -------------------------------- ### Enabling Standard Macros in CEL Java Source: https://github.com/google/cel-java/blob/main/codelab/README.md Demonstrates the best practice for enabling macros in CEL Java. It highlights the use of `CelStandardMacro.STANDARD_MACROS` and advises explicitly enabling only necessary macros for specific use cases to ensure safety and clarity. ```java import com.google.api.expr.v1alpha1.CelStandardMacro; // Best practice: Enable only required macros for your use case. // CelStandardMacro.STANDARD_MACROS enables all listed macros, but explicit enabling is safer. // Example of explicit enabling (replace with actual macro enabling logic): // CelConfiguration.Builder celConfigBuilder = CelConfiguration.newBuilder(); // celConfigBuilder.addMacroExtensions(CelStandardMacro.LIST_CONTAINS); // celConfigBuilder.addMacroExtensions(CelStandardMacro.OPTIONAL_GET); // CelEnvironment cel = celConfigBuilder.build().getEnvironment(); ``` -------------------------------- ### CEL Standard Macros Reference Source: https://github.com/google/cel-java/blob/main/codelab/README.md A reference table detailing the available standard macros in CEL, their signatures, and a brief description of their functionality. This includes macros for iteration, filtering, and presence testing. ```APIDOC Macro | Signature | Description ------------|---------------------------|---------------------------------- `all` | `r.all(var, cond)` | Test if `cond` evaluates `true` for *all* `var` in range `r`. `exists` | `r.exists(var, cond)` | Test if `cond` evaluates `true` for *any* `var` in range `r`. `exists_one` | `r.exists_one(var, cond)` | Test if `cond` evaluates `true` for *only one* `var` in range `r`. `filter` | `r.filter(var, cond)` | For lists, create a new list where each element `var` in range `r` satisfies the condition `cond`. For maps, create a new list where each key `var` in range `r` satisfies the condition `cond`. `map` | `r.map(var, expr)` | Create a new list where each each `var` in range `r` is transformed by `expr`. | `r.map(var, cond, expr)` | Same as two-arg `map` but with a conditional `cond` filter before the value is transformed. `has` | `has(a.b)` | Presence test for `b` on value `a` \: For maps, json tests definition. For protos, tests non-default primitive value or a or a set message field. ``` -------------------------------- ### Using CEL Extensions in Java Source: https://github.com/google/cel-java/blob/main/extensions/src/main/java/dev/cel/extensions/README.md Demonstrates how to incorporate CEL extensions into the CelCompiler and CelRuntime builders in Java. This involves using the addLibraries method with predefined extension sets. ```java CelCompilerFactory.standardCelCompilerBuilder().addLibraries(CelExtensions.strings()) CelRuntimeFactory.standardCelRuntimeBuilder().addLibraries(CelExtensions.strings()) ```