View Javadoc

1   /**
2    * Copyright 2005-2013 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.krad.uif.modifier;
17  
18  import org.kuali.rice.krad.datadictionary.parse.BeanTag;
19  import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute;
20  import org.kuali.rice.krad.datadictionary.uif.UifDictionaryBeanBase;
21  import org.kuali.rice.krad.uif.component.Ordered;
22  
23  import java.io.Serializable;
24  
25  
26  /**
27   * Provides configuration for comparing an object with another object
28   *
29   * <p>
30   * Used with a comparison view (such as in maintenance documents edit mode)
31   * where two objects with the same properties are compared. This class
32   * configures the object paths for the objects that will be compared, and has
33   * additional configuration for the generated comparison group
34   * </p>
35   *
36   * <p>
37   * All comparison objects must have the same fields and collection rows
38   * </p>
39   *
40   * @author Kuali Rice Team (rice.collab@kuali.org)
41   * @see org.kuali.rice.krad.uif.modifier.CompareFieldCreateModifier
42   */
43  @BeanTag(name = "compareConfig-bean", parent = "Uif-CompareConfig")
44  public class ComparableInfo extends UifDictionaryBeanBase implements Serializable, Ordered, Cloneable  {
45  	private static final long serialVersionUID = -5926058412202550266L;
46  
47  	private String bindingObjectPath;
48  	private String headerText;
49  	private boolean readOnly;
50  
51  	private int order;
52  	private String idSuffix;
53  
54  	private boolean compareToForValueChange;
55  	private boolean highlightValueChange;
56  
57  	public ComparableInfo() {
58          super();
59  
60  		readOnly = false;
61  		compareToForValueChange = false;
62  		highlightValueChange = true;
63  	}
64  
65  	/**
66  	 * Returns the path (from the form) for the object to compare to
67  	 *
68  	 * <p>
69  	 * When a comparison view is rendered, a group will be rendered for each
70  	 * comparison object using the fields defined on the view. This gives the
71  	 * path to one of the comparison objects
72  	 * </p>
73  	 *
74  	 * <p>
75  	 * e.g. For maintenance documents the compare object paths would be
76  	 * document.newMaintainableObject.businessObject and
77  	 * document.oldMaintainableObject.businessObject
78  	 * </p>
79  	 *
80  	 * @return path to the compare object
81  	 */
82      @BeanTagAttribute(name="bindingObjectPath")
83  	public String getBindingObjectPath() {
84  		return this.bindingObjectPath;
85  	}
86  
87  	/**
88  	 * Setter for the path to the compare object
89  	 *
90  	 * @param bindingObjectPath
91  	 */
92  	public void setBindingObjectPath(String bindingObjectPath) {
93  		this.bindingObjectPath = bindingObjectPath;
94  	}
95  
96  	/**
97  	 * Text that should display on the header for the compare group
98  	 *
99  	 * <p>
100 	 * In the comparison view each compare group can be labeled, this gives the
101 	 * text that should be used for that label. For example in the maintenance
102 	 * view the compare record is labeled 'Old' to indicate it is the old
103 	 * version of the record
104 	 * </p>
105 	 *
106 	 * @return header text
107 	 */
108     @BeanTagAttribute(name="headerText")
109 	public String getHeaderText() {
110 		return this.headerText;
111 	}
112 
113 	/**
114 	 * Setter for the compare group header text
115 	 *
116 	 * @param headerText
117 	 */
118 	public void setHeaderText(String headerText) {
119 		this.headerText = headerText;
120 	}
121 
122 	/**
123 	 * Indicates whether the compare group should be read-only
124 	 *
125 	 * @return true if the group should be read-only, false if edits are
126 	 *         allowed
127 	 */
128     @BeanTagAttribute(name="readOnly")
129 	public boolean isReadOnly() {
130 		return this.readOnly;
131 	}
132 
133 	/**
134 	 * Setter for the read-only indicator
135 	 *
136 	 * @param readOnly
137 	 */
138 	public void setReadOnly(boolean readOnly) {
139 		this.readOnly = readOnly;
140 	}
141 
142 	/**
143 	 * Sets the order value that will be used to determine where the compare
144 	 * group should be placed in relation to the other compare groups
145 	 *
146 	 * <p>
147 	 * For example if the compare groups are being rendered from left to right
148 	 * in columns, a lower order value would be placed to the left of a compare
149 	 * group with a higher order value
150 	 * </p>
151 	 *
152 	 * @see org.springframework.core.Ordered#getOrder()
153 	 */
154     @BeanTagAttribute(name="order")
155 	public int getOrder() {
156 		return this.order;
157 	}
158 
159 	/**
160 	 * Setter for the compare object order
161 	 *
162 	 * @param order
163 	 */
164 	public void setOrder(int order) {
165 		this.order = order;
166 	}
167 
168 	/**
169 	 * Specifies an id suffix to use for the generated comparison fields
170 	 *
171 	 * <p>
172 	 * For the given string, all components created for the comparison group
173 	 * will contain the string on their id. This can be helpful for scripting.
174 	 * If not given, the items will receive a default id suffix
175 	 * </p>
176 	 *
177 	 * @return id suffix for comparison group
178 	 */
179     @BeanTagAttribute(name="idSuffix")
180 	public String getIdSuffix() {
181 		return this.idSuffix;
182 	}
183 
184 	/**
185 	 * Setter for the id prefix to use for the generated comparison components
186 	 *
187 	 * @param idSuffix
188 	 */
189 	public void setIdSuffix(String idSuffix) {
190 		this.idSuffix = idSuffix;
191 	}
192 
193     /**
194      * Indicates whether this comparable group's field values should be compared
195      * to when highlighting changes of values between comparables (versions)
196      *
197      * @return true if this comparable group should be used for
198      *         comparison, false if not
199      * @see #isHighlightValueChange
200      */
201     @BeanTagAttribute(name="compareToForValueChange")
202     public boolean isCompareToForValueChange() {
203         return this.compareToForValueChange;
204     }
205 
206     /**
207      * Setter for the use comparable group values for comparison indicator
208      *
209      * @param compareToForValueChange
210      */
211     public void setCompareToForValueChange(boolean compareToForValueChange) {
212         this.compareToForValueChange = compareToForValueChange;
213     }
214 
215     /**
216      * Indicates whether the fields in this comparable group should be
217      * highlighted if their values defer from the comparable group marked for
218      * comparison
219      *
220      * @return true if the comparable fields should be highlighted,
221      *         false if they should not be highlighted (no comparison will be
222      *         performed)
223      * @see #isCompareToForValueChange
224      */
225     @BeanTagAttribute(name="highlightValueChange")
226     public boolean isHighlightValueChange() {
227         return this.highlightValueChange;
228     }
229 
230     /**
231      * Setter for the highlight comparable field value changed indicator
232      *
233      * @param highlightValueChange
234      */
235     public void setHighlightValueChange(boolean highlightValueChange) {
236         this.highlightValueChange = highlightValueChange;
237     }
238 
239     /**
240      * Returns a clone of the comparable info.
241      *
242      * @return ComparableInfo clone of the component
243      */
244     public <T extends ComparableInfo> T clone() {
245         try {
246             T clonedClass = (T)this.getClass().newInstance();
247             clonedClass = (T)copyProperties(clonedClass);
248 
249             return clonedClass;
250         }
251         catch(Exception exception) {
252             throw new RuntimeException();
253         }
254     }
255 
256     protected ComparableInfo copyProperties(Cloneable comparableInfo) {
257         ComparableInfo comparableInfoCopy = (ComparableInfo) comparableInfo;
258         comparableInfoCopy.setBindingObjectPath(this.bindingObjectPath);
259         comparableInfoCopy.setCompareToForValueChange(this.compareToForValueChange);
260         comparableInfoCopy.setHeaderText(this.headerText);
261         comparableInfoCopy.setHighlightValueChange(this.highlightValueChange);
262         comparableInfoCopy.setIdSuffix(this.idSuffix);
263         comparableInfoCopy.setOrder(this.order);
264         comparableInfoCopy.setReadOnly(this.readOnly);
265 
266         return comparableInfoCopy;
267     }
268 
269     protected <T> void copyProperties(T comparableInfo) {
270         super.copyProperties(comparableInfo);
271         ComparableInfo comparableInfoCopy = (ComparableInfo) comparableInfo;
272         comparableInfoCopy.setBindingObjectPath(this.bindingObjectPath);
273         comparableInfoCopy.setCompareToForValueChange(this.compareToForValueChange);
274         comparableInfoCopy.setHeaderText(this.headerText);
275         comparableInfoCopy.setHighlightValueChange(this.highlightValueChange);
276         comparableInfoCopy.setIdSuffix(this.idSuffix);
277         comparableInfoCopy.setOrder(this.order);
278         comparableInfoCopy.setReadOnly(this.readOnly);
279     }
280 }