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.ken.kew;
017
018 import java.util.ArrayList;
019 import java.util.Collections;
020 import java.util.List;
021 import java.util.Map;
022
023 import javax.xml.xpath.XPathExpressionException;
024
025 import org.apache.log4j.Logger;
026 import org.kuali.rice.kew.api.WorkflowRuntimeException;
027 import org.kuali.rice.kew.api.identity.Id;
028 import org.kuali.rice.kew.api.identity.PrincipalName;
029 import org.kuali.rice.kew.api.rule.RoleName;
030 import org.kuali.rice.kew.api.rule.RuleExtension;
031 import org.kuali.rice.kew.engine.RouteContext;
032 import org.kuali.rice.kew.routeheader.DocumentContent;
033 import org.kuali.rice.kew.rule.GenericRoleAttribute;
034 import org.kuali.rice.kew.rule.QualifiedRoleName;
035 import org.kuali.rice.kew.rule.RuleExtensionBo;
036 import org.kuali.rice.kew.workgroup.GroupNameId;
037
038
039 /**
040 * KEW RoleAttribute implementation that is responsible for encapsulating a list
041 * of users and groups which are reviewers for a Notification Channel.
042 * This implementation relies on the default XML form implemented by GenericRoleAttribute
043 * @author Kuali Rice Team (rice.collab@kuali.org)
044 */
045 public class ChannelReviewerRoleAttribute extends GenericRoleAttribute {
046 private static final Logger LOG = Logger.getLogger(ChannelReviewerRoleAttribute.class);
047 private static final List<RoleName> SUPPORTED_ROLES;
048
049 static {
050 RoleName reviewerRole = new RoleName(ChannelReviewerRoleAttribute.class.getName(), "reviewers", "Reviewers");
051 List<RoleName> tmp = new ArrayList<RoleName>(1);
052 tmp.add(reviewerRole);
053 SUPPORTED_ROLES = Collections.unmodifiableList(tmp);
054 }
055
056 /**
057 * Constructs a ChannelReviewerRoleAttribute.java.
058 */
059 public ChannelReviewerRoleAttribute() {
060 super("channelReviewers");
061 LOG.info("CHANNEL REVIEWER ROLE ATTRIBUTE CONSTRUCTOR");
062 }
063
064 /**
065 * @see org.kuali.rice.kew.rule.GenericRoleAttribute#isMatch(org.kuali.rice.kew.routeheader.DocumentContent, java.util.List)
066 */
067 @Override
068 public boolean isMatch(DocumentContent docContent, List<RuleExtension> ruleExtensions) {
069 LOG.info("CHANNEL REVIEWER ROLE ATTRIBUTE IS MATCH");
070 return super.isMatch(docContent, ruleExtensions);
071 }
072
073 /**
074 * @see org.kuali.rice.kew.rule.GenericWorkflowAttribute#getProperties()
075 */
076 @Override
077 public Map<String, String> getProperties() {
078 LOG.info("CHANNEL REVIEWER ROLE ATTRIBUTE GETPROPERTIES");
079 // intentionally unimplemented...not intending on using this attribute client-side
080 return null;
081 }
082
083 /**
084 * @see org.kuali.rice.kew.rule.RoleAttribute#getRoleNames()
085 */
086 public List<RoleName> getRoleNames() {
087 LOG.info("CHANNEL REVIEWER ROLE ATTRIBUTE CALLED ROLENAMES");
088 return SUPPORTED_ROLES;
089 }
090
091 /**
092 * @see org.kuali.rice.kew.rule.GenericRoleAttribute#getQualifiedRoleNames(java.lang.String, org.kuali.rice.kew.routeheader.DocumentContent)
093 */
094 @Override
095 public List<String> getQualifiedRoleNames(String roleName, DocumentContent documentContent) {
096 List<String> qrn = new ArrayList<String>(1);
097 qrn.add(roleName);
098 return qrn;
099 }
100
101 /**
102 * This looks at the reviewers list passed through from KEN and then resolves the individuals that need to actually approve
103 * the message.
104 * @see org.kuali.rice.kew.rule.GenericRoleAttribute#resolveRecipients(org.kuali.rice.kew.engine.RouteContext, org.kuali.rice.kew.rule.QualifiedRoleName)
105 */
106 @Override
107 protected List<Id> resolveRecipients(RouteContext routeContext, QualifiedRoleName qualifiedRoleName) {
108 LOG.info("CHANNEL REVIEWER ROLE ATTRIBUTE CALLED");
109 List<Id> ids = new ArrayList<Id>();
110
111 LOG.info("DOC CONTENT:" + routeContext.getDocumentContent().getDocContent());
112 LOG.info("ATTR CONTENT:" + routeContext.getDocumentContent().getAttributeContent());
113 DocumentContent dc = routeContext.getDocumentContent();
114 List<Map<String, String>> attrs;
115 try {
116 attrs = content.parseContent(dc.getAttributeContent());
117 } catch (XPathExpressionException xpee) {
118 throw new WorkflowRuntimeException("Error parsing ChannelReviewer role attribute content", xpee);
119 }
120
121 if (attrs.size() > 0) {
122 Map<String, String> values = attrs.get(0);
123 if (values != null) {
124 // iterate through all "fields" and accumulate a list of users and groups
125 for (Map.Entry<String, String> entry: values.entrySet()) {
126 String name = entry.getKey();
127 String value = entry.getValue();
128 LOG.info("Entry: " + name + "=" + value);
129 Id id;
130 if (name.startsWith("user")) {
131 LOG.info("Adding user: " + value);
132 id = new PrincipalName(value);
133 ids.add(id);
134 } else if (name.startsWith("group")) {
135 LOG.info("Adding group: " + value);
136 id = new GroupNameId(value);
137 ids.add(id);
138 } else {
139 LOG.error("Invalid attribute value: " + name + "=" + value);
140 }
141 }
142 }
143 } else {
144 LOG.debug("No attribute content found for ChannelReviewerRoleAttribute");
145 }
146
147 LOG.info("Returning ids: " + ids.size());
148 return ids;
149 }
150 }