View Javadoc

1   /**
2    * Copyright 2005-2013 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.group;
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.util.jaxb.MapStringStringAdapter;
21  import org.kuali.rice.kim.api.KimConstants;
22  import org.springframework.cache.annotation.CacheEvict;
23  import org.springframework.cache.annotation.Cacheable;
24  
25  import javax.jws.WebMethod;
26  import javax.jws.WebParam;
27  import javax.jws.WebResult;
28  import javax.jws.WebService;
29  import javax.jws.soap.SOAPBinding;
30  import javax.xml.bind.annotation.XmlElement;
31  import javax.xml.bind.annotation.XmlElementWrapper;
32  import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
33  import java.util.Collection;
34  import java.util.List;
35  import java.util.Map;
36  /**
37   *
38   * This service provides operations for checking group membership, querying for group data,
39   * creating and updating groups.
40   *
41   * <p>A group is a collection of principals.  It's membership consists of direct principal
42   * assignment and/or nested group membership.  All groups are uniquely identified by a namespace
43   * code plus a name.
44   *
45   * <p>As mentioned previously, groups support nested group membership.  A principal or group is
46   * considered to be a "member" of a group if it is either directly assigned to the group or
47   * indirectly assigned (via a nested group membership).  A principal or group is said to be a
48   * "direct" member of another group only if it is directly assigned as a member of the group,
49   * and not via a nested group assignment.
50   *
51   * @author Kuali Rice Team (rice.collab@kuali.org)
52   *
53   */
54  
55  @WebService(name = "groupService", targetNamespace = KimConstants.Namespaces.KIM_NAMESPACE_2_0)
56  @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
57  public interface GroupService {
58  
59      /**
60       * Get all the groups for a given principal.
61       *
62       * <p>
63       * This will include all groups directly assigned as well as those inferred
64       * by the fact that they are members of higher level groups.
65       * </p>
66       *
67       * @param principalId The id of the Principal
68       * @return a list of Group objects in which the given Principal is a member of.  An empty list is returned if an invalid or
69       *         non-existant principalId is supplied.
70       * @throws RiceIllegalArgumentException if the principalId is null or blank
71       */
72      @WebMethod(operationName = "getGroupsByPrincipalId")
73      @XmlElementWrapper(name = "groups", required = true)
74      @XmlElement(name = "group", required = false)
75      @WebResult(name = "groups")
76      @Cacheable(value= GroupMember.Cache.NAME, key="'principalId=' + #p0")
77      List<Group> getGroupsByPrincipalId(@WebParam(name = "principalId") String principalId) throws RiceIllegalArgumentException;
78  
79  
80      /**
81       * Get all the groups within a namespace for a given principal.
82       *
83       * <p>
84       * This will include all groups directly assigned as well as those inferred
85       * by the fact that they are members of higher level groups, and filtered by Group namespace.
86       * </p>
87       *
88       * @param principalId The id of the Principal
89       * @param namespaceCode The namespace code of the desired Groups to return
90       * @return a list of Group objects in which the given Principal is a member of, filtered by Group namespace.  An empty list is returned if an invalid or
91       *         non-existant principalId is supplied.
92       * @throws RiceIllegalArgumentException if the principalId, namespaceCode is null or blank
93       */
94      @WebMethod(operationName = "getGroupsByPrincipalIdAndNamespaceCode")
95      @XmlElementWrapper(name = "groups", required = true)
96      @XmlElement(name = "group", required = false)
97      @WebResult(name = "groups")
98      @Cacheable(value= GroupMember.Cache.NAME, key="'principalId=' + #p0 + '|' + 'namespaceCode=' + #p1")
99      List<Group> getGroupsByPrincipalIdAndNamespaceCode(@WebParam(name = "principalId") String principalId,
100             @WebParam(name = "namespaceCode") String namespaceCode) throws RiceIllegalArgumentException;
101 
102     /**
103      * Query for groups based on the given search criteria which is a Map of group field names to values.
104      *
105      * <p>
106      * This method returns it's results as a List of group ids that match the given search criteria.
107      * </p>
108      *
109      * @param queryByCriteria the criteria.  Cannot be null.
110      * @return a list of groupId Strings in which the given criteria match Group properties.  An empty list is returned if an invalid or
111      *         non-existent criteria is supplied.
112      * @throws RiceIllegalArgumentException if the queryByCriteria is null
113      */
114     @WebMethod(operationName = "findGroupIds")
115     @XmlElementWrapper(name = "groupIds", required = true)
116     @XmlElement(name = "groupId", required = false)
117     @WebResult(name = "groupIds")
118     List<String> findGroupIds(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
119 
120     /**
121      * Query for groups based on the given search criteria which is a Map of group field names to values.
122      *
123      * <p>
124      * This method returns it's results as a List of Groups that match the given search criteria.
125      * </p>
126      *
127      * @param queryByCriteria the criteria.  Cannot be null.
128      * @return a list of Group objects in which the given criteria match Group properties.  An empty list is returned if an invalid or
129      *         non-existent criteria is supplied.
130      * @throws RiceIllegalArgumentException if the queryByCriteria is null
131      */
132     @WebMethod(operationName = "findGroups")
133     @WebResult(name = "results")
134     GroupQueryResults findGroups(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
135 
136     /**
137      * Query for group members based on the given search criteria which is a Map of group member field names to values.
138      *
139      * <p>
140      * This method returns it's results as a List of GroupMemberss that match the given search criteria.
141      * </p>
142      *
143      * @param queryByCriteria the criteria.  Cannot be null.
144      * @return a list of GroupMember objects in which the given criteria match Group properties.  An empty list is returned if an invalid or
145      *         non-existent criteria is supplied.
146      * @throws RiceIllegalArgumentException if the queryByCriteria is null
147      */
148     @WebMethod(operationName = "findGroupMembers")
149     @WebResult(name = "results")
150     GroupMemberQueryResults findGroupMembers(@WebParam(name = "query") QueryByCriteria queryByCriteria) throws RiceIllegalArgumentException;
151     /**
152      * Lookup a Group based on the passed in id.
153      *
154      *
155      * @param id String that matches the desired Groups id
156      * @return a Group with the given id value.  A null reference is returned if an invalid or
157      *         non-existant id is supplied.
158      * @throws RiceIllegalArgumentException if the groupId is null or blank
159      */
160     @WebMethod(operationName = "getGroup")
161     @WebResult(name = "group")
162     @Cacheable(value= Group.Cache.NAME, key="'id=' + #p0")
163     Group getGroup(@WebParam(name="id") String id) throws RiceIllegalArgumentException;
164 
165     /**
166      * Lookup a Group based on the passed in namespace and name.
167      *
168      *
169      * @param namespaceCode String that matches the desired Group's namespaceCode
170      * @param groupName     String that matches the desired Group's name
171      * @return a Group with the given namespace and name values.  A null reference is returned if an invalid or
172      *         non-existant id is supplied.
173      * @throws RiceIllegalArgumentException if the namespaceCode, groupName is null or blank
174      */
175     @WebMethod(operationName = "getGroupByNamespaceCodeAndName")
176     @WebResult(name = "group")
177     @Cacheable(value= Group.Cache.NAME, key="'namespaceCode=' + #p0 + '|' + 'groupName=' + #p1")
178     Group getGroupByNamespaceCodeAndName(@WebParam(name = "namespaceCode") String namespaceCode,
179             @WebParam(name = "groupName") String groupName) throws RiceIllegalArgumentException;
180 
181     /**
182      * Gets all groups for the given collection of group ids.
183      *
184      * <p>The result is a Map containing the group id as the key and the Group as the value.</p>
185      *
186      * @param ids Collection that matches the desired Groups' id
187      * @return a Map of Groups with the given id values.  An empty Map is returned if an invalid or
188      *         non-existant id is supplied.
189      * @throws RiceIllegalArgumentException if the groupIds null or empty
190      */
191     @WebMethod(operationName = "getGroups")
192     @XmlElementWrapper(name = "groups", required = true)
193     @XmlElement(name = "group", required = false)
194     @WebResult(name = "groups")
195     @Cacheable(value= Group.Cache.NAME, key="'ids=' + T(org.kuali.rice.core.api.cache.CacheKeyUtils).key(#p0)")
196     List<Group> getGroups(@WebParam(name="ids") Collection<String> ids) throws RiceIllegalArgumentException;
197 
198 
199     /**
200      * Check whether the give principal is a member of the group.
201      *
202      * <p>Will return true if the principal is a member of the group or a group assigned to this group.</p>
203      *
204      * @param principalId Id of the principal
205      * @param groupId     Id string of group
206      * @return true if principal is a member of the group or a member of a group assigned to the the group.
207      * @throws RiceIllegalArgumentException if the principalId, groupId is null or blank
208      */
209     @WebMethod(operationName = "isMemberOfGroup")
210     @WebResult(name = "isMember")
211     @Cacheable(value= GroupMember.Cache.NAME, key="'{isMemberOfGroup}' + 'principalId=' + #p0 + '|' + 'groupId=' + #p1")
212 	boolean isMemberOfGroup(@WebParam(name="principalId") String principalId, @WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
213 
214 	/**
215 	 * Check whether the give principal is a member of the group.
216 	 *
217 	 * <p>This will not recurse into contained groups.
218 	 */
219     /**
220      * Check whether the give principal is a member of the group.
221      *
222      * <p>This method does not recurse into contained groups.</p>
223      *
224      * @param principalId Id of the principal
225      * @param groupId     Id string of group
226      * @return true if principal is a direct member of the group.
227      * @throws RiceIllegalArgumentException if the principalId, groupId is null or blank
228      */
229     @WebMethod(operationName = "isDirectMemberOfGroup")
230     @WebResult(name = "isDirectMember")
231     @Cacheable(value= GroupMember.Cache.NAME, key="'{isDirectMemberOfGroup}' + 'principalId=' + #p0 + '|' + 'groupId=' + #p1")
232 	boolean isDirectMemberOfGroup(@WebParam(name="principalId") String principalId, @WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
233 
234     /**
235      * Get all the groups for the given principal.  Recurses into parent groups
236      * to provide a comprehensive list.
237      *
238      * <p>
239      * This returns id for all groups for a given principal id.
240      * </p>
241      *
242      * @param principalId Id of a Principal
243      * @return a list of Group Ids in which the principal is a member of.
244      * @throws RiceIllegalArgumentException if the principalId is null or blank
245      */
246     @WebMethod(operationName = "getGroupIdsByPrincipalId")
247     @XmlElementWrapper(name = "groupIds", required = true)
248     @XmlElement(name = "groupId", required = false)
249     @WebResult(name = "groupIds")
250     @Cacheable(value= GroupMember.Cache.NAME, key="'{getGroupIdsByPrincipalId}' + 'principalId=' + #p0")
251 	List<String> getGroupIdsByPrincipalId(@WebParam(name = "principalId") String principalId) throws RiceIllegalArgumentException;
252 
253     /**
254      * Get all the groups for the given principal.  Recurses into parent groups
255      * to provide a comprehensive list.  This is limited to the passed in Group's namespace.
256      *
257      * <p>
258      * This returns id for all groups for a given principal id, limited to specific Group namespace.
259      * </p>
260      *
261      * @param principalId Id of a Principal
262      * @param namespaceCode Namspace code to limit group results to
263      * @return a list of Group Ids in which the principal is a member of, limited to the passed in namespace.
264      * @throws RiceIllegalArgumentException if the principalId, namespaceCode is null or blank
265      */
266     @WebMethod(operationName = "getGroupIdsByPrincipalIdAndNamespaceCode")
267     @XmlElementWrapper(name = "groupIds", required = true)
268     @XmlElement(name = "groupId", required = false)
269     @WebResult(name = "groupIds")
270     @Cacheable(value= GroupMember.Cache.NAME, key="'{getGroupIdsByPrincipalIdAndNamespaceCode}' + 'principalId=' + #p0 + '|' + 'namespaceCode=' + #p1")
271 	List<String> getGroupIdsByPrincipalIdAndNamespaceCode(@WebParam(name = "principalId") String principalId,
272             @WebParam(name = "namespaceCode") String namespaceCode) throws RiceIllegalArgumentException;
273 
274 
275     /**
276      * Get all the groups for the given principal.  Does not recurse into parent groups.
277      *
278      * <p>
279      * This returns id for all groups for a given principal id.
280      * </p>
281      *
282      * @param principalId Id of a Principal
283      * @return a list of Group Ids in which the principal is directly a member of.
284      * @throws RiceIllegalArgumentException if the principalId is null or blank
285      */
286     @WebMethod(operationName = "getDirectGroupIdsByPrincipalId")
287     @XmlElementWrapper(name = "groupIds", required = true)
288     @XmlElement(name = "groupId", required = false)
289     @WebResult(name = "groupIds")
290     @Cacheable(value= GroupMember.Cache.NAME, key="'{getDirectGroupIdsByPrincipalId}' + 'principalId=' + #p0")
291     List<String> getDirectGroupIdsByPrincipalId(@WebParam(name = "principalId") String principalId) throws RiceIllegalArgumentException;
292 
293 
294     /**
295      * Check whether the group identified by groupMemberId is a member of the group
296      * identified by groupId.  This will recurse through all groups.
297      *
298      * <p>Will return true if the group is a member of the group or a group assigned to this group.</p>
299      *
300      * @param groupMemberId Id of the principal
301      * @param groupId     Id string of group
302      * @return true if group is a member of the group or a member of a group assigned to the the group.
303      * @throws RiceIllegalArgumentException if the groupMemberId, groupId is null or blank
304      */
305     @WebMethod(operationName = "isGroupMemberOfGroup")
306     @WebResult(name = "isMember")
307     @Cacheable(value= GroupMember.Cache.NAME, key="'{isGroupMemberOfGroup}' + 'groupMemberId=' + #p0 + '|' + 'groupId=' + #p1")
308     boolean isGroupMemberOfGroup(@WebParam(name="groupMemberId") String groupMemberId, @WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
309 
310 
311     /**
312      * Returns all principal ids that are members of the given group id.  Recurses into contained groups for
313      * comprehensive list.
314      *
315      * <p>Will return a list of all principal ids for members this group.</p>
316      *
317      * @param groupId     Id string of group
318      * @return List of principal ids
319      * @throws RiceIllegalArgumentException if the groupId is null or blank
320      */
321     @WebMethod(operationName = "getMemberPrincipalIds")
322     @XmlElementWrapper(name = "principalIds", required = true)
323     @XmlElement(name = "principalId", required = false)
324     @WebResult(name = "principalIds")
325     @Cacheable(value= GroupMember.Cache.NAME, key="'{getMemberPrincipalIds}' + 'groupId=' + #p0")
326 	List<String> getMemberPrincipalIds(@WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
327 
328 
329     /**
330      * Returns all principal ids that are direct members of the given group id.
331      *
332      * <p>Will return a list of all principal ids for direct members this group.</p>
333      *
334      * @param groupId     Id string of group
335      * @return List of direct member principal ids.
336      * @throws RiceIllegalArgumentException if the groupId is null or blank
337      */
338     @WebMethod(operationName = "getDirectMemberPrincipalIds")
339     @XmlElementWrapper(name = "principalIds", required = true)
340     @XmlElement(name = "principalId", required = false)
341     @WebResult(name = "principalIds")
342     @Cacheable(value= GroupMember.Cache.NAME, key="'{getDirectMemberPrincipalIds}' + 'groupId=' + #p0")
343 	List<String> getDirectMemberPrincipalIds(@WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
344 
345 
346     /**
347      * Returns all group ids that are members of the given group id.  Recurses into contained groups for
348      * a comprehensive list.
349      *
350      * <p>Will return a list of all group ids for members this group.</p>
351      *
352      * @param groupId     Id string of group
353      * @return List of group ids
354      * @throws RiceIllegalArgumentException if the groupId is null or blank
355      */
356     @WebMethod(operationName = "getMemberGroupIds")
357     @XmlElementWrapper(name = "groupIds", required = true)
358     @XmlElement(name = "groupId", required = false)
359     @WebResult(name = "groupIds")
360     @Cacheable(value= GroupMember.Cache.NAME, key="'{getMemberGroupIds}' + 'groupId=' + #p0")
361 	List<String> getMemberGroupIds( @WebParam(name="groupId") String groupId ) throws RiceIllegalArgumentException;
362 
363 
364     /**
365      * Returns all group ids that are direct members of the given group id.
366      *
367      * <p>Will return a list of all group ids for direct members this group.</p>
368      *
369      * @param groupId     Id string of group
370      * @return List of direct member group ids.
371      * @throws RiceIllegalArgumentException if the groupId is null or blank
372      */
373     @WebMethod(operationName = "getDirectMemberOfGroup")
374     @XmlElementWrapper(name = "groupIds", required = true)
375     @XmlElement(name = "groupId", required = false)
376     @WebResult(name = "groupIds")
377     @Cacheable(value= GroupMember.Cache.NAME, key="'{getDirectMemberGroupIds}' + 'groupId=' + #p0")
378 	List<String> getDirectMemberGroupIds( @WebParam(name="groupId") String groupId ) throws RiceIllegalArgumentException;
379 
380 
381     /**
382      * Returns all parent groups ids that the given group id is a member of. Recurses parent groups for
383      * a comprehensive list.
384      *
385      * <p>Will return a list of all group ids that the given group id is a member of.</p>
386      *
387      * @param groupId     Id string of group
388      * @return List of parent group ids.
389      * @throws RiceIllegalArgumentException if the groupId is null or blank
390      */
391     @WebMethod(operationName = "getParentGroupIds")
392     @XmlElementWrapper(name = "groupIds", required = true)
393     @XmlElement(name = "groupId", required = false)
394     @WebResult(name = "groupIds")
395     @Cacheable(value= GroupMember.Cache.NAME, key="'{getParentGroupIds}' + 'groupId=' + #p0")
396     List<String> getParentGroupIds(@WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
397 
398 
399     /**
400      * Returns all parent groups ids that the given group id is a member of.
401      *
402      * <p>Will return a list of all group ids that the given group id is a member of.</p>
403      *
404      * @param groupId     Id string of group
405      * @return List of parent group ids.
406      * @throws RiceIllegalArgumentException if the groupId is null or blank
407      */
408     @WebMethod(operationName = "getDirectParentGroupIds")
409     @XmlElementWrapper(name = "groupIds", required = true)
410     @XmlElement(name = "groupId", required = false)
411     @WebResult(name = "groupIds")
412     @Cacheable(value= GroupMember.Cache.NAME, key="'{getDirectParentGroupIds}' + 'groupId=' + #p0")
413     List<String> getDirectParentGroupIds(@WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
414 
415 	/**
416 	 * Get all the attributes of the given group.
417      * @throws RiceIllegalArgumentException if the groupId is null or blank
418 	 */
419     @WebMethod(operationName = "getAttributes")
420     @WebResult(name = "attributes")
421     @XmlJavaTypeAdapter(value = MapStringStringAdapter.class)
422     @Cacheable(value= Group.Cache.NAME, key="'{getAttributes}' + 'groupId=' + #p0")
423     Map<String, String> getAttributes( @WebParam(name="groupId") String groupId ) throws RiceIllegalArgumentException;
424 
425 
426     /**
427      * Get all GroupMembers all the groups with a given group id.
428      *
429      * <p>
430      * The collection of GroupMembers will contain members for a the group in no defined order.
431      * </p>
432      *
433      * @param groupId     Id of group
434      * @return Collection of GroupMembers.
435      * @throws RiceIllegalArgumentException if the groupId is null or blank
436      */
437     @WebMethod(operationName = "getMembersOfGroup")
438     @XmlElementWrapper(name = "members", required = true)
439     @XmlElement(name = "member", required = false)
440     @WebResult(name = "members")
441     @Cacheable(value= GroupMember.Cache.NAME, key="'groupId=' + #p0")
442 	List<GroupMember> getMembersOfGroup( @WebParam(name="groupId") String groupId ) throws RiceIllegalArgumentException;
443 
444 
445     /**
446      * Get all GroupMembers all the groups with the given group ids.
447      *
448      * <p>
449      * The collection of GroupMembers will contain members for all the groups in no defined order.
450      * The values returned may or may not be grouped by group id.
451      * </p>
452      *
453      * @param groupIds     Ids of groups
454      * @return Collection of GroupMembers.
455      * @throws RiceIllegalArgumentException if the groupIds is null or empty
456      */
457     @WebMethod(operationName = "getMembers")
458     @XmlElementWrapper(name = "members", required = true)
459     @XmlElement(name = "member", required = false)
460     @WebResult(name = "members")
461     @Cacheable(value= GroupMember.Cache.NAME, key="'groupIds=' + T(org.kuali.rice.core.api.cache.CacheKeyUtils).key(#p0)")
462 	List<GroupMember> getMembers( @WebParam(name="groupIds") List<String> groupIds ) throws RiceIllegalArgumentException;
463 
464 
465     /**
466      * Creates a new group using the given Group.
467      *
468      * <p>
469      * This will attempt to create a new Group
470      * </p>
471      *
472      * @param group The new group to be created
473      * @return a the Group that has been created.
474      * @throws RiceIllegalArgumentException if the group is null
475      */
476     @WebMethod(operationName = "createGroup")
477     @WebResult(name = "group")
478     @CacheEvict(value={Group.Cache.NAME, GroupMember.Cache.NAME}, allEntries = true)
479 	Group createGroup(@WebParam(name="group") Group group) throws RiceIllegalArgumentException;
480 
481     /**
482      * Updates an existing group using the given Group.
483      *
484      * <p>
485      * This will attempt to update an existing Group.  For this to return without exceptions, the passed in Group
486      * must have it's Id set and be a valid group that already exists.
487      * </p>
488      *
489      * @param group The group to be updated
490      * @return a the Group that has been updated.
491      * @throws RiceIllegalArgumentException if the group is null
492      */
493     @WebMethod(operationName = "updateGroup")
494     @WebResult(name = "group")
495     @CacheEvict(value={Group.Cache.NAME, GroupMember.Cache.NAME}, allEntries = true)
496 	Group updateGroup(@WebParam(name="group") Group group) throws RiceIllegalArgumentException;
497 
498 	/**
499      * Updates a group using the given Group.
500      *
501      * <p>
502      * This will attempt to update an existing group with data from the passed in group.  If the passed in groupId and the group.id values are different
503      * this method will inactivate the old group and create a new group with the same members with the passed in groups properties.
504      * </p>
505      *
506      * @param groupId Id of the Group to be updated
507      * @param group   Group object to use for update
508      * @return a the Group that has been updated.
509      * @throws RiceIllegalArgumentException if the group is null or the groupId is null or blank
510      */
511     @WebMethod(operationName = "updateGroupWithId")
512     @WebResult(name = "group")
513     @CacheEvict(value={Group.Cache.NAME, GroupMember.Cache.NAME}, allEntries = true)
514     Group updateGroup(@WebParam(name="groupId") String groupId, @WebParam(name="group") Group group) throws RiceIllegalArgumentException;
515 
516     /**
517      * Creates a new group using the given GroupMember.
518      *
519      * <p>
520      * This will attempt to create a new GroupMember
521      * </p>
522      *
523      * @param groupMember The new groupMember to be created
524      * @return a the GroupMember that has been created.
525      * @throws RiceIllegalArgumentException if the group is null
526      */
527     @WebMethod(operationName = "createGroupMember")
528     @WebResult(name = "groupMember")
529     @CacheEvict(value={GroupMember.Cache.NAME}, allEntries = true)
530 	GroupMember createGroupMember(@WebParam(name="groupMember") GroupMember groupMember) throws RiceIllegalArgumentException;
531 
532     /**
533      * Updates an existing group using the given GroupMember.
534      *
535      * <p>
536      * This will attempt to update an existing GroupMember.  For this to return without exceptions, the passed in
537      * GroupMember must have it's Id set and be a valid groupMember that already exists.
538      * </p>
539      *
540      * @param groupMember The groupMember to be updated
541      * @return a the GroupMember that has been updated.
542      * @throws RiceIllegalArgumentException if the groupMember is null
543      */
544     @WebMethod(operationName = "updateGroupMember")
545     @WebResult(name = "groupMember")
546     @CacheEvict(value={GroupMember.Cache.NAME}, allEntries = true)
547 	GroupMember updateGroupMember(@WebParam(name="groupMember") GroupMember groupMember) throws RiceIllegalArgumentException;
548 
549     /**
550      * Adds the group with the id supplied in childId as a member of the group with the id supplied in parentId.
551      *
552      * @param childId Id of the Group to be added to the members of Parent
553      * @param parentId  Id of the Group object to add the member to
554      * @return true if the member was added successfully.
555      * @throws RiceIllegalArgumentException if the childId, parentId is null or blank
556      */
557     @WebMethod(operationName = "addGroupToGroup")
558     @WebResult(name = "addedToGroup")
559     @CacheEvict(value={GroupMember.Cache.NAME}, allEntries = true)
560     boolean addGroupToGroup(@WebParam(name="childId") String childId, @WebParam(name="parentId") String parentId) throws RiceIllegalArgumentException;
561 
562     /**
563      * Removes the group with the id supplied in childId from the group with the id supplied in parentId.
564      *
565      * @param childId Id of the Group to be removed from the members of Parent
566      * @param parentId  Id of the Group object to remove the member from
567      * @return true if the member was removed successfully.
568      * @throws RiceIllegalArgumentException if the childId, parentId is null or blank
569      */
570     @WebMethod(operationName = "removeGroupFromGroup")
571     @WebResult(name = "removedFromGroup")
572     @CacheEvict(value={GroupMember.Cache.NAME}, allEntries = true)
573     boolean removeGroupFromGroup(@WebParam(name="childId") String childId, @WebParam(name="parentId") String parentId) throws RiceIllegalArgumentException;
574 
575     /**
576      * Add the principal with the given principalId as a member of the group with the given groupId.
577      *
578      * @param principalId Id of the Principal to be added to the members of the Parent Group
579      * @param groupId  Id of the Group object to add the member to
580      * @return true if the member was added successfully.
581      * @throws RiceIllegalArgumentException if the principalId, groupId is null or blank
582      */
583     @WebMethod(operationName = "addPrincipalToGroup")
584     @WebResult(name = "addedToGroup")
585     @CacheEvict(value={GroupMember.Cache.NAME}, allEntries = true)
586     boolean addPrincipalToGroup(@WebParam(name="principalId") String principalId, @WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
587 
588     /**
589      * Removes the member principal with the given principalId from the group with the given groupId.
590      *
591      * @param principalId Id of the Principal to be removed from the members of the Parent Group
592      * @param groupId  Id of the Group object to remove the member from
593      * @return true if the member was removed successfully.
594      * @throws RiceIllegalArgumentException if the principalId, groupId is null or blank
595      */
596     @WebMethod(operationName = "removePrincipalFromGroup")
597     @WebResult(name = "removedFromGroup")
598     @CacheEvict(value={GroupMember.Cache.NAME}, allEntries = true)
599     boolean removePrincipalFromGroup(@WebParam(name="principalId") String principalId, @WebParam(name="groupId") String groupId) throws RiceIllegalArgumentException;
600 
601     /**
602      * Removes all members from the group with the given groupId.
603      *
604      * @param groupId  Id of the Group object to remove the members from
605      * @throws RiceIllegalArgumentException if the groupId is null or blank
606      */
607     @WebMethod(operationName = "removeAllMembers")
608     @CacheEvict(value={GroupMember.Cache.NAME}, allEntries = true)
609     void removeAllMembers( @WebParam(name="groupId") String groupId ) throws RiceIllegalArgumentException;
610 }