View Javadoc
1   /**
2    * Copyright 2005-2015 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.kim.api.responsibility;
17  
18  import org.kuali.rice.core.api.criteria.QueryByCriteria;
19  import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
20  import org.kuali.rice.core.api.exception.RiceIllegalStateException;
21  import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter;
22  import org.kuali.rice.kim.api.KimConstants;
23  import org.kuali.rice.kim.api.common.template.Template;
24  import org.kuali.rice.kim.api.common.template.TemplateQueryResults;
25  import org.springframework.cache.annotation.CacheEvict;
26  import org.springframework.cache.annotation.Cacheable;
27  
28  import javax.jws.WebMethod;
29  import javax.jws.WebParam;
30  import javax.jws.WebResult;
31  import javax.jws.WebService;
32  import javax.jws.soap.SOAPBinding;
33  import javax.xml.bind.annotation.XmlElement;
34  import javax.xml.bind.annotation.XmlElementWrapper;
35  import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
36  import java.util.List;
37  import java.util.Map;
38  
39  /**
40   * This service provides operations for determining what responsibility actions
41   * a principal has and for querying about responsibility data.  It also provides several
42   * write operations.
43   *
44   * <p>
45   * A responsibility represents an action that a principal is requested to
46   * take.  This is used for defining workflow actions (such as approve,
47   * acknowledge, fyi) that the principal has the responsibility to take.  The
48   * workflow engine integrates with this service to provide responsibility-driven routing.
49   * <p/>
50   *
51   * <p>
52   * A responsibility is very similar to a permission in a couple of ways.
53   * First of all, responsibilities are always granted to a role, never assigned
54   * directly to a principal or group.  Furthermore, in a similar fashion to
55   * permissions, a role has the concept of a responsibility template.  The
56   * responsibility template specifies what additional responsibility details
57   * need to be defined when the responsibility is created.
58   * <p/>
59   *
60   * @author Kuali Rice Team (rice.collab@kuali.org)
61   */
62  @WebService(name = "responsibilityService", targetNamespace = KimConstants.Namespaces.KIM_NAMESPACE_2_0)
63  @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
64  public interface ResponsibilityService {
65  
66      /**
67       * This will create a {@link Responsibility} exactly like the responsibility passed in.
68       *
69       * @param responsibility the responsibility to create
70       * @return the id of the newly created object.  will never be null.
71       * @throws RiceIllegalArgumentException if the responsibility is null
72       * @throws RiceIllegalStateException if the responsibility is already existing in the system
73       */
74      @WebMethod(operationName="createResponsibility")
75      @WebResult(name = "responsibility")
76      @CacheEvict(value={Responsibility.Cache.NAME, Template.Cache.NAME + "{Responsibility}"}, allEntries = true)
77      Responsibility createResponsibility(@WebParam(name = "responsibility") Responsibility responsibility)
78              throws RiceIllegalArgumentException, RiceIllegalStateException;
79  
80      /**
81       * This will up ev a {@link Responsibility}.
82       *
83       * @param responsibility the responsibility to update
84       * @throws RiceIllegalArgumentException if the responsibility is null
85       * @throws RiceIllegalStateException if the responsibility does not exist in the system
86       */
87      @WebMethod(operationName="updateResponsibility")
88      @WebResult(name = "responsibility")
89      @CacheEvict(value={Responsibility.Cache.NAME, Template.Cache.NAME + "{Responsibility}"}, allEntries = true)
90      Responsibility updateResponsibility(@WebParam(name = "responsibility") Responsibility responsibility)
91              throws RiceIllegalArgumentException, RiceIllegalStateException;
92  
93      /**
94       * Gets a {@link Responsibility} from an id.
95       *
96       * <p>
97       *   This method will return null if the responsibility does not exist.
98       * </p>
99       *
100      * @param id the unique id to retrieve the responsibility by. cannot be null or blank.
101      * @return a {@link Responsibility} or null
102      * @throws RiceIllegalArgumentException if the id is null or blank
103      */
104     @WebMethod(operationName = "getResponsibility")
105     @WebResult(name = "responsibility")
106     @Cacheable(value=Responsibility.Cache.NAME, key="'id=' + #p0")
107     Responsibility getResponsibility(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
108 
109     /**
110      * Finds a {@link Responsibility} for namespaceCode and name.
111      *
112      * @param namespaceCode the namespace code.  cannot be null or blank.
113      * @param name the responsibility name. cannot be null or blank.
114      * @return a {@link Responsibility} or null
115      * @throws RiceIllegalArgumentException if the id or namespaceCode is null or blank
116      */
117     @WebMethod(operationName = "findRespByNamespaceCodeAndName")
118     @WebResult(name = "responsibility")
119     @Cacheable(value=Responsibility.Cache.NAME, key="'namespaceCode=' + #p0 + '|' + 'name=' + #p1")
120     Responsibility findRespByNamespaceCodeAndName(@WebParam(name = "namespaceCode") String namespaceCode,
121                                                   @WebParam(name = "name") String name) throws RiceIllegalArgumentException;
122     /**
123      * Gets a {@link Template} from an id.
124      *
125      * <p>
126      *   This method will return null if the template does not exist.
127      * </p>
128      *
129      * @param id the unique id to retrieve the template by. cannot be null or blank.
130      * @return a {@link Template} or null
131      * @throws RiceIllegalArgumentException if the id is null or blank
132      */
133     @WebMethod(operationName = "getResponsibilityTemplate")
134     @WebResult(name = "template")
135     @Cacheable(value=Template.Cache.NAME + "{Responsibility}", key="'id=' + #p0")
136     Template getResponsibilityTemplate(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
137 
138     /**
139      * Finds a {@link Template} for namespaceCode and name.
140      *
141      * @param namespaceCode the namespace code.  cannot be null or blank.
142      * @param name the template name. cannot be null or blank.
143      * @return a {@link Template} or null
144      * @throws RiceIllegalArgumentException if the id or namespaceCode is null or blank
145      */
146     @WebMethod(operationName = "findRespTemplateByNamespaceCodeAndName")
147     @WebResult(name = "template")
148     @Cacheable(value=Template.Cache.NAME + "{Responsibility}", key="'namespaceCode=' + #p0 + '|' + 'name=' + #p1")
149     Template findRespTemplateByNamespaceCodeAndName(@WebParam(name = "namespaceCode") String namespaceCode,
150                                                     @WebParam(name = "name") String name) throws RiceIllegalArgumentException;
151     /**
152      * Checks in a given principal id has a responsibility using the passed in responsibility information.
153      *
154      * @param principalId the principal id to check.  cannot be null or blank.
155      * @param namespaceCode the namespace code.  cannot be null or blank.
156      * @param respName the responsibility name. cannot be null or blank.
157      * @param qualification the qualification for the responsibility. cannot be null.
158      * @return true is principal has responsibility
159      * @throws RiceIllegalArgumentException if the principalId, namespaceCode, respName is null or blank
160      * @throws RiceIllegalArgumentException if the qualification is null
161      */
162     @WebMethod(operationName = "hasResponsibility")
163     @WebResult(name = "result")
164     @Cacheable(value= Responsibility.Cache.NAME,
165             key="'{hasResponsibility}' + 'principalId=' + #p0 + '|' + 'namespaceCode=' + #p1 + '|' + 'respName=' + #p2 + '|' + 'qualification=' + T(org.kuali.rice.core.api.cache.CacheKeyUtils).mapKey(#p3)",
166             condition="!T(org.kuali.rice.kim.api.cache.KimCacheUtils).isResponsibilityAssignedToDynamicRole(#p1, #p2)")
167     boolean hasResponsibility(@WebParam(name = "principalId") String principalId,
168                               @WebParam(name = "namespaceCode") String namespaceCode,
169                               @WebParam(name = "respName") String respName,
170                               @XmlJavaTypeAdapter(value = MapStringStringAdapter.class)
171                               @WebParam(name = "qualification") Map<String, String> qualification) throws RiceIllegalArgumentException;
172 
173     /**
174      * Checks in a given principal id has a responsibility using the passed in responsibility <b>template</b> information.
175      *
176      * @param principalId the principal id to check.  cannot be null or blank.
177      * @param namespaceCode the namespace code.  cannot be null or blank.
178      * @param respTemplateName the responsibility template name. cannot be null or blank.
179      * @param qualification the qualification for the responsibility. cannot be null.
180      * @param respDetails the responsibility details. cannot be null.
181      * @return true is principal has responsibility
182      * @throws RiceIllegalArgumentException if the principalId, namespaceCode, respName is null or blank
183      * @throws RiceIllegalArgumentException if the qualification or responsibilityDetails is null
184      */
185     @WebMethod(operationName = "hasResponsibilityByTemplate")
186     @WebResult(name = "result")
187     @Cacheable(value= Responsibility.Cache.NAME,
188             key="'{hasResponsibilityByTemplate}' + 'principalId=' + #p0 + '|' + 'namespaceCode=' + #p1 + '|' + 'respTemplateName=' + #p2 + '|' + 'qualification=' + T(org.kuali.rice.core.api.cache.CacheKeyUtils).mapKey(#p3) + '|' + 'respDetails=' + T(org.kuali.rice.core.api.cache.CacheKeyUtils).mapKey(#p4)",
189             condition="!T(org.kuali.rice.kim.api.cache.KimCacheUtils).isResponsibilityTemplateAssignedToDynamicRole(#p1, #p2)")
190     boolean hasResponsibilityByTemplate(@WebParam(name = "principalId") String principalId,
191             @WebParam(name = "namespaceCode") String namespaceCode,
192             @WebParam(name = "respTemplateName") String respTemplateName,
193             @XmlJavaTypeAdapter(value = MapStringStringAdapter.class) @WebParam(
194                     name = "qualification") Map<String, String> qualification,
195             @XmlJavaTypeAdapter(value = MapStringStringAdapter.class) @WebParam(
196                     name = "respDetails") Map<String, String> respDetails) throws RiceIllegalArgumentException;
197 
198     /**
199      * Gets a List of {@link ResponsibilityAction} based on passed in responsibility information.
200      *
201      * @param namespaceCode the namespace code.  cannot be null or blank.
202      * @param respName the responsibility name. cannot be null or blank.
203      * @param qualification the qualification for the responsibility. cannot be null.
204      * @return an immutable list of ResponsibilityAction. Will not return null.
205      * @throws RiceIllegalArgumentException if the namespaceCode, respName is null or blank
206      * @throws RiceIllegalArgumentException if the qualification or respDetails is null
207      */
208     @WebMethod(operationName = "getResponsibilityActions")
209     @XmlElementWrapper(name = "responsibilityActions", required = true)
210     @XmlElement(name = "responsibilityAction", required = false)
211     @WebResult(name = "responsibilityActions")
212     List<ResponsibilityAction> getResponsibilityActions(@WebParam(name = "namespaceCode") String namespaceCode,
213                                                         @WebParam(name = "respName") String respName,
214                                                         @XmlJavaTypeAdapter(value = MapStringStringAdapter.class)
215                                                         @WebParam(name = "qualification") Map<String, String> qualification) throws RiceIllegalArgumentException;
216 
217     /**
218      * Gets a List of {@link ResponsibilityAction} based on passed in responsibility template information.
219      *
220      * @param namespaceCode the namespace code.  cannot be null or blank.
221      * @param respTemplateName the responsibility name. cannot be null or blank.
222      * @param qualification the qualification for the responsibility. cannot be null.
223      * @param respDetails the responsibility details. can be null.
224      * @return an immutable list of ResponsibilityAction. Will not return null.
225      * @throws RiceIllegalArgumentException if the namespaceCode, respName is null or blank
226      * @throws RiceIllegalArgumentException if the qualification or respDetails is null
227      */
228     @WebMethod(operationName = "getResponsibilityActionsByTemplate")
229     @XmlElementWrapper(name = "responsibilityActions", required = true)
230     @XmlElement(name = "responsibilityAction", required = false)
231     @WebResult(name = "responsibilityActions")
232     List<ResponsibilityAction> getResponsibilityActionsByTemplate(
233             @WebParam(name = "namespaceCode") String namespaceCode,
234             @WebParam(name = "responsibilityTemplateName") String respTemplateName,
235             @XmlJavaTypeAdapter(value = MapStringStringAdapter.class) @WebParam(
236                     name = "qualification") Map<String, String> qualification,
237             @XmlJavaTypeAdapter(value = MapStringStringAdapter.class) @WebParam(
238                     name = "respDetails") Map<String, String> respDetails) throws RiceIllegalArgumentException;
239 
240     /**
241      * Gets a List of roleIds that the responsibility is associated with.
242      *
243      * @param id the unique id to retrieve the roleIds for. cannot be null or blank.
244      * @return an immutable list of roleIds. Will not return null.
245      * @throws RiceIllegalArgumentException if the id is null or blank or if the qualification is null
246      */
247     @WebMethod(operationName = "getRoleIdsForResponsibility")
248     @XmlElementWrapper(name = "roleIds", required = true)
249     @XmlElement(name = "roleId", required = false)
250     @WebResult(name = "roleIds")
251     @Cacheable(value=Responsibility.Cache.NAME, key="'{getRoleIdsForResponsibility}' + 'id=' + #p0")
252     List<String> getRoleIdsForResponsibility(@WebParam(name = "id") String id) throws RiceIllegalArgumentException;
253 
254     /**
255      * This method find Responsibilities based on a query criteria.  The criteria cannot be null.
256      *
257      * @param queryByCriteria the criteria.  Cannot be null.
258      * @return query results.  will never return null.
259      * @throws RiceIllegalArgumentException if the queryByCriteria is null
260      */
261     @WebMethod(operationName = "findResponsibilities")
262     @WebResult(name = "results")
263     ResponsibilityQueryResults findResponsibilities(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
264 
265 
266     /**
267      * This method find Responsibility Templates based on a query criteria.  The criteria cannot be null.
268      *
269      * @param queryByCriteria the criteria.  Cannot be null.
270      * @return query results.  will never return null.
271      * @throws RiceIllegalArgumentException if the queryByCriteria is null
272      */
273     @WebMethod(operationName = "findResponsibilityTemplates")
274     @WebResult(name = "results")
275     TemplateQueryResults findResponsibilityTemplates(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
276 
277     /**
278      * Return the responsibilities for the given unique combination of namespace,
279      *  and responsibility template name.
280      *
281      * @since 2.1.1
282      * @param namespaceCode namespace code for permission. cannot be null or blank.
283      * @param templateName name of permission template.  cannot be null or blank.
284      * @return a list of {@link org.kuali.rice.kim.api.permission.Permission} or null
285      * @throws RiceIllegalArgumentException if the namespaceCode or name is null or blank
286      */
287     @WebMethod(operationName = "findResponsibilitiesByTemplate")
288     @XmlElementWrapper(name = "responsibilities", required = true)
289     @XmlElement(name = "responsibility", required = false)
290     @WebResult(name = "responsibilities")
291     @Cacheable(value=Responsibility.Cache.NAME, key="'namespaceCode=' + #p1 + '|' + 'templateName=' + #p2")
292     List<Responsibility> findResponsibilitiesByTemplate(
293             @WebParam(name = "namespaceCode") String namespaceCode,
294             @WebParam(name = "templateName") String templateName)
295             throws RiceIllegalArgumentException;
296 
297     /**
298      * Return the active responsibilities for the given workflow document type.
299      *
300      * @since 2.6
301      * @param documentTypeName document type name associated with the responsibilities
302      * @return an immutable list of {@link org.kuali.rice.kim.api.responsibility.Responsibility}, if none are found list
303      *         will be empty
304      * @throws RiceIllegalArgumentException if the document type name is null or blank
305      */
306     @WebMethod(operationName = "findWorkflowResponsibilities")
307     @XmlElementWrapper(name = "responsibilities", required = true)
308     @XmlElement(name = "responsibility", required = false)
309     @WebResult(name = "responsibilities")
310     List<Responsibility> findWorkflowResponsibilities(
311             @WebParam(name = "documentTypeName") String documentTypeName)
312             throws RiceIllegalArgumentException;
313 
314     /**
315      * Return the active exception routing responsibilities for the given workflow document type.
316      *
317      * @since 2.6
318      * @param documentTypeName document type name associated with the responsibilities
319      * @return an immutable list of {@link org.kuali.rice.kim.api.responsibility.Responsibility}, if none are found list
320      *         will be empty
321      * @throws RiceIllegalArgumentException if the document type name is null or blank
322      */
323     @WebMethod(operationName = "findWorkflowExceptionResponsibilities")
324     @XmlElementWrapper(name = "responsibilities", required = true)
325     @XmlElement(name = "responsibility", required = false)
326     @WebResult(name = "responsibilities")
327     List<Responsibility> findWorkflowExceptionResponsibilities(
328             @WebParam(name = "documentTypeName") String documentTypeName)
329             throws RiceIllegalArgumentException;
330 
331 }