/// <summary> /// Invokes a currently registered Velocimacro with the parameters provided /// and places the rendered stream into the writer. /// Note : currently only accepts args to the VM if they are in the context. /// </summary> /// <param name="vmName">name of Velocimacro to call</param> /// <param name="logTag">string to be used for template name in case of error</param> /// <param name="parameters">args used to invoke Velocimacro. In context key format : /// eg "foo","bar" (rather than "$foo","$bar") /// </param> /// <param name="context">Context object containing data/objects used for rendering.</param> /// <param name="writer"> Writer for output stream</param> /// <returns>true if Velocimacro exists and successfully invoked, false otherwise.</returns> public bool InvokeVelocimacro(String vmName, String logTag, String[] parameters, IContext context, TextWriter writer) { // check parameters if (vmName == null || parameters == null || context == null || writer == null || logTag == null) { runtimeInstance.Error("VelocityEngine.invokeVelocimacro() : invalid parameter"); return(false); } // does the VM exist? if (!runtimeInstance.IsVelocimacro(vmName, logTag)) { runtimeInstance.Error(string.Format("VelocityEngine.invokeVelocimacro() : VM '{0}' not registered.", vmName)); return(false); } // now just create the VM call, and use evaluate StringBuilder construct = new StringBuilder("#"); construct.Append(vmName); construct.Append("("); for (int i = 0; i < parameters.Length; i++) { construct.Append(" $"); construct.Append(parameters[i]); } construct.Append(" )"); try { bool retval = Evaluate(context, writer, logTag, construct.ToString()); return(retval); } catch (Exception e) { runtimeInstance.Error(string.Format("VelocityEngine.invokeVelocimacro() : error {0}", e)); throw; } }