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;
019:
020: import java.util.Set;
021:
022: /**
023: * A VariableResolverFactory is the primary integration point for tying in external variables. The factory is
024: * responsible for returing {@link org.mvel.integration.VariableResolver}'s to the MVEL runtime. Factories are
025: * also structured in a chain to maintain locality-of-reference.
026: */
027: public interface VariableResolverFactory {
028: /**
029: * Creates a new variable. This probably doesn't need to be implemented in most scenarios. This is
030: * used for variable assignment.
031: *
032: * @param name - name of the variable being created
033: * @param value - value of the variable
034: * @return instance of the variable resolver associated with the variable
035: */
036: public VariableResolver createVariable(String name, Object value);
037:
038: public VariableResolver createIndexedVariable(int index,
039: String name, Object value);
040:
041: /**
042: * Creates a new variable, and assigns a static type. It is expected the underlying factory and resolver
043: * will enforce this.
044: *
045: * @param name - name of the variable being created
046: * @param value - value of the variable
047: * @param type - the static type
048: * @return instance of the variable resolver associated with the variable
049: */
050: public VariableResolver createVariable(String name, Object value,
051: Class<?> type);
052:
053: public VariableResolver createIndexedVariable(int index,
054: String name, Object value, Class<?> typee);
055:
056: public VariableResolver setIndexedVariableResolver(int index,
057: VariableResolver variableResolver);
058:
059: /**
060: * Returns the next factory in the factory chain. MVEL uses a hierarchical variable resolution strategy,
061: * much in the same way as Classloaders in Java. For performance reasons, it is the responsibility of
062: * the individual VariableResolverFactory to pass off to the next one.
063: *
064: * @return instance of the next factory - null if none.
065: */
066: public VariableResolverFactory getNextFactory();
067:
068: /**
069: * Sets the next factory in the chain. Proper implementation:
070: * <code>
071: * <p/>
072: * return this.nextFactory = resolverFactory;
073: * </code>
074: *
075: * @param resolverFactory - instance of next resolver factory
076: * @return - instance of next resolver factory
077: */
078: public VariableResolverFactory setNextFactory(
079: VariableResolverFactory resolverFactory);
080:
081: /**
082: * Return a variable resolver for the specified variable name. This method is expected to traverse the
083: * heirarchy of ResolverFactories.
084: *
085: * @param name - variable name
086: * @return - instance of the VariableResolver for the specified variable
087: */
088: public VariableResolver getVariableResolver(String name);
089:
090: public VariableResolver getIndexedVariableResolver(int index);
091:
092: /**
093: * Deterimines whether or not the current VariableResolverFactory is the physical target for the actual
094: * variable.
095: *
096: * @param name - variable name
097: * @return - boolean indicating whether or not factory is the physical target
098: */
099: public boolean isTarget(String name);
100:
101: /**
102: * Determines whether or not the variable is resolver in the chain of factories.
103: *
104: * @param name - variable name
105: * @return - boolean
106: */
107: public boolean isResolveable(String name);
108:
109: /**
110: * Return a list of known variables inside the factory. This method should not recurse into other factories.
111: * But rather return only the variables living inside this factory.
112: *
113: * @return
114: */
115: public Set<String> getKnownVariables();
116:
117: public int variableIndexOf(String name);
118:
119: public boolean isIndexedFactory();
120: }
|