View Javadoc
1   /**
2    * Copyright 2005-2016 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kns.datadictionary;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.kuali.rice.krad.bo.BusinessObject;
20  import org.kuali.rice.krad.datadictionary.DataDictionary;
21  import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
22  import org.kuali.rice.krad.datadictionary.exception.DuplicateEntryException;
23  
24  import java.util.ArrayList;
25  import java.util.HashMap;
26  import java.util.List;
27  import java.util.Map;
28  
29  /**
30   * The maintainableCollection element defines a set of data fields, nested collections, summaryFields and
31   * duplicateIdentificationsFields.
32   *
33   * JSTL: maintainableCollection is a Map which is accessed using a key of the name of the maintainableCollection.  Each
34   * entry contains the following keys and values:
35   *      **Key**                **Value**
36   *      collection             true
37   *      name                   name of collection
38   *      dataObjectClass    name of collection class
39   *
40   * name is the name of the collection
41   * dataObjectClass is the class name of the objects in the collection
42   * sourceClassName is the class name of the BO used in a lookup
43   * sourceAttributeName is the name of the attribute which returns the collection
44   * includeAddLine is true if the user is given the ability to add multiple lines.
45   * includeMultipleLookupLine whether to render a quickfinder icon for multiple value lookups on the collection.  Defaults to true
46   * summaryTitle is the label of the summary
47   * attributeToHighlightOnDuplicateKey is the name of an attribute to highlight if two records in the collection are the
48   * same based on the duplicateIdentificationFields element.
49   *
50   * @deprecated Use collections inside of {@link org.kuali.rice.krad.uif.view.MaintenanceDocumentView}.
51   */
52  @Deprecated
53  public class MaintainableCollectionDefinition extends MaintainableItemDefinition implements CollectionDefinitionI {
54      private static final long serialVersionUID = -5617868782623587053L;
55  
56  	// logger
57      //private static Log LOG = LogFactory.getLog(MaintainableCollectionDefinition.class);
58  
59  	protected Class<? extends BusinessObject> businessObjectClass;
60  
61      protected Class<? extends BusinessObject> sourceClassName;
62      protected String summaryTitle;
63      protected String attributeToHighlightOnDuplicateKey;
64  
65      protected boolean includeAddLine = true;
66      protected boolean includeMultipleLookupLine = true;
67      private boolean alwaysAllowCollectionDeletion = false;
68  
69      protected Map<String,MaintainableFieldDefinition> maintainableFieldMap = new HashMap<String, MaintainableFieldDefinition>();
70      protected Map<String,MaintainableCollectionDefinition> maintainableCollectionMap = new HashMap<String, MaintainableCollectionDefinition>();
71      protected Map<String,MaintainableFieldDefinition> summaryFieldMap = new HashMap<String, MaintainableFieldDefinition>();
72      protected Map<String,MaintainableFieldDefinition> duplicateIdentificationFieldMap = new HashMap<String, MaintainableFieldDefinition>();
73      protected List<MaintainableFieldDefinition> maintainableFields = new ArrayList<MaintainableFieldDefinition>();
74      protected List<MaintainableCollectionDefinition> maintainableCollections = new ArrayList<MaintainableCollectionDefinition>();
75      protected List<MaintainableFieldDefinition> summaryFields = new ArrayList<MaintainableFieldDefinition>();
76      protected List<MaintainableFieldDefinition> duplicateIdentificationFields = new ArrayList<MaintainableFieldDefinition>();
77  
78      public MaintainableCollectionDefinition() {}
79  
80  
81  
82      /**
83       * @return businessObjectClass
84       */
85      public Class<? extends BusinessObject> getBusinessObjectClass() {
86          return businessObjectClass;
87      }
88  
89      /**
90       * The BusinessObject class used for each row of this collection.
91       */
92      public void setBusinessObjectClass(Class<? extends BusinessObject> businessObjectClass) {
93          if (businessObjectClass == null) {
94              throw new IllegalArgumentException("invalid (null) dataObjectClass");
95          }
96  
97          this.businessObjectClass = businessObjectClass;
98      }
99  
100     /**
101      * @return Collection of all lookupField MaintainableFieldDefinitions associated with this MaintainableCollectionDefinition, in
102      *         the order in which they were added
103      */
104     public List<MaintainableFieldDefinition> getMaintainableFields() {
105         return maintainableFields;
106     }
107 
108     public List<? extends FieldDefinitionI> getFields() {
109         return maintainableFields;
110     }
111 
112     /**
113      * Directly validate simple fields, call completeValidation on Definition fields.
114      * 
115      * @see org.kuali.rice.krad.datadictionary.DataDictionaryDefinition#completeValidation(java.lang.Class, java.lang.Object)
116      */
117     public void completeValidation(Class rootBusinessObjectClass, Class otherBusinessObjectClass) {
118         if (!DataDictionary.isCollectionPropertyOf(rootBusinessObjectClass, getName())) {
119             throw new AttributeValidationException("unable to find collection named '" + getName() + "' in rootBusinessObjectClass '" + rootBusinessObjectClass.getName() + "' (" + "" + ")");
120         }
121 
122         if (dissallowDuplicateKey()) {
123             if (!DataDictionary.isPropertyOf(businessObjectClass, attributeToHighlightOnDuplicateKey)) {
124                 throw new AttributeValidationException("unable to find attribute named '" + attributeToHighlightOnDuplicateKey + "'in dataObjectClass '" + businessObjectClass.getName() + "' of collection '" + getName() + "' in rootBusinessObjectClass '" + rootBusinessObjectClass.getName() + "' (" + "" + ")");
125             }
126         }
127         
128         for (MaintainableFieldDefinition maintainableField : maintainableFields ) {
129             maintainableField.completeValidation(businessObjectClass, null);
130         }
131 
132         for (MaintainableCollectionDefinition maintainableCollection : maintainableCollections ) {
133             maintainableCollection.completeValidation(businessObjectClass, null);
134         }
135 
136 //        for (MaintainableFieldDefinition summaryField : summaryFields ) {
137 //            summaryField.completeValidation(dataObjectClass, null, validationCompletionUtils);
138 //        }
139 //        
140 //        for (MaintainableFieldDefinition identifierField : duplicateIdentificationFields) {
141 //            identifierField.completeValidation(dataObjectClass, null, validationCompletionUtils);
142 //        }
143     }
144 
145 
146     /**
147      * @see java.lang.Object#toString()
148      */
149     public String toString() {
150         return "MaintainableCollectionDefinition for " + getName();
151     }
152 
153 
154     public Class<? extends BusinessObject> getSourceClassName() {
155         return sourceClassName;
156     }
157 
158 
159     /** BusinessObject class which should be used for multiple value lookups for this collection.
160      */
161     public void setSourceClassName(Class<? extends BusinessObject> sourceClass) {
162         this.sourceClassName = sourceClass;
163     }
164 
165     public boolean getIncludeAddLine() {
166         return includeAddLine;
167     }
168 
169 
170     /** Control whether an "add" line should be included at the top of this collection. */
171     public void setIncludeAddLine(boolean includeAddLine) {
172         this.includeAddLine = includeAddLine;
173     }
174 
175     /**
176      * @return Collection of all lookupField MaintainableCollectionDefinitions associated with this
177      *         MaintainableCollectionDefinition, in the order in which they were added
178      */
179     public List<MaintainableCollectionDefinition> getMaintainableCollections() {
180         return maintainableCollections;
181     }
182 
183     public List<? extends CollectionDefinitionI> getCollections() {
184         return maintainableCollections;
185     }
186 
187     
188     /**
189      * @return Collection of all SummaryFieldDefinitions associated with this SummaryFieldDefinition, in the order in which they
190      *         were added
191      */
192     public List<? extends FieldDefinitionI> getSummaryFields() {
193         return summaryFields;
194     }
195 
196     public boolean hasSummaryField(String key) {
197         return summaryFieldMap.containsKey(key);
198     }
199 
200     public boolean isIncludeMultipleLookupLine() {
201         return includeMultipleLookupLine;
202     }
203 
204     /** Set whether the multiple lookup line (and link) should appear above this collection. */
205     public void setIncludeMultipleLookupLine(boolean includeMultipleLookupLine) {
206         this.includeMultipleLookupLine = includeMultipleLookupLine;
207     }
208 
209     public String getSummaryTitle() {
210         return summaryTitle;
211     }
212 
213     /**
214 summaryTitle is the label of the summary
215      */
216     public void setSummaryTitle(String overrideSummaryName) {
217         this.summaryTitle = overrideSummaryName;
218     }
219 
220 
221     public String getAttributeToHighlightOnDuplicateKey() {
222         return attributeToHighlightOnDuplicateKey;
223     }
224 
225     /**
226  attributeToHighlightOnDuplicateKey is the name of an attribute to highlight
227                             if two records in the collection are the same based on the
228                             duplicateIdentificationFields element.
229     */
230     public void setAttributeToHighlightOnDuplicateKey(String attributeToHighlightOnDuplicate) {
231         this.attributeToHighlightOnDuplicateKey = attributeToHighlightOnDuplicate;
232     }
233 
234     public boolean dissallowDuplicateKey() {
235         return StringUtils.isNotBlank(getAttributeToHighlightOnDuplicateKey());
236     }
237 
238     public List<MaintainableFieldDefinition> getDuplicateIdentificationFields() {
239         return duplicateIdentificationFields;
240     }
241 
242     /** The list of fields to include in this collection. */
243     public void setMaintainableFields(List<MaintainableFieldDefinition> maintainableFields) {
244         maintainableFieldMap.clear();
245         for ( MaintainableFieldDefinition maintainableField : maintainableFields ) {
246             if (maintainableField == null) {
247                 throw new IllegalArgumentException("invalid (null) maintainableField");
248             }
249 
250             String fieldName = maintainableField.getName();
251             if (maintainableFieldMap.containsKey(fieldName)) {
252                 throw new DuplicateEntryException("duplicate fieldName entry for field '" + fieldName + "'");
253             }
254 
255             maintainableFieldMap.put(fieldName, maintainableField);
256         }
257         this.maintainableFields = maintainableFields;
258     }
259 
260     /** The list of sub-collections to include in this collection. */
261     public void setMaintainableCollections(List<MaintainableCollectionDefinition> maintainableCollections) {
262         maintainableCollectionMap.clear();
263         for (MaintainableCollectionDefinition maintainableCollection : maintainableCollections ) {
264             if (maintainableCollection == null) {
265                 throw new IllegalArgumentException("invalid (null) maintainableCollection");
266             }
267 
268             String fieldName = maintainableCollection.getName();
269             if (maintainableCollectionMap.containsKey(fieldName)) {
270                 throw new DuplicateEntryException("duplicate fieldName entry for field '" + fieldName + "'");
271             }
272 
273             maintainableCollectionMap.put(fieldName, maintainableCollection);
274         }
275         this.maintainableCollections = maintainableCollections;
276     }
277 
278     /**
279 
280                         The summaryFields element defines a set of summaryField
281                         elements.
282      */
283     public void setSummaryFields(List<MaintainableFieldDefinition> summaryFields) {
284         summaryFieldMap.clear();
285         for (MaintainableFieldDefinition summaryField : summaryFields ) {
286             if (summaryField == null) {
287                 throw new IllegalArgumentException("invalid (null) summaryField");
288             }
289 
290             String fieldName = summaryField.getName();
291             if (summaryFieldMap.containsKey(fieldName)) {
292                 throw new DuplicateEntryException("duplicate fieldName entry for field '" + fieldName + "'");
293             }
294 
295             summaryFieldMap.put(fieldName, summaryField);
296         }
297         this.summaryFields = summaryFields;
298     }
299 
300     /**
301     The duplicateIdentificationFields element is used to define a set of
302     fields that will be used to determine if two records in the collection
303     are duplicates.
304     */
305     public void setDuplicateIdentificationFields(List<MaintainableFieldDefinition> duplicateIdentificationFields) {
306         duplicateIdentificationFieldMap.clear();
307         for (MaintainableFieldDefinition identifierField : duplicateIdentificationFields) {
308             if (identifierField == null) {
309                 throw new IllegalArgumentException("invalid (null) identifierField");
310             }
311 
312             String fieldName = identifierField.getName();
313             if (duplicateIdentificationFieldMap.containsKey(fieldName)) {
314                 throw new DuplicateEntryException("duplicate fieldName entry for field '" + fieldName + "'");
315             }
316 
317             duplicateIdentificationFieldMap.put(fieldName, identifierField);            
318         }
319         this.duplicateIdentificationFields = duplicateIdentificationFields;
320     }
321 
322 
323 
324 	public boolean isAlwaysAllowCollectionDeletion() {
325 		return this.alwaysAllowCollectionDeletion;
326 	}
327 
328 
329 
330 	public void setAlwaysAllowCollectionDeletion(
331 			boolean alwaysAllowCollectionDeletion) {
332 		this.alwaysAllowCollectionDeletion = alwaysAllowCollectionDeletion;
333 	}
334     
335 }