1 /* 2 * Copyright 2011 The Kuali Foundation 3 * 4 * Licensed under the Educational Community License, Version 1.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/ecl1.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.service; 17 18 import java.util.List; 19 import java.util.Map; 20 21 import org.kuali.rice.kns.bo.BusinessObjectRelationship; 22 import org.kuali.rice.kns.datadictionary.RelationshipDefinition; 23 24 /** 25 * Provides metadata such as relationships and key fields for data objects 26 * 27 * @author Kuali Rice Team (rice.collab@kuali.org) 28 */ 29 public interface DataObjectMetaDataService { 30 31 /** 32 * Checks the DataDictionary and OJB Repository File to determine the primary 33 * fields names for a given class. 34 * 35 * @param clazz The Class to check for primary keys 36 * @return a list of the primary key field names or an empty list if none are found 37 */ 38 public List<String> listPrimaryKeyFieldNames(Class<?> clazz); 39 40 /** 41 * @param DataObject object whose primary key field name,value pairs you want 42 * @return a Map containing the names and values of fields for the given class which 43 * are designated as key fields in the OJB repository file or DataDictionary 44 * @throws IllegalArgumentException if the given Object is null 45 */ 46 public Map<String, ?> getPrimaryKeyFieldValues(Object dataObject); 47 48 /** 49 * @param persistableObject object whose primary key field name,value pairs you want 50 * @param sortFieldNames if true, the returned Map will iterate through its entries sorted by fieldName 51 * @return a Map containing the names and values of fields for the given class which 52 * are designated as key fields in the OJB repository file or DataDictionary 53 * @throws IllegalArgumentException if the given Object is null 54 */ 55 public Map<String, ?> getPrimaryKeyFieldValues(Object dataObject, boolean sortFieldNames); 56 57 /** 58 * Compares two dataObject instances for equality of type and key values using toString() 59 * of each value for comparison purposes. 60 * 61 * @param do1 62 * @param do2 63 * @return boolean indicating whether the two objects are equal. 64 */ 65 public boolean equalsByPrimaryKeys(Object do1, Object do2); 66 67 /** 68 * Attempts to find a relationship for the given attribute within the given 69 * data object 70 * 71 * <p> 72 * First the data dictionary is queried to find any relationship definitions 73 * setup that include the attribute, if found the 74 * <code>BusinessObjectRetationship</code> is build from that. If not and 75 * the data object class is persistent, relationships are retrieved from the 76 * persistence service. Nested attributes are handled in addition to 77 * external business objects. If multiple relationships are found, the one 78 * that contains the least amount of joining keys is returned 79 * </p> 80 * 81 * @param dataObject 82 * - data object instance that contains the attribute 83 * @param dataObjectClass 84 * - class for the data object that contains the attribute 85 * @param attributeName 86 * - property name for the attribute 87 * @param attributePrefix 88 * - property prefix for the attribute 89 * @param keysOnly 90 * - indicates whether only primary key fields should be returned 91 * in the relationship 92 * @param supportsLookup 93 * - indicates whether the relationship should support lookup 94 * @param supportsInquiry 95 * - indicates whether the relationship should support inquiry 96 * @return BusinessObjectRelationship for the attribute, or null if not 97 * found 98 */ 99 public BusinessObjectRelationship getDataObjectRelationship(Object dataObject, Class<?> dataObjectClass, 100 String attributeName, String attributePrefix, boolean keysOnly, boolean supportsLookup, 101 boolean supportInquiry); 102 103 /** 104 * This method fetches the RelationshipDefinition using the parameters. 105 * 106 * @param dataObjectClass - data object class that contains the attribute 107 * @param attributeName - property name for the attribute 108 * @return RelationshipDefinition for the attribute, or null if not found 109 */ 110 public RelationshipDefinition getDictionaryRelationship(Class<?> dataObjectClass, String attributeName); 111 112 /** 113 * Returns the attribute to be associated with for object level markings. This would 114 * be the field chosen for inquiry links etc. 115 * 116 * @param dataObjectClass - data object class to obtain title attribute of 117 * @return property name of title attribute or null if data object entry not found 118 * @throws IllegalArgumentException 119 * if the given Class is null 120 */ 121 public String getTitleAttribute(Class<?> dataObjectClass); 122 123 }