[stringtemplate-interest] Grid Problems

James Briant jab.antlr at species.org
Fri Feb 19 11:41:42 PST 2010


I have this same problem. Specifically,

class  {
  public String name;
  public List<Number> phones;
}
class Number {
  public String number;
}

Person person = new ....

Will work with <person.phones:writephone()>

Using a HashMap will not:

HashMap person = new HashMap()
HashMap phone1 = new HashMap()
person.put("phones",phone1);

But if you hack StringTemplate.Aggregate to make it public,

Aggregate person = new Aggregate()
Aggregate phone1 = new Aggregate()
person.put("phones",phone1)

This works.


This is because (in 3.2) in ASTExpr.java convertAnythingIteratableToIterator
and convertAnythingToIterator will BOTH convert a HashMap to a list, but not
a class, and not StringTemplate.Aggregate.

I request that Aggregate, or an object like Aggregate is implemented so that
during rapid prototyping I can create aggregate objects without having to
create specific classes.

Thanks!



On Tue, May 6, 2008 at 9:27 AM, Terence Parr <parrt at cs.usfca.edu> wrote:

> Hi Bob, i'm racing to get ANTLR v3.1 out the door...I'll get to this
> as soon as i can.
> T
> On May 3, 2008, at 12:04 PM, Bob wrote:
>
> > I have a system that produces data in 2-D grids (rows-and-columns).
> > Each column has a name.  This seemed like a perfect match for
> > StringTemplate.
> >
> > I've included at the end of this email a template that I wish to use
> > to
> > generate a report from my 2-D grids.  In particular, I wish to:
> >
> > 1. Create a 1-row grid (person) containing one person record.
> > 2. Create a multi-row grid (phones) containing phone numbers for the
> > person.
> > 3. Format it all together as shown in the template at the end of this
> > message.
> >
> > The basic operation here is to set a StringTemplate attribute to one
> > of
> > my grids (StringTableModel).  I want to make a function like:
> >
> > public static void setAttribute(StringTemplate st, String var,
> > StringTableModel val)
> >       { ... }
> >
> > Then I use code as follows to generate my report:
> >
> >       StringTemplate st = ....;
> >
> >       StringTableModel sperson = new StringTableModel(dmod.getPersonSb(),
> > sfmap);
> >       setAttribute(st, "person", sperson);
> >
> >       StringTableModel sphones = new StringTableModel(dmod.getPhonesSb(),
> > sfmap);
> >       setAttribute(st, "phones", sphones);
> >
> >       return st.toString();
> >
> > Unfortunately, I came up against several difficulties in figuring out
> > what to place in the body of the setAttribute(StringTemplate, String,
> > StringTableModel) function:
> >
> > 1. I first tried setting multi-valued attributes as follows.  The
> > parser
> > complained that I couldn't have "." in an attribute name:
> >       for (int col=0; col<val.getColumnCount(); ++col) {
> >               String colName = var + "." + val.getColumnName(col) + "";
> >               for (int row=0; row<val.getRowCount(); ++row) {
> >                       st.setAttribute(colName, val.getValueAt(row, col));
> >               }
> >       }
> >
> > 2. Then I tried the syntax shown in the docs for 2-5 column multi-
> > valued
> > attributes, as follows.  The parser also did not understand this,
> > since
> > I'm only setting one column at a time:
> >       for (int col=0; col<val.getColumnCount(); ++col) {
> >               String colName = var + ".{" + val.getColumnName(col) + "}";
> >               for (int row=0; row<val.getRowCount(); ++row) {
> >                       st.setAttribute(colName, val.getValueAt(row, col));
> >               }
> >       }
> >
> >
> > 3. Then I tried creating a HashMap for each row, and setting the value
> > once per row.  This ALMOST worked.  It worked as long as you have 2 or
> > more phone numbers.  But if you had just one phone number (and in my
> > case 2 columns), the system interpreted the data as two single-valued
> > attributes, as opposed to one aggregate attribute.  Thus, it worked
> > if I
> > had 2 phone numbers, but threw an exception if I had just one.  Is
> > this
> > a bug, or is that the intended behavior?
> >       for (int row=0; row<val.getRowCount(); ++row) {
> >               HashMap map = new HashMap();
> >               for (int col=0; col<val.getColumnCount(); ++col) {
> >                       map.put(val.getColumnName(col), val.getValueAt(row,
> col));
> >               }
> >               st.setAttribute(var, map);
> >       }
> >
> > 4. I figured maybe if I make each column as a list of attributes, this
> > would work.  No such luck...
> >       HashMap map = new HashMap();
> >       for (int col=0; col<val.getColumnCount(); ++col) {
> >               List list = new ArrayList(val.getRowCount());
> >               for (int row=0; row<val.getRowCount(); ++row) {
> >                       list.add(val.getValueAt(row, col));
> >               }
> >               map.put(val.getColumnName(col), list);
> >       }
> >       st.setAttribute(var, map);
> >
> > 5. Finally, I hacked the source code, making StringTemplate.Aggregate
> > public, to allow the following.  Since StringTemplate.Aggregate is
> > basically a wrapper around HashMap, I'm surprised that behaved
> > differently from the HashMap example above.  But it did: this worked,
> > whereas the example above did not:
> >
> >
> >       for (int row=0; row<val.getRowCount(); ++row) {
> >               StringTemplate.Aggregate map = new
> StringTemplate.Aggregate();
> >               for (int col=0; col<val.getColumnCount(); ++col) {
> >                       map.put(val.getColumnName(col), val.getValueAt(row,
> col));
> >               }
> >               st.setAttribute(var, map);
> >       }
> >
> > ---------------------
> > Current status: at this point, I know of no way to do what I want
> > without hacking the source code.  Any suggestions on a solution to
> > this
> > problem?
> >
> > Thanks,
> > -- Bob
> >
> >
> > // ===================================================
> > // summary.st
> >
> > <ul>
> > <li>Name: $person.firstname$ $person.lastname$</li>
> > <li>Email: $person.email$</li>
> > </ul>
> >
> >
> > <h3>Phones</h3>
> > <table border=1>
> > $phones:{it |
> >  <tr>
> >    <td>$it.groupid$</td><td>$it.phone$</td>
> >  </tr>
> > }$
> > </table>
> >
> >
> > _______________________________________________
> > stringtemplate-interest mailing list
> > stringtemplate-interest at antlr.org
> > http://www.antlr.org:8080/mailman/listinfo/stringtemplate-interest
>
> _______________________________________________
> stringtemplate-interest mailing list
> stringtemplate-interest at antlr.org
> http://www.antlr.org:8080/mailman/listinfo/stringtemplate-interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/stringtemplate-interest/attachments/20100219/ff793523/attachment.html 


More information about the stringtemplate-interest mailing list