Coverage Report - org.kuali.rice.kew.rule.AbstractIdRoleAttribute
 
Classes in this File Line Coverage Branch Coverage Complexity
AbstractIdRoleAttribute
0%
0/58
0%
0/22
2.417
 
 1  
 /*
 2  
  * Copyright 2007-2008 The Kuali Foundation
 3  
  *
 4  
  * Licensed under the Educational Community License, Version 2.0 (the "License");
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  *
 8  
  * http://www.opensource.org/licenses/ecl2.php
 9  
  *
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an "AS IS" BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  
  * See the License for the specific language governing permissions and
 14  
  * limitations under the License.
 15  
  */
 16  
 package org.kuali.rice.kew.rule;
 17  
 
 18  
 import java.io.StringReader;
 19  
 import java.util.ArrayList;
 20  
 import java.util.HashMap;
 21  
 import java.util.List;
 22  
 import java.util.Map;
 23  
 
 24  
 import javax.xml.xpath.XPath;
 25  
 import javax.xml.xpath.XPathConstants;
 26  
 import javax.xml.xpath.XPathExpressionException;
 27  
 
 28  
 import org.apache.commons.lang.StringUtils;
 29  
 import org.kuali.rice.kew.api.WorkflowRuntimeException;
 30  
 import org.kuali.rice.kew.engine.RouteContext;
 31  
 import org.kuali.rice.kew.identity.Id;
 32  
 import org.kuali.rice.kew.routeheader.DocumentContent;
 33  
 import org.kuali.rice.kew.rule.bo.RuleAttribute;
 34  
 import org.kuali.rice.kew.rule.xmlrouting.GenericXMLRuleAttribute;
 35  
 import org.kuali.rice.kew.rule.xmlrouting.XPathHelper;
 36  
 import org.w3c.dom.Element;
 37  
 import org.w3c.dom.NodeList;
 38  
 import org.xml.sax.InputSource;
 39  
 
 40  
 /**
 41  
  * A generic Role Attribute superclass that can be used to route to an ID. Can
 42  
  * take as configuration the label to use for the element name in the XML. This
 43  
  * allows for re-use of this component in different contexts.
 44  
  * 
 45  
  * @author Kuali Rice Team (rice.collab@kuali.org)
 46  
  */
 47  0
 public abstract class AbstractIdRoleAttribute extends AbstractRoleAttribute
 48  
                 implements GenericXMLRuleAttribute {
 49  
 
 50  
         private static final String XML_ELEMENT_LABEL = "xmlElementLabel";
 51  
         private static final String ROLE_NAME_LABEL = "roleNameLabel";
 52  
 
 53  
         private String idValue;
 54  0
         private Map paramMap = new HashMap();
 55  
         private RuleAttribute ruleAttribute;
 56  
 
 57  
         protected abstract String getAttributeElementName();
 58  
 
 59  
         protected abstract Id resolveId(String id);
 60  
 
 61  
         protected abstract String getIdName();
 62  
 
 63  
         /**
 64  
          * Returns qualified role names based on IDs in the XML. Each returned
 65  
          * qualified Role contains a single ID.
 66  
          * 
 67  
          * @see org.kuali.rice.kew.rule.RoleAttribute#getQualifiedRoleNames(java.lang.String,
 68  
          *      org.kuali.rice.kew.routeheader.DocumentContent)
 69  
          */
 70  
         public List<String> getQualifiedRoleNames(String roleName,
 71  
                         DocumentContent documentContent) {
 72  
                 try {
 73  0
                         readConfiguration();
 74  0
                         String elementName = (String) getParamMap().get(XML_ELEMENT_LABEL);
 75  0
                         List<String> qualifiedRoleNames = new ArrayList<String>();
 76  0
                         XPath xPath = XPathHelper.newXPath();
 77  0
                         NodeList idNodes = (NodeList) xPath.evaluate("//"
 78  
                                         + getAttributeElementName() + "/" + elementName,
 79  
                                         documentContent.getDocument(), XPathConstants.NODESET);
 80  0
                         for (int index = 0; index < idNodes.getLength(); index++) {
 81  0
                                 Element idElement = (Element) idNodes.item(index);
 82  0
                                 String id = idElement.getTextContent();
 83  0
                                 qualifiedRoleNames.add(id);
 84  
                         }
 85  0
                         return qualifiedRoleNames;
 86  0
                 } catch (XPathExpressionException e) {
 87  0
                         throw new WorkflowRuntimeException(
 88  
                                         "Failed to evaulate XPath expression to find ids.", e);
 89  
                 }
 90  
         }
 91  
 
 92  
         /**
 93  
          * Takes the given qualified role which contains an ID and returns a
 94  
          * resolved role for the entity with that id.
 95  
          * 
 96  
          * @see org.kuali.rice.kew.rule.RoleAttribute#resolveQualifiedRole(org.kuali.rice.kew.engine.RouteContext,
 97  
          *      java.lang.String, java.lang.String)
 98  
          */
 99  
         public ResolvedQualifiedRole resolveQualifiedRole(
 100  
                         RouteContext routeContext, String roleName, String qualifiedRole) {
 101  0
                 String roleNameLabel = (String) getParamMap().get(ROLE_NAME_LABEL);
 102  0
                 if (roleNameLabel == null) {
 103  0
                         readConfiguration();
 104  0
                         roleNameLabel = (String) getParamMap().get(ROLE_NAME_LABEL);
 105  
                 }
 106  0
                 ResolvedQualifiedRole resolvedRole = new ResolvedQualifiedRole();
 107  0
                 resolvedRole.setQualifiedRoleLabel(roleNameLabel);
 108  0
                 resolvedRole.getRecipients().add(resolveId(qualifiedRole));
 109  0
                 return resolvedRole;
 110  
         }
 111  
 
 112  
         /**
 113  
          * Generates XML containing the ID on this attribute.
 114  
          * 
 115  
          * @see org.kuali.rice.kew.rule.AbstractWorkflowAttribute#getDocContent()
 116  
          */
 117  
         @Override
 118  
         public String getDocContent() {
 119  0
                 readConfiguration();
 120  0
                 if (!StringUtils.isBlank(getIdValue())) {
 121  0
                         String elementName = (String) getParamMap().get(XML_ELEMENT_LABEL);
 122  0
                         return "<" + getAttributeElementName() + "><" + elementName + ">"
 123  
                                         + getIdValue() + "</" + elementName + "></"
 124  
                                         + getAttributeElementName() + ">";
 125  
                 }
 126  0
                 return "";
 127  
         }
 128  
 
 129  
         /**
 130  
          * Reads any configured values in the XML of the RuleAttribute and adds them
 131  
          * to the paramMap.
 132  
          * 
 133  
          */
 134  
         protected void readConfiguration() {
 135  0
                 String idInMap = (String) getParamMap().get(getIdName());
 136  0
                 if (getIdValue() == null) {
 137  0
                         setIdValue(idInMap);
 138  
                 }
 139  0
                 if (getIdValue() != null) {
 140  0
                         getParamMap().put(getIdName(), getIdValue());
 141  
                 }
 142  0
                 if (ruleAttribute != null) {
 143  0
                         String xmlConfigData = ruleAttribute.getXmlConfigData();
 144  0
                         if (!StringUtils.isBlank(xmlConfigData)) {
 145  0
                                 XPath xPath = XPathHelper.newXPath();
 146  
                                 try {
 147  0
                                         String xmlElementLabel = xPath.evaluate("/configuration/"
 148  
                                                         + XML_ELEMENT_LABEL, new InputSource(
 149  
                                                         new StringReader(xmlConfigData)));
 150  0
                                         String roleNameLabel = xPath.evaluate("/configuration/"
 151  
                                                         + ROLE_NAME_LABEL, new InputSource(
 152  
                                                         new StringReader(xmlConfigData)));
 153  0
                                         if (!StringUtils.isBlank(xmlElementLabel)) {
 154  0
                                                 getParamMap().put(XML_ELEMENT_LABEL, xmlElementLabel);
 155  
                                         }
 156  0
                                         if (!StringUtils.isBlank(roleNameLabel)) {
 157  0
                                                 getParamMap().put(ROLE_NAME_LABEL, roleNameLabel);
 158  
                                         }
 159  
 
 160  0
                                 } catch (XPathExpressionException e) {
 161  0
                                         throw new WorkflowRuntimeException(
 162  
                                                         "Failed to locate Rule Attribute configuration.");
 163  0
                                 }
 164  
                         }
 165  
                 }
 166  
                 // setup default values if none were defined in XML
 167  0
                 if (StringUtils.isBlank((String) getParamMap().get(XML_ELEMENT_LABEL))) {
 168  0
                         getParamMap().put(XML_ELEMENT_LABEL, getIdName());
 169  
                 }
 170  0
                 if (getParamMap().get(ROLE_NAME_LABEL) == null) {
 171  0
                         getParamMap().put(ROLE_NAME_LABEL, "");
 172  
                 }
 173  0
         }
 174  
 
 175  
         public String getIdValue() {
 176  0
                 return this.idValue;
 177  
         }
 178  
 
 179  
         public void setIdValue(String idValue) {
 180  0
                 this.idValue = idValue;
 181  0
         }
 182  
 
 183  
         public Map getParamMap() {
 184  0
                 return paramMap;
 185  
         }
 186  
 
 187  
         public void setParamMap(Map paramMap) {
 188  0
                 this.paramMap = paramMap;
 189  0
         }
 190  
 
 191  
         public void setRuleAttribute(RuleAttribute ruleAttribute) {
 192  0
                 this.ruleAttribute = ruleAttribute;
 193  0
         }
 194  
 
 195  
 }