1 /**
2 * Copyright 2005-2014 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.service;
17
18 import java.io.IOException;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.Set;
22 import java.util.regex.Pattern;
23
24 import org.kuali.rice.core.web.format.Formatter;
25 import org.kuali.rice.krad.bo.BusinessObject;
26 import org.kuali.rice.krad.datadictionary.AttributeDefinition;
27 import org.kuali.rice.krad.datadictionary.AttributeSecurity;
28 import org.kuali.rice.krad.datadictionary.DataDictionary;
29 import org.kuali.rice.krad.datadictionary.InactivationBlockingMetadata;
30 import org.kuali.rice.krad.datadictionary.control.ControlDefinition;
31 import org.kuali.rice.krad.document.Document;
32 import org.kuali.rice.krad.keyvalues.KeyValuesFinder;
33 import org.kuali.rice.krad.uif.UifConstants.ViewType;
34 import org.kuali.rice.krad.uif.view.View;
35
36 /**
37 * Defines the API for interacting with the data dictionary
38 *
39 * @author Kuali Rice Team (rice.collab@kuali.org)
40 */
41 public interface DataDictionaryService {
42
43 /**
44 * Adds additional dictionary files to the data dictionary (files that will not be loaded through one of
45 * the module configurations)
46 *
47 * <p>
48 * Additional files must be associated with a namespace thus a map is specified with the key giving the
49 * namespace the list of files should be associated with
50 * </p>
51 *
52 * <p>
53 * Duplicate entries among any of the XML files in any of these packages will result in exceptions
54 * being thrown, hence service-initialization failure
55 * </p>
56 *
57 * @param additionalDictionaryFiles map where key is namespace and value is list of dictionary files that
58 * should be added to that namespace
59 * @throws IOException if any of the given packages can't be located
60 */
61 public void setAdditionalDictionaryFiles(Map<String, List<String>> additionalDictionaryFiles) throws IOException;
62
63 /**
64 * Sequentially adds each package named (as a String) in the given List as a source of unique entries to the
65 * DataDictionary being constructed
66 *
67 * <p>
68 * Duplicate entries among any of the XML files in any of these packages will result in exceptions
69 * being thrown, hence service-initialization failure
70 * </p>
71 *
72 * @param namespaceCode - namespace the beans loaded from the location should be associated with
73 * @param locations - list of locations to add (either classpath entries or file/folder locations)
74 * @throws IOException if any of the given packages can't be located
75 */
76 public void addDataDictionaryLocations(String namespaceCode, List<String> locations) throws IOException;
77
78 /**
79 * @return current DataDictionary
80 */
81 public DataDictionary getDataDictionary();
82
83 /**
84 * the html control type used to render the field
85 */
86 ControlDefinition getAttributeControlDefinition(Class<?> dataObjectClass, String attributeName);
87
88 /**
89 * the display size of the field if text control
90 */
91 Integer getAttributeSize(Class<?> dataObjectClass, String attributeName);
92
93 /**
94 * the max length defined for the given attribute name.
95 */
96 Integer getAttributeMaxLength(Class<?> dataObjectClass, String attributeName);
97
98 /**
99 * 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 @Deprecated
122 Class<? extends Formatter> getAttributeFormatter(Class<?> dataObjectClass, String attributeName);
123
124 /**
125 * indicates whether or not to force input text into uppercase
126 */
127 Boolean getAttributeForceUppercase(Class<?> dataObjectClass, String attributeName);
128
129 /**
130 * short help text for attribute
131 */
132 String getAttributeSummary(Class<?> dataObjectClass, String attributeName);
133
134 /**
135 * detailed help text for attribute
136 */
137 String getAttributeDescription(Class<?> dataObjectClass, String attributeName);
138
139 /**
140 * indicates whether or not the named attribute is required
141 */
142 Boolean isAttributeRequired(Class<?> dataObjectClass, String attributeName);
143
144 /**
145 * indicates whether or not the named attribute is defined in the business object xml
146 */
147 Boolean isAttributeDefined(Class<?> dataObjectClass, String attributeName);
148
149 /**
150 * the Class that returns a values list for this attribute
151 */
152 Class<? extends KeyValuesFinder> getAttributeValuesFinderClass(Class<?> dataObjectClass, String attributeName);
153
154 /**
155 * the label to be used for displaying the collection.
156 */
157 String getCollectionLabel(Class<?> dataObjectClass, String collectionName);
158
159 /**
160 * the short label to be used for displaying the collection.
161 */
162 String getCollectionShortLabel(Class<?> dataObjectClass, String collectionName);
163
164 /**
165 * short help text for collection
166 */
167 String getCollectionSummary(Class<?> dataObjectClass, String collectionName);
168
169 /**
170 * detailed help text for collection
171 */
172 String getCollectionDescription(Class<?> dataObjectClass, String collectionName);
173
174 /**
175 * the html control type used to render the field
176 */
177 ControlDefinition getAttributeControlDefinition(String entryName, String attributeName);
178
179 /**
180 * the display size of the field if text control
181 */
182 Integer getAttributeSize(String entryName, String attributeName);
183
184 /**
185 * the min length defined for the given attribute name.
186 */
187 Integer getAttributeMinLength(String entryName, String attributeName);
188
189 /**
190 * the max length defined for the given attribute name.
191 */
192 Integer getAttributeMaxLength(String entryName, String attributeName);
193
194 /**
195 * @param entryName
196 * @param attributeName
197 * @return the exclusive minimum for the specified attribute, or {@code null} if none.
198 */
199 /*BigDecimal*/ String getAttributeExclusiveMin(String entryName, String attributeName);
200
201 /**
202 * @param entryName
203 * @param attributeName
204 * @return the inclusive maximum for the specified attribute, or {@code null} if none.
205 */
206 /*BigDecimal*/ String getAttributeInclusiveMax(String entryName, String attributeName);
207
208 /**
209 * the regular expression defined to validate the given attribute name.
210 */
211 Pattern getAttributeValidatingExpression(String entryName, String attributeName);
212
213 /**
214 * the label to be used for displaying the attribute.
215 */
216 String getAttributeLabel(String entryName, String attributeName);
217
218 /**
219 * the short label to be used for displaying the attribute.
220 */
221 String getAttributeShortLabel(String entryName, String attributeName);
222
223 /**
224 * the "label (short label)" used for displaying error messages
225 */
226 String getAttributeErrorLabel(String entryName, String attributeName);
227
228 /**
229 * the formatter class used to format the attribute value
230 */
231 @Deprecated
232 Class<? extends Formatter> getAttributeFormatter(String entryName, String attributeName);
233
234 /**
235 * indicates whether or not to force input text into uppercase
236 */
237 Boolean getAttributeForceUppercase(String entryName, String attributeName);
238
239 /**
240 * the AttributeSecurity object defined for the attribute's data value
241 */
242 AttributeSecurity getAttributeSecurity(String entryName, String attributeName);
243
244 /**
245 * short help text for attribute
246 */
247 String getAttributeSummary(String entryName, String attributeName);
248
249 /**
250 * detailed help text for attribute
251 */
252 String getAttributeDescription(String entryName, String attributeName);
253
254 String getAttributeValidatingErrorMessageKey(String entryName, String attributeName);
255
256 String[] getAttributeValidatingErrorMessageParameters(String entryName, String attributeName);
257
258 /**
259 * indicates whether or not the named attribute is required
260 */
261 Boolean isAttributeRequired(String entryName, String attributeName);
262
263 /**
264 * indicates whether or not the named attribute is defined in the business object xml
265 */
266 Boolean isAttributeDefined(String entryName, String attributeName);
267
268 /**
269 * the Class that returns a values list for this attribute
270 */
271 Class<? extends KeyValuesFinder> getAttributeValuesFinderClass(String entryName, String attributeName);
272
273 /**
274 * AttributeDefinition associated with the given attributeName within the given entry
275 */
276 AttributeDefinition getAttributeDefinition(String entryName, String attributeName);
277
278 /**
279 * the label to be used for displaying the collection.
280 */
281 String getCollectionLabel(String entryName, String collectionName);
282
283 /**
284 * the short label to be used for displaying the collection.
285 */
286 String getCollectionShortLabel(String entryName, String collectionName);
287
288 /**
289 * the element label to be used for displaying the collection.
290 */
291 String getCollectionElementLabel(String entryName, String collectionName, Class<?> dataObjectClass);
292
293 /**
294 * short help text for collection
295 */
296 String getCollectionSummary(String entryName, String collectionName);
297
298 /**
299 * detailed help text for collection
300 */
301 String getCollectionDescription(String entryName, String collectionName);
302
303 /**
304 * @param entryName
305 * @param relationshipName
306 * @return source Class for the given relationship, or null if there is no relationship with that name
307 */
308 Class<? extends BusinessObject> getRelationshipSourceClass(String entryName, String relationshipName);
309
310 /**
311 * @param entryName
312 * @param relationshipName
313 * @return target Class for the given relationship, or null if there is no relationship with that name
314 */
315 Class<? extends BusinessObject> getRelationshipTargetClass(String entryName, String relationshipName);
316
317 /**
318 * @param entryName
319 * @param relationshipName
320 * @return List<String> of source attributeNames for the given relationship, or null if there is no relationship
321 * with that name
322 */
323 List<String> getRelationshipSourceAttributes(String entryName, String relationshipName);
324
325 /**
326 * @param entryName
327 * @param relationshipName
328 * @return List<String> of target attributeNames for the given relationship, or null if there is no relationship
329 * with that name
330 */
331 List<String> getRelationshipTargetAttributes(String entryName, String relationshipName);
332
333 /**
334 * returns a Map that specifies the attributes of the relationship
335 *
336 * @param entryName - Name of the Business Object entry
337 * @param relationshipName - Name of the relationship
338 * @return Map - Target field as key, source field as value
339 */
340 Map<String, String> getRelationshipAttributeMap(String entryName, String relationshipName);
341
342 /**
343 * returns a list of names for all entries whose source parameter matches the parameter
344 *
345 * @param entryName Name of the Business Object entry
346 * @param sourceAttributeName name of the source attribute
347 * @return the names of all entries that use the sourceAttributeName as a primitive attribute
348 */
349 List<String> getRelationshipEntriesForSourceAttribute(String entryName, String sourceAttributeName);
350
351 /**
352 * returns a list of names for all entries whose source parameter matches the parameter
353 *
354 * @param entryName Name of the Business Object entry
355 * @param targetAttributeName name of the target attribute
356 * @return the names of all entries that use the targetAttributeName as a primitive attribute
357 */
358 List<String> getRelationshipEntriesForTargetAttribute(String entryName, String targetAttributeName);
359
360 /**
361 * Determines whether there is a relationship defined for the given entry with the given name
362 *
363 * @param entryName name of the BO entry
364 * @param relationshipName name of the relationship for the entry
365 * @return true iff there is a relationship with the given name defined for the BO entry in the DD
366 */
367 boolean hasRelationship(String entryName, String relationshipName);
368
369 /**
370 * Returns all of the relationships defined for a BO in the DD
371 *
372 * @param entryName of the BO entry
373 * @return a list of all DD defined mappings
374 */
375 List<String> getRelationshipNames(String entryName);
376
377 // /**
378 // * Returns the list of document class names
379 // *
380 // * @return
381 // */
382 // public List getDocumentObjectClassnames();
383
384 /**
385 * This method returns the user friendly label based on the workflow doc type name
386 *
387 * @param documentTypeName
388 * @return label
389 */
390 String getDocumentLabelByTypeName(String documentTypeName);
391
392 /**
393 * This method returns the user friendly label based on the document or business object class
394 *
395 * @param documentOrBusinessObjectClass
396 * @return label
397 */
398 String getDocumentLabelByClass(Class<?> documentOrBusinessObjectClass);
399
400 /**
401 * Returns the document type name declared in the dd for the given document
402 * class. If no valid document type is found 'null' is returned.
403 *
404 * @param documentClass
405 * @return documentTypeName
406 */
407 String getDocumentTypeNameByClass(Class<?> documentClass);
408
409 /**
410 * Returns the document type name declared in the dd for the given document
411 * class. If no valid document type is found an
412 * {@link org.kuali.rice.krad.datadictionary.exception.UnknownDocumentTypeException} is thrown.
413 *
414 * @param documentClass
415 * @return documentTypeName
416 */
417 String getValidDocumentTypeNameByClass(Class<?> documentClass);
418
419 /**
420 * Returns the document class declared in the dd for the given document type
421 * name. If no document entry is found with given document type name, 'null'
422 * will be returned.
423 *
424 * @param documentTypeName
425 * @return document Class
426 */
427 Class<? extends Document> getDocumentClassByTypeName(String documentTypeName);
428
429 /**
430 * Returns the document class declared in the dd for the given document type
431 * name. If no document entry is found with given document type name, and
432 * {@link org.kuali.rice.krad.datadictionary.exception.UnknownDocumentTypeException} will be thrown.
433 *
434 * @param documentTypeName
435 * @return document Class
436 */
437 Class<? extends Document> getValidDocumentClassByTypeName(String documentTypeName);
438
439 /**
440 * Returns the list of attributes that should be used for grouping when determining the current
441 * status of a business object that implements InactivateableFromTo
442 *
443 * @param businessObjectClass - business object class to get configured list for
444 * @return List of string attribute names that gives the group by list
445 */
446 List<String> getGroupByAttributesForEffectiveDating(Class<?> businessObjectClass);
447
448 /**
449 * Returns all of the inactivation blocks registered for a particular business object
450 *
451 * @param inactivationBlockedBusinessObjectClass
452 * @return a set of all registered inactivation blocks for a particular business object
453 */
454 Set<InactivationBlockingMetadata> getAllInactivationBlockingDefinitions(
455 Class<?> inactivationBlockedBusinessObjectClass);
456
457 /**
458 * Returns the View entry identified by the given id
459 *
460 * @param viewId - unique id for view
461 * @return View instance associated with the id
462 */
463 View getViewById(String viewId);
464
465 /**
466 * Returns an object from the dictionary by its spring bean name or id
467 *
468 * @param id id or name for the bean definition
469 * @return Object object instance created or the singleton being maintained
470 */
471 Object getDictionaryBean(String id);
472
473 /**
474 * Indicates whether the data dictionary contains a bean with the given id
475 *
476 * @param id id of the bean to check for
477 * @return boolean true if dictionary contains bean, false otherwise
478 */
479 boolean containsDictionaryBean(String id);
480
481 /**
482 * Returns a property value for the bean with the given name from the dictionary.
483 *
484 * @param beanName id or name for the bean definition
485 * @param propertyName name of the property to retrieve
486 * @return Object property value for property
487 */
488 Object getDictionaryBeanProperty(String beanName, String propertyName);
489
490 /**
491 * Returns View instance identified by the view type name 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 View instance that matches the given index
498 */
499 View getViewByTypeIndex(ViewType viewTypeName, Map<String, String> indexKey);
500
501 /**
502 * Returns the view id for the view that matches the given view type and index
503 *
504 * @param viewTypeName type name for the view
505 * @param indexKey Map of index key parameters, these are the parameters the
506 * indexer used to index the view initially and needs to identify
507 * an unique view instance
508 * @return id for the view that matches the view type and index or null if a match is not found
509 */
510 String getViewIdByTypeIndex(ViewType viewTypeName, Map<String, String> indexKey);
511 }