View Javadoc

1   package org.kuali.student.common.ui.server.screenreport.jasper;
2   
3   import java.util.Collection;
4   import java.util.Iterator;
5   
6   import net.sf.jasperreports.engine.JRException;
7   import net.sf.jasperreports.engine.JRField;
8   import net.sf.jasperreports.engine.data.JRAbstractBeanDataSource;
9   import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
10  
11  import org.kuali.student.common.ui.client.util.ExportElement;
12  
13  /**
14   * This class overwrites the common JRBeanCollectionDataSource in order to return a JRDataSource to be used on the subreport
15   * when the field is called "subset".
16   * 
17   * @author Kuali Rice Team (kuali-rice@googlegroups.com)
18   */
19  public class KSCollectionDataSource extends JRAbstractBeanDataSource {
20  
21      /**
22      *
23      */
24      private Collection<ExportElement> data;
25      private Iterator<ExportElement> iterator;
26      private ExportElement currentBean;
27      private ExportElement parent;
28  
29      public KSCollectionDataSource(Collection<ExportElement> elements, ExportElement parent) {
30          super(true);
31  
32          this.parent = parent;
33          this.data = elements;
34  
35          if (this.data != null) {
36              this.iterator = this.data.iterator();
37          }
38      }
39  
40      /**
41      *
42      */
43      public boolean next() {
44          boolean hasNext = false;
45  
46          if (this.iterator != null) {
47              hasNext = this.iterator.hasNext();
48  
49              if (hasNext) {
50                  this.currentBean = this.iterator.next();
51                  
52                  // Skip the empty elements in the collection.
53                  if (this.currentBean.isEmpty()){
54                      return next();
55                  }
56              }
57          }
58  
59          return hasNext;
60      }
61  
62      @Override
63      public Object getFieldValue(JRField field) throws JRException {
64          return getFieldValue(currentBean, field);
65      }
66      
67      /**
68      *
69      */
70      protected Object getFieldValue(ExportElement bean, JRField field) throws JRException {
71          Object object = getBeanProperty(bean, getPropertyName(field));
72  
73          // Return a new datasource object with subset data for subreport.
74          if ("subset".equals(field.getName())) {
75              return new KSCollectionDataSource((Collection<ExportElement>) object, bean);
76              
77          // Do not repeat section name for subsets.
78          } else if ("sectionName".equals(field.getName())) {
79              if (parent != null && parent.getSectionName() != null && parent.getSectionName().equals(object)) {
80                  return null;
81              } else {
82                  return object;
83              }
84          }
85          return object;
86      }
87  
88      /**
89      *
90      */
91      public void moveFirst() {
92          if (this.data != null) {
93              this.iterator = this.data.iterator();
94          }
95      }
96  
97      /**
98       * Returns the underlying bean collection used by this data source.
99       * 
100      * @return the underlying bean collection
101      */
102     public Collection getData() {
103         return data;
104     }
105 
106     /**
107      * Returns the total number of records/beans that this data source contains.
108      * 
109      * @return the total number of records of this data source
110      */
111     public int getRecordCount() {
112         return data == null ? 0 : data.size();
113     }
114 
115     /**
116      * Clones this data source by creating a new instance that reuses the same underlying bean collection.
117      * 
118      * @return a clone of this data source
119      */
120     public JRBeanCollectionDataSource cloneDataSource() {
121         return new JRBeanCollectionDataSource(data);
122     }
123 
124    
125 
126 }