001: /*
002: *
003: * Copyright 2007 Giordano Maestro (giordano.maestro@assetdata.it)
004: *
005: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
006: * use this file except in compliance with the License. You may obtain a copy of
007: * the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
013: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
014: * License for the specific language governing permissions and limitations under
015: * the License.
016: */
017: package org.romaframework.aspect.reporting.jr.component;
018:
019: import java.util.Collection;
020: import java.util.HashMap;
021: import java.util.Iterator;
022: import java.util.LinkedList;
023: import java.util.List;
024: import java.util.Map;
025:
026: import net.sf.jasperreports.engine.JRDataSource;
027: import net.sf.jasperreports.engine.JRException;
028: import net.sf.jasperreports.engine.JasperFillManager;
029: import net.sf.jasperreports.engine.JasperPrint;
030: import net.sf.jasperreports.engine.JasperReport;
031: import net.sf.jasperreports.engine.design.JRDesignBand;
032: import net.sf.jasperreports.engine.design.JRDesignField;
033:
034: import org.apache.commons.logging.Log;
035: import org.apache.commons.logging.LogFactory;
036: import org.romaframework.aspect.reporting.ReportingAspect;
037: import org.romaframework.aspect.reporting.feature.ReportingClassFeatures;
038: import org.romaframework.aspect.reporting.jr.DesignJr;
039: import org.romaframework.aspect.reporting.jr.JRDesignHelper;
040: import org.romaframework.aspect.reporting.jr.ReflectionHelper;
041: import org.romaframework.aspect.reporting.jr.ds.RomaHashMapListDataSource;
042: import org.romaframework.aspect.reporting.jr.template.TemplateManager;
043: import org.romaframework.core.flow.ObjectContext;
044: import org.romaframework.core.schema.SchemaClassDefinition;
045: import org.romaframework.core.schema.SchemaFeatures;
046: import org.romaframework.core.schema.SchemaField;
047: import org.romaframework.core.util.DynaBean;
048:
049: public class ObjectComponentJr extends BaseComponentJr {
050:
051: protected Log log = LogFactory.getLog("JR.REPORTING");
052:
053: protected final HashMap<String, Object> parametersSource = new HashMap<String, Object>();
054:
055: protected SchemaClassDefinition designClassToRender;
056:
057: protected final JRDesignBand detailBand = JRDesignHelper.getBand();
058:
059: private String reportName;
060:
061: public ObjectComponentJr(BaseComponentJr parent,
062: SchemaFeatures iClassToRender) throws JRException {
063: super (parent, iClassToRender,
064: (SchemaClassDefinition) iClassToRender);
065: designClassToRender = (SchemaClassDefinition) iClassToRender;
066: }
067:
068: /**
069: * Add the title to the report
070: *
071: */
072: protected void addTitle(String reportName) {
073: final DynaBean classFeatures = designClassToRender
074: .getFeatures(ReportingAspect.ASPECT_NAME);
075: reportName = (String) classFeatures
076: .getAttribute(ReportingClassFeatures.LABEL);
077: if (reportName == null) {
078: reportName = designClassToRender.getSchemaClass()
079: .getClazz().getSimpleName();
080: }
081:
082: final JRDesignBand titleBand = JRDesignHelper.getTitleBand(
083: reportName, design.getDesign().getColumnWidth());
084: design.getDesign().setColumnHeader(titleBand);
085:
086: }
087:
088: /**
089: * Creates the base design
090: *
091: * @param iSchemaObject
092: * @throws JRException
093: */
094: @Override
095: public void generateDesign() throws JRException {
096: if (!isRegistered()) {
097: // Generate the design
098: addTitle(reportName);
099: JRDesignHelper.renderFields(design, designClassToRender,
100: this );
101: addFieldToTemplate(design);
102: fillBand(design.getDesign().getColumnWidth(), detailBand);
103: // Adding the template to the manager
104: ObjectContext.getInstance().getComponent(
105: TemplateManager.class).addDesign(id, design);
106: } else {
107: design = ObjectContext.getInstance().getComponent(
108: TemplateManager.class).getDesign(id);
109: }
110: }
111:
112: protected void addFieldToTemplate(DesignJr jr) throws JRException {
113: // Add the fields to the design
114: final JRDesignField field = new JRDesignField();
115: field.setName(RomaHashMapListDataSource.FIELD_NAME);
116: field.setValueClass(Map.class);
117: if (!design.isCustomTemplate()) {
118: design.getDesign().addField(field);
119: }
120: }
121:
122: @Override
123: public void fillDesign(Object iToRender,
124: Map<String, Object> parametersSource) throws JRException {
125: final Iterator<SchemaField> fields = designClassToRender
126: .getFieldIterator();
127: while (fields.hasNext()) {
128: final SchemaField field = fields.next();
129: log.debug(field + " : " + field.getGetterMethod()
130: + " : toRender -> " + iToRender);
131: final Object toRender = ReflectionHelper.getObjectValue(
132: field, iToRender);
133: if (design.getSubreport(field) != null) {
134: log.debug(field);
135: design.getSubreport(field).fillDesign(toRender,
136: parametersSource);
137: } else {
138: log.debug("Field " + field + " not binded.");
139: }
140: }
141: }
142:
143: public void fillBand(int columnWidth, JRDesignBand iDetailBand)
144: throws JRException {
145: final Iterator<SchemaField> fields = designClassToRender
146: .getFieldIterator();
147: while (fields.hasNext()) {
148: final SchemaField field = fields.next();
149: if (design.getSubreport(field) != null) {
150: log.debug(field);
151: design.getSubreport(field).fillBand(columnWidth,
152: iDetailBand);
153: } else {
154: log.debug("Field " + field + " not added to Band.");
155: }
156: }
157: design.getDesign().setDetail(iDetailBand);
158: }
159:
160: public JasperPrint getPrinter(Object iToRender) throws JRException {
161: fillDesign(iToRender, parametersSource);
162: final JasperReport report = getCompiledReport();
163: final JasperPrint jPrint = JasperFillManager.fillReport(report,
164: new HashMap<String, Object>(), getFieldsSource());
165: return jPrint;
166: }
167:
168: public JasperPrint getCollectionPrinter(Collection<?> iToRender)
169: throws JRException {
170:
171: final List<Map<String, Object>> sources = new LinkedList<Map<String, Object>>();
172: for (final Object object : iToRender) {
173: final ObjectComponentJr jrReport = new ObjectComponentJr(
174: null, designClassToRender);
175: jrReport.generateDesign();
176: jrReport.fillDesign(object, jrReport.parametersSource);
177: sources.add(jrReport.parametersSource);
178: }
179: final RomaHashMapListDataSource source = new RomaHashMapListDataSource(
180: sources);
181:
182: // Get the printer
183:
184: final JasperPrint jPrint = JasperFillManager.fillReport(
185: getCompiledReport(), new HashMap<String, Object>(),
186: source);
187: return jPrint;
188: }
189:
190: public void addSimpleParameter(String key, Object value) {
191: parametersSource.put(key, value);
192: }
193:
194: public HashMap<String, Object> getParametersSource() {
195: return parametersSource;
196: }
197:
198: @Override
199: protected String generateID(BaseComponentJr iParent,
200: SchemaFeatures iSchemaFeature) {
201: final SchemaClassDefinition schemaObject = (SchemaClassDefinition) iSchemaFeature;
202: if (iParent != null) {
203: return iParent.id
204: + "_"
205: + schemaObject.getSchemaClass().getClazz()
206: .getSimpleName();
207: } else {
208: return schemaObject.getSchemaClass().getClazz()
209: .getSimpleName();
210: }
211: }
212:
213: public JRDataSource getFieldsSource() {
214: final List<Map<String, Object>> list = new LinkedList<Map<String, Object>>();
215: list.add(parametersSource);
216: return new RomaHashMapListDataSource(list);
217: }
218:
219: }
|