On Dec 26, 2008, at 15:53 , Steve Cohen wrote:

AIM delivers instant messages to our bot, which is implemented using AIM's SDK. An Instant Message contains of course the text of the IM, which our bot processes much like a command-line parser of a sort. A properly entered command leads to some sort of action being performed which might be data retrieval or modification, or something else. An improperly entered command leads to an "error page". No matter what it is, the feedback to the user is an IM sent back to him via AIM. Our bot's interface to AIM going in this direction is again the AIM SDK. This is analogous to a servlet response.

Additionally, although there are alternatives, AOL's preferred mechanism for receiving inputs from a "bot" is that it be a limited form of xhtml - that is, only a restricted subset of xhtml is allowed. Things like <b>, <br/>, and <font> are allowed, <table> is not. The AIM SDK provides a way of converting strings to this format, but it is not required to use this API.

Up until now, the relatively simple nature of this interface led me down the primrose path of simply taking strings as input, parsing them, running them through whatever process was required and spitting back out the required output. I gave no thoughts to MVC. Possible outputs were stored in a properties file, often with various replaceable parameters. This was easily handled in java, but it's become more cumbersome as the size of this properties file increased. It got way more cumbersome when I started needing to format the text. I developed a clever (too clever by half) mechanism for formatting this text using java, but I really need to get away from that. Java is doing way too much. I would rather now have a bunch of little "html pages" that have the formatting on them, with the content to be popped in via templating.

What I want is to have the various boilerplate outputs stored as velocity templates, in an intelligently organized directory tree structure, and use the velocity mechanism to merge in the live data. Fortunately, even though this application isn't a WebApp, I long ago made the decision to run it inside of Tomcat. Although it isn't a Web application, there are a couple of minor interfaces that do access the application through servlets, hence Tomcat. Thus the architecture is all already there to put all the templates under the Web Context root.

However, as I said, it ISN'T actually a web app. It doesn't deliver content to users via the http request/response paradigm. One idea for using velocity in this situation would be to make http://localhost:8080 calls to the Velocity Servlet, get the merged output, read it into a StringWriter, and send that on to the user. But that doesn't feel right. It feels like needless overhead.

I would like to invoke Velocity like a non-webapp, through java, but read the templates from the Web Context as though it were a web app. Has anyone done anything like that, or otherwise have helpful advice for me?


It's fairly straight forward to call Velocity outside of any type of web-app environment:

http://velocity.apache.org/engine/releases/velocity-1.6.1/developer-guide.html#thevelocityhelperclass

Since you want to go in the MVC direction you may not want to invoke a velocity template directly but maybe reference some sort of logical name that refers to a method or class that contains the controller logic. The controller logic would then initialize the context and specify the velocity template to render. For example:

public String dispatch(String cntrlName) {
  VelocityContext ctx = new VelocityContext();
  String template;
  if (cntrlName.equals("foo") {
    ctx.put("msg", "this is foo");
    template = "foo.vm";
  }
  else if (cntrName.equals("bar") {
    ctx.put("msg", "this is bar");
    template = "bar.vm";
  }
  else { // Some error}
        
  StringWriter writer = new StringWriter();
  Velocity.merge(template, "utf-8", ctx, writer);
  return writer.toString();
}

The above won't compile of course, and the setup is primitive, but you get the idea. If you wanted to hit a velocity page directly you can always add the logic for it. So, this is independent of any mechanism of providing a request.

You could then create a simple servlet that would map an URL to a dispatch cntrlName, call something like above, then stream the result to the response.

The above dispatch setup can also be accessed by your AOL SDK front End.

Your templates would generate your XHTML, text or whatever flavor.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to