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