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    }