org.antlr.stringtemplate
Class StringTemplate.Aggregate
java.lang.Object
org.antlr.stringtemplate.StringTemplate.Aggregate
- Enclosing class:
- StringTemplate
public static final class StringTemplate.Aggregate
- extends java.lang.Object
An automatically created aggregate of properties.
I often have lists of things that need to be formatted, but the list
items are actually pieces of data that are not already in an object. I
need ST to do something like:
Ter=3432
Tom=32234
....
using template:
$items:{it.name$=$it.type$}$
This example will call getName() on the objects in items attribute, but
what if they aren't objects? I have perhaps two parallel arrays
instead of a single array of objects containing two fields. One
solution is allow Maps to be handled like properties so that it.name
would fail getName() but then see that it's a Map and do
it.get("name") instead.
This very clean approach is espoused by some, but the problem is that
it's a hole in my separation rules. People can put the logic in the
view because you could say: "go get bob's data" in the view:
Bob's Phone: $db.bob.phone$
A view should not be part of the program and hence should never be able
to go ask for a specific person's data.
After much thought, I finally decided on a simple solution. I've
added setAttribute variants that pass in multiple property values,
with the property names specified as part of the name using a special
attribute name syntax: "name.{propName1,propName2,...}". This
object is a special kind of HashMap that hopefully prevents people
from passing a subclass or other variant that they have created as
it would be a loophole. Anyway, the ASTExpr.getObjectProperty()
method looks for Aggregate as a special case and does a get() instead
of getPropertyName.
Field Summary |
protected java.util.HashMap |
properties
|
Method Summary |
java.lang.Object |
get(java.lang.String propName)
|
protected void |
put(java.lang.String propName,
java.lang.Object propValue)
Allow StringTemplate to add values, but prevent the end
user from doing so. |
java.lang.String |
toString()
|
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
properties
protected java.util.HashMap properties
StringTemplate.Aggregate
public StringTemplate.Aggregate()
put
protected void put(java.lang.String propName,
java.lang.Object propValue)
- Allow StringTemplate to add values, but prevent the end
user from doing so.
get
public java.lang.Object get(java.lang.String propName)
toString
public java.lang.String toString()
- Overrides:
toString
in class java.lang.Object