001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.sys.document.datadictionary;
017
018 import java.util.Comparator;
019 import java.util.List;
020 import java.util.Map;
021
022 import org.kuali.kfs.sys.businessobject.AccountingLine;
023 import org.kuali.kfs.sys.document.AccountingDocument;
024 import org.kuali.kfs.sys.document.authorization.AccountingLineAuthorizer;
025 import org.kuali.kfs.sys.document.web.DefaultAccountingLineGroupImpl;
026 import org.kuali.kfs.sys.document.web.RenderableAccountingLineContainer;
027 import org.kuali.rice.kns.datadictionary.DataDictionaryDefinitionBase;
028 import org.kuali.rice.kns.datadictionary.exception.AttributeValidationException;
029
030 /**
031 * Data dictionary definition that includes metadata for an accounting document about one of its groups of accounting lines (typically source vs. target, but this should open things up).
032 */
033 public class AccountingLineGroupDefinition extends DataDictionaryDefinitionBase {
034 private String groupLabel;
035 private Class<? extends AccountingLine> accountingLineClass;
036 private AccountingLineViewDefinition accountingLineView;
037 private String importedLinePropertyPrefix;
038 private List<? extends TotalDefinition> totals;
039 private Class<? extends AccountingLineAuthorizer> accountingLineAuthorizerClass;
040 private int forceColumnCount = -1;
041 private String errorKey;
042 private boolean topHeadersAfterFirstLineHiding = true;
043 private boolean headerRendering = true;
044 private boolean importingAllowed = true;
045 private Class<? extends DefaultAccountingLineGroupImpl> accountingLineGroupClass = org.kuali.kfs.sys.document.web.DefaultAccountingLineGroupImpl.class;
046 private Class<? extends Comparator<AccountingLine>> accountingLineComparatorClass = org.kuali.kfs.sys.businessobject.AccountingLineComparator.class;
047
048 private List<? extends AccountingLineViewActionDefinition> accountingLineGroupActions;
049
050 private AccountingLineAuthorizer accountingLineAuthorizer;
051
052 /**
053 * Validates that:
054 * 1) this accounting line group has an accounting line class
055 * 2) this accounting line group has an accounting line view
056 * @see org.kuali.rice.kns.datadictionary.DataDictionaryDefinition#completeValidation(java.lang.Class, java.lang.Class)
057 */
058 public void completeValidation(Class rootBusinessObjectClass, Class otherBusinessObjectClass) {
059 if (accountingLineClass == null) {
060 throw new AttributeValidationException("Please specify an accounting line class for AccountingLineGroup "+getId());
061 }
062 if (accountingLineView == null) {
063 throw new AttributeValidationException("Please specify an accountingLineView for AccountingLineGroup "+getId());
064 }
065 }
066
067 /**
068 * Gets the accountingLineClass attribute.
069 * @return Returns the accountingLineClass.
070 */
071 public Class<? extends AccountingLine> getAccountingLineClass() {
072 return accountingLineClass;
073 }
074
075 /**
076 * Sets the accountingLineClass attribute value.
077 * @param accountingLineClass The accountingLineClass to set.
078 */
079 public void setAccountingLineClass(Class<? extends AccountingLine> accountingLineClass) {
080 this.accountingLineClass = accountingLineClass;
081 }
082
083 /**
084 * Gets the accountingLineView attribute.
085 * @return Returns the accountingLineView.
086 */
087 public AccountingLineViewDefinition getAccountingLineView() {
088 return accountingLineView;
089 }
090
091 /**
092 * Sets the accountingLineView attribute value.
093 * @param accountingLineView The accountingLineView to set.
094 */
095 public void setAccountingLineView(AccountingLineViewDefinition accountingLineView) {
096 this.accountingLineView = accountingLineView;
097 }
098
099 /**
100 * Gets the groupLabel attribute.
101 * @return Returns the groupLabel.
102 */
103 public String getGroupLabel() {
104 return (groupLabel == null) ? "" : groupLabel;
105 }
106
107 /**
108 * Sets the groupLabel attribute value.
109 * @param groupLabel The groupLabel to set.
110 */
111 public void setGroupLabel(String groupLabel) {
112 this.groupLabel = groupLabel;
113 }
114
115 /**
116 * Gets the totals attribute.
117 * @return Returns the totals.
118 */
119 public List<? extends TotalDefinition> getTotals() {
120 return totals;
121 }
122
123 /**
124 * Sets the totals attribute value.
125 * @param totals The totals to set.
126 */
127 public void setTotals(List<? extends TotalDefinition> totals) {
128 this.totals = totals;
129 }
130
131 /**
132 * Gets the accountingLineAuthorizerClass attribute.
133 * @return Returns the accountingLineAuthorizerClass.
134 */
135 public Class<? extends AccountingLineAuthorizer> getAccountingLineAuthorizerClass() {
136 return accountingLineAuthorizerClass;
137 }
138
139 /**
140 * Sets the accountingLineAuthorizerClass attribute value.
141 * @param accountingLineAuthorizerClass The accountingLineAuthorizerClass to set.
142 */
143 public void setAccountingLineAuthorizerClass(Class<? extends AccountingLineAuthorizer> accountingLineAuthorizerClass) {
144 this.accountingLineAuthorizerClass = accountingLineAuthorizerClass;
145 }
146
147 /**
148 * Gets the importedLinePropertyPrefix attribute.
149 * @return Returns the importedLinePropertyPrefix.
150 */
151 public String getImportedLinePropertyPrefix() {
152 return importedLinePropertyPrefix;
153 }
154
155 /**
156 * Sets the importedLinePropertyPrefix attribute value.
157 * @param importedLinePropertyPrefix The importedLinePropertyPrefix to set.
158 */
159 public void setImportedLinePropertyPrefix(String importedLinePropertyPrefix) {
160 this.importedLinePropertyPrefix = importedLinePropertyPrefix;
161 }
162
163 /**
164 * Gets the forceColumnCount attribute.
165 * @return Returns the forceColumnCount.
166 */
167 public int getForceColumnCount() {
168 return forceColumnCount;
169 }
170
171 /**
172 * Sets the forceColumnCount attribute value.
173 * @param forceColumnCount The forceColumnCount to set.
174 */
175 public void setForceColumnCount(int forceColumnCount) {
176 this.forceColumnCount = forceColumnCount;
177 }
178
179 /**
180 * Gets the errorKey attribute.
181 * @return Returns the errorKey.
182 */
183 public String getErrorKey() {
184 return errorKey;
185 }
186
187 /**
188 * Sets the errorKey attribute value.
189 * @param errorKey The errorKey to set.
190 */
191 public void setErrorKey(String errorKey) {
192 this.errorKey = errorKey;
193 }
194
195 /**
196 * Returns an instance of the accounting line authorizer for this group
197 * @return an instance of the accounting line authorizer
198 */
199 public AccountingLineAuthorizer getAccountingLineAuthorizer() {
200 if (accountingLineAuthorizer == null) {
201 accountingLineAuthorizer = createAccountingLineAuthorizer();
202 }
203 return accountingLineAuthorizer;
204 }
205
206 /**
207 * Creates an instance of the accounting line authorizer
208 * @return the accounting line authorizer for this group
209 */
210 protected AccountingLineAuthorizer createAccountingLineAuthorizer() {
211 Class<? extends AccountingLineAuthorizer> authorizerClass = getAccountingLineAuthorizerClass();
212 AccountingLineAuthorizer authorizer = null;
213 try {
214 authorizer = authorizerClass.newInstance();
215 }
216 catch (InstantiationException ie) {
217 throw new IllegalArgumentException("InstantiationException while attempting to instantiate AccountingLineAuthorization class", ie);
218 }
219 catch (IllegalAccessException iae) {
220 throw new IllegalArgumentException("IllegalAccessException while attempting to instantiate AccountingLineAuthorization class", iae);
221 }
222 return authorizer;
223 }
224
225 /**
226 * Gets the topHeadersAfterFirstLineHiding attribute.
227 * @return Returns the topHeadersAfterFirstLineHiding.
228 */
229 public boolean isTopHeadersAfterFirstLineHiding() {
230 return topHeadersAfterFirstLineHiding;
231 }
232
233 /**
234 * Sets the topHeadersAfterFirstLineHiding attribute value.
235 * @param topHeadersAfterFirstLineHiding The topHeadersAfterFirstLineHiding to set.
236 */
237 public void setTopHeadersAfterFirstLineHiding(boolean showTopHeadersAfterFirstLine) {
238 this.topHeadersAfterFirstLineHiding = showTopHeadersAfterFirstLine;
239 }
240
241 /**
242 * Gets the headerRendering attribute.
243 * @return Returns the headerRendering.
244 */
245 public boolean isHeaderRendering() {
246 return headerRendering;
247 }
248
249 /**
250 * Sets the headerRendering attribute value.
251 * @param headerRendering The headerRendering to set.
252 */
253 public void setHeaderRendering(boolean headerRendering) {
254 this.headerRendering = headerRendering;
255 }
256
257 /**
258 * Gets the accountingLineGroupActions attribute.
259 * @return Returns the accountingLineGroupActions.
260 */
261 public List<? extends AccountingLineViewActionDefinition> getAccountingLineGroupActions() {
262 return accountingLineGroupActions;
263 }
264
265 /**
266 * Sets the accountingLineGroupActions attribute value.
267 * @param accountingLineGroupActions The accountingLineGroupActions to set.
268 */
269 public void setAccountingLineGroupActions(List<? extends AccountingLineViewActionDefinition> accountingLineGroupActions) {
270 this.accountingLineGroupActions = accountingLineGroupActions;
271 }
272
273 /**
274 * Gets the importingAllowed attribute.
275 * @return Returns the importingAllowed.
276 */
277 public boolean isImportingAllowed() {
278 return importingAllowed;
279 }
280
281 /**
282 * Sets the importingAllowed attribute value.
283 * @param importingAllowed The importingAllowed to set.
284 */
285 public void setImportingAllowed(boolean importingAllowed) {
286 this.importingAllowed = importingAllowed;
287 }
288
289 /**
290 * Gets the accountingLineGroupClass attribute.
291 * @return Returns the accountingLineGroupClass.
292 */
293 public Class<? extends DefaultAccountingLineGroupImpl> getAccountingLineGroupClass() {
294 return accountingLineGroupClass;
295 }
296
297 /**
298 * Sets the accountingLineGroupClass attribute value.
299 * @param accountingLineGroupClass The accountingLineGroupClass to set.
300 */
301 public void setAccountingLineGroupClass(Class<? extends DefaultAccountingLineGroupImpl> accountingLineGroupClass) {
302 this.accountingLineGroupClass = accountingLineGroupClass;
303 }
304
305 /**
306 * Sets the accountingLineComparatorClass attribute value.
307 * @param accountingLineComparatorClass The accountingLineComparatorClass to set.
308 */
309 public void setAccountingLineComparatorClass(Class<? extends Comparator<AccountingLine>> accountingLineComparatorClass) {
310 this.accountingLineComparatorClass = accountingLineComparatorClass;
311 }
312
313 /**
314 * @return an instance of the Comparator this group should use to sort accounting lines
315 */
316 public Comparator<AccountingLine> getAccountingLineComparator() {
317 Comparator<AccountingLine> comparator = null;
318 try {
319 comparator = accountingLineComparatorClass.newInstance();
320 }
321 catch (InstantiationException ie) {
322 throw new RuntimeException("Could not instantiate class for AccountingLineComparator for group", ie);
323 }
324 catch (IllegalAccessException iae) {
325 throw new RuntimeException("Illegal access attempting to instantiate class for AccountingLineComparator for group", iae);
326 }
327 return comparator;
328 }
329
330 /**
331 * Creates a new accounting line group for this definition
332 * @param accountingDocument the document which owns or will own the accounting line being rendered
333 * @param containers the containers within this group
334 * @param collectionPropertyName the property name of the collection of accounting lines owned by this group
335 * @param errors a List of errors keys for errors on the page
336 * @param displayedErrors a Map of errors that have already been displayed
337 * @param canEdit determines if the page can be edited or not
338 * @return a newly created and initialized accounting line group
339 */
340 public DefaultAccountingLineGroupImpl createAccountingLineGroup(AccountingDocument accountingDocument, List<RenderableAccountingLineContainer> containers, String collectionPropertyName, String collectionItemPropertyName, Map<String, Object> displayedErrors, Map<String, Object> displayedWarnings, Map<String, Object> displayedInfo, boolean canEdit) {
341 DefaultAccountingLineGroupImpl accountingLineGroup = null;
342 try {
343 accountingLineGroup = getAccountingLineGroupClass().newInstance();
344 accountingLineGroup.initialize(this, accountingDocument, containers, collectionPropertyName, collectionItemPropertyName, displayedErrors, displayedWarnings, displayedInfo, canEdit);
345 }
346 catch (InstantiationException ie) {
347 throw new RuntimeException("Could not initialize new AccountingLineGroup implementation of class: "+getAccountingLineGroupClass().getName(), ie);
348 }
349 catch (IllegalAccessException iae) {
350 throw new RuntimeException("Could not initialize new AccountingLineGroup implementation of class: "+getAccountingLineGroupClass().getName(), iae);
351 }
352 return accountingLineGroup;
353 }
354 }