package ru.hflabs.rcd.model.document;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import ru.hflabs.rcd.model.Descriptioned;
import ru.hflabs.rcd.model.Named;
import ru.hflabs.rcd.model.OneToMany;
import ru.hflabs.rcd.model.Permissioned;
import ru.hflabs.rcd.model.annotation.Hashed;
import ru.hflabs.rcd.model.annotation.Indexed;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlTransient;
import java.util.Collection;
import static ru.hflabs.util.core.EqualsUtil.lowerCaseEquals;
import static ru.hflabs.util.core.EqualsUtil.lowerCaseHashCode;
/**
* Класс <class>Group</class> описывает группу справочников
*
* @see Named
* @see Descriptioned
* @see ru.hflabs.rcd.model.Identifying
*/
@Getter
@Setter
@Indexed(
id = Group.PRIMARY_KEY,
fields = {
@Indexed.Field(Group.HISTORY_ID),
@Indexed.Field(Group.CHANGE_TYPE),
@Indexed.Field(Group.CHANGE_DATE),
@Indexed.Field(value = Group.NAME, search = true),
@Indexed.Field(value = Group.DESCRIPTION, search = true),
@Indexed.Field(Group.OWNER)
}
)
@Hashed(ignore = {Group.PRIMARY_KEY, Group.HISTORY_ID})
public final class Group extends DocumentTemplate implements Named, Descriptioned, Permissioned, OneToMany<Dictionary> {
private static final long serialVersionUID = -289028798163794162L;
/*
* Название полей с идентификаторами
*/
public static final String OWNER = "owner";
public static final String PERMISSIONS = "permissions";
/** Владелец группы */
@Size(max = NAME_MAX_SIZE)
private String owner;
/** Уникальное название группы */
@NotNull
@Size(min = NAME_MIN_SIZE, max = NAME_MAX_SIZE)
private String name;
/** Описание группы */
@Size(max = DESCRIPTION_SIZE)
private String description;
/** Права безопасности */
private int permissions = Permissioned.PERMISSION_ALL;
/** Коллекция справоников группы */
private Collection<Dictionary> descendants;
@XmlTransient
@Override
public Collection<Dictionary> getDescendants() {
return descendants;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + lowerCaseHashCode(name);
result = 31 * result + (description != null ? description.hashCode() : 0);
result = 31 * result + (owner != null ? owner.hashCode() : 0);
return result;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
if (!super.equals(o)) {
return false;
}
Group that = (Group) o;
if (!lowerCaseEquals(name, that.name)) {
return false;
}
if (description != null ? !description.equals(that.description) : that.description != null) {
return false;
}
if (owner != null ? !owner.equals(that.owner) : that.owner != null) {
return false;
}
return true;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
.appendSuper(super.toString())
.append(OWNER, getOwner())
.append(NAME, getName())
.append(PERMISSIONS, getPermissions())
.toString();
}
}