[ http://issues.apache.org/jira/browse/VELOCITY-444?page=comments#action_12416386 ]
Nathan Bubna commented on VELOCITY-444: --------------------------------------- The velocity-user list is really where you should take questions about getting something to work. Sending my response there and to you... > Allow evaluation of Java expressions that does not return text or value! > ------------------------------------------------------------------------ > > Key: VELOCITY-444 > URL: http://issues.apache.org/jira/browse/VELOCITY-444 > Project: Velocity > Type: Improvement > Components: Source > Versions: 1.4 > Environment: WindowsXP > Reporter: Colbert Philippe > Priority: Critical > > I have started to use Velocity as a file preprocessor with my own macros in > separate files. I quickly realized that there are some features missing in > Velocity. > I want to create Velocity macros with optional parameters, which is essential > for my application. When a user calls my macros, she/he should not be > obliged to pass all the necessary parameters to my macro. The macro should > be callable with no parameter or with partial or full set of parameters. > All parameters will have default values. > I think the best way to do this is to have a Map (like a java.util.Map as in > HashMap). As far as I know, Velocity does not support a Map objects > directly. Such object as a Map has to be created in Java and used from the > Velocity macro language. Therein lies the problem. > Velocity does not have a reserved word for evaluating a Java expression > without returning a value or text. In the documentation, using #set( > $result = $myObj.method() ), method() can have side effects but it must > return a value. I want to be able to call methods that return nothing > (void). I have tried many things to try circumventing this but nothing > works. Velocity always outputs the text of the expression without evaluating > it. > The solution would be to have a reserve construct similar like #set(....) but > it would be called #eval(....). Such expression #eval(....) would take a > Java expression and would evaluate it without generating any text. The > #eval(....) would be used to set the value of my Map. > // Utility Java class that creates and keeps HashMap(s) > public static class Utility { > public static final byte MAP_COUNT = 16; > private final Stack<Map<String,String>> maps = > new Stack<Map<String,String>>(); > public Utility() { this(MAP_COUNT); } > public Utility(int count) { > for(int i=0;i<count;i++) { > maps.push(new HashMap<String,String>()); > } > } > public Map<String,String> createMap() { return maps.pop(); } > public void discardMap(Map<String,String> map) { map.clear(); > maps.push(map); } > } > protected final Utility util = new Utility(); > engine.setProperty("util", util); // ...later passed as property of > VelocityEngine > ##======================= > ## Macro to create a Map and use it inside the macro > ##======================= > #set( $myMap = $util.createMap() ) > $myMap.size() > #$myMap.put("first", "alpha") > #$myMap.put("second", "beta") > #$myMap.put("third", "kapa") > #$myMap.put("fourth", "gamma") > #foreach( $myKey in [ "first", "second", "third", "fourth" ] ) > $myKey ${myMap.get($myKey)} > #end > ##======================= > ## Output text file ...DOES NOT WORK AS PLANNED!! > ##======================= > $myMap.size() > #$myMap.put("first", "alpha") > #$myMap.put("second", "beta") > #$myMap.put("third", "kapa") > #$myMap.put("fourth", "gamma") > first ${myMap.get($myKey)} > second ${myMap.get($myKey)} > third ${myMap.get($myKey)} > fourth ${myMap.get($myKey)} -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
