org.mvel2.compiler.CompiledAccExpression Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tbel Show documentation
Show all versions of tbel Show documentation
TBEL is a powerful expression language for ThingsBoard platform user-defined functions.
Original implementation is based on MVEL.
/**
* MVEL 2.0
* Copyright (C) 2007 The Codehaus
* Mike Brock, Dhanji Prasanna, John Graham, Mark Proctor
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mvel2.compiler;
import org.mvel2.ParserContext;
import org.mvel2.integration.VariableResolverFactory;
import org.mvel2.optimizers.OptimizerFactory;
import java.io.Serializable;
import static org.mvel2.optimizers.OptimizerFactory.getThreadAccessorOptimizer;
public class CompiledAccExpression implements ExecutableStatement, Serializable {
private char[] expression;
private int start;
private int offset;
private transient Accessor accessor;
private ParserContext context;
private Class ingressType;
public CompiledAccExpression(char[] expression, Class ingressType, ParserContext context) {
this(expression, 0, expression.length, ingressType, context);
}
public CompiledAccExpression(char[] expression, int start, int offset, Class ingressType, ParserContext context) {
this.expression = expression;
this.start = start;
this.offset = offset;
this.context = context;
this.ingressType = ingressType != null ? ingressType : Object.class;
}
public Object setValue(Object ctx, Object elCtx, VariableResolverFactory vrf, Object value) {
if (accessor == null) {
if (ingressType == Object.class && value != null) ingressType = value.getClass();
accessor = getThreadAccessorOptimizer()
.optimizeSetAccessor(context, expression, 0, expression.length, ctx, ctx, vrf, false, value, ingressType);
}
else {
accessor.setValue(ctx, elCtx, vrf, value);
}
return value;
}
public Object getValue(Object staticContext, VariableResolverFactory factory) {
if (accessor == null) {
try {
accessor = getThreadAccessorOptimizer()
.optimizeAccessor(context, expression, 0, expression.length, staticContext, staticContext, factory, false, ingressType);
return getValue(staticContext, factory);
}
finally {
OptimizerFactory.clearThreadAccessorOptimizer();
}
}
return accessor.getValue(staticContext, staticContext, factory);
}
public void setKnownIngressType(Class type) {
this.ingressType = type;
}
public void setKnownEgressType(Class type) {
}
public Class getKnownIngressType() {
return ingressType;
}
public Class getKnownEgressType() {
return null;
}
public boolean isConvertableIngressEgress() {
return false;
}
public void computeTypeConversionRule() {
}
public boolean intOptimized() {
return false;
}
public boolean isLiteralOnly() {
return false;
}
public Object getValue(Object ctx, Object elCtx, VariableResolverFactory variableFactory) {
if (accessor == null) {
try {
accessor = getThreadAccessorOptimizer().optimizeAccessor(context, expression, start, offset, ctx, elCtx,
variableFactory, false, ingressType);
return getValue(ctx, elCtx, variableFactory);
}
finally {
OptimizerFactory.clearThreadAccessorOptimizer();
}
}
return accessor.getValue(ctx, elCtx, variableFactory);
}
public Accessor getAccessor() {
return accessor;
}
public boolean isEmptyStatement() {
return accessor == null;
}
public boolean isExplicitCast() {
return false;
}
}