001 /**
002 * Copyright 2005-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kim.impl.jaxb;
017
018 import java.io.Serializable;
019
020 import javax.xml.bind.Unmarshaller;
021 import javax.xml.bind.annotation.XmlAccessType;
022 import javax.xml.bind.annotation.XmlAccessorType;
023 import javax.xml.bind.annotation.XmlElement;
024 import javax.xml.bind.annotation.XmlTransient;
025 import javax.xml.bind.annotation.XmlType;
026 import javax.xml.bind.annotation.adapters.NormalizedStringAdapter;
027 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
028
029 import org.kuali.rice.core.util.jaxb.NameAndNamespacePair;
030 import org.kuali.rice.core.util.jaxb.NameAndNamespacePairValidatingAdapter;
031 import org.kuali.rice.kim.api.permission.PermissionContract;
032 import org.kuali.rice.kim.api.role.RoleContract;
033 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
034
035
036 /**
037 * Base class representing an unmarshalled <rolePermission> element.
038 * Refer to the static inner classes for more information about the specific contexts.
039 *
040 * @author Kuali Rice Team (rice.collab@kuali.org)
041 */
042 @XmlTransient
043 public abstract class RolePermissionXmlDTO implements Serializable {
044
045 private static final long serialVersionUID = 1L;
046
047 @XmlElement(name="permissionId")
048 @XmlJavaTypeAdapter(NormalizedStringAdapter.class)
049 private String permissionId;
050
051 @XmlElement(name="permissionName")
052 @XmlJavaTypeAdapter(NameAndNamespacePairValidatingAdapter.class)
053 private NameAndNamespacePair permissionNameAndNamespace;
054
055 /**
056 * Constructs an empty RolePermissionXmlDTO instance.
057 */
058 public RolePermissionXmlDTO() {}
059
060 /**
061 * Constructs a RolePermissionXmlDTO that gets populated from the given KIM permission.
062 *
063 * @param permission The permission that this DTO should obtain its data from.
064 * @param populateIds If true, the permission ID will get populated; otherwise, it will remain null.
065 */
066 public RolePermissionXmlDTO(PermissionContract permission, boolean populateIds) {
067 if (permission == null) {
068 throw new IllegalArgumentException("Cannot construct a role permission with a null permission");
069 }
070 if (populateIds) {
071 this.permissionId = permission.getId();
072 }
073 this.permissionNameAndNamespace = new NameAndNamespacePair(permission.getNamespaceCode(), permission.getName());
074 }
075
076 /**
077 * @return the permissionId
078 */
079 public String getPermissionId() {
080 return this.permissionId;
081 }
082
083 /**
084 * @param permissionId the permissionId to set
085 */
086 public void setPermissionId(String permissionId) {
087 this.permissionId = permissionId;
088 }
089
090 /**
091 * @return the permissionNameAndNamespace
092 */
093 public NameAndNamespacePair getPermissionNameAndNamespace() {
094 return this.permissionNameAndNamespace;
095 }
096
097 /**
098 * @param permissionNameAndNamespace the permissionNameAndNamespace to set
099 */
100 public void setPermissionNameAndNamespace(NameAndNamespacePair permissionNameAndNamespace) {
101 this.permissionNameAndNamespace = permissionNameAndNamespace;
102 }
103
104 /**
105 * Retrieves the permission name from the permission-name-and-namespace combo.
106 *
107 * @return The name of the permission assigned to the role, or null if the permission-name-and-namespace combo is null.
108 */
109 public String getPermissionName() {
110 return (permissionNameAndNamespace != null) ? permissionNameAndNamespace.getName() : null;
111 }
112
113 /**
114 * Retrieves the permission namespace code from the permission-name-and-namespace combo.
115 *
116 * @return The namespace code of the permission assigned to the role, or null if the permission-name-and-namespace combo is null.
117 */
118 public String getPermissionNamespaceCode() {
119 return (permissionNameAndNamespace != null) ? permissionNameAndNamespace.getNamespaceCode() : null;
120 }
121
122 /**
123 * Retrieves the ID of the role that the permission is assigned to.
124 * Subclasses are responsible for implementing this method so that it does so.
125 *
126 * @return The role ID of the role that the permission is assigned to.
127 */
128 public abstract String getRoleId();
129
130 // =======================================================================================================
131
132 /**
133 * This class represents a <rolePermission> element that is not a descendant of a <role> element.
134 *
135 * @author Kuali Rice Team (rice.collab@kuali.org)
136 */
137 @XmlAccessorType(XmlAccessType.FIELD)
138 @XmlType(name="StandaloneRolePermissionType", propOrder={
139 "roleId", "roleNameAndNamespace", "permissionId", "permissionNameAndNamespace"
140 })
141 public static class OutsideOfRole extends RolePermissionXmlDTO {
142
143 private static final long serialVersionUID = 1L;
144
145 @XmlElement(name="roleId")
146 @XmlJavaTypeAdapter(NormalizedStringAdapter.class)
147 private String roleId;
148
149 @XmlElement(name="roleName")
150 @XmlJavaTypeAdapter(NameAndNamespacePairValidatingAdapter.class)
151 private NameAndNamespacePair roleNameAndNamespace;
152
153 public OutsideOfRole() {
154 super();
155 }
156
157 public OutsideOfRole(PermissionContract permission, String roleId, boolean populateIds) {
158 super(permission, populateIds);
159 if (populateIds) {
160 this.roleId = roleId;
161 }
162 RoleContract tempRole = KimApiServiceLocator.getRoleService().getRole(roleId);
163 if (tempRole == null) {
164 throw new IllegalArgumentException("Cannot find role with ID \"" + roleId + "\"");
165 }
166 this.roleNameAndNamespace = new NameAndNamespacePair(tempRole.getNamespaceCode(), tempRole.getName());
167 }
168
169 /**
170 * @see org.kuali.rice.kim.impl.jaxb.RolePermissionXmlDTO#getRoleId()
171 */
172 @Override
173 public String getRoleId() {
174 return this.roleId;
175 }
176
177 /**
178 * @param roleId the roleId to set
179 */
180 public void setRoleId(String roleId) {
181 this.roleId = roleId;
182 }
183
184 /**
185 * @return the roleNameAndNamespace
186 */
187 public NameAndNamespacePair getRoleNameAndNamespace() {
188 return this.roleNameAndNamespace;
189 }
190
191 /**
192 * @param roleNameAndNamespace the roleNameAndNamespace to set
193 */
194 public void setRoleNameAndNamespace(NameAndNamespacePair roleNameAndNamespace) {
195 this.roleNameAndNamespace = roleNameAndNamespace;
196 }
197
198 /**
199 * Retrieves the role name from the role-name-and-namespace combo.
200 *
201 * @return The name of the role that is assigned to the permission, or null if the role-name-and-namespace combo is null.
202 */
203 public String getRoleName() {
204 return (roleNameAndNamespace != null) ? roleNameAndNamespace.getName() : null;
205 }
206
207 /**
208 * Retrieves the role namespace code from the role-name-and-namespace combo.
209 *
210 * @return The namespace code of the role that is assigned to the permission, or null if the role-name-and-namespace combo is null.
211 */
212 public String getRoleNamespaceCode() {
213 return (roleNameAndNamespace != null) ? roleNameAndNamespace.getNamespaceCode() : null;
214 }
215 }
216
217 // =======================================================================================================
218
219 /**
220 * This class represents a <rolePermission> element that is a descendant of a <role> element.
221 *
222 * @author Kuali Rice Team (rice.collab@kuali.org)
223 */
224 @XmlAccessorType(XmlAccessType.FIELD)
225 @XmlType(name="RolePermissionType", propOrder={
226 "permissionId", "permissionNameAndNamespace"
227 })
228 public static class WithinRole extends RolePermissionXmlDTO {
229
230 private static final long serialVersionUID = 1L;
231
232 @XmlTransient
233 private String roleId;
234
235 public WithinRole() {
236 super();
237 }
238
239 public WithinRole(PermissionContract permission, boolean populateIds) {
240 super(permission, populateIds);
241 }
242
243 void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) {
244 if (parent instanceof RolePermissionsXmlDTO) {
245 this.roleId = ((RolePermissionXmlDTO)parent).getRoleId();
246 }
247 }
248
249 /**
250 * @see org.kuali.rice.kim.impl.jaxb.RolePermissionXmlDTO#getRoleId()
251 */
252 @Override
253 public String getRoleId() {
254 return this.roleId;
255 }
256 }
257 }