/**
* Copyright (C) 2011 JTalks.org Team
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jtalks.jcommune.service.security.acl.sids;
import org.jtalks.common.model.entity.Group;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.Immutable;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
/**
* This class does the same as {@link org.springframework.security.acls.domain.PrincipalSid} does for users. More
* precisely it contains some security ID that is used by Spring ACL to associate the owner to the permissions it owns.
* Thus this class contains an ID that will be saved into database ({@code acl_sids#sid, acl_object_identity#owner_sid,
* acl_entry#sid}).
*
* @author stanislav bashkirstev
*/
@Immutable
public class UserGroupSid implements UniversalSid {
public static final String SID_PREFIX = "usergroup";
private final String groupId;
/**
* @param sidId passes the direct sid id which should obey the format "usergroup:[group_id]"
* @throws UniversalSid.WrongFormatException
* if the format of the passed string is wrong
*/
public UserGroupSid(@Nonnull String sidId) {
this.groupId = parseGroupId(sidId);
}
/**
* Constructs SID by the group id. The {@link #getSidId()} will consist of word 'usrgroup:[specified id]'.
*
* @param groupId the id of the group that will own permissions for some actions on some objects
* @see Group#getId()
*/
public UserGroupSid(@Nonnegative long groupId) {
this.groupId = String.valueOf(groupId);
}
/**
* Constructs a SID by retrieving the group id from the {@link Group} object.
*
* @param group a group to take its database id
* @see Group#getId()
*/
public UserGroupSid(@Nonnull Group group) {
this.groupId = String.valueOf(group.getId());
}
private String parseGroupId(String sidId) {
String[] splitted = sidId.split(Pattern.quote(":"));
if (splitted.length != 2) {
throw new WrongFormatException(sidId);
}
return splitted[1];
}
/**
* Gets the id of the {@link Group} which this SID is actually is.
*
* @return the id of the {@link Group} which this SID is actually is
*/
public String getGroupId() {
return groupId;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isPrincipal() {
return false;
}
/**
* {@inheritDoc}
*/
@Override
public String getSidId() {
return SID_PREFIX + UniversalSid.SID_NAME_SEPARATOR + groupId;
}
/**
* Creates a list of sids from the specified list of groups.
*
* @param groups the array of groups that should be turned into the list of sids, might be empty
* @return the list of sids with the same size as it was specified
* @see #UserGroupSid(Group)
*/
public static List<UserGroupSid> create(@Nonnull Group... groups) {
List<UserGroupSid> userGroupSids = new ArrayList<UserGroupSid>();
for (Group group : groups) {
userGroupSids.add(new UserGroupSid(group));
}
return userGroupSids;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
UserGroupSid that = (UserGroupSid) o;
if (!groupId.equals(that.groupId)) {
return false;
}
return true;
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
return groupId.hashCode();
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return getSidId();
}
}