001/* 002 * The Kuali Financial System, a comprehensive financial management system for higher education. 003 * 004 * Copyright 2005-2014 The Kuali Foundation 005 * 006 * This program is free software: you can redistribute it and/or modify 007 * it under the terms of the GNU Affero General Public License as 008 * published by the Free Software Foundation, either version 3 of the 009 * License, or (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU Affero General Public License for more details. 015 * 016 * You should have received a copy of the GNU Affero General Public License 017 * along with this program. If not, see <http://www.gnu.org/licenses/>. 018 */ 019package org.kuali.rice.kim.impl.jaxb; 020 021import static org.kuali.rice.core.api.criteria.PredicateFactory.equal; 022 023import java.io.Serializable; 024import java.util.ArrayList; 025import java.util.HashSet; 026import java.util.List; 027import java.util.Set; 028 029import javax.xml.bind.Marshaller; 030import javax.xml.bind.UnmarshalException; 031import javax.xml.bind.Unmarshaller; 032import javax.xml.bind.annotation.XmlAccessType; 033import javax.xml.bind.annotation.XmlAccessorType; 034import javax.xml.bind.annotation.XmlElement; 035import javax.xml.bind.annotation.XmlTransient; 036import javax.xml.bind.annotation.XmlType; 037 038import org.kuali.rice.core.api.criteria.QueryByCriteria; 039import org.kuali.rice.core.util.jaxb.RiceXmlExportList; 040import org.kuali.rice.core.util.jaxb.RiceXmlImportList; 041import org.kuali.rice.core.util.jaxb.RiceXmlListAdditionListener; 042import org.kuali.rice.core.util.jaxb.RiceXmlListGetterListener; 043import org.kuali.rice.kim.api.role.RoleMember; 044import org.kuali.rice.kim.api.role.RoleMemberContract; 045import org.kuali.rice.kim.api.services.KimApiServiceLocator; 046 047/** 048 * Base class representing an unmarshalled <roleMembers> element. 049 * Refer to the static inner classes for more information about the specific contexts. 050 * 051 * @author Kuali Rice Team (rice.collab@kuali.org) 052 */ 053@XmlTransient 054public abstract class RoleMembersXmlDTO<T extends RoleMemberXmlDTO> implements RiceXmlListAdditionListener<T>, Serializable { 055 056 private static final long serialVersionUID = 1L; 057 058 public abstract List<T> getRoleMembers(); 059 060 public abstract void setRoleMembers(List<T> roleMembers); 061 062 void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException { 063 setRoleMembers(new RiceXmlImportList<T>(this)); 064 } 065 066 void afterUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException { 067 setRoleMembers(null); 068 } 069 070 // ======================================================================================================= 071 072 /** 073 * This class represents a <roleMembers> element that is not a child of a <role> element. 074 * 075 * @author Kuali Rice Team (rice.collab@kuali.org) 076 */ 077 @XmlAccessorType(XmlAccessType.FIELD) 078 @XmlType(name="StandaloneRoleMembersType", propOrder={"roleMembers"}) 079 public static class OutsideOfRole extends RoleMembersXmlDTO<RoleMemberXmlDTO.OutsideOfRole> { 080 081 private static final long serialVersionUID = 1L; 082 083 @XmlElement(name="roleMember") 084 private List<RoleMemberXmlDTO.OutsideOfRole> roleMembers; 085 086 /** 087 * @see org.kuali.rice.kim.impl.jaxb.RoleMembersXmlDTO#getRoleMembers() 088 */ 089 @Override 090 public List<RoleMemberXmlDTO.OutsideOfRole> getRoleMembers() { 091 return this.roleMembers; 092 } 093 094 /** 095 * @see org.kuali.rice.kim.impl.jaxb.RoleMembersXmlDTO#setRoleMembers(java.util.List) 096 */ 097 @Override 098 public void setRoleMembers(List<RoleMemberXmlDTO.OutsideOfRole> roleMembers) { 099 this.roleMembers = roleMembers; 100 } 101 102 /** 103 * @see org.kuali.rice.core.util.jaxb.RiceXmlListAdditionListener#newItemAdded(java.lang.Object) 104 */ 105 @Override 106 public void newItemAdded(RoleMemberXmlDTO.OutsideOfRole item) { 107 try { 108 RoleXmlUtil.validateAndPersistNewRoleMember(item); 109 } catch (UnmarshalException e) { 110 throw new RuntimeException(e); 111 } 112 } 113 } 114 115 // ======================================================================================================= 116 117 /** 118 * This class represents a <roleMembers> element that is a child of a <role> element. 119 * 120 * @author Kuali Rice Team (rice.collab@kuali.org) 121 */ 122 @XmlAccessorType(XmlAccessType.FIELD) 123 @XmlType(name="RoleMembersType", propOrder={"roleMembers"}) 124 public static class WithinRole extends RoleMembersXmlDTO<RoleMemberXmlDTO.WithinRole> 125 implements RiceXmlListGetterListener<RoleMemberXmlDTO.WithinRole,String> { 126 127 private static final long serialVersionUID = 1L; 128 129 @XmlElement(name="roleMember") 130 private List<RoleMemberXmlDTO.WithinRole> roleMembers; 131 132 @XmlTransient 133 private String roleId; 134 135 @XmlTransient 136 private Set<String> existingRoleMemberIds; 137 138 public WithinRole() {} 139 140 public WithinRole(String roleId) { 141 this.roleId = roleId; 142 } 143 144 /** 145 * @see org.kuali.rice.kim.impl.jaxb.RoleMembersXmlDTO#getRoleMembers() 146 */ 147 @Override 148 public List<org.kuali.rice.kim.impl.jaxb.RoleMemberXmlDTO.WithinRole> getRoleMembers() { 149 return this.roleMembers; 150 } 151 152 /** 153 * @see org.kuali.rice.kim.impl.jaxb.RoleMembersXmlDTO#setRoleMembers(java.util.List) 154 */ 155 @Override 156 public void setRoleMembers(List<org.kuali.rice.kim.impl.jaxb.RoleMemberXmlDTO.WithinRole> roleMembers) { 157 this.roleMembers = roleMembers; 158 } 159 160 /** 161 * @return the roleId 162 */ 163 public String getRoleId() { 164 return this.roleId; 165 } 166 167 /** 168 * @see org.kuali.rice.kim.impl.jaxb.RoleMembersXmlDTO#beforeUnmarshal(javax.xml.bind.Unmarshaller, java.lang.Object) 169 */ 170 @Override 171 void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException { 172 if (parent instanceof RoleXmlDTO) { 173 // Obtain the role ID from the enclosing role, and persist the role if it has not been persisted yet. 174 RoleXmlDTO parentRole = (RoleXmlDTO) parent; 175 if (!parentRole.isAlreadyPersisted()) { 176 RoleXmlUtil.validateAndPersistNewRole(parentRole); 177 } 178 roleId = parentRole.getRoleId(); 179 } 180 existingRoleMemberIds = new HashSet<String>(); 181 super.beforeUnmarshal(unmarshaller, parent); 182 } 183 184 /** 185 * This overridden method ... 186 * 187 * @see org.kuali.rice.kim.impl.jaxb.RoleMembersXmlDTO#afterUnmarshal(javax.xml.bind.Unmarshaller, java.lang.Object) 188 */ 189 @Override 190 void afterUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException { 191 super.afterUnmarshal(unmarshaller, parent); 192 if (parent instanceof RoleXmlDTO) { 193 ((RoleXmlDTO)parent).setExistingRoleMemberIds(existingRoleMemberIds); 194 } 195 existingRoleMemberIds = null; 196 } 197 198 /** 199 * @see org.kuali.rice.core.util.jaxb.RiceXmlListAdditionListener#newItemAdded(java.lang.Object) 200 */ 201 @Override 202 public void newItemAdded(org.kuali.rice.kim.impl.jaxb.RoleMemberXmlDTO.WithinRole item) { 203 // Persist the role member and add it to the set of role members that should not be removed from the role. 204 try { 205 existingRoleMemberIds.add(RoleXmlUtil.validateAndPersistNewRoleMember(item)); 206 } catch (UnmarshalException e) { 207 throw new RuntimeException(e); 208 } 209 } 210 211 void beforeMarshal(Marshaller marshaller) { 212 List<RoleMember> tempMembers = KimApiServiceLocator.getRoleService().findRoleMembers( 213 QueryByCriteria.Builder.fromPredicates(equal("roleId", roleId))).getResults(); 214 if (tempMembers != null && !tempMembers.isEmpty()) { 215 List<String> roleMemberIds = new ArrayList<String>(); 216 217 for (RoleMemberContract tempMember : tempMembers) { 218 if (tempMember.isActive(null)) { 219 roleMemberIds.add(tempMember.getId()); 220 } 221 } 222 223 if (!roleMemberIds.isEmpty()) { 224 setRoleMembers(new RiceXmlExportList<RoleMemberXmlDTO.WithinRole,String>(roleMemberIds, this)); 225 } 226 } 227 } 228 229 void afterMarshal(Marshaller marshaller) { 230 setRoleMembers(null); 231 } 232 233 /** 234 * @see org.kuali.rice.core.util.jaxb.RiceXmlListGetterListener#gettingNextItem(java.lang.Object, int) 235 */ 236 @Override 237 public RoleMemberXmlDTO.WithinRole gettingNextItem(String nextItem, int index) { 238 return new RoleMemberXmlDTO.WithinRole(KimApiServiceLocator.getRoleService().findRoleMembers(QueryByCriteria.Builder.fromPredicates(equal("roleMemberId", nextItem))).getResults().get(0), false); 239 } 240 } 241}