### 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
#if>
)
);
```
--------------------------------
### 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())
```