001: /**
002: * MVEL (The MVFLEX Expression Language)
003: *
004: * Copyright (C) 2007 Christopher Brock, MVFLEX/Valhalla Project and the Codehaus
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: */package org.mvel.integration.impl;
019:
020: import org.mvel.integration.VariableResolver;
021: import org.mvel.integration.VariableResolverFactory;
022: import static org.mvel.util.ParseTools.createClass;
023: import static org.mvel.util.ParseTools.getSimpleClassName;
024: import org.mvel.ParserContext;
025: import org.mvel.ParserConfiguration;
026:
027: import java.util.HashMap;
028: import java.util.HashSet;
029: import java.util.Map;
030: import java.util.Set;
031:
032: public class ClassImportResolverFactory extends
033: BaseVariableResolverFactory {
034: private Set<String> packageImports;
035:
036: public ClassImportResolverFactory() {
037: super ();
038:
039: variableResolvers = new HashMap<String, VariableResolver>();
040: }
041:
042: public ClassImportResolverFactory(ParserConfiguration ctx,
043: VariableResolverFactory nextFactory) {
044: packageImports = ctx.getPackageImports();
045: Map<String, Object> classes = ctx.getImports();
046:
047: this .nextFactory = nextFactory;
048:
049: this .variableResolvers = new HashMap<String, VariableResolver>();
050: for (String s : classes.keySet()) {
051: variableResolvers.put(s, new SimpleValueResolver(classes
052: .get(s)));
053: }
054: }
055:
056: public VariableResolver createVariable(String name, Object value) {
057: if (nextFactory == null) {
058: nextFactory = new MapVariableResolverFactory(new HashMap());
059: }
060:
061: return nextFactory.createVariable(name, value);
062: }
063:
064: public VariableResolver createVariable(String name, Object value,
065: Class type) {
066: if (nextFactory == null) {
067: nextFactory = new MapVariableResolverFactory(new HashMap());
068: }
069:
070: return nextFactory.createVariable(name, value);
071: }
072:
073: public Class addClass(Class clazz) {
074: variableResolvers.put(getSimpleClassName(clazz),
075: new SimpleValueResolver(clazz));
076: return clazz;
077: }
078:
079: public boolean isTarget(String name) {
080: return variableResolvers.containsKey(name);
081: }
082:
083: public boolean isResolveable(String name) {
084: if (variableResolvers.containsKey(name)
085: || isNextResolveable(name)) {
086: return true;
087: } else if (packageImports != null) {
088:
089: for (String s : packageImports) {
090: try {
091: addClass(createClass(s + "." + name));
092: return true;
093: } catch (ClassNotFoundException e) {
094: // do nothing;
095: }
096: }
097: }
098: return false;
099: }
100:
101: public void clear() {
102: variableResolvers.clear();
103: }
104:
105: public void setImportedClasses(Map<String, Class> imports) {
106: if (imports == null)
107: return;
108: for (String var : imports.keySet()) {
109: variableResolvers.put(var, new SimpleValueResolver(imports
110: .get(var)));
111: }
112: }
113:
114: public Map<String, Object> getImportedClasses() {
115: Map<String, Object> imports = new HashMap<String, Object>();
116: for (String var : variableResolvers.keySet()) {
117: imports.put(var, variableResolvers.get(var).getValue());
118: }
119:
120: return imports;
121: }
122:
123: public void addPackageImport(String packageName) {
124: if (packageImports == null)
125: packageImports = new HashSet<String>();
126: packageImports.add(packageName);
127: }
128: }
|