View Javadoc
1   /**
2    * Copyright 2005-2015 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.data.metadata;
17  
18  import com.google.common.annotations.Beta;
19  import org.kuali.rice.krad.data.provider.annotation.UifAutoCreateViewType;
20  
21  import java.util.Collection;
22  import java.util.List;
23  
24  
25  /**
26  * Metadata for a given data object type.
27  *
28  * <p>
29  * References the data object class and contains lists of all the attributes, collections, and relationships within
30  * the class.
31  * </p>
32  *
33  * @author Kuali Rice Team (rice.collab@kuali.org)
34  */
35  public interface DataObjectMetadata extends MetadataCommon {
36  
37      /**
38      * Gets metadata object type.
39      *
40      * <p>
41      * The type represented by this metadata object. Usually this will simply contain the class name created
42      * by the persistence layer when it is loaded from the database.
43      * </p>
44      *
45      * @return metadata object type. Will never return null.
46      */
47  	Class<?> getType();
48  
49      /**
50      * Gets attributes defined on the data object.
51      *
52      * <p>
53      * Gets all the attributes defined on the data object in the order given by the MetadataProvider. This may or may not
54      * be the same as the backing object's (table) and is most likely the order in which they appear in the source
55      * persistence metadata (XML or annotations).
56      * </p>
57      *
58      * @return Data object attributes. Will never return null. Will return an empty list if no attributes defined.
59      */
60  	List<DataObjectAttribute> getAttributes();
61  
62      /**
63      * Gets child collections.
64      *
65      * <p>
66      * Gets all the child collections defined on the data object in the order given by the MetadataProvider.
67      * </p>
68      *
69      * @return Child collections. Will never return null. Will return an empty list if no collections defined.
70      */
71  	List<DataObjectCollection> getCollections();
72  
73      /**
74      * Gets child relationships.
75      *
76      * <p>
77      * Gets all the child relationships defined on the data object in the order given by the MetadataProvider.
78      * </p>
79      *
80      * @return Child relationships. Will never return null. Will return an empty list if no relationships defined.
81      */
82  	List<DataObjectRelationship> getRelationships();
83  
84      /**
85      * Gets attribute metadata.
86      *
87      * <p>
88      * Get the named attribute's metadata from the data object.
89      * </p>
90      *
91      * @return <b>null</b> if the attributeName does not exist, the associated {@link DataObjectAttribute} otherwise.
92      */
93  	DataObjectAttribute getAttribute(String attributeName);
94  
95      /**
96      * Gets the named collection's metadata from the data object.
97      *
98      * <p>
99      * The name is the property on the data object which holds
100     * the {@link Collection}.
101     * </p>
102     *
103     * @return <b>null</b> if the attributeName does not exist, the associated {@link DataObjectCollection} otherwise.
104     */
105 	DataObjectCollection getCollection(String collectionName);
106 
107     /**
108     * Gets the named relationship's metadata from the data object.
109     *
110     * <p>
111     * The name is the property on the data object which holds the related business object's instance.
112     * </p>
113     *
114     * @return <b>null</b> if the attributeName does not exist, the associated {@link DataObjectRelationship} otherwise.
115     */
116 	DataObjectRelationship getRelationship(String relationshipName);
117 
118     /**
119     * Gets attribute relationships.
120     *
121     * <p>
122     * Returns all relationships of which the given attribute is part of the foreign key relationship.
123     * </p>
124     *
125     * @return The list of relationship metadata objects or an empty list if none found.
126     */
127 	List<DataObjectRelationship> getRelationshipsInvolvingAttribute(String attributeName);
128 
129 	/**
130 	 * Gets relationship of last attribute.
131      *
132      * <p>
133      * Returns a single relationship for which the given attribute is the last in the foreign key relationship.
134 	 * </p>
135      *
136 	 * @return <b>null</b> if no relationship's foreign key set ends wit the given field. The
137 	 *         {@link DataObjectRelationship} otherwise.
138 	 */
139 	DataObjectRelationship getRelationshipByLastAttributeInRelationship(String attributeName);
140 
141     /**
142     * Get the list of primary key attribute names for this data object.
143     *
144     * @return primary key attribute names.
145     */
146     List<String> getPrimaryKeyAttributeNames();
147 
148     /**
149     * List of attribute names which form a "user friendly" key. (As opposed to a sequence number as used by some parts
150     * of the system).
151     *
152     * <p>
153     * An example here would be the KIM Role object where the Role ID is the primary key, but the Namespace and Name
154     * properties form the user-visible and enterable key.
155     * </p>
156     *
157     * @return a list containing the business key attributes names for the data object.
158     */
159 	List<String> getBusinessKeyAttributeNames();
160 
161     /**
162     * Returns true if the list of primary key names and business key attribute names are different.
163     *
164     * @return true if the list of primary key names and business key attributes are different, false if they are the
165     *         same.
166     */
167 	Boolean hasDistinctBusinessKey();
168 
169     /**
170      * Gets primary display attribute name
171      *
172      * <p>
173      * This is the field on the object which best represents it on displays.  It will be used to build
174      * inquiry links and determine where to place quickfinder links.  Usually this will be the the primary key
175      * or the last field of the primary key if there are multiple fields.
176      * </p>
177      * <p>
178      * If not specified by the provider, the base implementation will default it to the last attribute in the
179      * primaryKeyAttributeNames list.
180      * </p>
181      *
182      * @return the name of the attribute to use for primary display purposes.
183      */
184     String getPrimaryDisplayAttributeName(); // KNS: titleAttribute
185 
186     /**
187     * Determines whether optimistic locking is supported.
188     *
189     * <p>
190     * Returns true if the underlying ORM tool performs optimistic locking checks on this object before saving. Under
191     * the KNS, this was done via the versionNumber property and appropriate OJB configuration. In JPA, this is linked
192     * to the @Version annotation.
193     * </p>
194     *
195     * @return true if this data object is configured for optimistic locking.
196     */
197 	boolean isSupportsOptimisticLocking();
198 
199     /**
200     * BETA: Gets auto create uif view types.
201     *
202     * <p>
203     * Returns collections of uif view types that should be auto created.
204     * </p>
205     *
206     * @return collection of uif view types.
207     */
208     @Beta
209 	Collection<UifAutoCreateViewType> getAutoCreateUifViewTypes();
210 
211     /**
212     * BETA: Determines where view type should be auto created.
213     *
214     * <p>
215     * Determines whether the specified uif view type can be auto created.
216     * </p>
217     *
218     * @return true if this uif view type should be auto created.
219     */
220     @Beta
221 	boolean shouldAutoCreateUifViewOfType(UifAutoCreateViewType viewType);
222 }