001    /**
002     * Copyright 2004-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.kpme.tklm.time.workflow;
017    
018    import java.util.ArrayList;
019    import java.util.HashSet;
020    import java.util.List;
021    import java.util.Map;
022    import java.util.Set;
023    
024    import org.apache.commons.lang.StringUtils;
025    import org.apache.commons.lang.math.NumberUtils;
026    import org.apache.log4j.Logger;
027    import org.joda.time.DateTime;
028    import org.kuali.kpme.core.KPMENamespace;
029    import org.kuali.kpme.core.role.KPMERole;
030    import org.kuali.kpme.core.service.HrServiceLocator;
031    import org.kuali.kpme.tklm.time.missedpunch.MissedPunch;
032    import org.kuali.kpme.tklm.time.missedpunch.MissedPunchDocument;
033    import org.kuali.rice.kew.api.exception.WorkflowException;
034    import org.kuali.rice.kew.api.identity.Id;
035    import org.kuali.rice.kew.api.identity.PrincipalId;
036    import org.kuali.rice.kew.api.rule.RoleName;
037    import org.kuali.rice.kew.engine.RouteContext;
038    import org.kuali.rice.kew.routeheader.DocumentContent;
039    import org.kuali.rice.kew.rule.GenericRoleAttribute;
040    import org.kuali.rice.kew.rule.QualifiedRoleName;
041    import org.kuali.rice.kim.api.role.RoleMember;
042    import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
043    
044    @SuppressWarnings("unchecked")
045    public class MissedPunchRoleAttribute extends GenericRoleAttribute {
046    
047            private static final long serialVersionUID = -7188190168685823002L;
048            
049            private static final Logger LOG = Logger.getLogger(MissedPunchRoleAttribute.class);
050    
051            @Override
052            public List<RoleName> getRoleNames() {
053                    List<RoleName> roleNames = new ArrayList<RoleName>();
054                    
055                    roleNames.add(RoleName.Builder.create(getClass().getName(), KPMERole.APPROVER.getRoleName(), KPMERole.APPROVER.getRoleName()).build());
056                    roleNames.add(RoleName.Builder.create(getClass().getName(), KPMERole.APPROVER_DELEGATE.getRoleName(), KPMERole.APPROVER_DELEGATE.getRoleName()).build());
057    
058                    return roleNames;
059            }
060            
061            @Override
062        protected List<String> getRoleNameQualifiers(String roleName, DocumentContent documentContent) {
063                    Set<String> roleNameQualifiers = new HashSet<String>();
064                    
065                    try {
066                            String documentId = documentContent.getRouteContext().getDocument().getDocumentId();
067                            MissedPunchDocument missedPunchDocument = (MissedPunchDocument) KRADServiceLocatorWeb.getDocumentService().getByDocumentHeaderId(documentId);
068                            MissedPunch missedPunch = missedPunchDocument.getMissedPunch();
069                    roleNameQualifiers.add(String.valueOf(missedPunch.getWorkArea()));
070                    } catch (WorkflowException we) {
071                            we.printStackTrace();
072                    }
073    
074                    return new ArrayList<String>(roleNameQualifiers);
075        }
076            
077            @Override
078        protected List<Id> resolveRecipients(RouteContext routeContext, QualifiedRoleName qualifiedRoleName) {
079                    List<Id> recipients = new ArrayList<Id>();
080                    
081                    String roleName = qualifiedRoleName.getBaseRoleName();
082                    String qualifier = qualifiedRoleName.getQualifier();
083                    
084                    if (StringUtils.isNotBlank(roleName) && NumberUtils.isNumber(qualifier)) {
085                            Long workArea = Long.valueOf(qualifier);
086            
087                            List<RoleMember> roleMembers = HrServiceLocator.getKPMERoleService().getRoleMembersInWorkArea(KPMENamespace.KPME_HR.getNamespaceCode(), roleName, workArea, new DateTime(), true);
088                            
089                    for (RoleMember roleMember : roleMembers) {
090                            recipients.add(new PrincipalId(roleMember.getMemberId()));
091                        }
092                    } else {
093                            LOG.error("Could not route to role " + roleName + " with work area " + qualifier);
094                    }
095                    
096                    return recipients;
097        }
098    
099            @Override
100            public Map<String, String> getProperties() {
101                    return null;
102            }
103    
104    }