/** * 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.layout.dlm.remoting; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.builder.CompareToBuilder; import org.apereo.portal.groups.IEntityGroup; import org.apereo.portal.groups.IGroupMember; import org.apereo.portal.portlet.om.PortletCategory; import org.apereo.portal.portlets.groupselector.EntityEnum; import org.apereo.portal.security.IPermission; /** * Entity bean for JSON output. Used for categories, groups, and people. * */ public class JsonEntityBean implements Serializable, Comparable<JsonEntityBean> { private static final long serialVersionUID = 1L; private EntityEnum entityType; private String id; private String name; private String creatorId; private String description; private String principalString; private String targetString; private List<JsonEntityBean> children = new ArrayList<JsonEntityBean>(); private boolean childrenInitialized = false; public JsonEntityBean() {} public JsonEntityBean(PortletCategory category) { this.entityType = EntityEnum.CATEGORY; this.id = category.getId(); this.name = category.getName(); this.creatorId = category.getCreatorId(); this.description = category.getDescription(); this.targetString = category.getId(); // e.g. 'local.25' } public JsonEntityBean(IGroupMember groupMember, EntityEnum entityType) { this.entityType = entityType; this.id = groupMember.getKey(); String prefix = ""; // default switch (entityType) { case PORTLET: prefix = IPermission.PORTLET_PREFIX; // E.g. groupMember.getKey()=56 break; case PERSON: // No prefix -- e.g. groupMember.getKey()=admin break; default: throw new IllegalArgumentException("Unsupported entityType: " + entityType); } this.targetString = prefix + groupMember.getKey(); } public JsonEntityBean(IEntityGroup entityGroup, EntityEnum entityType) { this.entityType = entityType; this.id = entityGroup.getKey(); this.name = entityGroup.getName(); this.creatorId = entityGroup.getCreatorID(); this.description = entityGroup.getDescription(); this.targetString = entityGroup.getKey(); // e.g. 'local.19' and 'pags.Authenticated Users' } public EntityEnum getEntityType() { return entityType; } public String getEntityTypeAsString() { return entityType.toString().toUpperCase(); } public void setEntityType(String entityType) { this.entityType = EntityEnum.getEntityEnum(entityType); } public void setEntityType(EntityEnum entityType) { this.entityType = entityType; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCreatorId() { return creatorId; } public void setCreatorId(String creatorId) { this.creatorId = creatorId; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPrincipalString() { return principalString; } public void setPrincipalString(String principalString) { this.principalString = principalString; } /** * Identifies this bean uniquely as a permissions target. NOTE: This id is not the fname (for * portlets) or name field (for groups), but rater a unique String like 'PORTLET_ID.19' or * 'local.36' or 'pags.Authenticated Users' * * @since 4.0.14 */ public String getTargetString() { return targetString; } /** @since 4.0.14 */ public void setTargetString(String targetString) { this.targetString = targetString; } /** * Compute a hash based on type and ID to uniquely identify this bean. This method helps avoid * the unlikely case where a group and person in the same principal list have the same ID. * * <p>Periods are replaced to avoid issues in JSP EL and form names can't contain spaces. Also * SpEL parsing of form field names fails with characters such as dash or parenthesis (which * PAGS groups can have) and likely other characters so they are also replaced with underscores. * * @return EntityType + "_" + ID */ public String getTypeAndIdHash() { assert (entityType != null); assert (id != null); String idStr = id.replaceAll("\\W", "__"); return entityType.toString().toLowerCase() + "_" + idStr; } public List<JsonEntityBean> getChildren() { return children; } public void setChildren(List<JsonEntityBean> children) { this.children = children; } /** * Convenience method to add a child to this object's list of children. * * @param child Object to add */ public void addChild(JsonEntityBean child) { children.add(child); } public boolean isChildrenInitialized() { return childrenInitialized; } public void setChildrenInitialized(boolean childrenInitialized) { this.childrenInitialized = childrenInitialized; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (childrenInitialized ? 1231 : 1237); result = prime * result + ((creatorId == null) ? 0 : creatorId.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((entityType == null) ? 0 : entityType.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; JsonEntityBean other = (JsonEntityBean) obj; if (childrenInitialized != other.childrenInitialized) return false; if (creatorId == null) { if (other.creatorId != null) return false; } else if (!creatorId.equals(other.creatorId)) return false; if (description == null) { if (other.description != null) return false; } else if (!description.equals(other.description)) return false; if (entityType == null) { if (other.entityType != null) return false; } else if (!entityType.equals(other.entityType)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public int compareTo(JsonEntityBean entity) { return (new CompareToBuilder()) .append(this.name, entity.getName()) .append(this.entityType, entity.getEntityType()) .append(this.creatorId, entity.getCreatorId()) .append(this.description, entity.getDescription()) .append(this.entityType, entity.getEntityType()) .append(this.id, entity.getId()) .append(this.principalString, this.getPrincipalString()) .toComparison(); } @Override public String toString() { return "JsonEntityBean [entityType=" + entityType + ", id=" + id + ", name=" + name + ", creatorId=" + creatorId + ", description=" + description + ", principalString=" + principalString + "]"; } }