package org.activityinfo.legacy.shared.reports.model;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import org.activityinfo.legacy.shared.command.Filter;
import org.activityinfo.legacy.shared.reports.content.Content;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import java.io.Serializable;
import java.util.Set;
/**
* ReportElement is the base class for all report elements and the report
* container itself.
* <p/>
* In ActivityInfo, we require that a given report element (such as chart) can
* be rendered either on the client side or the server side. For example, on the
* server side, a chart might be rendered to a GIF image that is included in a
* Word document to be downloaded by the user, while on the client side, we want
* to render the same chart using the OpenFlashChart flash component.
* <p/>
* So in order to maximize code reuse, the report pipeline is divided into
* serveral types of interchangeable components:
* <p/>
* <ol>
* <li><strong>Report Models</strong> define the structure and presentation of
* Tables, Pivot Tables, Charts, etc. They have no dependencies and can be moved
* between the server and client.</li>
* <p/>
* <li><strong>Data Access Objects (DAOs)</strong> retrieve data and do the raw
* number crunching. <code>SiteTableDAO</code> provides access to lists of
* sites, while <code>PivotDAO</code> summarizes data into a cube. Currently,
* there is a server-side implementation based on Hibernate and JDBC, but
* ultimately we will have client-side implementations that read the data from
* client-side SqlLite databases.</li>
* <p/>
* <li><strong>Generators</strong> intrepret the Report Models and use DAOs to
* obtain data and structure the content of a report element in
* <code>Content</code> objects. In principal, generators should be able to run
* on either the server or client side, but in practice they've been developed
* for the server side and probably have non-GWT-compatible-dependencies.</li>
* <p/>
* <li><strong>Renderers</strong> are server side class that accept Report
* Models and Report Content and render them into a given format, such as PDF, a
* Word Document, or a PNG file. Renderers should not contain any decisional
* logic or access data external to the <code>Content</code> object -- this sort
* of thing should be centralized in the generators.</li>
* <p/>
* </ol>
*
* @author Alex Bertram
* @see org.activityinfo.server.report.generator.ReportGenerator
* @see org.activityinfo.legacy.shared.reports.content.Content
* @see org.activityinfo.server.report.renderer.Renderer
*/
public abstract class ReportElement<ContentT extends Content> implements Serializable {
private Filter filter = new Filter();
private String title;
private String sheetTitle;
@XmlTransient
private ContentT content;
public ReportElement() {
}
/**
* Gets the filter that will be applied to this report. Note that elements
* inherit the report's global filter, as well as any other filter specified
* by the callers at runtime.
* <p/>
* If this element is part of a <code>Report</code>, then the
* <code>DateRange</code> provided to the generator will also be applied to
* the filter, IF the <code>minDate</code> and/or <code>maxDate</code> of
* this element's filter are <code>null</code>.
* <p/>
* This allows an individual <code>ReportElement</code> to override the
* <code>DateRange</code> of the report-- for example, a
* <code>MONTHLY</code> report may include a graph of results year-to-date.
*
* @return The filter applied to the report element.
*/
@XmlElement
public Filter getFilter() {
return filter;
}
/**
* Sets the filter that will be applied to this report.
*
* @param filter
*/
public void setFilter(Filter filter) {
this.filter = filter;
}
/**
* Gets the full title of the report element. In document-based output, like
* RTF, PDF, etc, this will be a text header that precedes the report
* element, while in a PowerPoint presentation it may be the slide's title.
*
* @return the full title of the report element
*/
@XmlElement
public String getTitle() {
return title;
}
/**
* Sets the full title of the report element. In document-based output, like
* RTF, PDF, etc, this will be a text header that precedes the report
* element, while in a PowerPoint presentation it may be the slide's title.
*
* @param title the full title of the report element
*/
public void setTitle(String title) {
this.title = title;
}
/**
* Gets the short form of the title used to name worksheet tabs. For
* example, something other than Sheet1, Sheet2, Sheet3 at the bottom of
* Excel.
*
* @return The sheet title
*/
@XmlElement
public String getSheetTitle() {
return sheetTitle;
}
/**
* Sets the short form of the title used to name worksheet tabs. For
* example, something other than Sheet1, Sheet2, Sheet3 at the bottom of
* Excel.
*
* @param sheetTitle The sheet title
*/
public void setSheetTitle(String sheetTitle) {
this.sheetTitle = sheetTitle;
}
@XmlTransient
public ContentT getContent() {
return content;
}
public void setContent(ContentT content) {
this.content = content;
}
/**
* @return the list of indicators used as a source for this report
*/
@XmlTransient
public abstract Set<Integer> getIndicators();
}