/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use * this file except in compliance with the License. You may obtain a copy of the License at the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package org.apereo.portal.groups; import java.util.Set; import org.apereo.portal.EntityIdentifier; import org.apereo.portal.IBasicEntity; /** * An <code>IGroupMember</code> defines common behavior for both the leaf <code>IEntity</code> and * composite <code>IEntityGroup</code> sub-types that together make up a Groups structure. * * <p>An <code>IGroupMember</code> can answer both its parents and its children but has no api for * adding or removing them. These methods are defined on the composite type, <code>IEntityGroup * </code>, since you add a member to a group, and not vice versa. * * <p>Because it extends <code>IBasicEntity</code>, an <code>IGroupMember</code> has an <code> * EntityIdentifier</code> that can be used to cache and lock it. A leaf <code>IGroupMember</code> * also has a separate <code>EntityIdentifier</code> for its underlying entity. This second <code> * EntityIdentifier</code> is used to create and record group memberships. In the case of a * composite (non-leaf) <code>IGroupMember</code>, both <code>EntityIdentifiers</code> are the same. * * <p>Take care to implement <code>equals()</code> and <code>hashCode()</code> so that duplicates * returned from "deep" methods can be recognized. * */ public interface IGroupMember extends IBasicEntity { /** * Returns an <code>Iterator</code> over the <code>Set</code> of this <code>IGroupMember's * </code> recursively-retrieved parent groups. * * @return java.util.Iterator */ Set<IEntityGroup> getAncestorGroups() throws GroupsException; /** * Returns an <code>Iterator</code> over this <code>IGroupMember's</code> parent groups. * * @return java.util.Iterator */ Set<IEntityGroup> getParentGroups() throws GroupsException; /** * Returns the key of the underlying entity. * * @return String */ String getKey(); /** * Returns the underlying entity type. For an <code>IEntityGroup</code>, this is analogous to * <code>Class</code> as applied to an <code>Array</code>; it is an attribute of the group * object. For an <code>IEntity</code>, it is the entity type of the group the entity belongs * to, which may be any <code>Class</code> the underlying entity can be legally cast to. Thus, * an <code>IEntity</code> with an underlying entity of type <code>Manager</code> could have an * entity type of <code>Employee</code> as long as <code>Employee</code> was a superclass of * <code>Manager</code>. */ Class<? extends IBasicEntity> getLeafType(); /** * Returns the type of the underlying entity. For a group this will be <code>IEntityGroup</code> * . For an entity, it will be the type of the underlying <code>EntityIdentifier</code>. */ Class getType(); /** * Returns <code>EntityIdentifier</code> for this <code>IGroupMember's</code> underlying entity. * In the case of an <code>IEntityGroup</code>, it will be the <code>EntityIdentifier</code> for * <code>this</code>. In the case of an <code>IEntity</code>, it will be the <code> * EntityIdentifier</code> that identifies the underlying IPerson, ChannelDefinition, etc. * * @return org.apereo.portal.EntityIdentifier */ EntityIdentifier getUnderlyingEntityIdentifier(); /** * Answers if <code>this</code> is a recursive member of <code>IGroupMember</code> gm. * * @return boolean * @param gm org.apereo.portal.groups.IGroupMember */ boolean isDeepMemberOf(IEntityGroup group) throws GroupsException; /** @return boolean */ boolean isGroup(); /** * Answers if <code>this</code> is a member of <code>IGroupMember</code> gm. * * @return boolean * @param gm org.apereo.portal.groups.IGroupMember */ boolean isMemberOf(IEntityGroup group) throws GroupsException; /** * If this group member is an IEntityGroup, this method will return a reference to it as such; * otherwise throws an exception. */ IEntityGroup asGroup(); }