01: /**
02: * MVEL (The MVFLEX Expression Language)
03: *
04: * Copyright (C) 2007 Christopher Brock, MVFLEX/Valhalla Project and the Codehaus
05: *
06: * Licensed under the Apache License, Version 2.0 (the "License");
07: * you may not use this file except in compliance with the License.
08: * You may obtain a copy of the License at
09: *
10: * http://www.apache.org/licenses/LICENSE-2.0
11: *
12: * Unless required by applicable law or agreed to in writing, software
13: * distributed under the License is distributed on an "AS IS" BASIS,
14: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15: * See the License for the specific language governing permissions and
16: * limitations under the License.
17: *
18: */package org.mvel.ast;
19:
20: import org.mvel.ast.cache.CachedListAccessor;
21: import org.mvel.integration.VariableResolverFactory;
22: import org.mvel.optimizers.AccessorOptimizer;
23: import org.mvel.optimizers.OptimizerFactory;
24: import static org.mvel.optimizers.OptimizerFactory.SAFE_REFLECTIVE;
25: import static org.mvel.optimizers.OptimizerFactory.getAccessorCompiler;
26:
27: import java.util.List;
28:
29: /**
30: * @author Christopher Brock
31: */
32: public class InlineCollectionNode extends ASTNode {
33: public InlineCollectionNode(char[] expr, int start, int end,
34: int fields) {
35: super (expr, start, end, fields | INLINE_COLLECTION);
36: }
37:
38: public Object getReducedValueAccelerated(Object ctx,
39: Object this Value, VariableResolverFactory factory) {
40: if (accessor != null) {
41: return accessor.getValue(ctx, this Value, factory);
42: } else {
43: AccessorOptimizer ao = OptimizerFactory
44: .getThreadAccessorOptimizer();
45: accessor = ao.optimizeCollection(name, ctx, this Value,
46: factory);
47: egressType = ao.getEgressType();
48:
49: if (ao.isLiteralOnly()) {
50: if (egressType == List.class) {
51: List v = (List) accessor.getValue(null, null, null);
52: accessor = new CachedListAccessor(v);
53: return v;
54: }
55: }
56: return accessor.getValue(ctx, this Value, factory);
57: }
58:
59: }
60:
61: public Object getReducedValue(Object ctx, Object this Value,
62: VariableResolverFactory factory) {
63: return getAccessorCompiler(SAFE_REFLECTIVE).optimizeCollection(
64: name, ctx, thisValue, factory).getValue(ctx, thisValue,
65: factory);
66: }
67: }
|