001    /**
002     * Copyright 2005-2013 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.rice.krad.service;
017    
018    import org.kuali.rice.core.web.format.Formatter;
019    import org.kuali.rice.krad.bo.BusinessObject;
020    import org.kuali.rice.krad.datadictionary.AttributeDefinition;
021    import org.kuali.rice.krad.datadictionary.AttributeSecurity;
022    import org.kuali.rice.krad.datadictionary.DataDictionary;
023    import org.kuali.rice.krad.datadictionary.InactivationBlockingMetadata;
024    import org.kuali.rice.krad.datadictionary.control.ControlDefinition;
025    import org.kuali.rice.krad.document.Document;
026    import org.kuali.rice.krad.keyvalues.KeyValuesFinder;
027    import org.kuali.rice.krad.uif.view.View;
028    import org.kuali.rice.krad.uif.UifConstants.ViewType;
029    
030    import java.io.IOException;
031    import java.util.List;
032    import java.util.Map;
033    import java.util.Set;
034    import java.util.regex.Pattern;
035    
036    /**
037     * Defines the API for interacting with the data dictionary
038     *
039     * @author Kuali Rice Team (rice.collab@kuali.org)
040     */
041    public interface DataDictionaryService {
042    
043        /**
044         * Adds additional dictionary files to the data dictionary (files that will not be loaded through one of
045         * the module configurations)
046         *
047         * <p>
048         * Additional files must be associated with a namespace thus a map is specified with the key giving the
049         * namespace the list of files should be associated with
050         * </p>
051         *
052         * <p>
053         * Duplicate entries among any of the XML files in any of these packages will result in exceptions
054         * being thrown, hence service-initialization failure
055         * </p>
056         *
057         * @param additionalDictionaryFiles map where key is namespace and value is list of dictionary files that
058         * should be added to that namespace
059         * @throws IOException if any of the given packages can't be located
060         */
061        public void setAdditionalDictionaryFiles(Map<String, List<String>> additionalDictionaryFiles) throws IOException;
062    
063        /**
064         * Sequentially adds each package named (as a String) in the given List as a source of unique entries to the
065         * DataDictionary being constructed
066         *
067         * <p>
068         * Duplicate entries among any of the XML files in any of these packages will result in exceptions
069         * being thrown, hence service-initialization failure
070         * </p>
071         *
072         * @param namespaceCode - namespace the beans loaded from the location should be associated with
073         * @param locations - list of locations to add (either classpath entries or file/folder locations)
074         * @throws IOException if any of the given packages can't be located
075         */
076        public void addDataDictionaryLocations(String namespaceCode, List<String> locations) throws IOException;
077    
078        /**
079         * @return current DataDictionary
080         */
081        public DataDictionary getDataDictionary();
082    
083        /**
084         * the html control type used to render the field
085         */
086        ControlDefinition getAttributeControlDefinition(Class dataObjectClass, String attributeName);
087    
088        /**
089         * the display size of the field if text control
090         */
091        Integer getAttributeSize(Class dataObjectClass, String attributeName);
092    
093        /**
094         * the max length defined for the given attribute name.
095         */
096        Integer getAttributeMaxLength(Class dataObjectClass, String attributeName);
097    
098        /**
099         * the regular expression defined to validate the given attribute name.
100         */
101        Pattern getAttributeValidatingExpression(Class dataObjectClass, String attributeName);
102    
103        /**
104         * the label to be used for displaying the attribute.
105         */
106        String getAttributeLabel(Class dataObjectClass, String attributeName);
107    
108        /**
109         * the short label to be used for displaying the attribute.
110         */
111        String getAttributeShortLabel(Class dataObjectClass, String attributeName);
112    
113        /**
114         * the "label (short label)" used for displaying error messages
115         */
116        String getAttributeErrorLabel(Class dataObjectClass, String attributeName);
117    
118        /**
119         * the formatter class used to format the attribute value
120         */
121        Class<? extends Formatter> getAttributeFormatter(Class dataObjectClass, String attributeName);
122    
123        /**
124         * indicates whether or not to force input text into uppercase
125         */
126        Boolean getAttributeForceUppercase(Class dataObjectClass, String attributeName);
127    
128        /**
129         * short help text for attribute
130         */
131        String getAttributeSummary(Class dataObjectClass, String attributeName);
132    
133        /**
134         * detailed help text for attribute
135         */
136        String getAttributeDescription(Class dataObjectClass, String attributeName);
137    
138        /**
139         * indicates whether or not the named attribute is required
140         */
141        Boolean isAttributeRequired(Class dataObjectClass, String attributeName);
142    
143        /**
144         * indicates whether or not the named attribute is defined in the business object xml
145         */
146        Boolean isAttributeDefined(Class dataObjectClass, String attributeName);
147    
148        /**
149         * the Class that returns a values list for this attribute
150         */
151        Class<? extends KeyValuesFinder> getAttributeValuesFinderClass(Class dataObjectClass, String attributeName);
152    
153        /**
154         * the label to be used for displaying the collection.
155         */
156        String getCollectionLabel(Class dataObjectClass, String collectionName);
157    
158        /**
159         * the short label to be used for displaying the collection.
160         */
161        String getCollectionShortLabel(Class dataObjectClass, String collectionName);
162    
163        /**
164         * short help text for collection
165         */
166        String getCollectionSummary(Class dataObjectClass, String collectionName);
167    
168        /**
169         * detailed help text for collection
170         */
171        String getCollectionDescription(Class dataObjectClass, String collectionName);
172    
173        /**
174         * the html control type used to render the field
175         */
176        ControlDefinition getAttributeControlDefinition(String entryName, String attributeName);
177    
178        /**
179         * the display size of the field if text control
180         */
181        Integer getAttributeSize(String entryName, String attributeName);
182    
183        /**
184         * the min length defined for the given attribute name.
185         */
186        Integer getAttributeMinLength(String entryName, String attributeName);
187    
188        /**
189         * the max length defined for the given attribute name.
190         */
191        Integer getAttributeMaxLength(String entryName, String attributeName);
192    
193        /**
194         * @param entryName
195         * @param attributeName
196         * @return the exclusive minimum for the specified attribute, or {@code null} if none.
197         */
198        /*BigDecimal*/ String getAttributeExclusiveMin(String entryName, String attributeName);
199    
200        /**
201         * @param entryName
202         * @param attributeName
203         * @return the inclusive maximum for the specified attribute, or {@code null} if none.
204         */
205        /*BigDecimal*/ String getAttributeInclusiveMax(String entryName, String attributeName);
206    
207        /**
208         * the regular expression defined to validate the given attribute name.
209         */
210        Pattern getAttributeValidatingExpression(String entryName, String attributeName);
211    
212        /**
213         * the label to be used for displaying the attribute.
214         */
215        String getAttributeLabel(String entryName, String attributeName);
216    
217        /**
218         * the short label to be used for displaying the attribute.
219         */
220        String getAttributeShortLabel(String entryName, String attributeName);
221    
222        /**
223         * the "label (short label)" used for displaying error messages
224         */
225        String getAttributeErrorLabel(String entryName, String attributeName);
226    
227        /**
228         * the formatter class used to format the attribute value
229         */
230        Class<? extends Formatter> getAttributeFormatter(String entryName, String attributeName);
231    
232        /**
233         * indicates whether or not to force input text into uppercase
234         */
235        Boolean getAttributeForceUppercase(String entryName, String attributeName);
236    
237        /**
238         * the AttributeSecurity object defined for the attribute's data value
239         */
240        AttributeSecurity getAttributeSecurity(String entryName, String attributeName);
241    
242        /**
243         * short help text for attribute
244         */
245        String getAttributeSummary(String entryName, String attributeName);
246    
247        /**
248         * detailed help text for attribute
249         */
250        String getAttributeDescription(String entryName, String attributeName);
251    
252        String getAttributeValidatingErrorMessageKey(String entryName, String attributeName);
253    
254        String[] getAttributeValidatingErrorMessageParameters(String entryName, String attributeName);
255    
256        /**
257         * indicates whether or not the named attribute is required
258         */
259        Boolean isAttributeRequired(String entryName, String attributeName);
260    
261        /**
262         * indicates whether or not the named attribute is defined in the business object xml
263         */
264        Boolean isAttributeDefined(String entryName, String attributeName);
265    
266        /**
267         * the Class that returns a values list for this attribute
268         */
269        Class<? extends KeyValuesFinder> getAttributeValuesFinderClass(String entryName, String attributeName);
270    
271        /**
272         * AttributeDefinition associated with the given attributeName within the given entry
273         */
274        AttributeDefinition getAttributeDefinition(String entryName, String attributeName);
275    
276        /**
277         * the label to be used for displaying the collection.
278         */
279        String getCollectionLabel(String entryName, String collectionName);
280    
281        /**
282         * the short label to be used for displaying the collection.
283         */
284        String getCollectionShortLabel(String entryName, String collectionName);
285    
286        /**
287         * the element label to be used for displaying the collection.
288         */
289        String getCollectionElementLabel(String entryName, String collectionName, Class dataObjectClass);
290    
291        /**
292         * short help text for collection
293         */
294        String getCollectionSummary(String entryName, String collectionName);
295    
296        /**
297         * detailed help text for collection
298         */
299        String getCollectionDescription(String entryName, String collectionName);
300    
301        /**
302         * @param entryName
303         * @param relationshipName
304         * @return source Class for the given relationship, or null if there is no relationship with that name
305         */
306        Class<? extends BusinessObject> getRelationshipSourceClass(String entryName, String relationshipName);
307    
308        /**
309         * @param entryName
310         * @param relationshipName
311         * @return target Class for the given relationship, or null if there is no relationship with that name
312         */
313        Class<? extends BusinessObject> getRelationshipTargetClass(String entryName, String relationshipName);
314    
315        /**
316         * @param entryName
317         * @param relationshipName
318         * @return List<String> of source attributeNames for the given relationship, or null if there is no relationship
319         *         with that name
320         */
321        List<String> getRelationshipSourceAttributes(String entryName, String relationshipName);
322    
323        /**
324         * @param entryName
325         * @param relationshipName
326         * @return List<String> of target attributeNames for the given relationship, or null if there is no relationship
327         *         with that name
328         */
329        List<String> getRelationshipTargetAttributes(String entryName, String relationshipName);
330    
331        /**
332         * returns a Map that specifies the attributes of the relationship
333         *
334         * @param entryName - Name of the Business Object entry
335         * @param relationshipName - Name of the relationship
336         * @return Map - Target field as key, source field as value
337         */
338        Map<String, String> getRelationshipAttributeMap(String entryName, String relationshipName);
339    
340        /**
341         * returns a list of names for all entries whose source parameter matches the parameter
342         *
343         * @param entryName Name of the Business Object entry
344         * @param sourceAttributeName name of the source attribute
345         * @return the names of all entries that use the sourceAttributeName as a primitive attribute
346         */
347        List<String> getRelationshipEntriesForSourceAttribute(String entryName, String sourceAttributeName);
348    
349        /**
350         * returns a list of names for all entries whose source parameter matches the parameter
351         *
352         * @param entryName Name of the Business Object entry
353         * @param targetAttributeName name of the target attribute
354         * @return the names of all entries that use the targetAttributeName as a primitive attribute
355         */
356        List<String> getRelationshipEntriesForTargetAttribute(String entryName, String targetAttributeName);
357    
358        /**
359         * Determines whether there is a relationship defined for the given entry with the given name
360         *
361         * @param entryName name of the BO entry
362         * @param relationshipName name of the relationship for the entry
363         * @return true iff there is a relationship with the given name defined for the BO entry in the DD
364         */
365        boolean hasRelationship(String entryName, String relationshipName);
366    
367        /**
368         * Returns all of the relationships defined for a BO in the DD
369         *
370         * @param entryName of the BO entry
371         * @return a list of all DD defined mappings
372         */
373        List<String> getRelationshipNames(String entryName);
374    
375        //    /**
376        //     * Returns the list of document class names
377        //     *
378        //     * @return
379        //     */
380        //    public List getDocumentObjectClassnames();
381    
382        /**
383         * This method returns the user friendly label based on the workflow doc type name
384         *
385         * @param documentTypeName
386         * @return label
387         */
388        String getDocumentLabelByTypeName(String documentTypeName);
389    
390        /**
391         * This method returns the user friendly label based on the document or business object class
392         *
393         * @param documentOrBusinessObjectClass
394         * @return label
395         */
396        String getDocumentLabelByClass(Class documentOrBusinessObjectClass);
397    
398        /**
399         * Returns the document type name declared in the dd for the given document
400         * class. If no valid document type is found 'null' is returned.
401         *
402         * @param documentClass
403         * @return documentTypeName
404         */
405        String getDocumentTypeNameByClass(Class documentClass);
406    
407        /**
408         * Returns the document type name declared in the dd for the given document
409         * class. If no valid document type is found an
410         * {@link org.kuali.rice.krad.datadictionary.exception.UnknownDocumentTypeException} is thrown.
411         *
412         * @param documentClass
413         * @return documentTypeName
414         */
415        String getValidDocumentTypeNameByClass(Class documentClass);
416    
417        /**
418         * Returns the document class declared in the dd for the given document type
419         * name. If no document entry is found with given document type name, 'null'
420         * will be returned.
421         *
422         * @param documentTypeName
423         * @return document Class
424         */
425        Class<? extends Document> getDocumentClassByTypeName(String documentTypeName);
426    
427        /**
428         * Returns the document class declared in the dd for the given document type
429         * name. If no document entry is found with given document type name, and
430         * {@link org.kuali.rice.krad.datadictionary.exception.UnknownDocumentTypeException} will be thrown.
431         *
432         * @param documentTypeName
433         * @return document Class
434         */
435        Class<? extends Document> getValidDocumentClassByTypeName(String documentTypeName);
436    
437        /**
438         * Returns the list of attributes that should be used for grouping when determining the current
439         * status of a business object that implements InactivateableFromTo
440         *
441         * @param businessObjectClass - business object class to get configured list for
442         * @return List of string attribute names that gives the group by list
443         */
444        List<String> getGroupByAttributesForEffectiveDating(Class businessObjectClass);
445    
446        /**
447         * Returns all of the inactivation blocks registered for a particular business object
448         *
449         * @param inactivationBlockedBusinessObjectClass
450         * @return a set of all registered inactivation blocks for a particular business object
451         */
452        Set<InactivationBlockingMetadata> getAllInactivationBlockingDefinitions(
453                Class inactivationBlockedBusinessObjectClass);
454    
455        /**
456         * Returns the View entry identified by the given id
457         *
458         * @param viewId - unique id for view
459         * @return View instance associated with the id
460         */
461        View getViewById(String viewId);
462    
463        /**
464         * Returns an object from the dictionary by its spring bean name or id
465         *
466         * @param id - id or name for the bean definition
467         * @return Object object instance created or the singleton being maintained
468         */
469        Object getDictionaryObject(String id);
470    
471        /**
472         * Indicates whether the data dictionary contains a bean with the given id
473         *
474         * @param id - id of the bean to check for
475         * @return boolean true if dictionary contains bean, false otherwise
476         */
477        boolean containsDictionaryObject(String id);
478    
479        /**
480         * Returns View instance identified by the view type name and index
481         *
482         * @param viewTypeName - type name for the view
483         * @param indexKey - Map of index key parameters, these are the parameters the
484         * indexer used to index the view initially and needs to identify
485         * an unique view instance
486         * @return View instance that matches the given index
487         */
488        View getViewByTypeIndex(ViewType viewTypeName, Map<String, String> indexKey);
489    
490        /**
491         * Returns the view id for the view that matches the given view type and index
492         *
493         * @param viewTypeName type name for the view
494         * @param indexKey Map of index key parameters, these are the parameters the
495         * indexer used to index the view initially and needs to identify
496         * an unique view instance
497         * @return id for the view that matches the view type and index or null if a match is not found
498         */
499        String getViewIdByTypeIndex(ViewType viewTypeName, Map<String, String> indexKey);
500    }