001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.krms.api.repository.type;
017
018import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
019import org.kuali.rice.core.api.exception.RiceIllegalStateException;
020import org.kuali.rice.krms.api.KrmsConstants;
021import org.springframework.cache.annotation.CacheEvict;
022import org.springframework.cache.annotation.Cacheable;
023
024import javax.jws.WebMethod;
025import javax.jws.WebParam;
026import javax.jws.WebResult;
027import javax.jws.WebService;
028import javax.jws.soap.SOAPBinding;
029import javax.xml.bind.annotation.XmlElement;
030import javax.xml.bind.annotation.XmlElementWrapper;
031import java.util.List;
032import org.kuali.rice.krms.api.repository.typerelation.RelationshipType;
033import org.kuali.rice.krms.api.repository.typerelation.TypeTypeRelation;
034
035
036@WebService(name = "KRMSTypeService", targetNamespace = KrmsConstants.Namespaces.KRMS_NAMESPACE_2_0)
037@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
038public interface KrmsTypeRepositoryService {
039
040    public static final String CONTEXT_SERVICE_NAME = "contextTypeService";
041    public static final String AGENDA_SERVICE_NAME = "agendaTypeService";
042    public static final String RULE_SERVICE_NAME = "ruleTypeService";
043    public static final String SIMPLE_PROPOSITION_SERVICE_NAME = "simplePropositionTypeService";
044    public static final String COMPOUND_PROPOSITION_SERVICE_NAME = "compoundPropositionTypeService";
045    public static final String TERM_PROPOSITION_PARAMETER_SERVICE_NAME = "termPropositionParameterTypeService";
046    public static final String OPERATOR_PROPOSITION_PARAMETER_SERVICE_NAME = "operatorPropositionParameterTypeService";
047    public static final String CONSTANT_VALUE_PROPOSITION_PARAMETER_SERVICE_NAME = "constantPropositionParameterTypeService";
048    public static final String FUNCTION_PROPOSITION_PARAMETER_SERVICE_NAME = "functionPropositionParameterTypeService";
049    public static final String[] PROPOSITION_SERVICE_NAMES = {SIMPLE_PROPOSITION_SERVICE_NAME,
050        COMPOUND_PROPOSITION_SERVICE_NAME};
051    public static final String[] PROPOSITION_PARAMETER_SERVICE_NAMES = {TERM_PROPOSITION_PARAMETER_SERVICE_NAME,
052        OPERATOR_PROPOSITION_PARAMETER_SERVICE_NAME,
053        CONSTANT_VALUE_PROPOSITION_PARAMETER_SERVICE_NAME,
054        FUNCTION_PROPOSITION_PARAMETER_SERVICE_NAME};
055    public static final String TERM_PARAMETER_SERVICE_NAME = "termParameterTypeService";
056    
057    ////
058    //// type methods
059    ////
060    /**
061     * This will create a {@link KrmsTypeDefinition} exactly like the parameter passed in.
062     *
063     * @param krmsType - KrmsType
064     * @throws IllegalArgumentException if the krmsType is
065     * +
066     * @throws IllegalStateException if the KrmsType already exists in the system
067     */
068    @WebMethod(operationName="createKrmsType")
069    @WebResult(name = "krmsType")
070    @CacheEvict(value={KrmsTypeDefinition.Cache.NAME}, allEntries = true)
071    KrmsTypeDefinition createKrmsType(@WebParam(name = "krmsType") KrmsTypeDefinition krmsType)
072            throws RiceIllegalArgumentException, RiceIllegalStateException;
073
074    /**
075     * This will update an existing {@link KrmsTypeDefinition}
076     *
077     * @param krmsType - KrmsType
078     * @throws IllegalArgumentException if the krmsType is null
079     * @throws IllegalStateException if the KrmsType does not exist in the system
080     */
081    @WebMethod(operationName="updateKrmsType")
082    @WebResult(name = "krmsType")
083    @CacheEvict(value={KrmsTypeDefinition.Cache.NAME}, allEntries = true)
084    KrmsTypeDefinition updateKrmsType(@WebParam(name = "krmsType") KrmsTypeDefinition krmsType)
085            throws RiceIllegalArgumentException, RiceIllegalStateException;
086
087    /**
088     * Lookup a krms type based on the given id.
089     *
090     * @param id the given KRMS type id
091     * @return a KRMS KrmsType object with the given id.  A null reference is returned if an invalid or
092     *         non-existant id is supplied.
093     */
094    @WebMethod(operationName = "getTypeById")
095    @WebResult(name = "type")
096    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'id=' + #p0")
097    KrmsTypeDefinition getTypeById(@WebParam(name = "id") String id)
098            throws RiceIllegalArgumentException;
099
100    /**
101     * Get a krms type object based on name and namespace
102     *
103     * @param namespaceCode the given type namespace
104     * @param name the given type name
105     *
106     * @return A krms type object with the given namespace and name if one with that name and namespace
107     *         exists.  Otherwise, null is returned.
108     *
109     * @throws RiceIllegalArgumentException if the given namespaceCode or name is a null or blank value
110     * @throws RiceIllegalStateException if multiple krms types exist with the same name and namespace
111     */
112    @WebMethod(operationName = "getTypeByName")
113    @WebResult(name = "type")
114    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'namespaceCode=' + #p0 + '|' + 'name=' + #p1")
115    KrmsTypeDefinition getTypeByName(
116            @WebParam(name = "namespaceCode") String namespaceCode,
117            @WebParam(name = "name") String name)
118            throws RiceIllegalArgumentException, RiceIllegalStateException;
119
120    /**
121     * Returns all KRMS types that for a given namespace.
122     *
123     * @return all KRMS types for a namespace
124     * @throws IllegalArgumentException if the given namespaceCode is a null or blank value
125     */
126    @WebMethod(operationName = "findAllTypesByNamespace")
127    @XmlElementWrapper(name = "namespaceTypes", required = true)
128    @XmlElement(name = "namespaceType", required = false)
129    @WebResult(name = "namespaceTypes")
130    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'allByNamespaceCode=' + #p0")
131    List<KrmsTypeDefinition> findAllTypesByNamespace(
132            @WebParam(name = "namespaceCode") String namespaceCode)
133            throws RiceIllegalArgumentException;
134
135    /**
136     * Returns all KRMS types
137     *
138     * @return all KRMS types
139     */
140    @WebMethod(operationName = "findAllTypes")
141    @XmlElementWrapper(name = "types", required = true)
142    @XmlElement(name = "type", required = false)
143    @WebResult(name = "types")
144    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'all'")
145    List<KrmsTypeDefinition> findAllTypes();
146
147    /**
148     * Returns all agenda types for the given contextId.
149     *
150     * @param contextId the id of the context
151     * @return all agenda types for the given contextId
152     * @throws IllegalArgumentException if the given contextId is a null or blank value
153     */
154    @WebMethod(operationName = "findAllAgendaTypesByContextId")
155    @XmlElementWrapper(name = "agendaTypes", required = true)
156    @XmlElement(name = "agendaType", required = false)
157    @WebResult(name = "agendaTypes")
158    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'{AgendaType}contextId=' + #p0")
159    List<KrmsTypeDefinition> findAllAgendaTypesByContextId(
160            @WebParam(name="contextId") String contextId)
161            throws RiceIllegalArgumentException;
162
163    /**
164     * Return the agenda type by agendaItemId for the given contextId.
165     *
166     * @param agendaTypeId the id of the agendaType
167     * @param contextId the id of the context
168     * @return agendaType or null if none is found
169     * @throws IllegalArgumentException if the given agendaTypeId or contextId is a null or blank value
170     */
171    @WebMethod(operationName = "getAgendaTypeByAgendaTypeIdAndContextId")
172    @WebResult(name = "type")
173    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'agendaTypeId=' + #p0 + '|' + 'contextId=' + #p1")
174    KrmsTypeDefinition getAgendaTypeByAgendaTypeIdAndContextId(
175            @WebParam(name="agendaTypeId") String agendaTypeId,
176            @WebParam(name="contextId") String contextId)
177            throws RiceIllegalArgumentException;
178
179    /**
180     * Returns all rule types for the given contextId.
181     *
182     * @param contextId the id of the context
183     * @return all rule types for the given contextId
184     * @throws IllegalArgumentException if the given contextId is a null or blank value
185     */
186    @WebMethod(operationName = "findAllRuleTypesByContextId")
187    @XmlElementWrapper(name = "ruleTypes", required = true)
188    @XmlElement(name = "ruleType", required = false)
189    @WebResult(name = "ruleTypes")
190    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'{RuleType}contextId=' + #p0")
191    List<KrmsTypeDefinition> findAllRuleTypesByContextId(
192            @WebParam(name="contextId") String contextId)
193            throws RiceIllegalArgumentException;
194
195    /**
196     * Return the rule type by ruleItemId for the given contextId.
197     *
198     * @param ruleTypeId the id of the ruleType
199     * @param contextId the id of the context
200     * @return ruleType or null if none is found
201     * @throws IllegalArgumentException if the given ruleTypeId or contextId is a null or blank value
202     */
203    @WebMethod(operationName = "getRuleTypeByRuleTypeIdAndContextId")
204    @WebResult(name = "ruleType")
205    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'ruleTypeId=' + #p0 + '|' + 'contextId=' + #p1")
206    KrmsTypeDefinition getRuleTypeByRuleTypeIdAndContextId(
207            @WebParam(name="ruleTypeId") String ruleTypeId,
208            @WebParam(name="contextId") String contextId)
209            throws RiceIllegalArgumentException;
210
211    /**
212     * Returns all action types for the given contextId.
213     *
214     * @param contextId the id of the context
215     * @return all action types for the given contextId
216     * @throws IllegalArgumentException if the given contextId is a null or blank value
217     */
218    @WebMethod(operationName = "findAllActionTypesByContextId")
219    @XmlElementWrapper(name = "actionTypes", required = true)
220    @XmlElement(name = "actionType", required = false)
221    @WebResult(name = "actionTypes")
222    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'{ActionType}contextId=' + #p0")
223    List<KrmsTypeDefinition> findAllActionTypesByContextId(
224            @WebParam(name="contextId") String contextId)
225            throws RiceIllegalArgumentException;
226
227    /**
228     * Return the action type by actionItemId for the given contextId.
229     *
230     * @param actionTypeId the id of the actionType
231     * @param contextId the id of the context
232     * @return actionType or null if none is found
233     * @throws IllegalArgumentException if the given actionTypeId or contextId is a null or blank value
234     */
235    @WebMethod(operationName = "getActionTypeByActionTypeIdAndContextId")
236    @WebResult(name = "actionType")
237    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'actionTypeId=' + #p0 + '|' + 'contextId=' + #p1")
238    KrmsTypeDefinition getActionTypeByActionTypeIdAndContextId(
239            @WebParam(name="actionTypeId") String actionTypeId,
240            @WebParam(name="contextId") String contextId)
241            throws RiceIllegalArgumentException;
242
243    /**
244     * Retrieves an attribute definition for the given id.
245     *
246     * @param attributeDefinitionId the id of the attribute definition to retrieve
247     *
248     * @return the attribute definition matching the given id, or null if no corresponding attribute definition could
249     * be found with the given id value
250     * @throws IllegalArgumentException if the given attributeDefinitionId is a null or blank value
251     */
252    @WebMethod(operationName = "getAttributeDefinitionById")
253    @WebResult(name = "attribute")
254    @Cacheable(value= KrmsAttributeDefinition.Cache.NAME, key="'attributeDefinitionId=' + #p0")
255    KrmsAttributeDefinition getAttributeDefinitionById(@WebParam(name = "attributeDefinitionId") String attributeDefinitionId)
256            throws RiceIllegalArgumentException;
257
258    /**
259     * Retrieves an attribute definition for the given namespace code and name.
260     *
261     * @param namespaceCode the namespace under which to locate the attribute definition
262     * @param name the name of the attribute definition to retrieve
263     *
264     * @return the attribute definition matching the give namespace code and name, or null if no corresponding attribute
265     * definition could be located
266     *
267     * @throws RiceIllegalArgumentException if the given namespaceCode or name is a null or blank value
268     */
269    @WebMethod(operationName = "getAttributeDefinitionByName")
270    @WebResult(name = "attribute")
271    @Cacheable(value= KrmsAttributeDefinition.Cache.NAME, key="'namespaceCode=' + #p0 + '|' + 'name=' + #p1")
272    KrmsAttributeDefinition getAttributeDefinitionByName(
273            @WebParam(name = "namespaceCode") String namespaceCode,
274            @WebParam(name = "name") String name) throws RiceIllegalArgumentException;
275
276    ////
277    //// type type relation methods
278    ////
279    /**
280     * This will create a {@link TypeTypeRelation} exactly like the parameter
281     * passed in.
282     *
283     * @param typeTypeRelation The TypeTypeRelation to create.
284     * @throws IllegalArgumentException if the TypeTypeRelation is null.
285     * @throws IllegalStateException if the TypeTypeRelation already exists in
286     * the system.
287     * @return a {@link TypeTypeRelation} exactly like the parameter passed in.
288     *
289     */
290    @WebMethod(operationName = "createTypeTypeRelation")
291    @WebResult(name = "typeTypeRelation")
292    TypeTypeRelation createTypeTypeRelation(@WebParam(name = "typeTypeRelation") TypeTypeRelation typeTypeRelation)
293            throws RiceIllegalArgumentException;
294
295    /**
296     * Retrieves a TypeTypeRelation from the repository based on the given id.
297     *
298     * @param typeTypeRelationId to retrieve.
299     * @return a {@link TypeTypeRelation} identified by the given id. A null
300     * reference is returned if an invalid or non-existent id is supplied.
301     *
302     */
303    @WebMethod(operationName = "getTypeTypeRelation")
304    @WebResult(name = "typeTypeRelation")
305    TypeTypeRelation getTypeTypeRelation(@WebParam(name = "typeTypeRelationId") String typeTypeRelationId)
306            throws RiceIllegalArgumentException;
307
308    /**
309     * This will update an existing {@link TypeTypeRelation}.
310     *
311     * @param typeTypeRelation The TypeTypeRelation to update.
312     * @throws IllegalArgumentException if the TypeTypeRelation is null.
313     * @throws IllegalStateException if the TypeTypeRelation does not exists in
314     * the system.
315     *
316     */
317    @WebMethod(operationName = "updateTypeTypeRelation")
318    void updateTypeTypeRelation(@WebParam(name = "typeTypeRelation") TypeTypeRelation typeTypeRelation)
319            throws RiceIllegalArgumentException;
320
321    /**
322     * Delete the {@link TypeTypeRelation} with the given id.
323     *
324     * @param typeTypeRelationId to delete.
325     * @throws IllegalArgumentException if the TypeTypeRelation is null.
326     * @throws IllegalStateException if the TypeTypeRelation does not exists in
327     * the system
328     *
329     */
330    @WebMethod(operationName = "deleteTypeTypeRelation")
331    void deleteTypeTypeRelation(@WebParam(name = "typeTypeRelationId") String typeTypeRelationId)
332            throws RiceIllegalArgumentException;
333
334    /**
335     * find type type relations by from type
336     *
337     * @param fromTypeId to search on
338     * @return relations that match the from type
339     */
340    @WebMethod(operationName = "findTypeTypeRelationsByFromType")
341    @XmlElementWrapper(name = "typeTypeRelations", required = true)
342    @XmlElement(name = "typeTypeRelation", required = false)
343    @WebResult(name = "typeTypeRelations")
344    List<TypeTypeRelation> findTypeTypeRelationsByFromType(@WebParam(name = "fromTypeId") String fromTypeId)
345            throws RiceIllegalArgumentException;
346
347    /**
348     * find type type relations by To type
349     *
350     * @param toTypeId to type to search on
351     * @return types with that type in the 2nd position in the relationship
352     */
353    @WebMethod(operationName = "findTypeTypeRelationsByToType")
354    @XmlElementWrapper(name = "typeTypeRelations", required = true)
355    @XmlElement(name = "typeTypeRelation", required = false)
356    @WebResult(name = "typeTypeRelations")
357    List<TypeTypeRelation> findTypeTypeRelationsByToType(@WebParam(name = "toTypeId") String toTypeId)
358            throws RiceIllegalArgumentException;
359
360    /**
361     * find type type relations by relationship type
362     *
363     * @param relationshipType to search on
364     * @return type type relations given the specified type
365     */
366    @WebMethod(operationName = "findTypeTypeRelationsByRelationshipType")
367    @XmlElementWrapper(name = "typeTypeRelations", required = true)
368    @XmlElement(name = "typeTypeRelation", required = false)
369    @WebResult(name = "typeTypeRelations")
370    List<TypeTypeRelation> findTypeTypeRelationsByRelationshipType(@WebParam(name = "relationshipType") RelationshipType relationshipType)
371            throws RiceIllegalArgumentException;
372
373    /**
374     * Returns all KRMS types that for a given serviceName
375     *
376     * @return all KRMS types for a serviceName
377     * @throws IllegalArgumentException if the given serviceName is a null or
378     * blank value
379     */
380    @WebMethod(operationName = "findAllTypesByServiceName")
381    @XmlElementWrapper(name = "serviceNameTypes", required = true)
382    @XmlElement(name = "serviceNameType", required = false)
383    @WebResult(name = "serviceNameTypes")
384    // TODO: put in CACHING if we want/need it
385//    @Cacheable(value= KrmsTypeDefinition.Cache.NAME, key="'allByNamespaceCode=' + #p0")
386    List<KrmsTypeDefinition> findAllTypesByServiceName(
387            @WebParam(name = "serviceName") String serviceName)
388            throws RiceIllegalArgumentException;
389
390    /**
391     * find all context types
392     *
393     * @return types that are valid for contexts
394     */
395    @WebMethod(operationName = "findAllContextTypes")
396    @XmlElementWrapper(name = "contextTypes", required = true)
397    @XmlElement(name = "contextType", required = false)
398    @WebResult(name = "contextTypes")
399    List<KrmsTypeDefinition> findAllContextTypes()
400            throws RiceIllegalArgumentException;
401
402    /**
403     * find all agenda types
404     *
405     * @return types that are valid for agendas
406     */
407    @WebMethod(operationName = "findAllAgendaTypes")
408    @XmlElementWrapper(name = "agendaTypes", required = true)
409    @XmlElement(name = "agendaType", required = false)
410    @WebResult(name = "agendaTypes")
411    List<KrmsTypeDefinition> findAllAgendaTypes()
412            throws RiceIllegalArgumentException;
413
414    /**
415     * find all agenda types for context type
416     *
417     * @param contextTypeId to search on
418     * @return types that are valid for agendas
419     */
420    @WebMethod(operationName = "findAgendaTypesForContextType")
421    @XmlElementWrapper(name = "agendaTypes", required = true)
422    @XmlElement(name = "agendaType", required = false)
423    @WebResult(name = "agendaTypes")
424    List<KrmsTypeDefinition> findAgendaTypesForContextType(@WebParam(name = "contextTypeId") String contextTypeId)
425            throws RiceIllegalArgumentException;
426
427    /**
428     * find all agenda types for context type
429     *
430     * @param agendaTypeId to search on
431     * @return types that are valid for agendas
432     */
433    @WebMethod(operationName = "findAgendaTypesForAgendaType")
434    @XmlElementWrapper(name = "agendaTypes", required = true)
435    @XmlElement(name = "agendaType", required = false)
436    @WebResult(name = "agendaTypes")
437    List<KrmsTypeDefinition> findAgendaTypesForAgendaType(@WebParam(name = "agendaTypeId") String agendaTypeId)
438            throws RiceIllegalArgumentException;
439
440    /**
441     * find all rule types
442     *
443     * @return types that are valid for rules
444     */
445    @WebMethod(operationName = "findAllRuleTypes")
446    @XmlElementWrapper(name = "ruleTypes", required = true)
447    @XmlElement(name = "ruleType", required = false)
448    @WebResult(name = "ruleTypes")
449    List<KrmsTypeDefinition> findAllRuleTypes()
450            throws RiceIllegalArgumentException;
451
452    /**
453     * find the rule types for the specified agenda type
454     *
455     * @param agendaTypeId to search on
456     * @return types that are valid for rules
457     */
458    @WebMethod(operationName = "findRuleTypesForAgendaType")
459    @XmlElementWrapper(name = "ruleTypes", required = true)
460    @XmlElement(name = "ruleType", required = false)
461    @WebResult(name = "ruleTypes")
462    List<KrmsTypeDefinition> findRuleTypesForAgendaType(@WebParam(name = "agendaTypeId") String agendaTypeId)
463            throws RiceIllegalArgumentException;
464
465    /**
466     * find all Proposition types
467     *
468     * @return types that are valid for propositions
469     */
470    @WebMethod(operationName = "findAllPropositionTypes")
471    @XmlElementWrapper(name = "propositionTypes", required = true)
472    @XmlElement(name = "propositionType", required = false)
473    @WebResult(name = "propositionTypes")
474    List<KrmsTypeDefinition> findAllPropositionTypes()
475            throws RiceIllegalArgumentException;
476
477    /**
478     * find all Proposition types for the specified rule type
479     *
480     * @param ruleTypeId to search on
481     * @return types that are valid for propositions
482     */
483    @WebMethod(operationName = "findPropositionTypesForRuleType")
484    @XmlElementWrapper(name = "propositionTypes", required = true)
485    @XmlElement(name = "propositionType", required = false)
486    @WebResult(name = "propositionTypes")
487    List<KrmsTypeDefinition> findPropositionTypesForRuleType(@WebParam(name = "ruleTypeId") String ruleTypeId)
488            throws RiceIllegalArgumentException;
489
490    /**
491     * find all Proposition Parameter types
492     *
493     * @return types that are valid for proposition parameters
494     */
495    @WebMethod(operationName = "findAllPropositionParameterTypes")
496    @XmlElementWrapper(name = "propositionParameterTypes", required = true)
497    @XmlElement(name = "propositionParameterType", required = false)
498    @WebResult(name = "propositionParameterTypes")
499    List<KrmsTypeDefinition> findAllPropositionParameterTypes()
500            throws RiceIllegalArgumentException;
501
502    /**
503     * find Proposition Parameter types for the specified proposition type
504     *
505     * @param propositionTypeId to search on
506     * @return types that are valid for proposition parameters
507     */
508    @WebMethod(operationName = "findPropositionParameterTypesForPropositionType")
509    @XmlElementWrapper(name = "propositionParameterTypes", required = true)
510    @XmlElement(name = "propositionParameterType", required = false)
511    @WebResult(name = "propositionParameterTypes")
512    List<KrmsTypeDefinition> findPropositionParameterTypesForPropositionType(@WebParam(name = "propositionTypeId") String propositionTypeId)
513            throws RiceIllegalArgumentException;
514    
515
516    /**
517     * find term parameter types for the given Term based Proposition Parameter type
518     *
519     * @param termPropositionParameterTypeId to search on
520     * @return types that are valid as term parameters
521     */
522    @WebMethod(operationName = "findTermParameterTypesForTermPropositionParameterType")
523    @XmlElementWrapper(name = "termParameterTypes", required = true)
524    @XmlElement(name = "termParameterType", required = false)
525    @WebResult(name = "termParameterTypes")
526    List<KrmsTypeDefinition> findTermParameterTypesForTermPropositionParameterType(@WebParam(name = "termPropositionParameterTypeId") String termPropositionParameterTypeId)
527            throws RiceIllegalArgumentException;
528
529}