001: /*
002: * Copyright 2006-2007 Pentaho Corporation. All rights reserved.
003: * This software was developed by Pentaho Corporation and is provided under the terms
004: * of the Mozilla Public License, Version 1.1, or any later version. You may not use
005: * this file except in compliance with the license. If you need a copy of the license,
006: * please go to http://www.mozilla.org/MPL/MPL-1.1.txt.
007: *
008: * Software distributed under the Mozilla Public License is distributed on an "AS IS"
009: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
010: * the license for the specific language governing your rights and limitations.
011: *
012: * Additional Contributor(s): Martin Schmid gridvision engineering GmbH
013: */
014: package org.pentaho.reportdesigner.crm.report.reportexporter;
015:
016: import org.jetbrains.annotations.NotNull;
017: import org.jetbrains.annotations.Nullable;
018: import org.pentaho.reportdesigner.crm.report.datasetplugin.jdbc.JDBCDataSetReportElement;
019: import org.pentaho.reportdesigner.crm.report.datasetplugin.multidataset.MultiDataSetReportElement;
020: import org.pentaho.reportdesigner.crm.report.datasetplugin.properties.PropertiesDataSetReportElement;
021: import org.pentaho.reportdesigner.crm.report.datasetplugin.properties.PropertyInfo;
022: import org.pentaho.reportdesigner.crm.report.datasetplugin.staticfactory.StaticFactoryDataSetReportElement;
023: import org.pentaho.reportdesigner.crm.report.model.AnchorFieldReportElement;
024: import org.pentaho.reportdesigner.crm.report.model.BandReportElement;
025: import org.pentaho.reportdesigner.crm.report.model.BandToplevelItemReportElement;
026: import org.pentaho.reportdesigner.crm.report.model.BandToplevelPageReportElement;
027: import org.pentaho.reportdesigner.crm.report.model.BandToplevelReportElement;
028: import org.pentaho.reportdesigner.crm.report.model.ChartReportElement;
029: import org.pentaho.reportdesigner.crm.report.model.DateFieldReportElement;
030: import org.pentaho.reportdesigner.crm.report.model.DrawableFieldReportElement;
031: import org.pentaho.reportdesigner.crm.report.model.EllipseReportElement;
032: import org.pentaho.reportdesigner.crm.report.model.ImageFieldReportElement;
033: import org.pentaho.reportdesigner.crm.report.model.ImageURLFieldReportElement;
034: import org.pentaho.reportdesigner.crm.report.model.LabelReportElement;
035: import org.pentaho.reportdesigner.crm.report.model.LineReportElement;
036: import org.pentaho.reportdesigner.crm.report.model.MessageFieldReportElement;
037: import org.pentaho.reportdesigner.crm.report.model.NumberFieldReportElement;
038: import org.pentaho.reportdesigner.crm.report.model.RectangleReportElement;
039: import org.pentaho.reportdesigner.crm.report.model.Report;
040: import org.pentaho.reportdesigner.crm.report.model.ReportElement;
041: import org.pentaho.reportdesigner.crm.report.model.ReportFunctionElement;
042: import org.pentaho.reportdesigner.crm.report.model.ReportFunctionsElement;
043: import org.pentaho.reportdesigner.crm.report.model.ReportGroup;
044: import org.pentaho.reportdesigner.crm.report.model.ReportGroups;
045: import org.pentaho.reportdesigner.crm.report.model.ResourceFieldReportElement;
046: import org.pentaho.reportdesigner.crm.report.model.ResourceLabelReportElement;
047: import org.pentaho.reportdesigner.crm.report.model.ResourceMessageReportElement;
048: import org.pentaho.reportdesigner.crm.report.model.StaticImageReportElement;
049: import org.pentaho.reportdesigner.crm.report.model.SubReportDataElement;
050: import org.pentaho.reportdesigner.crm.report.model.SubReportElement;
051: import org.pentaho.reportdesigner.crm.report.model.TextFieldReportElement;
052: import org.pentaho.reportdesigner.crm.report.model.dataset.DataSetsReportElement;
053:
054: import java.util.ArrayList;
055: import java.util.TreeSet;
056:
057: /**
058: * User: Martin
059: * Date: 24.02.2006
060: * Time: 07:55:20
061: */
062: public class MergingReportVisitor extends ReportVisitor {
063: @NotNull
064: private Report oldReport;
065:
066: public MergingReportVisitor(@NotNull
067: Report oldReport) {
068: //noinspection ConstantConditions
069: if (oldReport == null) {
070: throw new IllegalArgumentException(
071: "oldReport must not be null");
072: }
073:
074: this .oldReport = oldReport;
075: }
076:
077: @Nullable
078: public Object getCurrentContext() {
079: return null;
080: }
081:
082: public void setCurrentContext(@Nullable
083: Object context) {
084: }
085:
086: @NotNull
087: public Object visit(@Nullable
088: Object parent, @NotNull
089: Report report) {
090: return oldReport;
091: }
092:
093: @Nullable
094: @SuppressWarnings({"ObjectEquality"})
095: public Object visit(@Nullable
096: Object parent, @NotNull
097: BandToplevelReportElement bandToplevelReportElement)
098: throws ReportCreationException {
099: if (bandToplevelReportElement.getParent() instanceof ReportGroup) {
100: return null;//1. already added by visit(ReportGroups) or 2. can be ignored
101: } else {
102: Report mergingReport = (Report) bandToplevelReportElement
103: .getParent();
104:
105: if (mergingReport != null) {
106: if (mergingReport.getReportHeaderBand() == bandToplevelReportElement) {
107: BandToplevelReportElement reportHeader = oldReport
108: .getReportHeaderBand();
109: reportHeader
110: .setPageBreakBefore(bandToplevelReportElement
111: .isPageBreakBefore());
112: reportHeader
113: .setPageBreakAfter(bandToplevelReportElement
114: .isPageBreakAfter());
115: applySizes(reportHeader, bandToplevelReportElement);
116: return reportHeader;
117: } else if (mergingReport.getReportFooterBand() == bandToplevelReportElement) {
118: BandToplevelReportElement reportFooter = oldReport
119: .getReportFooterBand();
120: reportFooter
121: .setPageBreakBefore(bandToplevelReportElement
122: .isPageBreakBefore());
123: reportFooter
124: .setPageBreakAfter(bandToplevelReportElement
125: .isPageBreakAfter());
126: applySizes(reportFooter, bandToplevelReportElement);
127: return reportFooter;
128: } else if (mergingReport.getPageHeaderBand() == bandToplevelReportElement) {
129: BandToplevelPageReportElement pageHeader = oldReport
130: .getPageHeaderBand();
131: BandToplevelPageReportElement bandToplevelPageReportElement = (BandToplevelPageReportElement) bandToplevelReportElement;
132: pageHeader
133: .setPageBreakBefore(bandToplevelReportElement
134: .isPageBreakBefore());
135: pageHeader
136: .setPageBreakAfter(bandToplevelReportElement
137: .isPageBreakAfter());
138: pageHeader
139: .setDisplayOnFirstPage(bandToplevelPageReportElement
140: .isDisplayOnFirstPage());
141: pageHeader
142: .setDisplayOnLastPage(bandToplevelPageReportElement
143: .isDisplayOnLastPage());
144: applySizes(pageHeader, bandToplevelReportElement);
145: return pageHeader;
146: } else if (mergingReport.getPageFooterBand() == bandToplevelReportElement) {
147: BandToplevelPageReportElement pageFooter = oldReport
148: .getPageFooterBand();
149: BandToplevelPageReportElement bandToplevelPageReportElement = (BandToplevelPageReportElement) bandToplevelReportElement;
150: pageFooter
151: .setPageBreakBefore(bandToplevelPageReportElement
152: .isPageBreakBefore());
153: pageFooter
154: .setPageBreakAfter(bandToplevelPageReportElement
155: .isPageBreakAfter());
156: pageFooter
157: .setDisplayOnFirstPage(bandToplevelPageReportElement
158: .isDisplayOnFirstPage());
159: pageFooter
160: .setDisplayOnLastPage(bandToplevelPageReportElement
161: .isDisplayOnLastPage());
162: applySizes(pageFooter, bandToplevelReportElement);
163: return pageFooter;
164: } else if (mergingReport.getItemBand() == bandToplevelReportElement) {
165: BandToplevelItemReportElement itemBand = oldReport
166: .getItemBand();
167: itemBand
168: .setPageBreakBefore(bandToplevelReportElement
169: .isPageBreakBefore());
170: itemBand
171: .setPageBreakAfter(bandToplevelReportElement
172: .isPageBreakAfter());
173: applySizes(itemBand, bandToplevelReportElement);
174: if (mergingReport.getItemBand()
175: .getRowBandingDefinition().isEnabled()) {
176: itemBand.setRowBandingDefinition(mergingReport
177: .getItemBand()
178: .getRowBandingDefinition());
179: }
180: return itemBand;
181: } else if (mergingReport.getWatermarkBand() == bandToplevelReportElement) {
182: BandToplevelReportElement watermark = oldReport
183: .getWatermarkBand();
184: watermark
185: .setPageBreakBefore(bandToplevelReportElement
186: .isPageBreakBefore());
187: watermark
188: .setPageBreakAfter(bandToplevelReportElement
189: .isPageBreakAfter());
190: applySizes(watermark, bandToplevelReportElement);
191: return watermark;
192: } else if (mergingReport.getNoDataBand() == bandToplevelReportElement) {
193: BandToplevelReportElement noDataBand = oldReport
194: .getNoDataBand();
195: noDataBand
196: .setPageBreakBefore(bandToplevelReportElement
197: .isPageBreakBefore());
198: noDataBand
199: .setPageBreakAfter(bandToplevelReportElement
200: .isPageBreakAfter());
201: applySizes(noDataBand, bandToplevelReportElement);
202: return noDataBand;
203: }
204: }
205: }
206: throw new RuntimeException("eeek!");
207: }
208:
209: private void applySizes(@NotNull
210: ReportElement targetReportElement, @NotNull
211: ReportElement sourceReportElement) {
212: targetReportElement.setMinimumSize(sourceReportElement
213: .getMinimumSize());
214: targetReportElement.setPreferredSize(sourceReportElement
215: .getPreferredSize());
216: targetReportElement.setMaximumSize(sourceReportElement
217: .getMaximumSize());
218: }
219:
220: @Nullable
221: public Object visit(@Nullable
222: Object parent, @NotNull
223: BandReportElement bandReportElement) throws ReportCreationException {
224: if (parent instanceof ReportElement) {
225: ReportElement parentReportElement = (ReportElement) parent;
226: parentReportElement.addChild(bandReportElement);
227: }
228: return null;
229: }
230:
231: @Nullable
232: public Object visit(@Nullable
233: Object parent, @NotNull
234: DateFieldReportElement dateFieldReportElement)
235: throws ReportCreationException {
236: if (parent instanceof ReportElement) {
237: ReportElement parentReportElement = (ReportElement) parent;
238: parentReportElement.addChild(dateFieldReportElement);
239: }
240: return null;
241: }
242:
243: @Nullable
244: public Object visit(@Nullable
245: Object parent, @NotNull
246: LabelReportElement labelReportElement)
247: throws ReportCreationException {
248: if (parent instanceof ReportElement) {
249: ReportElement parentReportElement = (ReportElement) parent;
250: parentReportElement.addChild(labelReportElement);
251: }
252: return null;
253: }
254:
255: @Nullable
256: public Object visit(@Nullable
257: Object parent, @NotNull
258: MessageFieldReportElement messageFieldReportElement)
259: throws ReportCreationException {
260: if (parent instanceof ReportElement) {
261: ReportElement parentReportElement = (ReportElement) parent;
262: parentReportElement.addChild(messageFieldReportElement);
263: }
264: return null;
265: }
266:
267: @Nullable
268: public Object visit(@Nullable
269: Object parent, @NotNull
270: NumberFieldReportElement numberFieldReportElement)
271: throws ReportCreationException {
272: if (parent instanceof ReportElement) {
273: ReportElement parentReportElement = (ReportElement) parent;
274: parentReportElement.addChild(numberFieldReportElement);
275: }
276: return null;
277: }
278:
279: @Nullable
280: public Object visit(@Nullable
281: Object parent, @NotNull
282: ReportGroup reportGroup) throws ReportCreationException {
283: if (parent instanceof ReportElement) {
284: ReportElement parentReportElement = (ReportElement) parent;
285: parentReportElement.addChild(reportGroup);
286: }
287: return null;
288: }
289:
290: @Nullable
291: public Object visit(@Nullable
292: Object parent, @NotNull
293: ResourceFieldReportElement resourceFieldReportElement)
294: throws ReportCreationException {
295: if (parent instanceof ReportElement) {
296: ReportElement parentReportElement = (ReportElement) parent;
297: parentReportElement.addChild(resourceFieldReportElement);
298: }
299: return null;
300: }
301:
302: @Nullable
303: public Object visit(@Nullable
304: Object parent, @NotNull
305: ResourceLabelReportElement resourceLabelReportElement)
306: throws ReportCreationException {
307: if (parent instanceof ReportElement) {
308: ReportElement parentReportElement = (ReportElement) parent;
309: parentReportElement.addChild(resourceLabelReportElement);
310: }
311: return null;
312: }
313:
314: @Nullable
315: public Object visit(@Nullable
316: Object parent, @NotNull
317: ChartReportElement chartReportElement)
318: throws ReportCreationException {
319: if (parent instanceof ReportElement) {
320: ReportElement parentReportElement = (ReportElement) parent;
321: parentReportElement.addChild(chartReportElement);
322: }
323: return null;
324: }
325:
326: @Nullable
327: public Object visit(@Nullable
328: Object parent, @NotNull
329: ResourceMessageReportElement resourceMessageReportElement)
330: throws ReportCreationException {
331: if (parent instanceof ReportElement) {
332: ReportElement parentReportElement = (ReportElement) parent;
333: parentReportElement.addChild(resourceMessageReportElement);
334: }
335: return null;
336: }
337:
338: @Nullable
339: public Object visit(@Nullable
340: Object parent, @NotNull
341: TextFieldReportElement textFieldReportElement)
342: throws ReportCreationException {
343: if (parent instanceof ReportElement) {
344: ReportElement parentReportElement = (ReportElement) parent;
345: parentReportElement.addChild(textFieldReportElement);
346: }
347: return null;
348: }
349:
350: @Nullable
351: public Object visit(@Nullable
352: Object parent, @NotNull
353: ReportFunctionsElement reportFunctionsElement)
354: throws ReportCreationException {
355: if (parent instanceof Report) {
356: return oldReport.getReportFunctions();
357: }
358: return null;
359: }
360:
361: @Nullable
362: public Object visit(@Nullable
363: Object parent, @NotNull
364: ReportFunctionElement reportFunctionElement)
365: throws ReportCreationException {
366: if (parent instanceof ReportElement) {
367: ReportElement parentReportElement = (ReportElement) parent;
368: parentReportElement.addChild(reportFunctionElement);
369: }
370: return null;
371: }
372:
373: @Nullable
374: public Object visit(@Nullable
375: Object parent, @NotNull
376: ReportGroups reportGroups) throws ReportCreationException {
377: if (parent instanceof Report) {
378: if (oldReport.getReportGroups().getChildren().isEmpty()) {
379: oldReport.addChild(reportGroups);
380: }
381: }
382: return null;
383: }
384:
385: @Nullable
386: public Object visit(@Nullable
387: Object parent, @NotNull
388: LineReportElement lineReportElement) throws ReportCreationException {
389: if (parent instanceof ReportElement) {
390: ReportElement parentReportElement = (ReportElement) parent;
391: parentReportElement.addChild(lineReportElement);
392: }
393: return null;
394: }
395:
396: @Nullable
397: public Object visit(@Nullable
398: Object parent, @NotNull
399: StaticImageReportElement staticImageReportElement)
400: throws ReportCreationException {
401: if (parent instanceof ReportElement) {
402: ReportElement parentReportElement = (ReportElement) parent;
403: parentReportElement.addChild(staticImageReportElement);
404: }
405: return null;
406: }
407:
408: @Nullable
409: public Object visit(@Nullable
410: Object parent, @NotNull
411: DataSetsReportElement dataSetsReportElement)
412: throws ReportCreationException {
413: if (parent instanceof Report) {
414: return oldReport.getDataSetsReportElement();
415: }
416: return null;
417: }
418:
419: @Nullable
420: public Object visit(@Nullable
421: Object parent, @NotNull
422: JDBCDataSetReportElement jdbcDataSetReportElement) {
423: if (parent instanceof DataSetsReportElement) {
424: DataSetsReportElement dataSetsReportElement = (DataSetsReportElement) parent;
425: dataSetsReportElement.addChild(jdbcDataSetReportElement);
426: }
427: return null;
428: }
429:
430: @Nullable
431: public Object visit(@Nullable
432: Object parent, @NotNull
433: StaticFactoryDataSetReportElement staticFactoryDataSetReportElement)
434: throws ReportCreationException {
435: if (parent instanceof DataSetsReportElement) {
436: DataSetsReportElement dataSetsReportElement = (DataSetsReportElement) parent;
437: dataSetsReportElement
438: .addChild(staticFactoryDataSetReportElement);
439: }
440: return null;
441: }
442:
443: @Nullable
444: public Object visit(@Nullable
445: Object parent, @NotNull
446: MultiDataSetReportElement multiDataSetReportElement)
447: throws ReportCreationException {
448: if (parent instanceof DataSetsReportElement) {
449: DataSetsReportElement dataSetsReportElement = (DataSetsReportElement) parent;
450: dataSetsReportElement.addChild(multiDataSetReportElement);
451: }
452: return null;
453: }
454:
455: @Nullable
456: public Object visit(@Nullable
457: Object parent, @NotNull
458: PropertiesDataSetReportElement propertiesDataSetReportElement)
459: throws ReportCreationException {
460: if (parent instanceof DataSetsReportElement) {
461: DataSetsReportElement dataSetsReportElement = (DataSetsReportElement) parent;
462: boolean mergedWithExisting = false;
463: ArrayList<ReportElement> children = dataSetsReportElement
464: .getChildren();
465: for (ReportElement reportElement : children) {
466: if (reportElement instanceof PropertiesDataSetReportElement) {
467: PropertiesDataSetReportElement dataSetReportElement = (PropertiesDataSetReportElement) reportElement;
468:
469: TreeSet<PropertyInfo> properties = new TreeSet<PropertyInfo>();
470: properties.addAll(dataSetReportElement
471: .getProperties());
472: properties.addAll(propertiesDataSetReportElement
473: .getProperties());
474:
475: dataSetReportElement.setProperties(properties);
476: mergedWithExisting = true;
477: }
478: }
479:
480: if (!mergedWithExisting) {
481: dataSetsReportElement
482: .addChild(propertiesDataSetReportElement);
483: }
484: }
485: return null;
486: }
487:
488: @Nullable
489: public Object visit(@Nullable
490: Object parent, @NotNull
491: RectangleReportElement rectangleReportElement)
492: throws ReportCreationException {
493: if (parent instanceof ReportElement) {
494: ReportElement parentReportElement = (ReportElement) parent;
495: parentReportElement.addChild(rectangleReportElement);
496: }
497: return null;
498: }
499:
500: @Nullable
501: public Object visit(@Nullable
502: Object parent, @NotNull
503: EllipseReportElement ellipseReportElement)
504: throws ReportCreationException {
505: if (parent instanceof ReportElement) {
506: ReportElement parentReportElement = (ReportElement) parent;
507: parentReportElement.addChild(ellipseReportElement);
508: }
509: return null;
510: }
511:
512: @Nullable
513: public Object visit(@Nullable
514: Object parent, @NotNull
515: ImageFieldReportElement imageFieldReportElement)
516: throws ReportCreationException {
517: if (parent instanceof ReportElement) {
518: ReportElement parentReportElement = (ReportElement) parent;
519: parentReportElement.addChild(imageFieldReportElement);
520: }
521: return null;
522: }
523:
524: @Nullable
525: public Object visit(@Nullable
526: Object parent, @NotNull
527: ImageURLFieldReportElement imageURLFieldReportElement)
528: throws ReportCreationException {
529: if (parent instanceof ReportElement) {
530: ReportElement parentReportElement = (ReportElement) parent;
531: parentReportElement.addChild(imageURLFieldReportElement);
532: }
533: return null;
534: }
535:
536: @Nullable
537: public Object visit(@Nullable
538: Object parent, @NotNull
539: AnchorFieldReportElement anchorFieldReportElement)
540: throws ReportCreationException {
541: if (parent instanceof ReportElement) {
542: ReportElement parentReportElement = (ReportElement) parent;
543: parentReportElement.addChild(anchorFieldReportElement);
544: }
545: return null;
546: }
547:
548: @Nullable
549: public Object visit(@Nullable
550: Object parent, @NotNull
551: DrawableFieldReportElement drawableFieldReportElement)
552: throws ReportCreationException {
553: if (parent instanceof ReportElement) {
554: ReportElement parentReportElement = (ReportElement) parent;
555: parentReportElement.addChild(drawableFieldReportElement);
556: }
557: return null;
558: }
559:
560: @Nullable
561: public Object visit(@Nullable
562: Object parent, @NotNull
563: SubReportElement subReportElement) throws ReportCreationException {
564: if (parent instanceof ReportElement) {
565: ReportElement parentReportElement = (ReportElement) parent;
566: parentReportElement.addChild(subReportElement);
567: }
568: return null;
569: }
570:
571: @Nullable
572: public Object visit(@Nullable
573: Object parent, @NotNull
574: SubReportDataElement subReportDataElement)
575: throws ReportCreationException {
576: return null;
577: }
578: }
|