custom velocity renderer to have nicely trimmed generated code
--------------------------------------------------------------

                 Key: TORQUE-71
                 URL: http://issues.apache.org/jira/browse/TORQUE-71
             Project: Torque
          Issue Type: Improvement
          Components: Generator
            Reporter: Thoralf Rickert
            Priority: Minor


The current Torque templates have spaces and tabs in front of Velocity commands 
(#foreach, #set, #end,...). The Velocity renderer puts this spaces and tabs 
into the generated code - that is the reason why the code in generated Base* 
class files looks sometimes a little bit ugly. If we remove the leading spaces 
in front of Velocity commands we can avoid this problem.

My solution is to override the rendering method in 
org.apache.velocity.texen.ant.TexenTask that Torque uses to render the 
templates and replace the template loader with our own. Therefor we can remove 
the leading spaces.

  /**
   * This method filters the template and replaces some
   * unwanted characters. For example it removes leading
   * spaces in front of velocity commands and replaces
   * tabs with spaces to prevent bounces in different
   * code editors with different tab-width-setting.
   */
  protected byte[] filter(String template, String encoding) throws Exception {
    StringReader stringReader = new StringReader(template);
    LineNumberReader lineNumberReader = new LineNumberReader(stringReader);
    String line = null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintStream ps = new PrintStream(baos,true,encoding);

    while ((line = lineNumberReader.readLine()) != null) {
      // remove leading spaces in front of velocity commands and comments
      line = line.replaceAll("^\\s*#", "#");
      // replace tabs with spaces to prevent bounces in editors
      line = line.replaceAll("\t","    ");
      ps.println(line);
    }
    ps.flush();
    ps.close();

    return baos.toByteArray();
  }

The only problem is, that this would generate an error if you use empty 
statements in #if or #foreach commands, for example
  #if (something)
  #end

This would create an error in velocity's render engine if you remove the 
leading spaces - because empty statements are not allowed in Velocity. But this 
can be avoided by add a single new line:

  #if (something)

  #end


A patch for the current generator comes in the next days.

-- 
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]

Reply via email to