001: package dinamica;
002:
003: import electric.xml.*;
004:
005: /**
006: * Generic output module to print master/detail html reports.<br>
007: * It will require a published recordset called "group-master.sql"
008: * and will consume a Transaction that is a subclass of MasterDetailReader.
009: * It can be an instance of this class or an instance of a subclass. If your
010: * master-detail scenario is rather simple, then this generic Transaction class
011: * will be enough to create your report.
012: * <br><br>
013: * (c) 2004 Martin Cordova<br>
014: * This code is released under the LGPL license<br>
015: * Dinamica Framework - http://www.martincordova.com
016: * @author Martin Cordova (dinamica@martincordova.com)
017: * */
018: public class MasterDetailOutput extends GenericOutput {
019:
020: /** reference to the master recordset */
021: private Recordset _master = null;
022:
023: /**
024: * Makes available the master recordset to subclasses
025: * of this class, because it may be useful to have it when
026: * overriding the onNewRow(...) method, which does not
027: * receive a reference to the master recordset.
028: * @return
029: */
030: protected Recordset getMaster() {
031: return _master;
032: }
033:
034: /**
035: * Subclass GenericOutput to provide the same features
036: * (all the PRINT commands, etc) and generates the
037: * master/detail section of the template with one level
038: * of grouping.
039: */
040: public void print(TemplateEngine te, GenericTransaction data)
041: throws Throwable {
042:
043: //reuse superclass code
044: super .print(te, data);
045:
046: //retrieve master recordset
047: Recordset master = data.getRecordset("master");
048: _master = master;
049:
050: //load repeatable subtemplate
051: Element root = getConfig().getDocument().getRoot();
052: Element gt = root.getElement("group-template");
053: if (gt == null)
054: throw new Throwable(
055: "Element <group-template> not found in config.xml. This element is required by the class dinamica.MasterDetailOutput!");
056:
057: //alternate colors?
058: IRowEvent event = null;
059: String altColors = gt.getAttribute("alternate-colors");
060: if (altColors != null && altColors.equalsIgnoreCase("true"))
061: event = this ;
062:
063: String nullExpr = gt.getAttribute("null-value");
064: if (nullExpr == null)
065: nullExpr = " ";
066:
067: //set group template
068: String section = getGroupTemplate(gt);
069:
070: //buffer
071: StringBuffer buf = new StringBuffer();
072:
073: /* use custom locale if available */
074: java.util.Locale l = (java.util.Locale) getSession()
075: .getAttribute("dinamica.user.locale");
076:
077: //for every master record build a master/detail section
078: master.top();
079: while (master.next()) {
080:
081: //get detail rows
082: MasterDetailReader m = (MasterDetailReader) data;
083: Recordset items = m.getDetail(master);
084:
085: //build subpage
086: this .resetRowColor();
087: TemplateEngine t = new TemplateEngine(getContext(),
088: getRequest(), section);
089: t.setRowEventObject(event);
090: t.setLocale(l);
091:
092: //print items count if required
093: t.replace("${fld:detail.recordcount}", String.valueOf(items
094: .getRecordCount()));
095:
096: //replace detail rows
097: t.replace(items, nullExpr, "rows");
098:
099: //replace master record columns
100: t.replace(master, " ");
101:
102: //append subpage section
103: buf.append(t.toString());
104:
105: }
106:
107: //replace into main template
108: te.replace("${group}", buf.toString());
109:
110: }
111:
112: /**
113: * Load repeatable subtemplate
114: * @return repeatable subtemplate body
115: * @throws Throwable
116: */
117: protected String getGroupTemplate(Element gt) throws Throwable {
118:
119: return getResource(gt.getString());
120:
121: }
122:
123: }
|