View Javadoc
1   /*
2    * The Kuali Financial System, a comprehensive financial management system for higher education.
3    * 
4    * Copyright 2005-2014 The Kuali Foundation
5    * 
6    * This program is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU Affero General Public License as
8    * published by the Free Software Foundation, either version 3 of the
9    * License, or (at your option) any later version.
10   * 
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU Affero General Public License for more details.
15   * 
16   * You should have received a copy of the GNU Affero General Public License
17   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  package org.kuali.rice.kim.impl.jaxb;
20  
21  import static org.kuali.rice.core.api.criteria.PredicateFactory.equal;
22  
23  import java.io.Serializable;
24  import java.util.ArrayList;
25  import java.util.HashSet;
26  import java.util.List;
27  import java.util.Set;
28  
29  import javax.xml.bind.Marshaller;
30  import javax.xml.bind.UnmarshalException;
31  import javax.xml.bind.Unmarshaller;
32  import javax.xml.bind.annotation.XmlAccessType;
33  import javax.xml.bind.annotation.XmlAccessorType;
34  import javax.xml.bind.annotation.XmlElement;
35  import javax.xml.bind.annotation.XmlTransient;
36  import javax.xml.bind.annotation.XmlType;
37  
38  import org.kuali.rice.core.api.criteria.QueryByCriteria;
39  import org.kuali.rice.core.util.jaxb.RiceXmlExportList;
40  import org.kuali.rice.core.util.jaxb.RiceXmlImportList;
41  import org.kuali.rice.core.util.jaxb.RiceXmlListAdditionListener;
42  import org.kuali.rice.core.util.jaxb.RiceXmlListGetterListener;
43  import org.kuali.rice.kim.api.role.RoleMember;
44  import org.kuali.rice.kim.api.role.RoleMemberContract;
45  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
46  
47  /**
48   * Base class representing an unmarshalled &lt;roleMembers&gt; element.
49   * Refer to the static inner classes for more information about the specific contexts.
50   * 
51   * @author Kuali Rice Team (rice.collab@kuali.org)
52   */
53  @XmlTransient
54  public abstract class RoleMembersXmlDTO<T extends RoleMemberXmlDTO> implements RiceXmlListAdditionListener<T>, Serializable {
55  
56      private static final long serialVersionUID = 1L;
57  
58      public abstract List<T> getRoleMembers();
59      
60      public abstract void setRoleMembers(List<T> roleMembers);
61      
62      void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException {
63          setRoleMembers(new RiceXmlImportList<T>(this));
64      }
65      
66      void afterUnmarshal(Unmarshaller unmarshaller, Object parent) throws UnmarshalException {
67          setRoleMembers(null);
68      }
69      
70      // =======================================================================================================
71      
72      /**
73       * This class represents a &lt;roleMembers&gt; element that is not a child of a &lt;role&gt; element.
74       * 
75       * @author Kuali Rice Team (rice.collab@kuali.org)
76       */
77      @XmlAccessorType(XmlAccessType.FIELD)
78      @XmlType(name="StandaloneRoleMembersType", propOrder={"roleMembers"})
79      public static class OutsideOfRole extends RoleMembersXmlDTO<RoleMemberXmlDTO.OutsideOfRole> {
80  
81          private static final long serialVersionUID = 1L;
82          
83          @XmlElement(name="roleMember")
84          private List<RoleMemberXmlDTO.OutsideOfRole> roleMembers;
85  
86          /**
87           * @see org.kuali.rice.kim.impl.jaxb.RoleMembersXmlDTO#getRoleMembers()
88           */
89          @Override
90          public List<RoleMemberXmlDTO.OutsideOfRole> getRoleMembers() {
91              return this.roleMembers;
92          }
93  
94          /**
95           * @see org.kuali.rice.kim.impl.jaxb.RoleMembersXmlDTO#setRoleMembers(java.util.List)
96           */
97          @Override
98          public void setRoleMembers(List<RoleMemberXmlDTO.OutsideOfRole> roleMembers) {
99              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 &lt;roleMembers&gt; element that is a child of a &lt;role&gt; 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 }