001 package org.kuali.rice.kew.api.action; 002 003 import java.io.Serializable; 004 import java.util.ArrayList; 005 import java.util.Collection; 006 import java.util.Collections; 007 import java.util.List; 008 import javax.xml.bind.annotation.XmlAccessType; 009 import javax.xml.bind.annotation.XmlAccessorType; 010 import javax.xml.bind.annotation.XmlAnyElement; 011 import javax.xml.bind.annotation.XmlElement; 012 import javax.xml.bind.annotation.XmlRootElement; 013 import javax.xml.bind.annotation.XmlType; 014 015 import org.kuali.rice.core.api.CoreConstants; 016 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 017 import org.kuali.rice.core.api.mo.ModelBuilder; 018 import org.w3c.dom.Element; 019 020 @XmlRootElement(name = RoutingReportCriteria.Constants.ROOT_ELEMENT_NAME) 021 @XmlAccessorType(XmlAccessType.NONE) 022 @XmlType(name = RoutingReportCriteria.Constants.TYPE_NAME, propOrder = { 023 RoutingReportCriteria.Elements.DOCUMENT_ID, 024 RoutingReportCriteria.Elements.TARGET_NODE_NAME, 025 RoutingReportCriteria.Elements.TARGET_PRINCIPAL_IDS, 026 RoutingReportCriteria.Elements.ROUTING_PRINCIPAL_ID, 027 RoutingReportCriteria.Elements.DOCUMENT_TYPE_NAME, 028 RoutingReportCriteria.Elements.XML_CONTENT, 029 RoutingReportCriteria.Elements.RULE_TEMPLATE_NAMES, 030 RoutingReportCriteria.Elements.NODE_NAMES, 031 RoutingReportCriteria.Elements.ACTIONS_TO_TAKE, 032 RoutingReportCriteria.Elements.ACTIVATE_REQUESTS, 033 RoutingReportCriteria.Elements.FLATTEN_NODES, 034 CoreConstants.CommonElements.FUTURE_ELEMENTS}) 035 public final class RoutingReportCriteria extends AbstractDataTransferObject implements RoutingReportCriteriaContract { 036 037 @XmlElement(name = Elements.DOCUMENT_ID, required = false) 038 private final String documentId; 039 @XmlElement(name = Elements.TARGET_NODE_NAME, required = false) 040 private final String targetNodeName; 041 @XmlElement(name = Elements.TARGET_PRINCIPAL_IDS, required = false) 042 private final List<String> targetPrincipalIds; 043 @XmlElement(name = Elements.ROUTING_PRINCIPAL_ID, required = false) 044 private final String routingPrincipalId; 045 @XmlElement(name = Elements.DOCUMENT_TYPE_NAME, required = false) 046 private final String documentTypeName; 047 @XmlElement(name = Elements.XML_CONTENT, required = false) 048 private final String xmlContent; 049 @XmlElement(name = Elements.RULE_TEMPLATE_NAMES, required = false) 050 private final List<String> ruleTemplateNames; 051 @XmlElement(name = Elements.NODE_NAMES, required = false) 052 private final List<String> nodeNames; 053 @XmlElement(name = Elements.ACTIONS_TO_TAKE, required = false) 054 private final List<RoutingReportActionToTake> actionsToTake; 055 @XmlElement(name = Elements.ACTIVATE_REQUESTS, required = false) 056 private final boolean activateRequests; 057 @XmlElement(name = Elements.FLATTEN_NODES, required = false) 058 private final boolean flattenNodes; 059 @SuppressWarnings("unused") 060 @XmlAnyElement 061 private final Collection<Element> _futureElements = null; 062 063 /** 064 * Private constructor used only by JAXB. 065 */ 066 private RoutingReportCriteria() { 067 this.documentId = null; 068 this.targetNodeName = null; 069 this.targetPrincipalIds = null; 070 this.routingPrincipalId = null; 071 this.documentTypeName = null; 072 this.xmlContent = null; 073 this.ruleTemplateNames = null; 074 this.nodeNames = null; 075 this.actionsToTake = null; 076 this.flattenNodes = false; 077 this.activateRequests = false; 078 } 079 080 private RoutingReportCriteria(Builder builder) { 081 this.documentId = builder.getDocumentId(); 082 this.targetNodeName = builder.getTargetNodeName(); 083 this.targetPrincipalIds = builder.getTargetPrincipalIds(); 084 this.routingPrincipalId = builder.getRoutingPrincipalId(); 085 this.documentTypeName = builder.getDocumentTypeName(); 086 this.xmlContent = builder.getXmlContent(); 087 this.ruleTemplateNames = builder.getRuleTemplateNames(); 088 this.nodeNames = builder.getNodeNames(); 089 if (builder.getActionsToTake() != null) { 090 List<RoutingReportActionToTake> actions = new ArrayList<RoutingReportActionToTake>(); 091 for (RoutingReportActionToTake.Builder actionBuilder : builder.getActionsToTake()) { 092 actions.add(actionBuilder.build()); 093 } 094 this.actionsToTake = actions; 095 } else { 096 this.actionsToTake = Collections.emptyList(); 097 } 098 this.flattenNodes = builder.isFlattenNodes(); 099 this.activateRequests = builder.isActivateRequests(); 100 } 101 102 @Override 103 public String getDocumentId() { 104 return this.documentId; 105 } 106 107 @Override 108 public String getTargetNodeName() { 109 return this.targetNodeName; 110 } 111 112 @Override 113 public List<String> getTargetPrincipalIds() { 114 return this.targetPrincipalIds; 115 } 116 117 @Override 118 public String getRoutingPrincipalId() { 119 return this.routingPrincipalId; 120 } 121 122 @Override 123 public String getDocumentTypeName() { 124 return this.documentTypeName; 125 } 126 127 @Override 128 public String getXmlContent() { 129 return this.xmlContent; 130 } 131 132 @Override 133 public List<String> getRuleTemplateNames() { 134 return this.ruleTemplateNames; 135 } 136 137 @Override 138 public List<String> getNodeNames() { 139 return this.nodeNames; 140 } 141 142 @Override 143 public List<RoutingReportActionToTake> getActionsToTake() { 144 return this.actionsToTake; 145 } 146 147 @Override 148 public boolean isActivateRequests() { 149 return this.activateRequests; 150 } 151 152 @Override 153 public boolean isFlattenNodes() { 154 return this.flattenNodes; 155 } 156 157 /** 158 * A builder which can be used to construct {@link RoutingReportCriteria} instances. Enforces the constraints of 159 * the {@link RoutingReportCriteriaContract}. 160 */ 161 public final static class Builder implements Serializable, ModelBuilder, RoutingReportCriteriaContract { 162 163 private String documentId; 164 private String targetNodeName; 165 private List<String> targetPrincipalIds; 166 private String routingPrincipalId; 167 private String documentTypeName; 168 private String xmlContent; 169 private List<String> ruleTemplateNames; 170 private List<String> nodeNames; 171 private List<RoutingReportActionToTake.Builder> actionsToTake; 172 private boolean activateRequests; 173 private boolean flattenNodes; 174 175 private Builder(String documentId, String targetNodeName) { 176 this.setDocumentId(documentId); 177 this.setTargetNodeName(targetNodeName); 178 } 179 180 private Builder(String documentTypeName) { 181 this.setDocumentTypeName(documentTypeName); 182 } 183 184 public static Builder createByDocumentTypeName(String documentTypeName) { 185 return new Builder(documentTypeName); 186 } 187 188 public static Builder createByDocumentId(String documentId) { 189 return new Builder(documentId, null); 190 } 191 192 public static Builder createByDocumentIdAndTargetNodeName(String documentId, String targetNodeName) { 193 return new Builder(documentId, targetNodeName); 194 } 195 196 public static Builder create(RoutingReportCriteriaContract contract) { 197 if (contract == null) { 198 throw new IllegalArgumentException("contract was null"); 199 } 200 Builder builder = 201 createByDocumentIdAndTargetNodeName(contract.getDocumentId(), contract.getTargetNodeName()); 202 builder.setDocumentId(contract.getDocumentId()); 203 builder.setTargetNodeName(contract.getTargetNodeName()); 204 builder.setTargetPrincipalIds(contract.getTargetPrincipalIds()); 205 builder.setRoutingPrincipalId(contract.getRoutingPrincipalId()); 206 builder.setDocumentTypeName(contract.getDocumentTypeName()); 207 builder.setXmlContent(contract.getXmlContent()); 208 builder.setRuleTemplateNames(contract.getRuleTemplateNames()); 209 builder.setNodeNames(contract.getNodeNames()); 210 if (contract.getActionsToTake() != null) { 211 List<RoutingReportActionToTake.Builder> actionsToTake = new ArrayList<RoutingReportActionToTake.Builder>(); 212 for (RoutingReportActionToTakeContract action : contract.getActionsToTake()) { 213 actionsToTake.add(RoutingReportActionToTake.Builder.create(action)); 214 } 215 builder.setActionsToTake(actionsToTake); 216 } 217 builder.setActivateRequests(contract.isActivateRequests()); 218 builder.setFlattenNodes(contract.isFlattenNodes()); 219 220 return builder; 221 } 222 223 public RoutingReportCriteria build() { 224 return new RoutingReportCriteria(this); 225 } 226 227 @Override 228 public String getDocumentId() { 229 return this.documentId; 230 } 231 232 @Override 233 public String getTargetNodeName() { 234 return this.targetNodeName; 235 } 236 237 @Override 238 public List<String> getTargetPrincipalIds() { 239 return this.targetPrincipalIds; 240 } 241 242 @Override 243 public String getRoutingPrincipalId() { 244 return this.routingPrincipalId; 245 } 246 247 @Override 248 public String getDocumentTypeName() { 249 return this.documentTypeName; 250 } 251 252 @Override 253 public String getXmlContent() { 254 return this.xmlContent; 255 } 256 257 @Override 258 public List<String> getRuleTemplateNames() { 259 return this.ruleTemplateNames; 260 } 261 262 @Override 263 public List<String> getNodeNames() { 264 return this.nodeNames; 265 } 266 267 @Override 268 public List<RoutingReportActionToTake.Builder> getActionsToTake() { 269 return this.actionsToTake; 270 } 271 272 @Override 273 public boolean isActivateRequests() { 274 return this.activateRequests; 275 } 276 277 @Override 278 public boolean isFlattenNodes() { 279 return this.flattenNodes; 280 } 281 282 public void setDocumentId(String documentId) { 283 // TODO add validation of input value if required and throw IllegalArgumentException if needed 284 this.documentId = documentId; 285 } 286 287 public void setTargetNodeName(String targetNodeName) { 288 // TODO add validation of input value if required and throw IllegalArgumentException if needed 289 this.targetNodeName = targetNodeName; 290 } 291 292 public void setTargetPrincipalIds(List<String> targetPrincipalIds) { 293 // TODO add validation of input value if required and throw IllegalArgumentException if needed 294 this.targetPrincipalIds = Collections.unmodifiableList(targetPrincipalIds); 295 } 296 297 public void setRoutingPrincipalId(String routingPrincipalId) { 298 // TODO add validation of input value if required and throw IllegalArgumentException if needed 299 this.routingPrincipalId = routingPrincipalId; 300 } 301 302 public void setDocumentTypeName(String documentTypeName) { 303 // TODO add validation of input value if required and throw IllegalArgumentException if needed 304 this.documentTypeName = documentTypeName; 305 } 306 307 public void setXmlContent(String xmlContent) { 308 // TODO add validation of input value if required and throw IllegalArgumentException if needed 309 this.xmlContent = xmlContent; 310 } 311 312 public void setRuleTemplateNames(List<String> ruleTemplateNames) { 313 // TODO add validation of input value if required and throw IllegalArgumentException if needed 314 this.ruleTemplateNames = Collections.unmodifiableList(ruleTemplateNames); 315 } 316 317 public void setNodeNames(List<String> nodeNames) { 318 // TODO add validation of input value if required and throw IllegalArgumentException if needed 319 this.nodeNames = Collections.unmodifiableList(nodeNames); 320 } 321 322 public void setActionsToTake(List<RoutingReportActionToTake.Builder> actionsToTake) { 323 // TODO add validation of input value if required and throw IllegalArgumentException if needed 324 this.actionsToTake = Collections.unmodifiableList(actionsToTake); 325 } 326 327 public void setActivateRequests(boolean activateRequests) { 328 // TODO add validation of input value if required and throw IllegalArgumentException if needed 329 this.activateRequests = activateRequests; 330 } 331 332 public void setFlattenNodes(boolean flattenNodes) { 333 // TODO add validation of input value if required and throw IllegalArgumentException if needed 334 this.flattenNodes = flattenNodes; 335 } 336 } 337 338 /** 339 * Defines some internal constants used on this class. 340 */ 341 static class Constants { 342 343 final static String ROOT_ELEMENT_NAME = "routingReportCriteria"; 344 final static String TYPE_NAME = "RoutingReportCriteriaType"; 345 } 346 347 /** 348 * A private class which exposes constants which define the XML element names to use when this object is marshalled 349 * to XML. 350 */ 351 static class Elements { 352 353 final static String DOCUMENT_ID = "documentId"; 354 final static String TARGET_NODE_NAME = "targetNodeName"; 355 final static String TARGET_PRINCIPAL_IDS = "targetPrincipalIds"; 356 final static String ROUTING_PRINCIPAL_ID = "routingPrincipalId"; 357 final static String DOCUMENT_TYPE_NAME = "documentTypeName"; 358 final static String XML_CONTENT = "xmlContent"; 359 final static String RULE_TEMPLATE_NAMES = "ruleTemplateNames"; 360 final static String NODE_NAMES = "nodeNames"; 361 final static String ACTIONS_TO_TAKE = "actionsToTake"; 362 final static String ACTIVATE_REQUESTS = "activateRequests"; 363 final static String FLATTEN_NODES = "flattenNodes"; 364 } 365 }