001    /**
002     * Copyright 2005-2014 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.document;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.apache.log4j.Logger;
020    import org.hibernate.annotations.Fetch;
021    import org.hibernate.annotations.FetchMode;
022    import org.hibernate.annotations.Type;
023    import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
024    import org.kuali.rice.kim.api.KimConstants;
025    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
026    import org.kuali.rice.kim.api.type.KimAttributeField;
027    import org.kuali.rice.kim.api.type.KimType;
028    import org.kuali.rice.kim.bo.ui.GroupDocumentMember;
029    import org.kuali.rice.kim.bo.ui.GroupDocumentQualifier;
030    import org.kuali.rice.kim.impl.type.IdentityManagementTypeAttributeTransactionalDocument;
031    import org.kuali.rice.kim.service.KIMServiceLocatorInternal;
032    import org.kuali.rice.krad.service.SequenceAccessorService;
033    import org.springframework.util.AutoPopulatingList;
034    
035    import javax.persistence.AttributeOverride;
036    import javax.persistence.AttributeOverrides;
037    import javax.persistence.CascadeType;
038    import javax.persistence.Column;
039    import javax.persistence.Entity;
040    import javax.persistence.FetchType;
041    import javax.persistence.JoinColumn;
042    import javax.persistence.OneToMany;
043    import javax.persistence.Table;
044    import javax.persistence.Transient;
045    import java.util.ArrayList;
046    import java.util.HashMap;
047    import java.util.List;
048    import java.util.Map;
049    
050    
051    /**
052     * This is a description of what this class does - bhargavp don't forget to fill this in.
053     *
054     * @author Kuali Rice Team (rice.collab@kuali.org)
055     *
056     */
057    @Entity
058    @AttributeOverrides({
059            @AttributeOverride(name="documentNumber",column=@Column(name="FDOC_NBR"))
060    })
061    @Table(name="KRIM_GRP_DOCUMENT_T")
062    public class IdentityManagementGroupDocument extends IdentityManagementTypeAttributeTransactionalDocument {
063            private static final Logger LOG = Logger.getLogger(IdentityManagementGroupDocument.class);
064            
065            private static final long serialVersionUID = 1L;
066            
067            // principal data
068            @Column(name="GRP_ID")
069            protected String groupId;
070            @Column(name="KIM_TYP_ID")
071            protected String groupTypeId;
072            @Transient
073            protected String groupTypeName;
074            @Column(name="GRP_NMSPC")
075            protected String groupNamespace;
076            @Column(name="GRP_NM")
077            protected String groupName;
078            @Column(name="GRP_DESC")
079            protected String groupDescription;
080            @Type(type="yes_no")
081            @Column(name="ACTV_IND")
082            protected boolean active = true;
083    
084            @Transient
085            protected boolean editing;
086    
087            @OneToMany(targetEntity = GroupDocumentMember.class, fetch = FetchType.EAGER, cascade=CascadeType.ALL)
088            @Fetch(value = FetchMode.SELECT)
089            @JoinColumn(name="FDOC_NBR", insertable = false, updatable = false)
090            private List<GroupDocumentMember> members = new AutoPopulatingList(GroupDocumentMember.class);
091            @OneToMany(targetEntity = GroupDocumentQualifier.class, fetch = FetchType.EAGER, cascade=CascadeType.ALL)
092            @Fetch(value = FetchMode.SELECT)
093            @JoinColumn(name="FDOC_NBR", insertable = false, updatable = false)
094            private List<GroupDocumentQualifier> qualifiers = new AutoPopulatingList(GroupDocumentQualifier.class);
095    
096            public IdentityManagementGroupDocument() {
097            }
098            
099            /**
100             * @return the active
101             */
102            public boolean isActive() {
103                    return this.active;
104            }
105    
106            /**
107             * @param active the active to set
108             */
109            public void setActive(boolean active) {
110                    this.active = active;
111            }
112    
113            /**
114             * @param groupId the groupId to set
115             */
116            public void setRoleId(String groupId) {
117                    this.groupId = groupId;
118            }
119    
120            /**
121             * @param member the members to set
122             */
123            public void addMember(GroupDocumentMember member) {
124            getMembers().add(member);
125            }
126    
127            /**
128             * @return the kimType
129             */
130            public KimType getKimType() {
131            if (getGroupTypeId() != null) {
132                        return KimApiServiceLocator.getKimTypeInfoService().getKimType(getGroupTypeId());
133            }
134            return null;
135            }
136            
137            public GroupDocumentMember getBlankMember() {
138                    return new GroupDocumentMember();
139            }
140    
141            /**
142             * @see org.kuali.rice.krad.document.DocumentBase#doRouteStatusChange(org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange)
143             */
144            @Override
145            public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) {
146                    super.doRouteStatusChange(statusChangeEvent);
147                    if (getDocumentHeader().getWorkflowDocument().isProcessed()) {
148                            KIMServiceLocatorInternal.getUiDocumentService().saveGroup(this);
149                    }
150            }
151    
152            @Override
153            public void prepareForSave(){
154                    String groupId;
155                    if(StringUtils.isBlank(getGroupId())){
156                            SequenceAccessorService sas = getSequenceAccessorService();
157                            Long nextSeq = sas.getNextAvailableSequenceNumber(
158                                            "KRIM_GRP_ID_S", this.getClass());
159                            groupId = nextSeq.toString();
160                            setGroupId(groupId);
161                    } else{
162                            groupId = getGroupId();
163                    }
164                    if(getMembers()!=null){
165                            String groupMemberId;
166                            for(GroupDocumentMember member: getMembers()){
167                                    member.setGroupId(getGroupId());
168                                    if(StringUtils.isBlank(member.getGroupMemberId())){
169                                            SequenceAccessorService sas = getSequenceAccessorService();
170                                            Long nextSeq = sas.getNextAvailableSequenceNumber(
171                                                            "KRIM_GRP_MBR_ID_S", this.getClass());
172                                            groupMemberId = nextSeq.toString();
173                                            member.setGroupMemberId(groupMemberId);
174                                    }
175                                    if (StringUtils.isBlank(member.getDocumentNumber())) {
176                                            member.setDocumentNumber(getDocumentNumber());
177                                    }
178                            }
179                    }
180                    int index = 0;
181                    // this needs to be checked - are all qualifiers present?
182                    if(getDefinitions()!=null){
183                            for(KimAttributeField key : getDefinitions()) {
184                                    if ( getQualifiers().size() > index ) {
185                                            GroupDocumentQualifier qualifier = getQualifiers().get(index);
186                                            qualifier.setKimAttrDefnId(getKimAttributeDefnId(key));
187                                            qualifier.setKimTypId(getKimType().getId());
188                                            qualifier.setGroupId(groupId);
189                                    }
190                                    index++;
191                    }
192                    }
193            }
194    
195            public void initializeDocumentForNewGroup() {
196                    if(StringUtils.isBlank(this.groupId)){
197                            SequenceAccessorService sas = getSequenceAccessorService();
198                            Long nextSeq = sas.getNextAvailableSequenceNumber(
199                                            KimConstants.SequenceNames.KRIM_GROUP_ID_S, this.getClass());
200                            this.groupId = nextSeq.toString();
201                    }
202                    if(StringUtils.isBlank(this.groupTypeId)) {
203                            this.groupTypeId = "1";
204                    }
205            }
206            
207            public String getGroupId(){
208    //              if(StringUtils.isBlank(this.groupId)){
209    //                      initializeDocumentForNewGroup();
210    //              }
211                    return groupId;
212            }
213    
214            /**
215             * @param groupId the groupId to set
216             */
217            public void setGroupId(String groupId) {
218                    this.groupId = groupId;
219            }
220    
221            /**
222             * @return the groupName
223             */
224            public String getGroupName() {
225                    return this.groupName;
226            }
227    
228            /**
229             * @param groupName the groupName to set
230             */
231            public void setGroupName(String groupName) {
232                    this.groupName = groupName;
233            }
234    
235            public String getGroupDescription() {
236                    return this.groupDescription;
237            }
238    
239            public void setGroupDescription(String groupDescription) {
240                    this.groupDescription = groupDescription;
241            }
242            
243            /**
244             * @return the groupNamespace
245             */
246            public String getGroupNamespace() {
247                    return this.groupNamespace;
248            }
249    
250            /**
251             * @param groupNamespace the groupNamespace to set
252             */
253            public void setGroupNamespace(String groupNamespace) {
254                    this.groupNamespace = groupNamespace;
255            }
256    
257            /**
258             * @return the groupTypeId
259             */
260            public String getGroupTypeId() {
261                    return this.groupTypeId;
262            }
263    
264            /**
265             * @param groupTypeId the groupTypeId to set
266             */
267            public void setGroupTypeId(String groupTypeId) {
268                    this.groupTypeId = groupTypeId;
269            }
270    
271            /**
272             * @return the groupTypeName
273             */
274            public String getGroupTypeName() {
275                    return this.groupTypeName;
276            }
277    
278            /**
279             * @param groupTypeName the groupTypeName to set
280             */
281            public void setGroupTypeName(String groupTypeName) {
282                    this.groupTypeName = groupTypeName;
283            }
284    
285            /**
286             * @return the members
287             */
288            public List<GroupDocumentMember> getMembers() {
289                    return this.members;
290            }
291    
292            /**
293             * @param members the members to set
294             */
295            public void setMembers(List<GroupDocumentMember> members) {
296                    this.members = members;
297            }
298    
299            /**
300             * @return the qualifiers
301             */
302            public List<GroupDocumentQualifier> getQualifiers() {
303                    return this.qualifiers;
304            }
305    
306            /**
307             * @param qualifiers the qualifiers to set
308             */
309            public void setQualifiers(List<GroupDocumentQualifier> qualifiers) {
310                    this.qualifiers = qualifiers;
311            }
312    
313            public GroupDocumentQualifier getQualifier(String kimAttributeDefnId) {
314                    for(GroupDocumentQualifier qualifier: qualifiers){
315                            if(qualifier.getKimAttrDefnId().equals(kimAttributeDefnId))
316                                    return qualifier;
317                    }
318                    return null;
319            }
320    
321            public Map<String, String> getQualifiersAsAttributes() {
322            Map<String, String> attributes = new HashMap<String, String>();
323                    for(GroupDocumentQualifier qualifier: qualifiers){
324                            if ( qualifier.getKimAttribute() != null ) {
325                                    attributes.put(qualifier.getKimAttribute().getAttributeName(), qualifier.getAttrVal());
326                            } else {
327                                    LOG.warn( "Unknown attribute ID on group: " + qualifier.getKimAttrDefnId() + " / value=" + qualifier.getAttrVal());
328                                    attributes.put("Unknown Attribute ID: " + qualifier.getKimAttrDefnId(), qualifier.getAttrVal());
329                            }
330                    }
331                    return attributes;
332            }
333            
334            public void setDefinitions(List<KimAttributeField> definitions) {
335                    super.setDefinitions(definitions);
336                    if(getQualifiers()==null || getQualifiers().size()<1){
337                            GroupDocumentQualifier qualifier;
338                            setQualifiers(new ArrayList<GroupDocumentQualifier>());
339                            if(getDefinitions()!=null){
340                                    for(KimAttributeField key : getDefinitions()) {
341                                            qualifier = new GroupDocumentQualifier();
342                                    qualifier.setKimAttrDefnId(getKimAttributeDefnId(key));
343                                    getQualifiers().add(qualifier);
344                            }
345                            }
346                    }
347            }
348    
349            /**
350             * @return the editing
351             */
352            public boolean isEditing() {
353                    return this.editing;
354            }
355    
356            /**
357             * @param editing the editing to set
358             */
359            public void setEditing(boolean editing) {
360                    this.editing = editing;
361            }
362    
363            public void setKimType(KimType kimType) {
364                    super.setKimType(kimType);
365                    if (kimType != null){
366                            setGroupTypeId(kimType.getId());
367                            setGroupTypeName(kimType.getName());
368                    }
369            }
370    }