/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.rice.kim.impl.jaxb; import java.io.Serializable; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.NormalizedStringAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.kuali.rice.core.util.jaxb.NameAndNamespacePair; import org.kuali.rice.core.util.jaxb.NameAndNamespacePairValidatingAdapter; import org.kuali.rice.kim.api.permission.PermissionContract; import org.kuali.rice.kim.api.role.RoleContract; import org.kuali.rice.kim.api.services.KimApiServiceLocator; /** * Base class representing an unmarshalled <rolePermission> element. * Refer to the static inner classes for more information about the specific contexts. * * @author Kuali Rice Team (rice.collab@kuali.org) */ @XmlTransient public abstract class RolePermissionXmlDTO implements Serializable { private static final long serialVersionUID = 1L; @XmlElement(name="permissionId") @XmlJavaTypeAdapter(NormalizedStringAdapter.class) private String permissionId; @XmlElement(name="permissionName") @XmlJavaTypeAdapter(NameAndNamespacePairValidatingAdapter.class) private NameAndNamespacePair permissionNameAndNamespace; /** * Constructs an empty RolePermissionXmlDTO instance. */ public RolePermissionXmlDTO() {} /** * Constructs a RolePermissionXmlDTO that gets populated from the given KIM permission. * * @param permission The permission that this DTO should obtain its data from. * @param populateIds If true, the permission ID will get populated; otherwise, it will remain null. */ public RolePermissionXmlDTO(PermissionContract permission, boolean populateIds) { if (permission == null) { throw new IllegalArgumentException("Cannot construct a role permission with a null permission"); } if (populateIds) { this.permissionId = permission.getId(); } this.permissionNameAndNamespace = new NameAndNamespacePair(permission.getNamespaceCode(), permission.getName()); } /** * @return the permissionId */ public String getPermissionId() { return this.permissionId; } /** * @param permissionId the permissionId to set */ public void setPermissionId(String permissionId) { this.permissionId = permissionId; } /** * @return the permissionNameAndNamespace */ public NameAndNamespacePair getPermissionNameAndNamespace() { return this.permissionNameAndNamespace; } /** * @param permissionNameAndNamespace the permissionNameAndNamespace to set */ public void setPermissionNameAndNamespace(NameAndNamespacePair permissionNameAndNamespace) { this.permissionNameAndNamespace = permissionNameAndNamespace; } /** * Retrieves the permission name from the permission-name-and-namespace combo. * * @return The name of the permission assigned to the role, or null if the permission-name-and-namespace combo is null. */ public String getPermissionName() { return (permissionNameAndNamespace != null) ? permissionNameAndNamespace.getName() : null; } /** * Retrieves the permission namespace code from the permission-name-and-namespace combo. * * @return The namespace code of the permission assigned to the role, or null if the permission-name-and-namespace combo is null. */ public String getPermissionNamespaceCode() { return (permissionNameAndNamespace != null) ? permissionNameAndNamespace.getNamespaceCode() : null; } /** * Retrieves the ID of the role that the permission is assigned to. * Subclasses are responsible for implementing this method so that it does so. * * @return The role ID of the role that the permission is assigned to. */ public abstract String getRoleId(); // ======================================================================================================= /** * This class represents a <rolePermission> element that is not a descendant of a <role> element. * * @author Kuali Rice Team (rice.collab@kuali.org) */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name="StandaloneRolePermissionType", propOrder={ "roleId", "roleNameAndNamespace", "permissionId", "permissionNameAndNamespace" }) public static class OutsideOfRole extends RolePermissionXmlDTO { private static final long serialVersionUID = 1L; @XmlElement(name="roleId") @XmlJavaTypeAdapter(NormalizedStringAdapter.class) private String roleId; @XmlElement(name="roleName") @XmlJavaTypeAdapter(NameAndNamespacePairValidatingAdapter.class) private NameAndNamespacePair roleNameAndNamespace; public OutsideOfRole() { super(); } public OutsideOfRole(PermissionContract permission, String roleId, boolean populateIds) { super(permission, populateIds); if (populateIds) { this.roleId = roleId; } RoleContract tempRole = KimApiServiceLocator.getRoleService().getRole(roleId); if (tempRole == null) { throw new IllegalArgumentException("Cannot find role with ID \"" + roleId + "\""); } this.roleNameAndNamespace = new NameAndNamespacePair(tempRole.getNamespaceCode(), tempRole.getName()); } /** * @see org.kuali.rice.kim.impl.jaxb.RolePermissionXmlDTO#getRoleId() */ @Override public String getRoleId() { return this.roleId; } /** * @param roleId the roleId to set */ public void setRoleId(String roleId) { this.roleId = roleId; } /** * @return the roleNameAndNamespace */ public NameAndNamespacePair getRoleNameAndNamespace() { return this.roleNameAndNamespace; } /** * @param roleNameAndNamespace the roleNameAndNamespace to set */ public void setRoleNameAndNamespace(NameAndNamespacePair roleNameAndNamespace) { this.roleNameAndNamespace = roleNameAndNamespace; } /** * Retrieves the role name from the role-name-and-namespace combo. * * @return The name of the role that is assigned to the permission, or null if the role-name-and-namespace combo is null. */ public String getRoleName() { return (roleNameAndNamespace != null) ? roleNameAndNamespace.getName() : null; } /** * Retrieves the role namespace code from the role-name-and-namespace combo. * * @return The namespace code of the role that is assigned to the permission, or null if the role-name-and-namespace combo is null. */ public String getRoleNamespaceCode() { return (roleNameAndNamespace != null) ? roleNameAndNamespace.getNamespaceCode() : null; } } // ======================================================================================================= /** * This class represents a <rolePermission> element that is a descendant of a <role> element. * * @author Kuali Rice Team (rice.collab@kuali.org) */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name="RolePermissionType", propOrder={ "permissionId", "permissionNameAndNamespace" }) public static class WithinRole extends RolePermissionXmlDTO { private static final long serialVersionUID = 1L; @XmlTransient private String roleId; public WithinRole() { super(); } public WithinRole(PermissionContract permission, boolean populateIds) { super(permission, populateIds); } void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) { if (parent instanceof RolePermissionsXmlDTO) { this.roleId = ((RolePermissionXmlDTO)parent).getRoleId(); } } /** * @see org.kuali.rice.kim.impl.jaxb.RolePermissionXmlDTO#getRoleId() */ @Override public String getRoleId() { return this.roleId; } } }