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;
017
018import org.kuali.rice.core.api.criteria.QueryByCriteria;
019import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
020import org.kuali.rice.krms.api.KrmsConstants;
021import org.kuali.rice.krms.api.repository.agenda.AgendaDefinition;
022import org.kuali.rice.krms.api.repository.agenda.AgendaItemDefinition;
023import org.kuali.rice.krms.api.repository.context.ContextDefinition;
024import org.kuali.rice.krms.api.repository.language.NaturalLanguageUsage;
025import org.kuali.rice.krms.api.repository.proposition.PropositionDefinition;
026import org.kuali.rice.krms.api.repository.reference.ReferenceObjectBinding;
027import org.kuali.rice.krms.api.repository.rule.RuleDefinition;
028import org.springframework.cache.annotation.CacheEvict;
029import org.springframework.cache.annotation.Cacheable;
030
031import javax.jws.WebMethod;
032import javax.jws.WebParam;
033import javax.jws.WebResult;
034import javax.jws.WebService;
035import javax.jws.soap.SOAPBinding;
036import javax.xml.bind.annotation.XmlElement;
037import javax.xml.bind.annotation.XmlElementWrapper;
038import java.util.List;
039import java.util.Set;
040import org.kuali.rice.krms.api.repository.action.ActionDefinition;
041import org.kuali.rice.krms.api.repository.agenda.AgendaTreeDefinition;
042import org.kuali.rice.krms.api.repository.context.ContextSelectionCriteria;
043import org.kuali.rice.krms.api.repository.language.NaturalLanguageTemplate;
044
045/**
046 * The rule maintenance service operations facilitate management of rules and
047 * associated information.
048 *
049 * @author Kuali Rice Team (rice.collab@kuali.org)
050 */
051@WebService(name = "ruleManagementService", targetNamespace = KrmsConstants.Namespaces.KRMS_NAMESPACE_2_0)
052@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL,
053parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
054public interface RuleManagementService extends TranslateBusinessMethods {
055
056    /**
057     * Create RefObject-KRMS object binding
058     *
059     * @param referenceObjectDefinition  data for the new ReferenceObjectBinding to be created
060     * @return newly created ReferenceObjectBinding
061     * @throws RiceIllegalArgumentException if the given referenceObjectDefinition
062     *                                      is null or invalid
063     */
064    @WebMethod(operationName = "createReferenceObjectBinding")
065    @WebResult(name = "referenceObjectBinding")
066    @CacheEvict(value={ReferenceObjectBinding.Cache.NAME}, allEntries = true)
067    public ReferenceObjectBinding createReferenceObjectBinding(@WebParam(
068            name = "referenceObjectDefinition") ReferenceObjectBinding referenceObjectDefinition) throws RiceIllegalArgumentException;
069
070    /**
071     * Retrieve referenceObjectBinding  given a specific id
072     *
073     * @param id identifier of the ReferenceObjectBinding to be retrieved
074     * @return a ReferenceObjectBinding with the given id value
075     * @throws RiceIllegalArgumentException if the given  id is blank or
076     *                                      invalid
077     */
078    @WebMethod(operationName = "getReferenceObjectBinding")
079    @WebResult(name = "referenceObjectBinding")
080    @Cacheable(value= ReferenceObjectBinding.Cache.NAME, key="'id=' + #p0")
081    public ReferenceObjectBinding getReferenceObjectBinding(@WebParam(
082            name = "id") String id) throws RiceIllegalArgumentException;
083
084    /**
085     * Retrieve list of ReferenceObjectBinding objects given ids
086     *
087     * @param ids identifiers of the ReferenceObjectBinding to be retrieved
088     * @return list of ReferenceObjectBinding objects for the given ids
089     * @throws RiceIllegalArgumentException if one or more ids in the give list
090     *                                      is blank or invalid
091     */
092    @WebMethod(operationName = "getReferenceObjectBindings")
093    @XmlElementWrapper(name = "referenceObjectBindings", required = true)
094    @XmlElement(name = "referenceObjectBinding", required = false)
095    @WebResult(name = "referenceObjectBindings")
096    @Cacheable(value= ReferenceObjectBinding.Cache.NAME, key="'ids=' + #p0")
097    List<ReferenceObjectBinding> getReferenceObjectBindings(@WebParam(
098            name = "ids") List<String> ids) throws RiceIllegalArgumentException;
099
100    /**
101     * Retrieves list of ReferenceObjectBinding objects for the given ref obj
102     * discriminator type
103     *
104     * @param referenceObjectReferenceDiscriminatorType  reference object type
105     * @return list of ReferenceObjectBinding objects for the given discriminator
106     *         type
107     * @throws RiceIllegalArgumentException if the given  referenceObjectReferenceDiscriminatorType is
108     *                                      blank or invalid
109     */
110    @WebMethod(operationName = "findReferenceObjectBindingsByReferenceDiscriminatorType")
111    @XmlElementWrapper(name = "referenceObjectBindings", required = true)
112    @XmlElement(name = "referenceObjectBinding", required = false)
113    @WebResult(name = "referenceObjectBindings")
114    @Cacheable(value= ReferenceObjectBinding.Cache.NAME, key="'referenceObjectReferenceDiscriminatorType=' + #p0")
115    public List<ReferenceObjectBinding> findReferenceObjectBindingsByReferenceDiscriminatorType(
116            @WebParam(name = "referenceObjectReferenceDiscriminatorType") String referenceObjectReferenceDiscriminatorType) throws RiceIllegalArgumentException;
117
118    /**
119     * Retrieves list of ReferenceObjectBinding objects for the given krms obj
120     * discriminator type
121     *
122     * @param referenceObjectKrmsDiscriminatorType  reference object type
123     * @return list of ReferenceObjectBinding objects for the given discriminator
124     *         type
125     * @throws RiceIllegalArgumentException if the given  referenceObjectKrmsDiscriminatorType is
126     *                                      blank or invalid
127     */
128    @WebMethod(operationName = "findReferenceObjectBindingsByKrmsDiscriminatorType")
129    @XmlElementWrapper(name = "referenceObjectBindings", required = true)
130    @XmlElement(name = "referenceObjectBinding", required = false)
131    @WebResult(name = "referenceObjectBindings")
132    @Cacheable(value= ReferenceObjectBinding.Cache.NAME, key="'referenceObjectKrmsDiscriminatorType=' + #p0")
133    public List<ReferenceObjectBinding> findReferenceObjectBindingsByKrmsDiscriminatorType(
134            @WebParam(name = "referenceObjectKrmsDiscriminatorType") String referenceObjectKrmsDiscriminatorType) throws RiceIllegalArgumentException;
135
136    
137    /**
138     * Retrieves list of ReferenceObjectBinding objects for the given obj
139     * discriminator type and reference object id
140     *
141     * @param referenceObjectReferenceDiscriminatorType  reference object type
142     * @param referenceObjectId reference object id
143     * @return list of ReferenceObjectBinding objects for the given discriminator
144     *         type
145     * @throws RiceIllegalArgumentException if the given  referenceObjectKrmsDiscriminatorType or id is
146     *                                      blank or invalid
147     */
148    @WebMethod(operationName = "findReferenceObjectBindingsByReferenceObject")
149    @XmlElementWrapper(name = "referenceObjectBindings", required = true)
150    @XmlElement(name = "referenceObjectBinding", required = false)
151    @WebResult(name = "referenceObjectBindings")
152    @Cacheable(value= ReferenceObjectBinding.Cache.NAME, key="'referenceObjectReferenceDiscriminatorType=' + #p0 + '|' + 'referenceObjectId=' + #p1")
153    public List<ReferenceObjectBinding> findReferenceObjectBindingsByReferenceObject (
154            @WebParam(name = "referenceObjectReferenceDiscriminatorType") String referenceObjectReferenceDiscriminatorType, 
155            @WebParam(name = "referenceObjectId") String referenceObjectId) 
156            throws RiceIllegalArgumentException;
157    
158    /**
159     * Retrieves list of ReferenceObjectBinding objects for the given KRMS obj
160     * id.
161     *
162     * @param krmsObjectId identifier of the KRMS obj
163     * @return list of ReferenceObjectBinding objects for the given KRMS obj
164     * @throws RiceIllegalArgumentException if the given krmsObjectId is blank or
165     *                                      invalid
166     */
167    @WebMethod(operationName = "findReferenceObjectBindingsByKrmsObjectId")
168    @XmlElementWrapper(name = "referenceObjectBindings", required = true)
169    @XmlElement(name = "referenceObjectBinding", required = false)
170    @WebResult(name = "referenceObjectBindings")
171    @Cacheable(value= ReferenceObjectBinding.Cache.NAME, key="'krmsObjectId=' + #p0")
172    public List<ReferenceObjectBinding> findReferenceObjectBindingsByKrmsObject(
173            @WebParam(name = "krmsObjectId") String krmsObjectId) throws RiceIllegalArgumentException;
174
175    /**
176     * Update the ReferenceObjectBinding object specified by the identifier in the
177     * given DTO
178     *
179     * @param referenceObjectBindingDefinition DTO with updated info and id of the object to be updated
180     * @throws RiceIllegalArgumentException if the given  referenceObjectBindingDefinition
181     *                                      is null or invalid
182     */
183    @WebMethod(operationName = "updateReferenceObjectBinding")
184    @CacheEvict(value={ReferenceObjectBinding.Cache.NAME}, allEntries = true)
185    public void updateReferenceObjectBinding(ReferenceObjectBinding referenceObjectBindingDefinition) throws RiceIllegalArgumentException;
186
187    /**
188     * Delete the specified ReferenceObjectBinding object
189     *
190     * @param id identifier of the object to be deleted
191     * @throws RiceIllegalArgumentException if the given  id is null or invalid
192     */
193    @WebMethod(operationName = "deleteReferenceObjectBinding")
194    @CacheEvict(value={ReferenceObjectBinding.Cache.NAME}, allEntries = true)
195    public void deleteReferenceObjectBinding(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
196
197
198    /**
199     * Query for ReferenceObjectBinding ids based on the given search criteria
200     * which is a Map of ReferenceObjectBinding field names to values. <p/> <p>
201     * This method returns it's results as a List of ReferenceObjectBinding ids
202     * that match the given search criteria. </p>
203     *
204     * @param queryByCriteria the criteria.  Cannot be null.
205     * @return a list of ids matching the given criteria properties.  An empty
206     *         list is returned if an invalid or non-existent criteria is
207     *         supplied.
208     * @throws RiceIllegalArgumentException if the queryByCriteria is null
209     */
210    @WebMethod(operationName = "findReferenceObjectBindingIds")
211    @XmlElementWrapper(name = "referenceObjectBindingIds", required = true)
212    @XmlElement(name = "referenceObjectBindingId", required = false)
213    @WebResult(name = "referenceObjectBindingIds")
214    List<String> findReferenceObjectBindingIds(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
215
216    ////
217    //// agenda methods
218    ////
219    /**
220     * Create Agenda and an empty first item
221     *
222     * @param agendaDefinition data for the new Agenda to be created
223     * @return newly created Agenda
224     * @throws RiceIllegalArgumentException if the given agendaDefinition is
225     *                                      null or invalid
226     */
227    @WebMethod(operationName = "createAgenda")
228    @WebResult(name = "agenda")
229    @CacheEvict(value={AgendaTreeDefinition.Cache.NAME, AgendaDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME, ContextDefinition.Cache.NAME}, allEntries = true)
230    public AgendaDefinition createAgenda(@WebParam(name = "AgendaDefinition") AgendaDefinition agendaDefinition) throws RiceIllegalArgumentException;
231
232    /**
233     * Create Agenda if not found by contextId and name
234     *
235     * @param agendaDefinition data for the new Agenda to be created
236     * @return newly created or found Agenda
237     * @throws RiceIllegalArgumentException if the given agendaDefinition is
238     *                                      null or invalid
239     */
240    @WebMethod(operationName = "findCreateAgenda")
241    @WebResult(name = "agenda")
242    @CacheEvict(value={AgendaTreeDefinition.Cache.NAME, AgendaDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME, ContextDefinition.Cache.NAME}, allEntries = true)
243    public AgendaDefinition findCreateAgenda(@WebParam(name = "AgendaDefinition") AgendaDefinition agendaDefinition) throws RiceIllegalArgumentException;
244
245    /**
246     * Retrieve Agenda for the specified id
247     *
248     * @param id identifier for the Agenda
249     * @return specified Agenda
250     * @throws RiceIllegalArgumentException if the given id is null or invalid
251     */
252    @WebMethod(operationName = "getAgenda")
253    @WebResult(name = "agenda")
254    @Cacheable(value= AgendaDefinition.Cache.NAME, key="'id=' + #p0")
255    public AgendaDefinition getAgenda(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
256
257    /**
258     * Retrieves an Agenda from the repository based on the provided agenda name
259     * and context id.
260     *
261     * @param name the name of the Agenda to retrieve.
262     * @param contextId the id of the context that the agenda belongs to.
263     * @return an {@link AgendaDefinition} identified by the given name and namespace.  
264     * A null reference is returned if an invalid or non-existent name and
265     * namespace combination is supplied.
266     */
267    @WebMethod(operationName = "getAgendaByNameAndContextId")
268    @WebResult(name = "agenda")
269    @Cacheable(value= AgendaDefinition.Cache.NAME, key="'name=' + #p0 + '|' + 'contextId=' + #p1")
270    public AgendaDefinition getAgendaByNameAndContextId (@WebParam(name = "name") String name,
271                                                         @WebParam(name = "contextId") String contextId);
272    
273    /**
274     * Retrieve Agendas of the specified type
275     *
276     * @param typeId type of the Agenda
277     * @return list of Agendas of the specified type
278     * @throws RiceIllegalArgumentException if the given typeId is null or
279     *                                      invalid
280     */
281    @WebMethod(operationName = "getAgendasByType")
282    @XmlElementWrapper(name = "agendas", required = true)
283    @XmlElement(name = "agenda", required = false)
284    @WebResult(name = "agendas")
285    @Cacheable(value= AgendaDefinition.Cache.NAME, key="'typeId=' + #p0")
286    public List<AgendaDefinition> getAgendasByType(@WebParam(name = "typeId") String typeId) throws RiceIllegalArgumentException;
287
288    /**
289     * Retrieve Agendas associated with the specified context
290     *
291     * @param contextId  context of interest
292     * @return list of Agendas associated with the context
293     * @throws RiceIllegalArgumentException if the given contextId is null or
294     *                                      invalid
295     */
296    @WebMethod(operationName = "getAgendasByContext")
297    @XmlElementWrapper(name = "agendas", required = true)
298    @XmlElement(name = "agenda", required = false)
299    @WebResult(name = "agendas")
300    @Cacheable(value= AgendaDefinition.Cache.NAME, key="'contextId=' + #p0")
301    public List<AgendaDefinition> getAgendasByContext(@WebParam(name = "contextId") String contextId) throws RiceIllegalArgumentException;
302
303    /**
304     * Retrieve Agendas of the specified type and context
305     *
306     * @param typeId  type of the Agenda
307     * @param contextId  context of interest
308     * @return list of Agendas associated with the specified type and context
309     * @throws RiceIllegalArgumentException if the given typeId or contextId
310     *                                      null or invalid
311     */
312    @WebMethod(operationName = "getAgendasByTypeAndContext")
313    @XmlElementWrapper(name = "agendas", required = true)
314    @XmlElement(name = "agenda", required = false)
315    @WebResult(name = "agendas")
316    @Cacheable(value= AgendaDefinition.Cache.NAME, key="'typeId=' + #p0 + '|' + 'contextId=' + #p1")
317    public List<AgendaDefinition> getAgendasByTypeAndContext(@WebParam(name = "typeId") String typeId,
318            @WebParam(name = "contextId") String contextId) throws RiceIllegalArgumentException;
319
320    /**
321     * Update the Agenda specified by the identifier in the input DTO
322     *
323     * @param agendaDefinition DTO with updated info and identifier of the object to be updated
324     * @throws RiceIllegalArgumentException if the given agendaDefinition is
325     *                                      null or invalid
326     */
327    @WebMethod(operationName = "updateAgenda")
328    @CacheEvict(value={AgendaTreeDefinition.Cache.NAME, AgendaDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME, ContextDefinition.Cache.NAME}, allEntries = true)
329    public void updateAgenda(@WebParam(name = "agendaDefinition") AgendaDefinition agendaDefinition) throws RiceIllegalArgumentException;
330
331    /**
332     * Delete the specified Agenda
333     *
334     * @param id identifier of the object to be deleted
335     * @throws RiceIllegalArgumentException if the given id is null or invalid
336     */
337    @WebMethod(operationName = "deleteAgenda")
338    @CacheEvict(value={AgendaTreeDefinition.Cache.NAME, AgendaDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME, ContextDefinition.Cache.NAME}, allEntries = true)
339    public void deleteAgenda(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
340
341    ////
342    //// agenda item methods
343    ////
344    /**
345     * Create AgendaItem
346     *
347     * @param agendaItemDefinition  data for the new AgendaItem to be created
348     * @return newly created AgendaItem
349     * @throws RiceIllegalArgumentException if the given agendaItemDefinition is
350     *                                      null or invalid
351     */
352    @WebMethod(operationName = "createAgendaItem")
353    @WebResult(name = "agendaItem")
354    @CacheEvict(value={AgendaTreeDefinition.Cache.NAME, AgendaDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME, ContextDefinition.Cache.NAME}, allEntries = true)
355    public AgendaItemDefinition createAgendaItem(@WebParam(name = "AgendaItemDefinition") AgendaItemDefinition agendaItemDefinition) throws RiceIllegalArgumentException;
356
357    /**
358     * Retrieve AgendaItem by the specified identifier
359     *
360     * @param id identifier of the AgendaItem
361     * @return AgendaItem specified by the identifier
362     * @throws RiceIllegalArgumentException if the given id is null or invalid
363     */
364    @WebMethod(operationName = "getAgendaItem")
365    @WebResult(name = "agendaItem")
366    @Cacheable(value= AgendaItemDefinition.Cache.NAME, key="'id=' + #p0")
367    public AgendaItemDefinition getAgendaItem(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
368
369    /**
370     * Retrieve AgendaItems by specified type
371     *
372     * @param typeId type of the AgendaItems
373     * @return list of AgendaItems of the specified type
374     * @throws RiceIllegalArgumentException if the given typeId is null or
375     *                                      invalid
376     */
377    @WebMethod(operationName = "getAgendaItemsByType")
378    @XmlElementWrapper(name = "agendaItems", required = true)
379    @XmlElement(name = "agendaItem", required = false)
380    @WebResult(name = "agendaItems")
381    @Cacheable(value= AgendaItemDefinition.Cache.NAME, key="'typeId=' + #p0")
382    public List<AgendaItemDefinition> getAgendaItemsByType(@WebParam(name = "typeId") String typeId) throws RiceIllegalArgumentException;
383
384    /**
385     * Retrieve AgendaItems associated with a context
386     *
387     * @param contextId context identifier
388     * @return list of AgendaItems associated with a context
389     * @throws RiceIllegalArgumentException if the given  contextId is null or
390     *                                      invalid
391     */
392    @WebMethod(operationName = "getAgendaItemsByContext")
393    @XmlElementWrapper(name = "agendaItems", required = true)
394    @XmlElement(name = "agendaItem", required = false)
395    @WebResult(name = "agendaItems")
396    @Cacheable(value= AgendaItemDefinition.Cache.NAME, key="'contextId=' + #p0")
397    public List<AgendaItemDefinition> getAgendaItemsByContext(@WebParam(name = "contextId") String contextId) throws RiceIllegalArgumentException;
398
399    /**
400     * Retrieve AgendaItems by type and context
401     *
402     * @param typeId type of the Agendas
403     * @param contextId context with which the Agendas are associated
404     * @return list of AgendaItems of the specified type and context
405     * @throws RiceIllegalArgumentException if the given  typeId or contextId
406     *                                      null or invalid
407     */
408    @WebMethod(operationName = "getAgendaItemsByTypeAndContext")
409    @XmlElementWrapper(name = "agendaItems", required = true)
410    @XmlElement(name = "agendaItem", required = false)
411    @WebResult(name = "agendaItems")
412    @Cacheable(value= AgendaItemDefinition.Cache.NAME, key="'typeId=' + #p0 + '|' + 'contextId=' + #p1")
413    public List<AgendaItemDefinition> getAgendaItemsByTypeAndContext(@WebParam(name = "typeId") String typeId,
414            @WebParam(name = "contextId") String contextId) throws RiceIllegalArgumentException;
415
416    /**
417     * Update an AgendaItem
418     *
419     * @param agendaItemDefinition  updated data for the AgendaItem, with id of the object to be updated
420     * @throws RiceIllegalArgumentException if the given  agendaItemDefinition
421     *                                      is null or invalid
422     */
423    @WebMethod(operationName = "updateAgendaItem")
424    @CacheEvict(value={AgendaTreeDefinition.Cache.NAME, AgendaDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME, ContextDefinition.Cache.NAME}, allEntries = true)
425    public void updateAgendaItem(@WebParam(name = "agendaItemDefinition") AgendaItemDefinition agendaItemDefinition) throws RiceIllegalArgumentException;
426
427    /**
428     * Delete the specified AgendaItem
429     *
430     * @param id identifier of the AgendaItem to be deleted
431     * @throws RiceIllegalArgumentException if the given id is null or invalid
432     */
433    @WebMethod(operationName = "deleteAgendaItem")
434    @CacheEvict(value={AgendaTreeDefinition.Cache.NAME, AgendaDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME, ContextDefinition.Cache.NAME}, allEntries = true)
435    public void deleteAgendaItem(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
436
437    ////
438    //// rule methods
439    ////
440    /**
441     * Create Rule
442     *
443     * @param ruleDefinition data for the new Rule to be created
444     * @return newly created Rule
445     * @throws RiceIllegalArgumentException if the given ruleDefinition is null
446     *                                      or invalid
447     */
448    @WebMethod(operationName = "createRule")
449    @WebResult(name = "rule")
450    @CacheEvict(value={RuleDefinition.Cache.NAME, PropositionDefinition.Cache.NAME, ActionDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME}, allEntries = true)
451    public RuleDefinition createRule(@WebParam(name = "ruleDefinition") RuleDefinition ruleDefinition) throws RiceIllegalArgumentException;
452
453    /**
454     * Retrieves the rule for the given ruleId.  The rule includes the
455     * propositions which define the condition that is to be evaluated on the
456     * rule.  It also defines a collection of actions which will be invoked if
457     * the rule succeeds.
458     *
459     * @param ruleId the id of the rule to retrieve
460     * @return the rule definition, or null if no rule could be located for the
461     *         given ruleId
462     * @throws IllegalArgumentException if the given ruleId is null
463     */
464    @WebMethod(operationName = "getRule")
465    @WebResult(name = "rule")
466    @Cacheable(value= RuleDefinition.Cache.NAME, key="'ruleId=' + #p0")
467    public RuleDefinition getRule(@WebParam(name = "ruleId") String ruleId);
468
469    /**
470     * Retrieves an Rule from the repository based on the provided rule name
471     * and namespace.
472     *
473     * @param name the name of the Rule to retrieve.
474     * @param namespace the namespace that the rule is under.
475     * @return an {@link RuleDefinition} identified by the given name and namespace.
476     * A null reference is returned if an invalid or non-existent name and
477     * namespace combination is supplied.
478     * @throws IllegalArgumentException if the either the name or the namespace
479     * is null or blank.
480     */
481    @WebMethod(operationName = "getRuleByNameAndNamespace")
482    @WebResult(name = "rule")
483    @Cacheable(value= RuleDefinition.Cache.NAME, key="'name=' + #p0 + '|' + 'namespace=' + #p1")
484    public RuleDefinition getRuleByNameAndNamespace(@WebParam(name = "name") String name,
485                                                    @WebParam(name = "namespace") String namespace);
486        
487    /**
488     * Retrieves all of the rules for the given list of ruleIds.  The rule
489     * includes the propositions which define the condition that is to be
490     * evaluated on the rule.  It also defines a collection of actions which
491     * will be invoked if the rule succeeds.
492     * <p/>
493     * <p>The list which is returned from this operation may not be the same
494     * size as the list which is passed to this method.  If a rule doesn't exist
495     * for a given rule id then no result for that id will be returned in the
496     * list.  As a result of this, the returned list can be empty, but it will
497     * never be null.
498     *
499     * @param ruleIds the list of rule ids for which to retrieve the rules
500     * @return the list of rules for the given ids, this list will only contain
501     *         rules for the ids that were resolved successfully, it will never
502     *         return null but could return an empty list if no rules could be
503     *         loaded for the given set of ids
504     * @throws IllegalArgumentException if the given list of ruleIds is null
505     */
506    @WebMethod(operationName = "getRules")
507    @XmlElementWrapper(name = "rules", required = true)
508    @XmlElement(name = "rule", required = false)
509    @WebResult(name = "rules")
510    @Cacheable(value= RuleDefinition.Cache.NAME, key="'ruleIds=' + T(org.kuali.rice.core.api.cache.CacheKeyUtils).key(#p0)")
511    public List<RuleDefinition> getRules(@WebParam(name = "ruleIds") List<String> ruleIds);
512
513    /**
514     * Update the Rule specified by the identifier in the DTO
515     *
516     * @param ruleDefinition updated Rule information, object specified by the id
517     * @throws RiceIllegalArgumentException if the given ruleDefinition is null
518     *                                      or invalid
519     */
520    @WebMethod(operationName = "updateRule")
521    @CacheEvict(value={RuleDefinition.Cache.NAME, PropositionDefinition.Cache.NAME, ActionDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME}, allEntries = true)
522    public void updateRule(@WebParam(name = "ruleDefinition") RuleDefinition ruleDefinition) throws RiceIllegalArgumentException;
523
524    /**
525     * Delete the specified Rule
526     *
527     * @param id identifier of the Rule to be deleted
528     * @throws RiceIllegalArgumentException if the given id is null or invalid
529     */
530    @WebMethod(operationName = "deleteRule")
531    @CacheEvict(value={RuleDefinition.Cache.NAME, PropositionDefinition.Cache.NAME, ActionDefinition.Cache.NAME, AgendaItemDefinition.Cache.NAME}, allEntries = true)
532    public void deleteRule(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
533
534    ////
535    //// action methods
536    ////
537    /**
538     * Create Action
539     *
540     * @param actionDefinition data for the new Action to be created
541     * @return newly created Action
542     * @throws RiceIllegalArgumentException if the given actionDefinition is null
543     * or invalid
544     */
545    @WebMethod(operationName = "createAction")
546    @WebResult(name = "action")
547    @CacheEvict(value={ActionDefinition.Cache.NAME, RuleDefinition.Cache.NAME}, allEntries = true)
548    public ActionDefinition createAction(@WebParam(name = "actionDefinition") ActionDefinition actionDefinition) throws RiceIllegalArgumentException;
549
550    /**
551     * Retrieves the action for the given actionId. The action includes the
552     * propositions which define the condition that is to be evaluated on the
553     * action. It also defines a collection of actions which will be invoked if
554     * the action succeeds.
555     *
556     * @param actionId the id of the action to retrieve
557     * @return the action definition, or null if no action could be located for the
558     * given actionId
559     * @throws IllegalArgumentException if the given actionId is null
560     */
561    @WebMethod(operationName = "getAction")
562    @WebResult(name = "action")
563    @Cacheable(value= ActionDefinition.Cache.NAME, key="'actionId=' + #p0")
564    public ActionDefinition getAction(@WebParam(name = "actionId") String actionId) throws RiceIllegalArgumentException;
565
566    /**
567     * Retrieves all of the actions for the given list of actionIds.
568     * <p/>
569     * <p>The list which is returned from this operation may not be the same
570     * size as the list which is passed to this method. If a action doesn't exist
571     * for a given action id then no result for that id will be returned in the
572     * list. As a result of this, the returned list can be empty, but it will
573     * never be null.
574     *
575     * @param actionIds the list of action ids for which to retrieve the actions
576     * @return the list of actions for the given ids, this list will only contain
577     * actions for the ids that were resolved successfully, it will never return
578     * null but could return an empty list if no actions could be loaded for the
579     * given set of ids
580     * @throws IllegalArgumentException if the given list of actionIds is null
581     */
582    @WebMethod(operationName = "getActions")
583    @XmlElementWrapper(name = "actions", required = true)
584    @XmlElement(name = "action", required = false)
585    @WebResult(name = "actions")
586    @Cacheable(value= ActionDefinition.Cache.NAME, key="'actionIds=' + T(org.kuali.rice.core.api.cache.CacheKeyUtils).key(#p0)")
587    public List<ActionDefinition> getActions(@WebParam(name = "actionIds") List<String> actionIds)  throws RiceIllegalArgumentException;
588
589    /**
590     * Update the Action specified by the identifier in the DTO
591     *
592     * @param actionDefinition updated Action information, object specified by the
593     * id
594     * @throws RiceIllegalArgumentException if the given actionDefinition is null
595     * or invalid
596     */
597    @WebMethod(operationName = "updateAction")
598    @CacheEvict(value={ActionDefinition.Cache.NAME, RuleDefinition.Cache.NAME}, allEntries = true)
599    public void updateAction(@WebParam(name = "actionDefinition") ActionDefinition actionDefinition) throws RiceIllegalArgumentException;
600
601    /**
602     * Delete the specified Action
603     *
604     * @param id identifier of the Action to be deleted
605     * @throws RiceIllegalArgumentException if the given id is null or invalid
606     */
607    @WebMethod(operationName = "deleteAction")
608    @CacheEvict(value={ActionDefinition.Cache.NAME, RuleDefinition.Cache.NAME}, allEntries = true)
609    public void deleteAction(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
610  
611    
612    ////
613    //// proposition methods
614    ////
615    /**
616     * Create a Proposition
617     *
618     * @param propositionDefinition data for the new Proposition to be created
619     * @return newly created Proposition
620     * @throws RiceIllegalArgumentException if the given propositionDefinition
621     *                                      is null or invalid
622     */
623    @WebMethod(operationName = "createProposition")
624    @WebResult(name = "proposition")
625    @CacheEvict(value={PropositionDefinition.Cache.NAME, RuleDefinition.Cache.NAME}, allEntries = true)
626    public PropositionDefinition createProposition(@WebParam(name = "propositionDefinition") PropositionDefinition propositionDefinition) throws RiceIllegalArgumentException;
627
628    /**
629     * Retrieve Proposition specified by the identifier
630     *
631     * @param id identifier of the Proposition to be retrieved
632     * @return specified Proposition
633     * @throws RiceIllegalArgumentException if the given id is null or invalid
634     */
635    @WebMethod(operationName = "getProposition")
636    @WebResult(name = "proposition")
637    @Cacheable(value= PropositionDefinition.Cache.NAME, key="'id=' + #p0")
638    public PropositionDefinition getProposition(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
639
640    /**
641     * Retrieve Propositions of the specified type
642     *
643     * @param typeId type of the Propositions to be retrieved
644     * @return list of Propositions of the specified type
645     * @throws RiceIllegalArgumentException if the given typeId is null or
646     *                                      invalid
647     */
648    @WebMethod(operationName = "getPropositionsByType")
649    @XmlElementWrapper(name = "propositions", required = true)
650    @XmlElement(name = "proposition", required = false)
651    @WebResult(name = "propositions")
652    @Cacheable(value= PropositionDefinition.Cache.NAME, key="'typeId=' + #p0")
653    public Set<PropositionDefinition> getPropositionsByType(@WebParam(name = "typeId") String typeId) throws RiceIllegalArgumentException;
654
655    /**
656     * Retrieve Propositions associated with the specified Rule
657     *
658     * @param ruleId identifier of the Rule to which the Propositions are associated with
659     * @return list of Propositions associated with the Rule
660     * @throws RiceIllegalArgumentException if the given ruleId is null or
661     *                                      invalid
662     */
663    @WebMethod(operationName = "getPropositionsByRule")
664    @XmlElementWrapper(name = "propositions", required = true)
665    @XmlElement(name = "proposition", required = false)
666    @WebResult(name = "propositions")
667    @Cacheable(value= PropositionDefinition.Cache.NAME, key="'ruleId=' + #p0")
668    public Set<PropositionDefinition> getPropositionsByRule(@WebParam(name = "ruleId") String ruleId) throws RiceIllegalArgumentException;
669
670    /**
671     * Update the Proposition
672     *
673     * @param propositionDefinition updated data for the Proposition, id specifies the object to be updated
674     * @throws RiceIllegalArgumentException if the given propositionDefinition
675     *                                      is null or invalid
676     */
677    @WebMethod(operationName = "updateProposition")
678    @CacheEvict(value={PropositionDefinition.Cache.NAME, RuleDefinition.Cache.NAME}, allEntries = true)
679    public void updateProposition(
680            @WebParam(name = "propositionDefinition") PropositionDefinition propositionDefinition) throws RiceIllegalArgumentException;
681
682    /**
683     * Delete the Proposition
684     *
685     * @param id identifier of the Proposition to be deleted
686     * @throws RiceIllegalArgumentException if the given id is null or invalid
687     */
688    @WebMethod(operationName = "deleteProposition")
689    @CacheEvict(value={PropositionDefinition.Cache.NAME, RuleDefinition.Cache.NAME}, allEntries = true)
690    public void deleteProposition(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
691
692    ////
693    //// natural language usages
694    ////
695    /**
696     * Create NaturalLanguageUsage
697     *
698     * @param naturalLanguageUsage data for the new NaturalLanguageUsage to be created
699     * @return newly created NaturalLanguageUsage
700     * @throws RiceIllegalArgumentException if the given naturalLanguageUsage is
701     *                                      null or invalid
702     */
703    @WebMethod(operationName = "createNaturalLanguageUsage")
704    @WebResult(name = "naturalLanguageUsage")
705    @CacheEvict(value={NaturalLanguageUsage.Cache.NAME, NaturalLanguageTemplate.Cache.NAME}, allEntries = true)
706    public NaturalLanguageUsage createNaturalLanguageUsage(@WebParam(name = "naturalLanguageUsage") NaturalLanguageUsage naturalLanguageUsage) throws RiceIllegalArgumentException;
707
708    /**
709     * Retrieve NaturalLanguageUsage specified by the identifier
710     *
711     * @param id identifier of the NaturalLanguageUsage to be retrieved
712     * @return NaturalLanguageUsage specified by the identifier
713     * @throws RiceIllegalArgumentException if the given id is null or invalid
714     */
715    @WebMethod(operationName = "getNaturalLanguageUsage")
716    @WebResult(name = "naturalLanguageUsage")
717    @Cacheable(value= NaturalLanguageUsage.Cache.NAME, key="'id=' + #p0")
718    public NaturalLanguageUsage getNaturalLanguageUsage(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
719
720    /**
721     * Retrieve NaturalLanguageUsage specified by name and namespace
722     *
723     * @param name the name of the natural language usage to retrieve.
724     * @param namespace the namespace that the natural language usage is under.
725     * @return an {@link NaturalLanguageUsage} identified by the given name and
726     * namespace. A null reference is returned if an invalid or non-existent
727     * name and namespace combination is supplied.
728     * @throws RiceIllegalArgumentException if the either the name or the
729     * namespace is null or blank.
730     */
731    @WebMethod(operationName = "getNaturalLanguageUsageByNameAndNamespace")
732    @WebResult(name = "naturalLanguageUsage")
733    @Cacheable(value= NaturalLanguageUsage.Cache.NAME, key="'name=' + #p0 + '|' + 'namespace=' + #p1")
734    public NaturalLanguageUsage getNaturalLanguageUsageByNameAndNamespace(@WebParam(name = "name") String name,
735            @WebParam(name = "namespace") String namespace)
736            throws RiceIllegalArgumentException;
737
738    /**
739     * Update NaturalLanguageUsage
740     *
741     * @param naturalLanguageUsage updated data for the NaturalLanguageUsage object specified by the id
742     * @throws RiceIllegalArgumentException if the given naturalLanguageUsage is
743     *                                      null or invalid
744     */
745    @WebMethod(operationName = "updateNaturalLanguageUsage")
746    @CacheEvict(value={NaturalLanguageUsage.Cache.NAME, NaturalLanguageTemplate.Cache.NAME}, allEntries = true)
747    public void updateNaturalLanguageUsage(@WebParam(name = "naturalLanguageUsage") NaturalLanguageUsage naturalLanguageUsage) throws RiceIllegalArgumentException;
748
749    /**
750     * Delete NaturalLanguageUsage
751     *
752     * @param naturalLanguageUsageId  identifier of the NaturalLanguageUsage to be deleted
753     * @throws RiceIllegalArgumentException  if the given naturalLanguageUsageId is null or invalid
754     */
755    @WebMethod(operationName = "deleteNaturalLanguageUsage")
756    @CacheEvict(value={NaturalLanguageUsage.Cache.NAME, NaturalLanguageTemplate.Cache.NAME}, allEntries = true)
757    public void deleteNaturalLanguageUsage(@WebParam(name = "naturalLanguageUsageId") String naturalLanguageUsageId) throws RiceIllegalArgumentException;
758
759    /**
760     * Translates and retrieves a NaturalLanguage for a given KRMS object (e.g, proposition
761     * or agenda), NaturalLanguage usage type (context) and language into natural language
762     *
763     * @param namespace namespace to search on.
764     * @return list of NaturalLanguageUsages in a particular namespace
765     */
766    @WebMethod(operationName = "getNaturalLanguageUsagesByNamespace")
767    @XmlElementWrapper(name = "naturalLanguageUsages", required = true)
768    @XmlElement(name = "naturalLanguageUsage", required = false)
769    @WebResult(name = "naturalLanguageUsages")
770    @Cacheable(value= NaturalLanguageUsage.Cache.NAME, key="'namespace=' + #p0")
771    public List<NaturalLanguageUsage> getNaturalLanguageUsagesByNamespace(@WebParam(name = "namespace") String namespace)
772            throws RiceIllegalArgumentException;
773
774    ////
775    //// context methods
776    ////
777    /**
778     * Create Context
779     *
780     * @param contextDefinition data for the new Context to be created
781     * @return newly created Context
782     * @throws RiceIllegalArgumentException if the given contextDefinition is
783     * null or invalid or already in use.
784     */
785    @WebMethod(operationName = "createContext")
786    @WebResult(name = "context")
787    @CacheEvict(value={ContextDefinition.Cache.NAME}, allEntries = true)
788    public ContextDefinition createContext(@WebParam(name = "contextDefinition") ContextDefinition contextDefinition) throws RiceIllegalArgumentException;
789
790    
791    /**
792     * find Create Context
793     * 
794     * Searches for an existing context with the same name and namespace and returns it
795     * otherwise it creates the context.
796     *
797     * @param contextDefinition data for the new Context to be created
798     * @return newly created Context
799     * @throws RiceIllegalArgumentException if the given contextDefinition is
800     * null or invalid
801     */
802    @WebMethod(operationName = "findCreateContext")
803    @WebResult(name = "context")
804    @CacheEvict(value={ContextDefinition.Cache.NAME}, allEntries = true)
805    public ContextDefinition findCreateContext(@WebParam(name = "contextDefinition") ContextDefinition contextDefinition) throws RiceIllegalArgumentException;
806
807    
808    /**
809     * Update the Context specified by the identifier in the input DTO
810     *
811     * @param contextDefinition DTO with updated info and identifier of the
812     * object to be updated
813     * @throws RiceIllegalArgumentException if the given contextDefinition is
814     * null or invalid
815     */
816    @WebMethod(operationName = "updateContext")
817    @CacheEvict(value={ContextDefinition.Cache.NAME}, allEntries = true)
818    public void updateContext(@WebParam(name = "contextDefinition") ContextDefinition contextDefinition) throws RiceIllegalArgumentException;
819
820    /**
821     * Delete the specified Context
822     *
823     * @param id identifier of the object to be deleted
824     * @throws RiceIllegalArgumentException if the given id is null or invalid
825     */
826    @WebMethod(operationName = "deleteContext")
827    @CacheEvict(value={ContextDefinition.Cache.NAME}, allEntries = true)
828    public void deleteContext(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
829
830    /**
831     * Retrieve Context for the specified id
832     *
833     * @param id identifier for the Context
834     * @return specified Context
835     * @throws RiceIllegalArgumentException if the given id is null or invalid
836     */
837    @WebMethod(operationName = "getContext")
838    @WebResult(name = "context")
839    @Cacheable(value= ContextDefinition.Cache.NAME, key="'id=' + #p0")
840    public ContextDefinition getContext(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
841
842    /**
843     * Retrieves an Context from the repository based on the provided context
844     * name and namespace.
845     *
846     * @param name the name of the Context to retrieve.
847     * @param namespace the namespace that the context is under.
848     * @return an {@link ContextDefinition} identified by the given name and
849     * namespace. A null reference is returned if an invalid or non-existent
850     * name and namespace combination is supplied.
851     * @throws RiceIllegalArgumentException if the either the name or the
852     * namespace is null or blank.
853     */
854    @WebMethod(operationName = "getContextByNameAndNamespace")
855    @WebResult(name = "context")
856    @Cacheable(value= ContextDefinition.Cache.NAME, key="'name=' + #p0 + '|' + 'namespace=' + #p1")
857    public ContextDefinition getContextByNameAndNamespace(@WebParam(name = "name") String name,
858            @WebParam(name = "namespace") String namespace)
859            throws RiceIllegalArgumentException;
860
861    //// natural languatge template methods
862    /**
863     * This will create a {@link NaturalLanguageTemplate} exactly like the
864     * parameter passed in except the id will be assigned and create date/user 
865     * will be set.
866     *
867     * @param naturalLanguageTemplate The NaturalLanguageTemplate to create.
868     * @throws RiceIllegalArgumentException if the NaturalLanguageTemplate is null.
869     * @throws IllegalStateException if the NaturalLanguageTemplate already
870     * exists in the system.
871     * @return a {@link NaturalLanguageTemplate} exactly like the parameter
872     * passed in.
873     *
874     */
875    @WebMethod(operationName = "createNaturalLanguageTemplate")
876    @WebResult(name = "naturalLanguageTemplate")
877    @CacheEvict(value={NaturalLanguageTemplate.Cache.NAME}, allEntries = true)
878    public NaturalLanguageTemplate createNaturalLanguageTemplate(@WebParam(name = "naturalLanguageTemplate") NaturalLanguageTemplate naturalLanguageTemplate)
879            throws RiceIllegalArgumentException;
880
881    /**
882     * Retrieves a NaturalLanguageTemplate from the repository based on the
883     * given id.
884     *
885     * @param naturalLanguageTemplateId to retrieve.
886     * @return a {@link NaturalLanguageTemplate} identified by the given id. 
887     * @throws IllegalArgumentException if the given actionId is null     *
888     */
889    @WebMethod(operationName = "getNaturalLanguageTemplate")
890    @WebResult(name = "naturalLanguageTemplate")
891    @Cacheable(value= NaturalLanguageTemplate.Cache.NAME, key="'naturalLanguageTemplateId=' + #p0")
892    public NaturalLanguageTemplate getNaturalLanguageTemplate(@WebParam(name = "naturalLanguageTemplateId") String naturalLanguageTemplateId)
893            throws RiceIllegalArgumentException;
894
895    /**
896     * This will update an existing {@link NaturalLanguageTemplate}.
897     *
898     * @param naturalLanguageTemplate The NaturalLanguageTemplate to update.
899     * @throws RiceIllegalArgumentException if the NaturalLanguageTemplate is null.
900     * exists in the system.
901     *
902     */
903    @WebMethod(operationName = "updateNaturalLanguageTemplate")
904    @CacheEvict(value={NaturalLanguageTemplate.Cache.NAME}, allEntries = true)
905    public void updateNaturalLanguageTemplate(@WebParam(name = "naturalLanguageTemplate") NaturalLanguageTemplate naturalLanguageTemplate)
906            throws RiceIllegalArgumentException;
907
908    /**
909     * Delete the {@link NaturalLanguageTemplate} with the given id.
910     *
911     * @param naturalLanguageTemplateId to delete.
912     * @throws RiceIllegalArgumentException if the NaturalLanguageTemplate is null.
913     *
914     */
915    @WebMethod(operationName = "deleteNaturalLanguageTemplate")
916    @CacheEvict(value={NaturalLanguageTemplate.Cache.NAME}, allEntries = true)
917    public void deleteNaturalLanguageTemplate(@WebParam(name = "naturalLanguageTemplateId") String naturalLanguageTemplateId)
918            throws RiceIllegalArgumentException;
919
920    /**
921     * Finds all the natural language templates for a particular language
922     *
923     * @param languageCode language on which to search
924     * @return list of templates for that language
925     */
926    @WebMethod(operationName = "findNaturalLanguageTemplatesByLanguageCode")
927    @XmlElementWrapper(name = "naturalLangaugeTemplates", required = true)
928    @XmlElement(name = "naturalLangaugeTemplate", required = false)
929    @WebResult(name = "naturalLangaugeTemplates")
930    @Cacheable(value= NaturalLanguageTemplate.Cache.NAME, key="'languageCode=' + #p0")
931    public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByLanguageCode(@WebParam(name = "languageCode") String languageCode)
932            throws RiceIllegalArgumentException;
933
934    @WebMethod(operationName = "findNaturalLanguageTemplateByLanguageCodeTypeIdAndNluId")
935    @WebResult(name = "naturalLangaugeTemplate")
936    @Cacheable(value= NaturalLanguageTemplate.Cache.NAME, key="'languageCode=' + #p0 + '|' + 'typeId=' + #p1 + '|' + 'naturalLanguageUsageId=' + #p2")
937    public NaturalLanguageTemplate findNaturalLanguageTemplateByLanguageCodeTypeIdAndNluId(@WebParam(name = "languageCode") String languageCode,
938            @WebParam(name = "typeId") String typeId,
939            @WebParam(name = "naturalLanguageUsageId") String naturalLanguageUsageId)
940            throws RiceIllegalArgumentException;
941
942    /**
943     * Find all the natural language templates for a particular usage
944     *
945     * @param naturalLanguageUsageId the usage on which to search
946     * @return list of templates that match the usage
947     */
948    @WebMethod(operationName = "findNaturalLanguageTemplatesByNaturalLanguageUsage")
949    @XmlElementWrapper(name = "naturalLangaugeTemplates", required = true)
950    @XmlElement(name = "naturalLangaugeTemplate", required = false)
951    @WebResult(name = "naturalLangaugeTemplates")
952    @Cacheable(value= NaturalLanguageTemplate.Cache.NAME, key="'naturalLanguageUsageId=' + #p0")
953    public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByNaturalLanguageUsage(@WebParam(name = "naturalLanguageUsageId") String naturalLanguageUsageId)
954            throws RiceIllegalArgumentException;
955
956    /**
957     * Find all the natural language templates of a particular type
958     *
959     * Template types are keys that identify the message that is to be expressed
960     * in different languages and in different usage scenarios
961     *
962     * @param typeId on which to search
963     * @return list of templates matching that type
964     */
965    @WebMethod(operationName = "findNaturalLanguageTemplatesByType")
966    @XmlElementWrapper(name = "naturalLangaugeTemplates", required = true)
967    @XmlElement(name = "naturalLangaugeTemplate", required = false)
968    @WebResult(name = "naturalLangaugeTemplates")
969    @Cacheable(value= NaturalLanguageTemplate.Cache.NAME, key="'typeId=' + #p0")
970    public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByType(@WebParam(name = "typeId") String typeId)
971            throws RiceIllegalArgumentException;
972
973    /**
974     * Find the natural language template using the actual text of the template.
975     *
976     * @param template text to match exactly
977     * @return list of matching templates
978     */
979    @WebMethod(operationName = "findNaturalLanguageTemplatesByTemplate")
980    @XmlElementWrapper(name = "naturalLangaugeTemplates", required = true)
981    @XmlElement(name = "naturalLangaugeTemplate", required = false)
982    @WebResult(name = "naturalLangaugeTemplates")
983    @Cacheable(value= NaturalLanguageTemplate.Cache.NAME, key="'template=' + #p0")
984    public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByTemplate(@WebParam(name = "template") String template)
985            throws RiceIllegalArgumentException;
986
987    ////
988    //// translation methods
989    ////
990    /**
991     * Translates and retrieves a NaturalLanguage for a given KRMS object (e.g,
992     * proposition or agenda), NaturalLanguage usage type (context) and language
993     * into natural language
994     *
995     * @param naturalLanguageUsageId Natural language usage information
996     * @param typeId    KRMS object type id (for example, could refer to agenda
997     *                  or proposition)
998     * @param krmsObjectId KRMS object identifier
999     * @param languageCode  desired
1000     * @return natural language corresponding to the NaturalLanguage usage, KRMS object id, KRMS object type and desired language
1001     * @throws RiceIllegalArgumentException if the given naturalLanguageUsageId, typeId,
1002     *                                      krmsObjectId or language is null or
1003     *                                      invalid
1004     */
1005    @WebMethod(operationName = "translateNaturalLanguageForObject")
1006    @WebResult(name = "naturalLanguage")
1007    @Override
1008    public String translateNaturalLanguageForObject(@WebParam(name = "naturalLanguageUsageId") String naturalLanguageUsageId,
1009            @WebParam(name = "typeId") String typeId, @WebParam(name = "krmsObjectId") String krmsObjectId,
1010            @WebParam(name = "languageCode") String languageCode) throws RiceIllegalArgumentException;
1011
1012    /**
1013     * Retrieve all the NaturalLanguageUsages
1014     *
1015     * @return list of NaturalLanguageUsages
1016     */
1017    @WebMethod(operationName = "translateNaturalLanguageForProposition")
1018    @WebResult(name = "naturalLanguage")
1019    @Override
1020    public String translateNaturalLanguageForProposition(@WebParam(name = "naturalLanguageUsageId") String naturalLanguageUsageId,
1021            @WebParam(name = "propositionDefinintion") PropositionDefinition propositionDefinintion,
1022            @WebParam(name = "languageCode") String languageCode)
1023            throws RiceIllegalArgumentException;
1024
1025    /**
1026     * Translates NaturalLanguage for a given proposition, returning a tree of
1027     * the NaturalLanguage.
1028     *
1029     * This method is used to "preview" the proposition in a tree structure
1030     * before saving.
1031     *
1032     * @param naturalLanguageUsageId Natural language usage information
1033     * @param propositionDefinintion proposition to be translated
1034     * @param languageCode desired
1035     * @return natural language tree corresponding to the NaturalLanguage usage,
1036     * proposition and desired language
1037     * @throws RiceIllegalArgumentException if the given naturalLanguageUsageId,
1038     * proposition, or language is null or invalid
1039     */
1040    @WebMethod(operationName = "translateNaturalLanguageTreeForProposition")
1041    @WebResult(name = "naturalLanguageTree")
1042    @Override
1043    public NaturalLanguageTree translateNaturalLanguageTreeForProposition(@WebParam(name = "naturalLanguageUsageId") String naturalLanguageUsageId,
1044            @WebParam(name = "propositionDefinintion") PropositionDefinition propositionDefinintion,
1045            @WebParam(name = "languageCode") String languageCode)
1046            throws RiceIllegalArgumentException;
1047
1048  
1049    /**
1050     * Query for Context ids based on the given search criteria which is a Map
1051     * of Context field names to values.
1052     * <p/>
1053     * <p> This method returns it's results as a List of Context ids that match
1054     * the given search criteria. </p>
1055     *
1056     * @param queryByCriteria the criteria. Cannot be null.
1057     * @return a list of ids matching the given criteria properties. An empty
1058     * list is returned if an invalid or non-existent criteria is supplied.
1059     * @throws RiceIllegalArgumentException if the queryByCriteria is null
1060     */
1061    @WebMethod(operationName = "findContextIds")
1062    @XmlElementWrapper(name = "contextIds", required = true)
1063    @XmlElement(name = "context", required = false)
1064    @WebResult(name = "contextIds")
1065    List<String> findContextIds(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
1066
1067    /**
1068     * Query for Agenda ids based on the given search criteria which is a Map of
1069     * Agenda field names to values.
1070     * <p/>
1071     * <p> This method returns it's results as a List of Agenda ids that match
1072     * the given search criteria. </p>
1073     *
1074     * @param queryByCriteria the criteria. Cannot be null.
1075     * @return a list of ids matching the given criteria properties. An empty
1076     * list is returned if an invalid or non-existent criteria is supplied.
1077     * @throws RiceIllegalArgumentException if the queryByCriteria is null
1078     */
1079    @WebMethod(operationName = "findAgendaIds")
1080    @XmlElementWrapper(name = "contextIds", required = true)
1081    @XmlElement(name = "agenda", required = false)
1082    @WebResult(name = "agendaIds")
1083    List<String> findAgendaIds(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
1084
1085    /**
1086     * Query for Rule ids based on the given search criteria which is a Map of
1087     * Rule field names to values.
1088     * <p/>
1089     * <p> This method returns it's results as a List of Rule ids that match the
1090     * given search criteria. </p>
1091     *
1092     * @param queryByCriteria the criteria. Cannot be null.
1093     * @return a list of ids matching the given criteria properties. An empty
1094     * list is returned if an invalid or non-existent criteria is supplied.
1095     * @throws RiceIllegalArgumentException if the queryByCriteria is null
1096     */
1097    @WebMethod(operationName = "findRuleIds")
1098    @XmlElementWrapper(name = "ruleIds", required = true)
1099    @XmlElement(name = "rule", required = false)
1100    @WebResult(name = "ruleIds")
1101    List<String> findRuleIds(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
1102
1103    /**
1104     * Query for Proposition ids based on the given search criteria which is a
1105     * Map of Proposition field names to values.
1106     * <p/>
1107     * <p> This method returns it's results as a List of Proposition ids that
1108     * match the given search criteria. </p>
1109     *
1110     * @param queryByCriteria the criteria. Cannot be null.
1111     * @return a list of ids matching the given criteria properties. An empty
1112     * list is returned if an invalid or non-existent criteria is supplied.
1113     * @throws RiceIllegalArgumentException if the queryByCriteria is null
1114     */
1115    @WebMethod(operationName = "findPropositionIds")
1116    @XmlElementWrapper(name = "propositionIds", required = true)
1117    @XmlElement(name = "proposition", required = false)
1118    @WebResult(name = "propositionIds")
1119    List<String> findPropositionIds(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
1120
1121    /**
1122     * Query for Action ids based on the given search criteria which is a Map
1123     * of Action field names to values.
1124     * <p/>
1125     * <p> This method returns it's results as a List of Action ids that match
1126     * the given search criteria. </p>
1127     *
1128     * @param queryByCriteria the criteria. Cannot be null.
1129     * @return a list of ids matching the given criteria properties. An empty
1130     * list is returned if an invalid or non-existent criteria is supplied.
1131     * @throws RiceIllegalArgumentException if the queryByCriteria is null
1132     */
1133    @WebMethod(operationName = "findActionIds")
1134    @XmlElementWrapper(name = "actionIds", required = true)
1135    @XmlElement(name = "action", required = false)
1136    @WebResult(name = "actionIds")
1137    List<String> findActionIds(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
1138    
1139    ////
1140    //// extra methods from RuleRepositoryService copied here so I can break the dependence on that service
1141    //// and then implement different caching schemes for each 
1142    ////
1143    
1144    
1145      /**
1146     * Locates a ContextDefinition based on the given map of context qualifiers.
1147     * The requirements for valid selection criteria are implementation
1148     * dependent. An IllegalArgumentException may be thrown if the
1149     * implementation can't operate with the given criteria.
1150     *
1151     * @param contextSelectionCriteria
1152     * @return
1153     * @see ContextSelectionCriteria
1154     * @throws RiceIllegalArgumentException if the implementation can't handle
1155     * the given ContextSelectionCriteria
1156     */
1157    @WebMethod(operationName = "selectContext")
1158    @WebResult(name = "contextDefinition")
1159    public ContextDefinition selectContext(@WebParam(name = "contextSelectionCriteria") ContextSelectionCriteria contextSelectionCriteria)
1160            throws RiceIllegalArgumentException;
1161
1162    /**
1163     * Retrieves the agenda tree for the given agendaId. The agenda tree
1164     * includes the entire agenda definition in the appropriate order and with
1165     * the defined agenda branching.
1166     *
1167     * @param agendaId the id of the agenda for which to retrieve the agenda
1168     * tree
1169     * @return the agenda tree, or null if no agenda could be located for the
1170     * given agendaId
1171     *
1172     * @throws RiceIllegalArgumentException if the given agendaId is null
1173     */
1174    @WebMethod(operationName = "getAgendaTree")
1175    @WebResult(name = "agendaTree")
1176    @Cacheable(value= AgendaTreeDefinition.Cache.NAME, key="'agendaId=' + #p0")
1177    public AgendaTreeDefinition getAgendaTree(@WebParam(name = "agendaId") String agendaId)
1178            throws RiceIllegalArgumentException;
1179
1180    /**
1181     * Retrieves all of the agendas trees for the given list of agendaIds. The
1182     * agenda tree includes the entire agenda definition in the appropriate
1183     * order and with the defined agenda branching.
1184     *
1185     * <p>The list which is returned from this operation may not be the same
1186     * size as the list which is passed to this method. If an agenda doesn't
1187     * exist for a given agenda id then no result for that id will be returned
1188     * in the list. As a result of this, the returned list can be empty, but it
1189     * will never be null.
1190     *
1191     * @param agendaIds the list of agenda ids for which to retrieve the agenda
1192     * trees
1193     * @return the list of agenda trees for the given ids, this list will only
1194     * contain agenda trees for the ids that were resolved successfully, it will
1195     * never return null but could return an empty list if no agenda trees could
1196     * be loaded for the given set of ids
1197     *
1198     * @throws RiceIllegalArgumentException if the given list of agendaIds is
1199     * null
1200     */
1201    @WebMethod(operationName = "getAgendaTrees")
1202    @XmlElementWrapper(name = "agendaTrees", required = true)
1203    @XmlElement(name = "agendaTree", required = false)
1204    @WebResult(name = "agendaTrees")
1205    @Cacheable(value= AgendaTreeDefinition.Cache.NAME, key="'agendaIds=' + T(org.kuali.rice.core.api.cache.CacheKeyUtils).key(#p0)")
1206    public List<AgendaTreeDefinition> getAgendaTrees(@WebParam(name = "agendaIds") List<String> agendaIds)
1207            throws RiceIllegalArgumentException;
1208
1209   
1210}